From 812994c940c1a33354990300c874b73e53d1ae6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Sch=C3=A4ferdiek?= Date: Thu, 7 Apr 2022 18:18:07 +0200 Subject: [PATCH] Update community plugins --- .obsidian/plugins/obsidian-kanban/main.js | 104 +- .../plugins/obsidian-kanban/manifest.json | 2 +- .obsidian/plugins/obsidian-kanban/styles.css | 2 +- .../plugins/obsidian-tasks-plugin/main.js | 36269 +++++++--------- .../obsidian-tasks-plugin/manifest.json | 4 +- .../plugins/obsidian-tasks-plugin/styles.css | 4 + .obsidian/plugins/templater-obsidian/main.js | 28 +- .../plugins/templater-obsidian/manifest.json | 2 +- 8 files changed, 16606 insertions(+), 19809 deletions(-) diff --git a/.obsidian/plugins/obsidian-kanban/main.js b/.obsidian/plugins/obsidian-kanban/main.js index ea55b56..c385998 100644 --- a/.obsidian/plugins/obsidian-kanban/main.js +++ b/.obsidian/plugins/obsidian-kanban/main.js @@ -3,75 +3,75 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source visit the plugins github repository */ -var Hy=Object.create;var Na=Object.defineProperty;var By=Object.getOwnPropertyDescriptor;var Ky=Object.getOwnPropertyNames;var $y=Object.getPrototypeOf,Uy=Object.prototype.hasOwnProperty;var ju=t=>Na(t,"__esModule",{value:!0});var zu=(t,n)=>()=>(t&&(n=t(t=0)),n),Fe=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),Yr=(t,n)=>{for(var e in n)Na(t,e,{get:n[e],enumerable:!0})},jy=(t,n,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Ky(n))!Uy.call(t,r)&&r!=="default"&&Na(t,r,{get:()=>n[r],enumerable:!(e=By(n,r))||e.enumerable});return t},ge=t=>jy(ju(Na(t!=null?Hy($y(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var Ot=Fe((Pn,Fd)=>{"use strict";Object.defineProperty(Pn,"__esModule",{value:!0});function Sn(t){return typeof t=="object"&&!("toString"in t)?Object.prototype.toString.call(t).slice(8,-1):t}var wb=typeof process=="object"&&!0;function pn(t,n){if(!t)throw wb?new Error("Invariant failed"):new Error(n())}Pn.invariant=pn;var vl=Object.prototype.hasOwnProperty,Eb=Array.prototype.splice,Sb=Object.prototype.toString;function xr(t){return Sb.call(t).slice(8,-1)}var Wa=Object.assign||function(t,n){return yl(n).forEach(function(e){vl.call(n,e)&&(t[e]=n[e])}),t},yl=typeof Object.getOwnPropertySymbols=="function"?function(t){return Object.keys(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.keys(t)};function ar(t){return Array.isArray(t)?Wa(t.constructor(t.length),t):xr(t)==="Map"?new Map(t):xr(t)==="Set"?new Set(t):t&&typeof t=="object"?Wa(Object.create(Object.getPrototypeOf(t)),t):t}var Ld=function(){function t(){this.commands=Wa({},xb),this.update=this.update.bind(this),this.update.extend=this.extend=this.extend.bind(this),this.update.isEquals=function(n,e){return n===e},this.update.newContext=function(){return new t().update}}return Object.defineProperty(t.prototype,"isEquals",{get:function(){return this.update.isEquals},set:function(n){this.update.isEquals=n},enumerable:!0,configurable:!0}),t.prototype.extend=function(n,e){this.commands[n]=e},t.prototype.update=function(n,e){var r=this,i=typeof e=="function"?{$apply:e}:e;Array.isArray(n)&&Array.isArray(i)||pn(!Array.isArray(i),function(){return"update(): You provided an invalid spec to update(). The spec may not contain an array except as the value of $set, $push, $unshift, $splice or any custom command allowing an array value."}),pn(typeof i=="object"&&i!==null,function(){return"update(): You provided an invalid spec to update(). The spec and every included key path must be plain objects containing one of the "+("following commands: "+Object.keys(r.commands).join(", ")+".")});var a=n;return yl(i).forEach(function(o){if(vl.call(r.commands,o)){var s=n===a;a=r.commands[o](i[o],a,i,n),s&&r.isEquals(a,n)&&(a=n)}else{var u=xr(n)==="Map"?r.update(n.get(o),i[o]):r.update(n[o],i[o]),l=xr(a)==="Map"?a.get(o):a[o];(!r.isEquals(u,l)||typeof u=="undefined"&&!vl.call(n,o))&&(a===n&&(a=ar(n)),xr(a)==="Map"?a.set(o,u):a[o]=u)}}),a},t}();Pn.Context=Ld;var xb={$push:function(t,n,e){return Pd(n,e,"$push"),t.length?n.concat(t):n},$unshift:function(t,n,e){return Pd(n,e,"$unshift"),t.length?t.concat(n):n},$splice:function(t,n,e,r){return kb(n,e),t.forEach(function(i){Od(i),n===r&&i.length&&(n=ar(r)),Eb.apply(n,i)}),n},$set:function(t,n,e){return Tb(e),t},$toggle:function(t,n){$i(t,"$toggle");var e=t.length?ar(n):n;return t.forEach(function(r){e[r]=!n[r]}),e},$unset:function(t,n,e,r){return $i(t,"$unset"),t.forEach(function(i){Object.hasOwnProperty.call(n,i)&&(n===r&&(n=ar(r)),delete n[i])}),n},$add:function(t,n,e,r){return Nd(n,"$add"),$i(t,"$add"),xr(n)==="Map"?t.forEach(function(i){var a=i[0],o=i[1];n===r&&n.get(a)!==o&&(n=ar(r)),n.set(a,o)}):t.forEach(function(i){n===r&&!n.has(i)&&(n=ar(r)),n.add(i)}),n},$remove:function(t,n,e,r){return Nd(n,"$remove"),$i(t,"$remove"),t.forEach(function(i){n===r&&n.has(i)&&(n=ar(r)),n.delete(i)}),n},$merge:function(t,n,e,r){return Mb(n,t),yl(t).forEach(function(i){t[i]!==n[i]&&(n===r&&(n=ar(r)),n[i]=t[i])}),n},$apply:function(t,n){return _b(t),t(n)}},bl=new Ld;Pn.isEquals=bl.update.isEquals;Pn.extend=bl.extend;Pn.default=bl.update;Pn.default.default=Fd.exports=Wa(Pn.default,Pn);function Pd(t,n,e){pn(Array.isArray(t),function(){return"update(): expected target of "+Sn(e)+" to be an array; got "+Sn(t)+"."}),$i(n[e],e)}function $i(t,n){pn(Array.isArray(t),function(){return"update(): expected spec of "+Sn(n)+" to be an array; got "+Sn(t)+". Did you forget to wrap your parameter in an array?"})}function kb(t,n){pn(Array.isArray(t),function(){return"Expected $splice target to be an array; got "+Sn(t)}),Od(n.$splice)}function Od(t){pn(Array.isArray(t),function(){return"update(): expected spec of $splice to be an array of arrays; got "+Sn(t)+". Did you forget to wrap your parameters in an array?"})}function _b(t){pn(typeof t=="function",function(){return"update(): expected spec of $apply to be a function; got "+Sn(t)+"."})}function Tb(t){pn(Object.keys(t).length===1,function(){return"Cannot have more than one key in an object with $set"})}function Mb(t,n){pn(n&&typeof n=="object",function(){return"update(): $merge expects a spec of type 'object'; got "+Sn(n)}),pn(t&&typeof t=="object",function(){return"update(): $merge expects a target of type 'object'; got "+Sn(t)})}function Nd(t,n){var e=xr(t);pn(e==="Map"||e==="Set",function(){return"update(): "+Sn(n)+" expects a target of type Set or Map; got "+Sn(e)})}});var Kd=Fe((s1,Bd)=>{"use strict";var Db=function(n){return Cb(n)&&!Ib(n)};function Cb(t){return!!t&&typeof t=="object"}function Ib(t){var n=Object.prototype.toString.call(t);return n==="[object RegExp]"||n==="[object Date]"||Pb(t)}var Ab=typeof Symbol=="function"&&Symbol.for,Lb=Ab?Symbol.for("react.element"):60103;function Pb(t){return t.$$typeof===Lb}function Ob(t){return Array.isArray(t)?[]:{}}function Ui(t,n){return n.clone!==!1&&n.isMergeableObject(t)?Zr(Ob(t),t,n):t}function Nb(t,n,e){return t.concat(n).map(function(r){return Ui(r,e)})}function Fb(t,n){if(!n.customMerge)return Zr;var e=n.customMerge(t);return typeof e=="function"?e:Zr}function Rb(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(n){return t.propertyIsEnumerable(n)}):[]}function Rd(t){return Object.keys(t).concat(Rb(t))}function Hd(t,n){try{return n in t}catch(e){return!1}}function Hb(t,n){return Hd(t,n)&&!(Object.hasOwnProperty.call(t,n)&&Object.propertyIsEnumerable.call(t,n))}function Bb(t,n,e){var r={};return e.isMergeableObject(t)&&Rd(t).forEach(function(i){r[i]=Ui(t[i],e)}),Rd(n).forEach(function(i){Hb(t,i)||(Hd(t,i)&&e.isMergeableObject(n[i])?r[i]=Fb(i,e)(t[i],n[i],e):r[i]=Ui(n[i],e))}),r}function Zr(t,n,e){e=e||{},e.arrayMerge=e.arrayMerge||Nb,e.isMergeableObject=e.isMergeableObject||Db,e.cloneUnlessOtherwiseSpecified=Ui;var r=Array.isArray(n),i=Array.isArray(t),a=r===i;return a?r?e.arrayMerge(t,n,e):Bb(t,n,e):Ui(n,e)}Zr.all=function(n,e){if(!Array.isArray(n))throw new Error("first argument should be an array");return n.reduce(function(r,i){return Zr(r,i,e)},{})};var Kb=Zr;Bd.exports=Kb});var to=Fe(at=>{"use strict";var Il=32;at.INT_BITS=Il;at.INT_MAX=2147483647;at.INT_MIN=-1<0)-(t<0)};at.abs=function(t){var n=t>>Il-1;return(t^n)-n};at.min=function(t,n){return n^(t^n)&-(t65535)<<4,t>>>=n,e=(t>255)<<3,t>>>=e,n|=e,e=(t>15)<<2,t>>>=e,n|=e,e=(t>3)<<1,t>>>=e,n|=e,n|t>>1};at.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0};at.popCount=function(t){return t=t-(t>>>1&1431655765),t=(t&858993459)+(t>>>2&858993459),(t+(t>>>4)&252645135)*16843009>>>24};function rf(t){var n=32;return t&=-t,t&&n--,t&65535&&(n-=16),t&16711935&&(n-=8),t&252645135&&(n-=4),t&858993459&&(n-=2),t&1431655765&&(n-=1),n}at.countTrailingZeros=rf;at.nextPow2=function(t){return t+=t===0,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t+1};at.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t-(t>>>1)};at.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,t&=15,27030>>>t&1};var Ji=new Array(256);(function(t){for(var n=0;n<256;++n){var e=n,r=n,i=7;for(e>>>=1;e;e>>>=1)r<<=1,r|=e&1,--i;t[n]=r<>>8&255]<<16|Ji[t>>>16&255]<<8|Ji[t>>>24&255]};at.interleave2=function(t,n){return t&=65535,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,n&=65535,n=(n|n<<8)&16711935,n=(n|n<<4)&252645135,n=(n|n<<2)&858993459,n=(n|n<<1)&1431655765,t|n<<1};at.deinterleave2=function(t,n){return t=t>>>n&1431655765,t=(t|t>>>1)&858993459,t=(t|t>>>2)&252645135,t=(t|t>>>4)&16711935,t=(t|t>>>16)&65535,t<<16>>16};at.interleave3=function(t,n,e){return t&=1023,t=(t|t<<16)&4278190335,t=(t|t<<8)&251719695,t=(t|t<<4)&3272356035,t=(t|t<<2)&1227133513,n&=1023,n=(n|n<<16)&4278190335,n=(n|n<<8)&251719695,n=(n|n<<4)&3272356035,n=(n|n<<2)&1227133513,t|=n<<1,e&=1023,e=(e|e<<16)&4278190335,e=(e|e<<8)&251719695,e=(e|e<<4)&3272356035,e=(e|e<<2)&1227133513,t|e<<2};at.deinterleave3=function(t,n){return t=t>>>n&1227133513,t=(t|t>>>2)&3272356035,t=(t|t>>>4)&251719695,t=(t|t>>>8)&4278190335,t=(t|t>>>16)&1023,t<<22>>22};at.nextCombination=function(t){var n=t|t-1;return n+1|(~n&-~n)-1>>>rf(t)+1}});var sf=Fe((B1,of)=>{"use strict";function af(t,n,e){var r=t[e]|0;if(r<=0)return[];var i=new Array(r),a;if(e===t.length-1)for(a=0;a0)return Qb(t|0,n);break;case"object":if(typeof t.length=="number")return af(t,n,0);break}return[]}of.exports=Xb});var Mf={};Yr(Mf,{Buffer:()=>ee,INSPECT_MAX_BYTES:()=>ff,SlowBuffer:()=>cw,isBuffer:()=>_f,kMaxLength:()=>iw});function lf(){Al=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,e=t.length;n0)throw new Error("Invalid string. Length must be a multiple of 4");a=t[s-2]==="="?2:t[s-1]==="="?1:0,o=new Zb(s*3/4-a),r=a>0?s-4:s;var u=0;for(n=0,e=0;n>16&255,o[u++]=i>>8&255,o[u++]=i&255;return a===2?(i=mn[t.charCodeAt(n)]<<2|mn[t.charCodeAt(n+1)]>>4,o[u++]=i&255):a===1&&(i=mn[t.charCodeAt(n)]<<10|mn[t.charCodeAt(n+1)]<<4|mn[t.charCodeAt(n+2)]>>2,o[u++]=i>>8&255,o[u++]=i&255),o}function tw(t){return Fn[t>>18&63]+Fn[t>>12&63]+Fn[t>>6&63]+Fn[t&63]}function nw(t,n,e){for(var r,i=[],a=n;au?u:s+o));return r===1?(n=t[e-1],i+=Fn[n>>2],i+=Fn[n<<4&63],i+="=="):r===2&&(n=(t[e-2]<<8)+t[e-1],i+=Fn[n>>10],i+=Fn[n>>4&63],i+=Fn[n<<2&63],i+="="),a.push(i),a.join("")}function no(t,n,e,r,i){var a,o,s=i*8-r-1,u=(1<>1,c=-7,d=e?i-1:0,f=e?-1:1,h=t[n+d];for(d+=f,a=h&(1<<-c)-1,h>>=-c,c+=s;c>0;a=a*256+t[n+d],d+=f,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=r;c>0;o=o*256+t[n+d],d+=f,c-=8);if(a===0)a=1-l;else{if(a===u)return o?NaN:(h?-1:1)*Infinity;o=o+Math.pow(2,r),a=a-l}return(h?-1:1)*o*Math.pow(2,a-r)}function uf(t,n,e,r,i,a){var o,s,u,l=a*8-i-1,c=(1<>1,f=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,p=r?1:-1,g=n<0||n===0&&1/n<0?1:0;for(n=Math.abs(n),isNaN(n)||n===Infinity?(s=isNaN(n)?1:0,o=c):(o=Math.floor(Math.log(n)/Math.LN2),n*(u=Math.pow(2,-o))<1&&(o--,u*=2),o+d>=1?n+=f/u:n+=f*Math.pow(2,1-d),n*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(n*u-1)*Math.pow(2,i),o=o+d):(s=n*Math.pow(2,d-1)*Math.pow(2,i),o=0));i>=8;t[e+h]=s&255,h+=p,s/=256,i-=8);for(o=o<0;t[e+h]=o&255,h+=p,o/=256,l-=8);t[e+h-p]|=g*128}function ro(){return ee.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Wn(t,n){if(ro()=ro())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ro().toString(16)+" bytes");return t|0}function cw(t){return+t!=t&&(t=0),ee.alloc(+t)}function Rn(t){return!!(t!=null&&t._isBuffer)}function mf(t,n){if(Rn(t))return t.length;if(typeof ArrayBuffer!="undefined"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;typeof t!="string"&&(t=""+t);var e=t.length;if(e===0)return 0;for(var r=!1;;)switch(n){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return oo(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return e*2;case"hex":return e>>>1;case"base64":return kf(t).length;default:if(r)return oo(t).length;n=(""+n).toLowerCase(),r=!0}}function uw(t,n,e){var r=!1;if((n===void 0||n<0)&&(n=0),n>this.length||((e===void 0||e>this.length)&&(e=this.length),e<=0)||(e>>>=0,n>>>=0,e<=n))return"";for(t||(t="utf8");;)switch(t){case"hex":return ww(this,n,e);case"utf8":case"utf-8":return bf(this,n,e);case"ascii":return yw(this,n,e);case"latin1":case"binary":return bw(this,n,e);case"base64":return gw(this,n,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ew(this,n,e);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function _r(t,n,e){var r=t[n];t[n]=t[e],t[e]=r}function gf(t,n,e,r,i){if(t.length===0)return-1;if(typeof e=="string"?(r=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=i?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(i)return-1;e=t.length-1}else if(e<0)if(i)e=0;else return-1;if(typeof n=="string"&&(n=ee.from(n,r)),Rn(n))return n.length===0?-1:vf(t,n,e,r,i);if(typeof n=="number")return n=n&255,ee.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?i?Uint8Array.prototype.indexOf.call(t,n,e):Uint8Array.prototype.lastIndexOf.call(t,n,e):vf(t,[n],e,r,i);throw new TypeError("val must be string, number or Buffer")}function vf(t,n,e,r,i){var a=1,o=t.length,s=n.length;if(r!==void 0&&(r=String(r).toLowerCase(),r==="ucs2"||r==="ucs-2"||r==="utf16le"||r==="utf-16le")){if(t.length<2||n.length<2)return-1;a=2,o/=2,s/=2,e/=2}function u(h,p){return a===1?h[p]:h.readUInt16BE(p*a)}var l;if(i){var c=-1;for(l=e;lo&&(e=o-s),l=e;l>=0;l--){for(var d=!0,f=0;fi&&(r=i)):r=i;var a=n.length;if(a%2!=0)throw new TypeError("Invalid hex string");r>a/2&&(r=a/2);for(var o=0;o239?4:a>223?3:a>191?2:1;if(i+s<=e){var u,l,c,d;switch(s){case 1:a<128&&(o=a);break;case 2:u=t[i+1],(u&192)==128&&(d=(a&31)<<6|u&63,d>127&&(o=d));break;case 3:u=t[i+1],l=t[i+2],(u&192)==128&&(l&192)==128&&(d=(a&15)<<12|(u&63)<<6|l&63,d>2047&&(d<55296||d>57343)&&(o=d));break;case 4:u=t[i+1],l=t[i+2],c=t[i+3],(u&192)==128&&(l&192)==128&&(c&192)==128&&(d=(a&15)<<18|(u&63)<<12|(l&63)<<6|c&63,d>65535&&d<1114112&&(o=d))}}o===null?(o=65533,s=1):o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|o&1023),r.push(o),i+=s}return vw(r)}function vw(t){var n=t.length;if(n<=wf)return String.fromCharCode.apply(String,t);for(var e="",r=0;rr)&&(e=r);for(var i="",a=n;ae)throw new RangeError("Trying to access beyond buffer length")}function qt(t,n,e,r,i,a){if(!Rn(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(n>i||nt.length)throw new RangeError("Index out of range")}function io(t,n,e,r){n<0&&(n=65535+n+1);for(var i=0,a=Math.min(t.length-e,2);i>>(r?i:1-i)*8}function ao(t,n,e,r){n<0&&(n=4294967295+n+1);for(var i=0,a=Math.min(t.length-e,4);i>>(r?i:3-i)*8&255}function Ef(t,n,e,r,i,a){if(e+r>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Sf(t,n,e,r,i){return i||Ef(t,n,e,4),uf(t,n,e,r,23,4),e+4}function xf(t,n,e,r,i){return i||Ef(t,n,e,8),uf(t,n,e,r,52,8),e+8}function xw(t){if(t=kw(t).replace(Sw,""),t.length<2)return"";for(;t.length%4!=0;)t=t+"=";return t}function kw(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function _w(t){return t<16?"0"+t.toString(16):t.toString(16)}function oo(t,n){n=n||Infinity;for(var e,r=t.length,i=null,a=[],o=0;o55295&&e<57344){if(!i){if(e>56319){(n-=3)>-1&&a.push(239,191,189);continue}else if(o+1===r){(n-=3)>-1&&a.push(239,191,189);continue}i=e;continue}if(e<56320){(n-=3)>-1&&a.push(239,191,189),i=e;continue}e=(i-55296<<10|e-56320)+65536}else i&&(n-=3)>-1&&a.push(239,191,189);if(i=null,e<128){if((n-=1)<0)break;a.push(e)}else if(e<2048){if((n-=2)<0)break;a.push(e>>6|192,e&63|128)}else if(e<65536){if((n-=3)<0)break;a.push(e>>12|224,e>>6&63|128,e&63|128)}else if(e<1114112){if((n-=4)<0)break;a.push(e>>18|240,e>>12&63|128,e>>6&63|128,e&63|128)}else throw new Error("Invalid code point")}return a}function Tw(t){for(var n=[],e=0;e>8,i=e%256,a.push(i),a.push(r);return a}function kf(t){return ew(xw(t))}function so(t,n,e,r){for(var i=0;i=n.length||i>=t.length);++i)n[i+e]=t[i];return i}function Dw(t){return t!==t}function _f(t){return t!=null&&(!!t._isBuffer||Tf(t)||Cw(t))}function Tf(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function Cw(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&Tf(t.slice(0,0))}var Fn,mn,Zb,Al,rw,df,ff,iw,wf,Sw,Df=zu(()=>{Fn=[],mn=[],Zb=typeof Uint8Array!="undefined"?Uint8Array:Array,Al=!1;rw={}.toString,df=Array.isArray||function(t){return rw.call(t)=="[object Array]"};ff=50;ee.TYPED_ARRAY_SUPPORT=window.TYPED_ARRAY_SUPPORT!==void 0?window.TYPED_ARRAY_SUPPORT:!0;iw=ro();ee.poolSize=8192;ee._augment=function(t){return t.__proto__=ee.prototype,t};ee.from=function(t,n,e){return hf(null,t,n,e)};ee.TYPED_ARRAY_SUPPORT&&(ee.prototype.__proto__=Uint8Array.prototype,ee.__proto__=Uint8Array);ee.alloc=function(t,n,e){return aw(null,t,n,e)};ee.allocUnsafe=function(t){return Ll(null,t)};ee.allocUnsafeSlow=function(t){return Ll(null,t)};ee.isBuffer=_f;ee.compare=function(n,e){if(!Rn(n)||!Rn(e))throw new TypeError("Arguments must be Buffers");if(n===e)return 0;for(var r=n.length,i=e.length,a=0,o=Math.min(r,i);a0&&(n=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(n+=" ... ")),""};ee.prototype.compare=function(n,e,r,i,a){if(!Rn(n))throw new TypeError("Argument must be a Buffer");if(e===void 0&&(e=0),r===void 0&&(r=n?n.length:0),i===void 0&&(i=0),a===void 0&&(a=this.length),e<0||r>n.length||i<0||a>this.length)throw new RangeError("out of range index");if(i>=a&&e>=r)return 0;if(i>=a)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,i>>>=0,a>>>=0,this===n)return 0;for(var o=a-i,s=r-e,u=Math.min(o,s),l=this.slice(i,a),c=n.slice(e,r),d=0;da)&&(r=a),n.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return dw(this,n,e,r);case"utf8":case"utf-8":return fw(this,n,e,r);case"ascii":return yf(this,n,e,r);case"latin1":case"binary":return hw(this,n,e,r);case"base64":return pw(this,n,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return mw(this,n,e,r);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}};ee.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};wf=4096;ee.prototype.slice=function(n,e){var r=this.length;n=~~n,e=e===void 0?r:~~e,n<0?(n+=r,n<0&&(n=0)):n>r&&(n=r),e<0?(e+=r,e<0&&(e=0)):e>r&&(e=r),e0&&(a*=256);)i+=this[n+--e]*a;return i};ee.prototype.readUInt8=function(n,e){return e||Et(n,1,this.length),this[n]};ee.prototype.readUInt16LE=function(n,e){return e||Et(n,2,this.length),this[n]|this[n+1]<<8};ee.prototype.readUInt16BE=function(n,e){return e||Et(n,2,this.length),this[n]<<8|this[n+1]};ee.prototype.readUInt32LE=function(n,e){return e||Et(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+this[n+3]*16777216};ee.prototype.readUInt32BE=function(n,e){return e||Et(n,4,this.length),this[n]*16777216+(this[n+1]<<16|this[n+2]<<8|this[n+3])};ee.prototype.readIntLE=function(n,e,r){n=n|0,e=e|0,r||Et(n,e,this.length);for(var i=this[n],a=1,o=0;++o=a&&(i-=Math.pow(2,8*e)),i};ee.prototype.readIntBE=function(n,e,r){n=n|0,e=e|0,r||Et(n,e,this.length);for(var i=e,a=1,o=this[n+--i];i>0&&(a*=256);)o+=this[n+--i]*a;return a*=128,o>=a&&(o-=Math.pow(2,8*e)),o};ee.prototype.readInt8=function(n,e){return e||Et(n,1,this.length),this[n]&128?(255-this[n]+1)*-1:this[n]};ee.prototype.readInt16LE=function(n,e){e||Et(n,2,this.length);var r=this[n]|this[n+1]<<8;return r&32768?r|4294901760:r};ee.prototype.readInt16BE=function(n,e){e||Et(n,2,this.length);var r=this[n+1]|this[n]<<8;return r&32768?r|4294901760:r};ee.prototype.readInt32LE=function(n,e){return e||Et(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24};ee.prototype.readInt32BE=function(n,e){return e||Et(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]};ee.prototype.readFloatLE=function(n,e){return e||Et(n,4,this.length),no(this,n,!0,23,4)};ee.prototype.readFloatBE=function(n,e){return e||Et(n,4,this.length),no(this,n,!1,23,4)};ee.prototype.readDoubleLE=function(n,e){return e||Et(n,8,this.length),no(this,n,!0,52,8)};ee.prototype.readDoubleBE=function(n,e){return e||Et(n,8,this.length),no(this,n,!1,52,8)};ee.prototype.writeUIntLE=function(n,e,r,i){if(n=+n,e=e|0,r=r|0,!i){var a=Math.pow(2,8*r)-1;qt(this,n,e,r,a,0)}var o=1,s=0;for(this[e]=n&255;++s=0&&(s*=256);)this[e+o]=n/s&255;return e+r};ee.prototype.writeUInt8=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,1,255,0),ee.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[e]=n&255,e+1};ee.prototype.writeUInt16LE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,2,65535,0),ee.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8):io(this,n,e,!0),e+2};ee.prototype.writeUInt16BE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,2,65535,0),ee.TYPED_ARRAY_SUPPORT?(this[e]=n>>>8,this[e+1]=n&255):io(this,n,e,!1),e+2};ee.prototype.writeUInt32LE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,4,4294967295,0),ee.TYPED_ARRAY_SUPPORT?(this[e+3]=n>>>24,this[e+2]=n>>>16,this[e+1]=n>>>8,this[e]=n&255):ao(this,n,e,!0),e+4};ee.prototype.writeUInt32BE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,4,4294967295,0),ee.TYPED_ARRAY_SUPPORT?(this[e]=n>>>24,this[e+1]=n>>>16,this[e+2]=n>>>8,this[e+3]=n&255):ao(this,n,e,!1),e+4};ee.prototype.writeIntLE=function(n,e,r,i){if(n=+n,e=e|0,!i){var a=Math.pow(2,8*r-1);qt(this,n,e,r,a-1,-a)}var o=0,s=1,u=0;for(this[e]=n&255;++o>0)-u&255;return e+r};ee.prototype.writeIntBE=function(n,e,r,i){if(n=+n,e=e|0,!i){var a=Math.pow(2,8*r-1);qt(this,n,e,r,a-1,-a)}var o=r-1,s=1,u=0;for(this[e+o]=n&255;--o>=0&&(s*=256);)n<0&&u===0&&this[e+o+1]!==0&&(u=1),this[e+o]=(n/s>>0)-u&255;return e+r};ee.prototype.writeInt8=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,1,127,-128),ee.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[e]=n&255,e+1};ee.prototype.writeInt16LE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,2,32767,-32768),ee.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8):io(this,n,e,!0),e+2};ee.prototype.writeInt16BE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,2,32767,-32768),ee.TYPED_ARRAY_SUPPORT?(this[e]=n>>>8,this[e+1]=n&255):io(this,n,e,!1),e+2};ee.prototype.writeInt32LE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,4,2147483647,-2147483648),ee.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8,this[e+2]=n>>>16,this[e+3]=n>>>24):ao(this,n,e,!0),e+4};ee.prototype.writeInt32BE=function(n,e,r){return n=+n,e=e|0,r||qt(this,n,e,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),ee.TYPED_ARRAY_SUPPORT?(this[e]=n>>>24,this[e+1]=n>>>16,this[e+2]=n>>>8,this[e+3]=n&255):ao(this,n,e,!1),e+4};ee.prototype.writeFloatLE=function(n,e,r){return Sf(this,n,e,!0,r)};ee.prototype.writeFloatBE=function(n,e,r){return Sf(this,n,e,!1,r)};ee.prototype.writeDoubleLE=function(n,e,r){return xf(this,n,e,!0,r)};ee.prototype.writeDoubleBE=function(n,e,r){return xf(this,n,e,!1,r)};ee.prototype.copy=function(n,e,r,i){if(r||(r=0),!i&&i!==0&&(i=this.length),e>=n.length&&(e=n.length),e||(e=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),n.length-e=0;--o)n[o+e]=this[o+r];else if(a<1e3||!ee.TYPED_ARRAY_SUPPORT)for(o=0;o>>0,r=r===void 0?this.length:r>>>0,n||(n=0);var o;if(typeof n=="number")for(o=e;o{var Tr=(Df(),Mf);if(Tr&&Tr.default){lo.exports=Tr.default;for(let t in Tr)lo.exports[t]=Tr[t]}else Tr&&(lo.exports=Tr)});var fo=Fe(Re=>{"use strict";var ur=to(),kt=sf(),If=Cf().Buffer;window.__TYPEDARRAY_POOL||(window.__TYPEDARRAY_POOL={UINT8:kt([32,0]),UINT16:kt([32,0]),UINT32:kt([32,0]),BIGUINT64:kt([32,0]),INT8:kt([32,0]),INT16:kt([32,0]),INT32:kt([32,0]),BIGINT64:kt([32,0]),FLOAT:kt([32,0]),DOUBLE:kt([32,0]),DATA:kt([32,0]),UINT8C:kt([32,0]),BUFFER:kt([32,0])});var Iw=typeof Uint8ClampedArray!="undefined",Aw=typeof BigUint64Array!="undefined",Lw=typeof BigInt64Array!="undefined",ct=window.__TYPEDARRAY_POOL;ct.UINT8C||(ct.UINT8C=kt([32,0]));ct.BIGUINT64||(ct.BIGUINT64=kt([32,0]));ct.BIGINT64||(ct.BIGINT64=kt([32,0]));ct.BUFFER||(ct.BUFFER=kt([32,0]));var co=ct.DATA,uo=ct.BUFFER;Re.free=function(n){if(If.isBuffer(n))uo[ur.log2(n.length)].push(n);else{if(Object.prototype.toString.call(n)!=="[object ArrayBuffer]"&&(n=n.buffer),!n)return;var e=n.length||n.byteLength,r=ur.log2(e)|0;co[r].push(n)}};function Af(t){if(!!t){var n=t.length||t.byteLength,e=ur.log2(n);co[e].push(t)}}function Pw(t){Af(t.buffer)}Re.freeUint8=Re.freeUint16=Re.freeUint32=Re.freeBigUint64=Re.freeInt8=Re.freeInt16=Re.freeInt32=Re.freeBigInt64=Re.freeFloat32=Re.freeFloat=Re.freeFloat64=Re.freeDouble=Re.freeUint8Clamped=Re.freeDataView=Pw;Re.freeArrayBuffer=Af;Re.freeBuffer=function(n){uo[ur.log2(n.length)].push(n)};Re.malloc=function(n,e){if(e===void 0||e==="arraybuffer")return Wt(n);switch(e){case"uint8":return Nl(n);case"uint16":return Lf(n);case"uint32":return Pf(n);case"int8":return Of(n);case"int16":return Nf(n);case"int32":return Ff(n);case"float":case"float32":return Rf(n);case"double":case"float64":return Hf(n);case"uint8_clamped":return Bf(n);case"bigint64":return $f(n);case"biguint64":return Kf(n);case"buffer":return jf(n);case"data":case"dataview":return Uf(n);default:return null}return null};function Wt(t){var t=ur.nextPow2(t),n=ur.log2(t),e=co[n];return e.length>0?e.pop():new ArrayBuffer(t)}Re.mallocArrayBuffer=Wt;function Nl(t){return new Uint8Array(Wt(t),0,t)}Re.mallocUint8=Nl;function Lf(t){return new Uint16Array(Wt(2*t),0,t)}Re.mallocUint16=Lf;function Pf(t){return new Uint32Array(Wt(4*t),0,t)}Re.mallocUint32=Pf;function Of(t){return new Int8Array(Wt(t),0,t)}Re.mallocInt8=Of;function Nf(t){return new Int16Array(Wt(2*t),0,t)}Re.mallocInt16=Nf;function Ff(t){return new Int32Array(Wt(4*t),0,t)}Re.mallocInt32=Ff;function Rf(t){return new Float32Array(Wt(4*t),0,t)}Re.mallocFloat32=Re.mallocFloat=Rf;function Hf(t){return new Float64Array(Wt(8*t),0,t)}Re.mallocFloat64=Re.mallocDouble=Hf;function Bf(t){return Iw?new Uint8ClampedArray(Wt(t),0,t):Nl(t)}Re.mallocUint8Clamped=Bf;function Kf(t){return Aw?new BigUint64Array(Wt(8*t),0,t):null}Re.mallocBigUint64=Kf;function $f(t){return Lw?new BigInt64Array(Wt(8*t),0,t):null}Re.mallocBigInt64=$f;function Uf(t){return new DataView(Wt(t),0,t)}Re.mallocDataView=Uf;function jf(t){t=ur.nextPow2(t);var n=ur.log2(t),e=uo[n];return e.length>0?e.pop():new If(t)}Re.mallocBuffer=jf;Re.clearCache=function(){for(var n=0;n<32;++n)ct.UINT8[n].length=0,ct.UINT16[n].length=0,ct.UINT32[n].length=0,ct.INT8[n].length=0,ct.INT16[n].length=0,ct.INT32[n].length=0,ct.FLOAT[n].length=0,ct.DOUBLE[n].length=0,ct.BIGUINT64[n].length=0,ct.BIGINT64[n].length=0,ct.UINT8C[n].length=0,co[n].length=0,uo[n].length=0}});var Yf=Fe((U1,Wf)=>{"use strict";Wf.exports=Ow;var ho=32;function Ow(t,n){n<=4*ho?po(0,n-1,t):go(0,n-1,t)}function po(t,n,e){for(var r=2*(t+1),i=t+1;i<=n;++i){for(var a=e[r++],o=e[r++],s=i,u=r-2;s-- >t;){var l=e[u-2],c=e[u-1];if(le[n+1]:!0}function mo(t,n,e,r){t*=2;var i=r[t];return i>1,s=o-r,u=o+r,l=i,c=s,d=o,f=u,h=a,p=t+1,g=n-1,w=0;Yn(l,c,e)&&(w=l,l=c,c=w),Yn(f,h,e)&&(w=f,f=h,h=w),Yn(l,d,e)&&(w=l,l=d,d=w),Yn(c,d,e)&&(w=c,c=d,d=w),Yn(l,f,e)&&(w=l,l=f,f=w),Yn(d,f,e)&&(w=d,d=f,f=w),Yn(c,h,e)&&(w=c,c=h,h=w),Yn(c,d,e)&&(w=c,c=d,d=w),Yn(f,h,e)&&(w=f,f=h,h=w);for(var S=e[2*c],_=e[2*c+1],k=e[2*f],P=e[2*f+1],I=2*l,D=2*d,N=2*h,K=2*i,j=2*o,X=2*a,Q=0;Q<2;++Q){var ie=e[I+Q],Y=e[D+Q],J=e[N+Q];e[K+Q]=ie,e[j+Q]=Y,e[X+Q]=J}Vf(s,t,e),Vf(u,n,e);for(var ne=p;ne<=g;++ne)if(mo(ne,S,_,e))ne!==p&&zf(ne,p,e),++p;else if(!mo(ne,k,P,e))for(;;)if(mo(g,k,P,e)){mo(g,S,_,e)?(Nw(ne,p,g,e),++p,--g):(zf(ne,g,e),--g);break}else{if(--g{"use strict";Jf.exports={init:Rw,sweepBipartite:Hw,sweepComplete:Bw,scanBipartite:Kw,scanComplete:$w};var ut=fo(),Fw=to(),vo=Yf(),nn=1<<28,Mr=1024,_t=ut.mallocInt32(Mr),Jn=ut.mallocInt32(Mr),Gn=ut.mallocInt32(Mr),Dr=ut.mallocInt32(Mr),ri=ut.mallocInt32(Mr),Gi=ut.mallocInt32(Mr),Ae=ut.mallocDouble(Mr*8);function Rw(t){var n=Fw.nextPow2(t);_t.length>>1;vo(Ae,_);for(var k=0,P=0,p=0;p<_;++p){var I=Ae[2*p+1]|0;if(I>=nn)I=I-nn|0,ii(Gn,Dr,P--,I);else if(I>=0)ii(_t,Jn,k--,I);else if(I<=-nn){I=-I-nn|0;for(var D=0;D>>1;vo(Ae,_);for(var k=0,P=0,I=0,p=0;p<_;++p){var D=Ae[2*p+1]|0,N=D&1;if(p<_-1&&D>>1==Ae[2*p+3]>>1&&(N=2,p+=1),D<0){for(var K=-(D>>1)-1,j=0;j>1)-1;N===0?ii(_t,Jn,k--,K):N===1?ii(Gn,Dr,P--,K):N===2&&ii(ri,Gi,I--,K)}}}function Kw(t,n,e,r,i,a,o,s,u,l,c,d){var f=0,h=2*t,p=n,g=n+t,w=1,S=1;r?S=nn:w=nn;for(var _=i;_>>1;vo(Ae,D);for(var N=0,_=0;_=nn?(j=!r,k-=nn):(j=!!r,k-=1),j)ai(_t,Jn,N++,k);else{var X=d[k],Q=h*k,ie=c[Q+n+1],Y=c[Q+n+1+t];e:for(var J=0;J>>1;vo(Ae,k);for(var P=0,g=0;g=nn)_t[P++]=w-nn;else{w-=1;var D=c[w],N=f*w,K=l[N+n+1],j=l[N+n+1+t];e:for(var X=0;X=0;--X)if(_t[X]===w){for(var J=X+1;J{"use strict";var Cr="d",oi="ax",Gf="vv",Rl="fp",Qi="es",yo="rs",Hl="re",Xi="rb",Qf="ri",si="rp",bo="bs",Bl="be",Zi="bb",Xf="bi",li="bp",Kl="rv",$l="Q",Ul=[Cr,oi,Gf,yo,Hl,Xi,Qf,bo,Bl,Zi,Xf];function Uw(t,n,e){var r="bruteForce"+(t?"Red":"Blue")+(n?"Flip":"")+(e?"Full":""),i=["function ",r,"(",Ul.join(),"){","var ",Qi,"=2*",Cr,";"],a="for(var i="+yo+","+si+"="+Qi+"*"+yo+";i<"+Hl+";++i,"+si+"+="+Qi+"){var x0="+Xi+"["+oi+"+"+si+"],x1="+Xi+"["+oi+"+"+si+"+"+Cr+"],xi="+Qf+"[i];",o="for(var j="+bo+","+li+"="+Qi+"*"+bo+";j<"+Bl+";++j,"+li+"+="+Qi+"){var y0="+Zi+"["+oi+"+"+li+"],"+(e?"y1="+Zi+"["+oi+"+"+li+"+"+Cr+"],":"")+"yi="+Xf+"[j];";return t?i.push(a,$l,":",o):i.push(o,$l,":",a),e?i.push("if(y1"+Bl+"-"+bo+"){"),t?(a(!0,!1),i.push("}else{"),a(!1,!1)):(i.push("if("+Rl+"){"),a(!0,!0),i.push("}else{"),a(!0,!1),i.push("}}else{if("+Rl+"){"),a(!1,!0),i.push("}else{"),a(!1,!1),i.push("}")),i.push("}}return "+n);var o=e.join("")+i.join(""),s=new Function(o);return s()}jl.partial=Zf(!1);jl.full=Zf(!0)});var zl=Fe((V1,th)=>{"use strict";th.exports=zw;var jw="for(var j=2*a,k=j*c,l=k,m=c,n=b,o=a+b,p=c;d>p;++p,k+=j){var _;if($)if(m===p)m+=1,l+=j;else{for(var s=0;j>s;++s){var t=e[k+s];e[k+s]=e[l],e[l++]=t}var u=f[p];f[p]=f[m],f[m++]=u}}return m";function zw(t,n){var e="abcdef".split("").concat(n),r=[];return t.indexOf("lo")>=0&&r.push("lo=e[k+n]"),t.indexOf("hi")>=0&&r.push("hi=e[k+o]"),e.push(jw.replace("_",r.join()).replace("$",t)),Function.apply(void 0,e)}});var ih=Fe((q1,rh)=>{"use strict";rh.exports=Yw;var Vw=zl(),nh=Vw("loe&&i[d+n]>l;--c,d-=o){for(var f=d,h=d+o,p=0;p>>1,l=2*t,c=u,d=i[l*u+n];o=w?(c=g,d=w):p>=_?(c=h,d=p):(c=S,d=_):w>=_?(c=g,d=w):_>=p?(c=h,d=p):(c=S,d=_);for(var k=l*(s-1),P=l*c,I=0;I{"use strict";uh.exports=sE;var ci=fo(),Vl=to(),ah=eh(),Jw=ah.partial,Gw=ah.full,dr=Fl(),Qw=ih(),ui=zl(),oh=128,Xw=1<<22,Zw=1<<22,eE=ui("!(lo>=p0)&&!(p1>=hi)",["p0","p1"]),sh=ui("lo===p0",["p0"]),tE=ui("lo0;){l-=1;var f=l*ql,h=$t[f],p=$t[f+1],g=$t[f+2],w=$t[f+3],S=$t[f+4],_=$t[f+5],k=l*Wl,P=Ir[k],I=Ir[k+1],D=_&1,N=!!(_&16),K=i,j=a,X=s,Q=u;if(D&&(K=s,j=u,X=i,Q=a),!(_&2&&(g=tE(t,h,p,g,K,j,I),p>=g))&&!(_&4&&(p=nE(t,h,p,g,K,j,P),p>=g))){var ie=g-p,Y=S-w;if(N){if(t*ie*(ie+Y){"use strict";ph.exports=fE;var fr=fo(),wo=Fl(),lE=dh();function cE(t,n){for(var e=0;e>>1;if(!(o<=0)){var s,u=fr.mallocDouble(2*o*i),l=fr.mallocInt32(i);if(i=fh(t,o,u,l),i>0){if(o===1&&r)wo.init(i),s=wo.sweepComplete(o,e,0,i,u,l,0,i,u,l);else{var c=fr.mallocDouble(2*o*a),d=fr.mallocInt32(a);a=fh(n,o,c,d),a>0&&(wo.init(i+a),o===1?s=wo.sweepBipartite(o,e,0,i,u,l,0,a,c,d):s=lE(o,e,r,i,u,l,a,c,d),fr.free(c),fr.free(d))}fr.free(u),fr.free(l)}return s}}}var ea;function hh(t,n){ea.push([t,n])}function uE(t){return ea=[],Eo(t,t,hh,!0),ea}function dE(t,n){return ea=[],Eo(t,n,hh,!1),ea}function fE(t,n,e){var r;switch(arguments.length){case 1:return uE(t);case 2:return typeof n=="function"?Eo(t,t,n,!0):dE(t,n);case 3:return Eo(t,n,e,!1);default:throw new Error("box-intersect: Invalid arguments")}}});var Fh=Fe((G1,_o)=>{var gh,vh,yh,bh,wh,Eh,Sh,xh,kh,xo,Yl,_h,Th,Mh,di,Dh,Ch,Ih,Ah,Lh,Ph,Oh,Nh,ko;(function(t){var n=typeof window=="object"?window:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(r){t(e(n,e(r)))}):typeof _o=="object"&&typeof _o.exports=="object"?t(e(n,e(_o.exports))):t(e(n));function e(r,i){return r!==n&&(typeof Object.create=="function"?Object.defineProperty(r,"__esModule",{value:!0}):r.__esModule=!0),function(a,o){return r[a]=i?i(a,o):o}}})(function(t){var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(r[a]=i[a])};gh=function(r,i){if(typeof i!="function"&&i!==null)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");n(r,i);function a(){this.constructor=r}r.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)},vh=Object.assign||function(r){for(var i,a=1,o=arguments.length;a=0;c--)(l=r[c])&&(u=(s<3?l(u):s>3?l(i,a,u):l(i,a))||u);return s>3&&u&&Object.defineProperty(i,a,u),u},wh=function(r,i){return function(a,o){i(a,o,r)}},Eh=function(r,i){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,i)},Sh=function(r,i,a,o){function s(u){return u instanceof a?u:new a(function(l){l(u)})}return new(a||(a=Promise))(function(u,l){function c(h){try{f(o.next(h))}catch(p){l(p)}}function d(h){try{f(o.throw(h))}catch(p){l(p)}}function f(h){h.done?u(h.value):s(h.value).then(c,d)}f((o=o.apply(r,i||[])).next())})},xh=function(r,i){var a={label:0,sent:function(){if(u[0]&1)throw u[1];return u[1]},trys:[],ops:[]},o,s,u,l;return l={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function c(f){return function(h){return d([f,h])}}function d(f){if(o)throw new TypeError("Generator is already executing.");for(;a;)try{if(o=1,s&&(u=f[0]&2?s.return:f[0]?s.throw||((u=s.return)&&u.call(s),0):s.next)&&!(u=u.call(s,f[1])).done)return u;switch(s=0,u&&(f=[f[0]&2,u.value]),f[0]){case 0:case 1:u=f;break;case 4:return a.label++,{value:f[1],done:!1};case 5:a.label++,s=f[1],f=[0];continue;case 7:f=a.ops.pop(),a.trys.pop();continue;default:if(u=a.trys,!(u=u.length>0&&u[u.length-1])&&(f[0]===6||f[0]===2)){a=0;continue}if(f[0]===3&&(!u||f[1]>u[0]&&f[1]=r.length&&(r=void 0),{value:r&&r[o++],done:!r}}};throw new TypeError(i?"Object is not iterable.":"Symbol.iterator is not defined.")},Yl=function(r,i){var a=typeof Symbol=="function"&&r[Symbol.iterator];if(!a)return r;var o=a.call(r),s,u=[],l;try{for(;(i===void 0||i-- >0)&&!(s=o.next()).done;)u.push(s.value)}catch(c){l={error:c}}finally{try{s&&!s.done&&(a=o.return)&&a.call(o)}finally{if(l)throw l.error}}return u},_h=function(){for(var r=[],i=0;i1||c(g,w)})})}function c(g,w){try{d(o[g](w))}catch(S){p(u[0][3],S)}}function d(g){g.value instanceof di?Promise.resolve(g.value.v).then(f,h):p(u[0][2],g)}function f(g){c("next",g)}function h(g){c("throw",g)}function p(g,w){g(w),u.shift(),u.length&&c(u[0][0],u[0][1])}},Ch=function(r){var i,a;return i={},o("next"),o("throw",function(s){throw s}),o("return"),i[Symbol.iterator]=function(){return this},i;function o(s,u){i[s]=r[s]?function(l){return(a=!a)?{value:di(r[s](l)),done:s==="return"}:u?u(l):l}:u}},Ih=function(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=r[Symbol.asyncIterator],a;return i?i.call(r):(r=typeof xo=="function"?xo(r):r[Symbol.iterator](),a={},o("next"),o("throw"),o("return"),a[Symbol.asyncIterator]=function(){return this},a);function o(u){a[u]=r[u]&&function(l){return new Promise(function(c,d){l=r[u](l),s(c,d,l.done,l.value)})}}function s(u,l,c,d){Promise.resolve(d).then(function(f){u({value:f,done:c})},l)}},Ah=function(r,i){return Object.defineProperty?Object.defineProperty(r,"raw",{value:i}):r.raw=i,r};var e=Object.create?function(r,i){Object.defineProperty(r,"default",{enumerable:!0,value:i})}:function(r,i){r.default=i};Lh=function(r){if(r&&r.__esModule)return r;var i={};if(r!=null)for(var a in r)a!=="default"&&Object.prototype.hasOwnProperty.call(r,a)&&ko(i,r,a);return e(i,r),i},Ph=function(r){return r&&r.__esModule?r:{default:r}},Oh=function(r,i,a,o){if(a==="a"&&!o)throw new TypeError("Private accessor was defined without a getter");if(typeof i=="function"?r!==i||!o:!i.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return a==="m"?o:a==="a"?o.call(r):o?o.value:i.get(r)},Nh=function(r,i,a,o,s){if(o==="m")throw new TypeError("Private method is not writable");if(o==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof i=="function"?r!==i||!s:!i.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return o==="a"?s.call(r,a):s?s.value=a:i.set(r,a),a},t("__extends",gh),t("__assign",vh),t("__rest",yh),t("__decorate",bh),t("__param",wh),t("__metadata",Eh),t("__awaiter",Sh),t("__generator",xh),t("__exportStar",kh),t("__createBinding",ko),t("__values",xo),t("__read",Yl),t("__spread",_h),t("__spreadArrays",Th),t("__spreadArray",Mh),t("__await",di),t("__asyncGenerator",Dh),t("__asyncDelegator",Ch),t("__asyncValues",Ih),t("__makeTemplateObject",Ah),t("__importStar",Lh),t("__importDefault",Ph),t("__classPrivateFieldGet",Oh),t("__classPrivateFieldSet",Nh)})});var rc=Fe(Ne=>{"use strict";Object.defineProperty(Ne,"__esModule",{value:!0});var nt=require("obsidian"),tc="YYYY-MM-DD",nc="gggg-[W]ww",qh="YYYY-MM",Wh="YYYY-[Q]Q",Yh="YYYY";function oa(t){let n=window.app.plugins.getPlugin("periodic-notes");return n&&n.settings?.[t]?.enabled}function sa(){try{let{internalPlugins:t,plugins:n}=window.app;if(oa("daily")){let{format:a,folder:o,template:s}=n.getPlugin("periodic-notes")?.settings?.daily||{};return{format:a||tc,folder:o?.trim()||"",template:s?.trim()||""}}let{folder:e,format:r,template:i}=t.getPluginById("daily-notes")?.instance?.options||{};return{format:r||tc,folder:e?.trim()||"",template:i?.trim()||""}}catch(t){console.info("No custom daily note settings found!",t)}}function la(){try{let t=window.app.plugins,n=t.getPlugin("calendar")?.options,e=t.getPlugin("periodic-notes")?.settings?.weekly;if(oa("weekly"))return{format:e.format||nc,folder:e.folder?.trim()||"",template:e.template?.trim()||""};let r=n||{};return{format:r.weeklyNoteFormat||nc,folder:r.weeklyNoteFolder?.trim()||"",template:r.weeklyNoteTemplate?.trim()||""}}catch(t){console.info("No custom weekly note settings found!",t)}}function ca(){let t=window.app.plugins;try{let n=oa("monthly")&&t.getPlugin("periodic-notes")?.settings?.monthly||{};return{format:n.format||qh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom monthly note settings found!",n)}}function ua(){let t=window.app.plugins;try{let n=oa("quarterly")&&t.getPlugin("periodic-notes")?.settings?.quarterly||{};return{format:n.format||Wh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom quarterly note settings found!",n)}}function da(){let t=window.app.plugins;try{let n=oa("yearly")&&t.getPlugin("periodic-notes")?.settings?.yearly||{};return{format:n.format||Yh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom yearly note settings found!",n)}}function Jh(...t){let n=[];for(let r=0,i=t.length;r{let _=r(),k=t.clone().set({hour:_.get("hour"),minute:_.get("minute"),second:_.get("second")});return p&&k.add(parseInt(g,10),w),S?k.format(S.substring(1).trim()):k.format(a)}).replace(/{{\s*yesterday\s*}}/gi,t.clone().subtract(1,"day").format(a)).replace(/{{\s*tomorrow\s*}}/gi,t.clone().add(1,"d").format(a)));return n.foldManager.save(d,u),d}catch(d){console.error(`Failed to create file: '${c}'`,d),new nt.Notice("Unable to create new file.")}}function IE(t,n){return n[kn(t,"day")]??null}function AE(){let{vault:t}=window.app,{folder:n}=sa(),e=t.getAbstractFileByPath(nt.normalizePath(n));if(!e)throw new Xh("Failed to find daily notes folder");let r={};return nt.Vault.recurseChildren(e,i=>{if(i instanceof nt.TFile){let a=vi(i,"day");if(a){let o=kn(a,"day");r[o]=i}}}),r}var ep=class extends Error{};function LE(){let{moment:t}=window,n=t.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;n;)e.push(e.shift()),n--;return e}function PE(t){return LE().indexOf(t.toLowerCase())}async function tp(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=la(),[a,o]=await gi(e),s=t.format(r),u=await fa(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*title\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(c,d,f)=>{let h=PE(d);return t.weekday(h).format(f.trim())}));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new nt.Notice("Unable to create new file.")}}function OE(t,n){return n[kn(t,"week")]??null}function NE(){let t={};if(!op())return t;let{vault:n}=window.app,{folder:e}=la(),r=n.getAbstractFileByPath(nt.normalizePath(e));if(!r)throw new ep("Failed to find weekly notes folder");return nt.Vault.recurseChildren(r,i=>{if(i instanceof nt.TFile){let a=vi(i,"week");if(a){let o=kn(a,"week");t[o]=i}}}),t}var np=class extends Error{};async function rp(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=ca(),[a,o]=await gi(e),s=t.format(r),u=await fa(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new nt.Notice("Unable to create new file.")}}function FE(t,n){return n[kn(t,"month")]??null}function RE(){let t={};if(!sp())return t;let{vault:n}=window.app,{folder:e}=ca(),r=n.getAbstractFileByPath(nt.normalizePath(e));if(!r)throw new np("Failed to find monthly notes folder");return nt.Vault.recurseChildren(r,i=>{if(i instanceof nt.TFile){let a=vi(i,"month");if(a){let o=kn(a,"month");t[o]=i}}}),t}var ip=class extends Error{};async function HE(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=ua(),[a,o]=await gi(e),s=t.format(r),u=await fa(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new nt.Notice("Unable to create new file.")}}function BE(t,n){return n[kn(t,"quarter")]??null}function KE(){let t={};if(!lp())return t;let{vault:n}=window.app,{folder:e}=ua(),r=n.getAbstractFileByPath(nt.normalizePath(e));if(!r)throw new ip("Failed to find quarterly notes folder");return nt.Vault.recurseChildren(r,i=>{if(i instanceof nt.TFile){let a=vi(i,"quarter");if(a){let o=kn(a,"quarter");t[o]=i}}}),t}var ap=class extends Error{};async function $E(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=da(),[a,o]=await gi(e),s=t.format(r),u=await fa(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new nt.Notice("Unable to create new file.")}}function UE(t,n){return n[kn(t,"year")]??null}function jE(){let t={};if(!cp())return t;let{vault:n}=window.app,{folder:e}=da(),r=n.getAbstractFileByPath(nt.normalizePath(e));if(!r)throw new ap("Failed to find yearly notes folder");return nt.Vault.recurseChildren(r,i=>{if(i instanceof nt.TFile){let a=vi(i,"year");if(a){let o=kn(a,"year");t[o]=i}}}),t}function zE(){let{app:t}=window,n=t.internalPlugins.plugins["daily-notes"];if(n&&n.enabled)return!0;let e=t.plugins.getPlugin("periodic-notes");return e&&e.settings?.daily?.enabled}function op(){let{app:t}=window;if(t.plugins.getPlugin("calendar"))return!0;let n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.weekly?.enabled}function sp(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.monthly?.enabled}function lp(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.quarterly?.enabled}function cp(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.yearly?.enabled}function VE(t){return{day:sa,week:la,month:ca,quarter:ua,year:da}[t]()}function qE(t,n){return{day:Zh,month:rp,week:tp}[t](n)}Ne.DEFAULT_DAILY_NOTE_FORMAT=tc;Ne.DEFAULT_MONTHLY_NOTE_FORMAT=qh;Ne.DEFAULT_QUARTERLY_NOTE_FORMAT=Wh;Ne.DEFAULT_WEEKLY_NOTE_FORMAT=nc;Ne.DEFAULT_YEARLY_NOTE_FORMAT=Yh;Ne.appHasDailyNotesPluginLoaded=zE;Ne.appHasMonthlyNotesPluginLoaded=sp;Ne.appHasQuarterlyNotesPluginLoaded=lp;Ne.appHasWeeklyNotesPluginLoaded=op;Ne.appHasYearlyNotesPluginLoaded=cp;Ne.createDailyNote=Zh;Ne.createMonthlyNote=rp;Ne.createPeriodicNote=qE;Ne.createQuarterlyNote=HE;Ne.createWeeklyNote=tp;Ne.createYearlyNote=$E;Ne.getAllDailyNotes=AE;Ne.getAllMonthlyNotes=RE;Ne.getAllQuarterlyNotes=KE;Ne.getAllWeeklyNotes=NE;Ne.getAllYearlyNotes=jE;Ne.getDailyNote=IE;Ne.getDailyNoteSettings=sa;Ne.getDateFromFile=vi;Ne.getDateFromPath=CE;Ne.getDateUID=kn;Ne.getMonthlyNote=FE;Ne.getMonthlyNoteSettings=ca;Ne.getPeriodicNoteSettings=VE;Ne.getQuarterlyNote=BE;Ne.getQuarterlyNoteSettings=ua;Ne.getTemplateInfo=gi;Ne.getWeeklyNote=OE;Ne.getWeeklyNoteSettings=la;Ne.getYearlyNote=UE;Ne.getYearlyNoteSettings=da});var pp=Fe((Oo,hp)=>{(function(t,n){typeof Oo=="object"&&typeof hp!="undefined"?n(Oo):typeof define=="function"&&define.amd?define(["exports"],n):(t=typeof globalThis!="undefined"?globalThis:t||self,n(t.index={}))})(Oo,function(t){"use strict";var n=function(){return n=Object.assign||function(Je){for(var ht,wn=1,zn=arguments.length;wn3&&Je<21)return"\xE8";switch(Je%10){case 1:return"r";case 2:return"n";case 3:return"r";case 4:return"t";default:return"\xE8"}},firstDayOfWeek:1,time_24hr:!0};w.l10ns.cat=w.l10ns.ca=S,w.l10ns;var _=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},k={weekdays:{shorthand:["Ne","Po","\xDAt","St","\u010Ct","P\xE1","So"],longhand:["Ned\u011Ble","Pond\u011Bl\xED","\xDAter\xFD","St\u0159eda","\u010Ctvrtek","P\xE1tek","Sobota"]},months:{shorthand:["Led","\xDAn","B\u0159e","Dub","Kv\u011B","\u010Cer","\u010Cvc","Srp","Z\xE1\u0159","\u0158\xEDj","Lis","Pro"],longhand:["Leden","\xDAnor","B\u0159ezen","Duben","Kv\u011Bten","\u010Cerven","\u010Cervenec","Srpen","Z\xE1\u0159\xED","\u0158\xEDjen","Listopad","Prosinec"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" do ",weekAbbreviation:"T\xFDd.",scrollTitle:"Rolujte pro zm\u011Bnu",toggleTitle:"P\u0159epnout dopoledne/odpoledne",amPM:["dop.","odp."],yearAriaLabel:"Rok",time_24hr:!0};_.l10ns.cs=k,_.l10ns;var P=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},I={weekdays:{shorthand:["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],longhand:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"]},months:{shorthand:["Ion","Chwef","Maw","Ebr","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag"],longhand:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"]},firstDayOfWeek:1,ordinal:function(be){return be===1?"af":be===2?"ail":be===3||be===4?"ydd":be===5||be===6?"ed":be>=7&&be<=10||be==12||be==15||be==18||be==20?"fed":be==11||be==13||be==14||be==16||be==17||be==19?"eg":be>=21&&be<=39?"ain":""},time_24hr:!0};P.l10ns.cy=I,P.l10ns;var D=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},N={weekdays:{shorthand:["s\xF8n","man","tir","ons","tors","fre","l\xF8r"],longhand:["s\xF8ndag","mandag","tirsdag","onsdag","torsdag","fredag","l\xF8rdag"]},months:{shorthand:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],longhand:["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"uge",time_24hr:!0};D.l10ns.da=N,D.l10ns;var K=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},j={weekdays:{shorthand:["So","Mo","Di","Mi","Do","Fr","Sa"],longhand:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]},months:{shorthand:["Jan","Feb","M\xE4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],longhand:["Januar","Februar","M\xE4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]},firstDayOfWeek:1,weekAbbreviation:"KW",rangeSeparator:" bis ",scrollTitle:"Zum \xC4ndern scrollen",toggleTitle:"Zum Umschalten klicken",time_24hr:!0};K.l10ns.de=j,K.l10ns;var X={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(be){var Je=be%100;if(Je>3&&Je<21)return"th";switch(Je%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},Q=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ie={firstDayOfWeek:1,rangeSeparator:" \u011Dis ",weekAbbreviation:"Sem",scrollTitle:"Rulumu por pligrandigi la valoron",toggleTitle:"Klaku por \u015Dalti",weekdays:{shorthand:["Dim","Lun","Mar","Mer","\u0134a\u016D","Ven","Sab"],longhand:["diman\u0109o","lundo","mardo","merkredo","\u0135a\u016Ddo","vendredo","sabato"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","A\u016Dg","Sep","Okt","Nov","Dec"],longhand:["januaro","februaro","marto","aprilo","majo","junio","julio","a\u016Dgusto","septembro","oktobro","novembro","decembro"]},ordinal:function(){return"-a"},time_24hr:!0};Q.l10ns.eo=ie,Q.l10ns;var Y=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},J={weekdays:{shorthand:["Dom","Lun","Mar","Mi\xE9","Jue","Vie","S\xE1b"],longhand:["Domingo","Lunes","Martes","Mi\xE9rcoles","Jueves","Viernes","S\xE1bado"]},months:{shorthand:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],longhand:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]},ordinal:function(){return"\xBA"},firstDayOfWeek:1,rangeSeparator:" a ",time_24hr:!0};Y.l10ns.es=J,Y.l10ns;var ne=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},le={weekdays:{shorthand:["P","E","T","K","N","R","L"],longhand:["P\xFChap\xE4ev","Esmasp\xE4ev","Teisip\xE4ev","Kolmap\xE4ev","Neljap\xE4ev","Reede","Laup\xE4ev"]},months:{shorthand:["Jaan","Veebr","M\xE4rts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],longhand:["Jaanuar","Veebruar","M\xE4rts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"]},firstDayOfWeek:1,ordinal:function(){return"."},weekAbbreviation:"N\xE4d",rangeSeparator:" kuni ",scrollTitle:"Keri, et suurendada",toggleTitle:"Kl\xF5psa, et vahetada",time_24hr:!0};ne.l10ns.et=le,ne.l10ns;var de=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},fe={weekdays:{shorthand:["\u06CC\u06A9","\u062F\u0648","\u0633\u0647","\u0686\u0647\u0627\u0631","\u067E\u0646\u062C","\u062C\u0645\u0639\u0647","\u0634\u0646\u0628\u0647"],longhand:["\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647","\u062F\u0648\u0634\u0646\u0628\u0647","\u0633\u0647\u200C\u0634\u0646\u0628\u0647","\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647","\u067E\u0646\u0686\u200C\u0634\u0646\u0628\u0647","\u062C\u0645\u0639\u0647","\u0634\u0646\u0628\u0647"]},months:{shorthand:["\u0698\u0627\u0646\u0648\u06CC\u0647","\u0641\u0648\u0631\u06CC\u0647","\u0645\u0627\u0631\u0633","\u0622\u0648\u0631\u06CC\u0644","\u0645\u0647","\u0698\u0648\u0626\u0646","\u0698\u0648\u0626\u06CC\u0647","\u0627\u0648\u062A","\u0633\u067E\u062A\u0627\u0645\u0628\u0631","\u0627\u06A9\u062A\u0628\u0631","\u0646\u0648\u0627\u0645\u0628\u0631","\u062F\u0633\u0627\u0645\u0628\u0631"],longhand:["\u0698\u0627\u0646\u0648\u06CC\u0647","\u0641\u0648\u0631\u06CC\u0647","\u0645\u0627\u0631\u0633","\u0622\u0648\u0631\u06CC\u0644","\u0645\u0647","\u0698\u0648\u0626\u0646","\u0698\u0648\u0626\u06CC\u0647","\u0627\u0648\u062A","\u0633\u067E\u062A\u0627\u0645\u0628\u0631","\u0627\u06A9\u062A\u0628\u0631","\u0646\u0648\u0627\u0645\u0628\u0631","\u062F\u0633\u0627\u0645\u0628\u0631"]},firstDayOfWeek:6,ordinal:function(){return""}};de.l10ns.fa=fe,de.l10ns;var he=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Te={firstDayOfWeek:1,weekdays:{shorthand:["Su","Ma","Ti","Ke","To","Pe","La"],longhand:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"]},months:{shorthand:["Tammi","Helmi","Maalis","Huhti","Touko","Kes\xE4","Hein\xE4","Elo","Syys","Loka","Marras","Joulu"],longhand:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kes\xE4kuu","Hein\xE4kuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"]},ordinal:function(){return"."},time_24hr:!0};he.l10ns.fi=Te,he.l10ns;var C=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},A={weekdays:{shorthand:["Sun","M\xE1n","T\xFDs","Mik","H\xF3s","Fr\xED","Ley"],longhand:["Sunnudagur","M\xE1nadagur","T\xFDsdagur","Mikudagur","H\xF3sdagur","Fr\xEDggjadagur","Leygardagur"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],longhand:["Januar","Februar","Mars","Apr\xEDl","Mai","Juni","Juli","August","Septembur","Oktobur","Novembur","Desembur"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"vika",scrollTitle:"Rulla fyri at broyta",toggleTitle:"Tr\xFDst fyri at skifta",yearAriaLabel:"\xC1r",time_24hr:!0};C.l10ns.fo=A,C.l10ns;var tt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},$e={firstDayOfWeek:1,weekdays:{shorthand:["dim","lun","mar","mer","jeu","ven","sam"],longhand:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]},months:{shorthand:["janv","f\xE9vr","mars","avr","mai","juin","juil","ao\xFBt","sept","oct","nov","d\xE9c"],longhand:["janvier","f\xE9vrier","mars","avril","mai","juin","juillet","ao\xFBt","septembre","octobre","novembre","d\xE9cembre"]},ordinal:function(be){return be>1?"":"er"},rangeSeparator:" au ",weekAbbreviation:"Sem",scrollTitle:"D\xE9filer pour augmenter la valeur",toggleTitle:"Cliquer pour basculer",time_24hr:!0};tt.l10ns.fr=$e,tt.l10ns;var B=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},z={weekdays:{shorthand:["\u039A\u03C5","\u0394\u03B5","\u03A4\u03C1","\u03A4\u03B5","\u03A0\u03AD","\u03A0\u03B1","\u03A3\u03AC"],longhand:["\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE","\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1","\u03A4\u03C1\u03AF\u03C4\u03B7","\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7","\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7","\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE","\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF"]},months:{shorthand:["\u0399\u03B1\u03BD","\u03A6\u03B5\u03B2","\u039C\u03AC\u03C1","\u0391\u03C0\u03C1","\u039C\u03AC\u03B9","\u0399\u03BF\u03CD","\u0399\u03BF\u03CD","\u0391\u03CD\u03B3","\u03A3\u03B5\u03C0","\u039F\u03BA\u03C4","\u039D\u03BF\u03AD","\u0394\u03B5\u03BA"],longhand:["\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2","\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2","\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2","\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2","\u039C\u03AC\u03B9\u03BF\u03C2","\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2","\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2","\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2","\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2","\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2","\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2","\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2"]},firstDayOfWeek:1,ordinal:function(){return""},weekAbbreviation:"\u0395\u03B2\u03B4",rangeSeparator:" \u03AD\u03C9\u03C2 ",scrollTitle:"\u039C\u03B5\u03C4\u03B1\u03BA\u03C5\u03BB\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B1\u03CD\u03BE\u03B7\u03C3\u03B7",toggleTitle:"\u039A\u03AC\u03BD\u03C4\u03B5 \u03BA\u03BB\u03B9\u03BA \u03B3\u03B9\u03B1 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE",amPM:["\u03A0\u039C","\u039C\u039C"]};B.l10ns.gr=z,B.l10ns;var U=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},G={weekdays:{shorthand:["\u05D0","\u05D1","\u05D2","\u05D3","\u05D4","\u05D5","\u05E9"],longhand:["\u05E8\u05D0\u05E9\u05D5\u05DF","\u05E9\u05E0\u05D9","\u05E9\u05DC\u05D9\u05E9\u05D9","\u05E8\u05D1\u05D9\u05E2\u05D9","\u05D7\u05DE\u05D9\u05E9\u05D9","\u05E9\u05D9\u05E9\u05D9","\u05E9\u05D1\u05EA"]},months:{shorthand:["\u05D9\u05E0\u05D5\u05F3","\u05E4\u05D1\u05E8\u05F3","\u05DE\u05E8\u05E5","\u05D0\u05E4\u05E8\u05F3","\u05DE\u05D0\u05D9","\u05D9\u05D5\u05E0\u05D9","\u05D9\u05D5\u05DC\u05D9","\u05D0\u05D5\u05D2\u05F3","\u05E1\u05E4\u05D8\u05F3","\u05D0\u05D5\u05E7\u05F3","\u05E0\u05D5\u05D1\u05F3","\u05D3\u05E6\u05DE\u05F3"],longhand:["\u05D9\u05E0\u05D5\u05D0\u05E8","\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8","\u05DE\u05E8\u05E5","\u05D0\u05E4\u05E8\u05D9\u05DC","\u05DE\u05D0\u05D9","\u05D9\u05D5\u05E0\u05D9","\u05D9\u05D5\u05DC\u05D9","\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8","\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8","\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8","\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8","\u05D3\u05E6\u05DE\u05D1\u05E8"]},rangeSeparator:" \u05D0\u05DC ",time_24hr:!0};U.l10ns.he=G,U.l10ns;var we=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ee={weekdays:{shorthand:["\u0930\u0935\u093F","\u0938\u094B\u092E","\u092E\u0902\u0917\u0932","\u092C\u0941\u0927","\u0917\u0941\u0930\u0941","\u0936\u0941\u0915\u094D\u0930","\u0936\u0928\u093F"],longhand:["\u0930\u0935\u093F\u0935\u093E\u0930","\u0938\u094B\u092E\u0935\u093E\u0930","\u092E\u0902\u0917\u0932\u0935\u093E\u0930","\u092C\u0941\u0927\u0935\u093E\u0930","\u0917\u0941\u0930\u0941\u0935\u093E\u0930","\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930","\u0936\u0928\u093F\u0935\u093E\u0930"]},months:{shorthand:["\u091C\u0928","\u092B\u0930","\u092E\u093E\u0930\u094D\u091A","\u0905\u092A\u094D\u0930\u0947\u0932","\u092E\u0908","\u091C\u0942\u0928","\u091C\u0942\u0932\u093E\u0908","\u0905\u0917","\u0938\u093F\u0924","\u0905\u0915\u094D\u091F","\u0928\u0935","\u0926\u093F"],longhand:["\u091C\u0928\u0935\u0930\u0940 ","\u092B\u0930\u0935\u0930\u0940","\u092E\u093E\u0930\u094D\u091A","\u0905\u092A\u094D\u0930\u0947\u0932","\u092E\u0908","\u091C\u0942\u0928","\u091C\u0942\u0932\u093E\u0908","\u0905\u0917\u0938\u094D\u0924 ","\u0938\u093F\u0924\u092E\u094D\u092C\u0930","\u0905\u0915\u094D\u091F\u0942\u092C\u0930","\u0928\u0935\u092E\u094D\u092C\u0930","\u0926\u093F\u0938\u092E\u094D\u092C\u0930"]}};we.l10ns.hi=Ee,we.l10ns;var Pe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},rt={firstDayOfWeek:1,weekdays:{shorthand:["Ned","Pon","Uto","Sri","\u010Cet","Pet","Sub"],longhand:["Nedjelja","Ponedjeljak","Utorak","Srijeda","\u010Cetvrtak","Petak","Subota"]},months:{shorthand:["Sij","Velj","O\u017Eu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],longhand:["Sije\u010Danj","Velja\u010Da","O\u017Eujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"]},time_24hr:!0};Pe.l10ns.hr=rt,Pe.l10ns;var gt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},dt={firstDayOfWeek:1,weekdays:{shorthand:["V","H","K","Sz","Cs","P","Szo"],longhand:["Vas\xE1rnap","H\xE9tf\u0151","Kedd","Szerda","Cs\xFCt\xF6rt\xF6k","P\xE9ntek","Szombat"]},months:{shorthand:["Jan","Feb","M\xE1r","\xC1pr","M\xE1j","J\xFAn","J\xFAl","Aug","Szep","Okt","Nov","Dec"],longhand:["Janu\xE1r","Febru\xE1r","M\xE1rcius","\xC1prilis","M\xE1jus","J\xFAnius","J\xFAlius","Augusztus","Szeptember","Okt\xF3ber","November","December"]},ordinal:function(){return"."},weekAbbreviation:"H\xE9t",scrollTitle:"G\xF6rgessen",toggleTitle:"Kattintson a v\xE1lt\xE1shoz",rangeSeparator:" - ",time_24hr:!0};gt.l10ns.hu=dt,gt.l10ns;var un=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},dn={weekdays:{shorthand:["Min","Sen","Sel","Rab","Kam","Jum","Sab"],longhand:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"],longhand:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]},firstDayOfWeek:1,ordinal:function(){return""},time_24hr:!0,rangeSeparator:" - "};un.l10ns.id=dn,un.l10ns;var Xt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ct={weekdays:{shorthand:["Sun","M\xE1n","\xDEri","Mi\xF0","Fim","F\xF6s","Lau"],longhand:["Sunnudagur","M\xE1nudagur","\xDEri\xF0judagur","Mi\xF0vikudagur","Fimmtudagur","F\xF6studagur","Laugardagur"]},months:{shorthand:["Jan","Feb","Mar","Apr","Ma\xED","J\xFAn","J\xFAl","\xC1g\xFA","Sep","Okt","N\xF3v","Des"],longhand:["Jan\xFAar","Febr\xFAar","Mars","Apr\xEDl","Ma\xED","J\xFAn\xED","J\xFAl\xED","\xC1g\xFAst","September","Okt\xF3ber","N\xF3vember","Desember"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"vika",yearAriaLabel:"\xC1r",time_24hr:!0};Xt.l10ns.is=Ct,Xt.l10ns;var Zt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Kn={weekdays:{shorthand:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],longhand:["Domenica","Luned\xEC","Marted\xEC","Mercoled\xEC","Gioved\xEC","Venerd\xEC","Sabato"]},months:{shorthand:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],longhand:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"]},firstDayOfWeek:1,ordinal:function(){return"\xB0"},rangeSeparator:" al ",weekAbbreviation:"Se",scrollTitle:"Scrolla per aumentare",toggleTitle:"Clicca per cambiare",time_24hr:!0};Zt.l10ns.it=Kn,Zt.l10ns;var Mn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},yn={weekdays:{shorthand:["\u65E5","\u6708","\u706B","\u6C34","\u6728","\u91D1","\u571F"],longhand:["\u65E5\u66DC\u65E5","\u6708\u66DC\u65E5","\u706B\u66DC\u65E5","\u6C34\u66DC\u65E5","\u6728\u66DC\u65E5","\u91D1\u66DC\u65E5","\u571F\u66DC\u65E5"]},months:{shorthand:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"],longhand:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"]},time_24hr:!0,rangeSeparator:" \u304B\u3089 ",monthAriaLabel:"\u6708",amPM:["\u5348\u524D","\u5348\u5F8C"],yearAriaLabel:"\u5E74",hourAriaLabel:"\u6642\u9593",minuteAriaLabel:"\u5206"};Mn.l10ns.ja=yn,Mn.l10ns;var $n=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},fn={weekdays:{shorthand:["\u10D9\u10D5","\u10DD\u10E0","\u10E1\u10D0","\u10DD\u10D7","\u10EE\u10E3","\u10DE\u10D0","\u10E8\u10D0"],longhand:["\u10D9\u10D5\u10D8\u10E0\u10D0","\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8","\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8"]},months:{shorthand:["\u10D8\u10D0\u10DC","\u10D7\u10D4\u10D1","\u10DB\u10D0\u10E0","\u10D0\u10DE\u10E0","\u10DB\u10D0\u10D8","\u10D8\u10D5\u10DC","\u10D8\u10D5\u10DA","\u10D0\u10D2\u10D5","\u10E1\u10D4\u10E5","\u10DD\u10E5\u10E2","\u10DC\u10DD\u10D4","\u10D3\u10D4\u10D9"],longhand:["\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8","\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8","\u10DB\u10D0\u10E0\u10E2\u10D8","\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8","\u10DB\u10D0\u10D8\u10E1\u10D8","\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8","\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8","\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD","\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8","\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8","\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8","\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u10D9\u10D5.",scrollTitle:"\u10D3\u10D0\u10E1\u10E5\u10E0\u10DD\u10DA\u10D4\u10D7 \u10D2\u10D0\u10E1\u10D0\u10D3\u10D8\u10D3\u10D4\u10D1\u10DA\u10D0\u10D3",toggleTitle:"\u10D3\u10D0\u10D0\u10D9\u10DA\u10D8\u10D9\u10D4\u10D7 \u10D2\u10D0\u10D3\u10D0\u10E0\u10D7\u10D5\u10D8\u10E1\u10D7\u10D5\u10D8\u10E1",amPM:["AM","PM"],yearAriaLabel:"\u10EC\u10D4\u10DA\u10D8",time_24hr:!0};$n.l10ns.ka=fn,$n.l10ns;var yt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},It={weekdays:{shorthand:["\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0"],longhand:["\uC77C\uC694\uC77C","\uC6D4\uC694\uC77C","\uD654\uC694\uC77C","\uC218\uC694\uC77C","\uBAA9\uC694\uC77C","\uAE08\uC694\uC77C","\uD1A0\uC694\uC77C"]},months:{shorthand:["1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"],longhand:["1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"]},ordinal:function(){return"\uC77C"},rangeSeparator:" ~ "};yt.l10ns.ko=It,yt.l10ns;var it=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},V={weekdays:{shorthand:["\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799","\u1785\u1793\u17D2\u1791","\u17A2\u1784\u17D2\u1782\u17B6\u179A","\u1796\u17BB\u1792","\u1796\u17D2\u179A\u17A0\u179F.","\u179F\u17BB\u1780\u17D2\u179A","\u179F\u17C5\u179A\u17CD"],longhand:["\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799","\u1785\u1793\u17D2\u1791","\u17A2\u1784\u17D2\u1782\u17B6\u179A","\u1796\u17BB\u1792","\u1796\u17D2\u179A\u17A0\u179F\u17D2\u1794\u178F\u17B7\u17CD","\u179F\u17BB\u1780\u17D2\u179A","\u179F\u17C5\u179A\u17CD"]},months:{shorthand:["\u1798\u1780\u179A\u17B6","\u1780\u17BB\u1798\u17D2\u1797\u17C7","\u1798\u17B8\u1793\u17B6","\u1798\u17C1\u179F\u17B6","\u17A7\u179F\u1797\u17B6","\u1798\u17B7\u1790\u17BB\u1793\u17B6","\u1780\u1780\u17D2\u1780\u178A\u17B6","\u179F\u17B8\u17A0\u17B6","\u1780\u1789\u17D2\u1789\u17B6","\u178F\u17BB\u179B\u17B6","\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6","\u1792\u17D2\u1793\u17BC"],longhand:["\u1798\u1780\u179A\u17B6","\u1780\u17BB\u1798\u17D2\u1797\u17C7","\u1798\u17B8\u1793\u17B6","\u1798\u17C1\u179F\u17B6","\u17A7\u179F\u1797\u17B6","\u1798\u17B7\u1790\u17BB\u1793\u17B6","\u1780\u1780\u17D2\u1780\u178A\u17B6","\u179F\u17B8\u17A0\u17B6","\u1780\u1789\u17D2\u1789\u17B6","\u178F\u17BB\u179B\u17B6","\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6","\u1792\u17D2\u1793\u17BC"]},ordinal:function(){return""},firstDayOfWeek:1,rangeSeparator:" \u178A\u179B\u17CB ",weekAbbreviation:"\u179F\u1794\u17D2\u178F\u17B6\u17A0\u17CD",scrollTitle:"\u179A\u17C6\u1780\u17B7\u179B\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1794\u1784\u17D2\u1780\u17BE\u1793",toggleTitle:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1795\u17D2\u179B\u17B6\u179F\u17CB\u1794\u17D2\u178A\u17BC\u179A",yearAriaLabel:"\u1786\u17D2\u1793\u17B6\u17C6",time_24hr:!0};it.l10ns.km=V,it.l10ns;var re=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ye={weekdays:{shorthand:["\u0416\u0441","\u0414\u0441","\u0421c","\u0421\u0440","\u0411\u0441","\u0416\u043C","\u0421\u0431"],longhand:["\u0416\u0435\u043A\u0441\u0435\u043D\u0431i","\u0414\u04AF\u0439\u0441\u0435\u043D\u0431i","\u0421\u0435\u0439\u0441\u0435\u043D\u0431i","\u0421\u04D9\u0440\u0441\u0435\u043D\u0431i","\u0411\u0435\u0439\u0441\u0435\u043D\u0431i","\u0416\u04B1\u043C\u0430","\u0421\u0435\u043D\u0431i"]},months:{shorthand:["\u049A\u0430\u04A3","\u0410\u049B\u043F","\u041D\u0430\u0443","\u0421\u04D9\u0443","\u041C\u0430\u043C","\u041C\u0430\u0443","\u0428i\u043B","\u0422\u0430\u043C","\u049A\u044B\u0440","\u049A\u0430\u0437","\u049A\u0430\u0440","\u0416\u0435\u043B"],longhand:["\u049A\u0430\u04A3\u0442\u0430\u0440","\u0410\u049B\u043F\u0430\u043D","\u041D\u0430\u0443\u0440\u044B\u0437","\u0421\u04D9\u0443i\u0440","\u041C\u0430\u043C\u044B\u0440","\u041C\u0430\u0443\u0441\u044B\u043C","\u0428i\u043B\u0434\u0435","\u0422\u0430\u043C\u044B\u0437","\u049A\u044B\u0440\u043A\u04AF\u0439\u0435\u043A","\u049A\u0430\u0437\u0430\u043D","\u049A\u0430\u0440\u0430\u0448\u0430","\u0416\u0435\u043B\u0442\u043E\u049B\u0441\u0430\u043D"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u0410\u043F\u0442\u0430",scrollTitle:"\u04AE\u043B\u043A\u0435\u0439\u0442\u0443 \u04AF\u0448\u0456\u043D \u0430\u0439\u043D\u0430\u043B\u0434\u044B\u0440\u044B\u04A3\u044B\u0437",toggleTitle:"\u0410\u0443\u044B\u0441\u0442\u044B\u0440\u0443 \u04AF\u0448\u0456\u043D \u0431\u0430\u0441\u044B\u04A3\u044B\u0437",amPM:["\u0422\u0414","\u0422\u041A"],yearAriaLabel:"\u0416\u044B\u043B"};re.l10ns.kz=ye,re.l10ns;var Be=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ft={weekdays:{shorthand:["S","Pr","A","T","K","Pn","\u0160"],longhand:["Sekmadienis","Pirmadienis","Antradienis","Tre\u010Diadienis","Ketvirtadienis","Penktadienis","\u0160e\u0161tadienis"]},months:{shorthand:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd"],longhand:["Sausis","Vasaris","Kovas","Balandis","Gegu\u017E\u0117","Bir\u017Eelis","Liepa","Rugpju\u0304tis","Rugse\u0307jis","Spalis","Lapkritis","Gruodis"]},firstDayOfWeek:1,ordinal:function(){return"-a"},rangeSeparator:" iki ",weekAbbreviation:"Sav",scrollTitle:"Keisti laik\u0105 pel\u0117s rateliu",toggleTitle:"Perjungti laiko format\u0105",time_24hr:!0};Be.l10ns.lt=ft,Be.l10ns;var Ke=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ue={firstDayOfWeek:1,weekdays:{shorthand:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],longhand:["Sv\u0113tdiena","Pirmdiena","Otrdiena","Tre\u0161diena","Ceturtdiena","Piektdiena","Sestdiena"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","J\u016Bn","J\u016Bl","Aug","Sep","Okt","Nov","Dec"],longhand:["Janv\u0101ris","Febru\u0101ris","Marts","Apr\u012Blis","Maijs","J\u016Bnijs","J\u016Blijs","Augusts","Septembris","Oktobris","Novembris","Decembris"]},rangeSeparator:" l\u012Bdz ",time_24hr:!0};Ke.l10ns.lv=Ue,Ke.l10ns;var Ge=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Vt={weekdays:{shorthand:["\u041D\u0435","\u041F\u043E","\u0412\u0442","\u0421\u0440","\u0427\u0435","\u041F\u0435","\u0421\u0430"],longhand:["\u041D\u0435\u0434\u0435\u043B\u0430","\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A","\u0412\u0442\u043E\u0440\u043D\u0438\u043A","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0440\u0442\u043E\u043A","\u041F\u0435\u0442\u043E\u043A","\u0421\u0430\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u0408\u0430\u043D","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0458","\u0408\u0443\u043D","\u0408\u0443\u043B","\u0410\u0432\u0433","\u0421\u0435\u043F","\u041E\u043A\u0442","\u041D\u043E\u0435","\u0414\u0435\u043A"],longhand:["\u0408\u0430\u043D\u0443\u0430\u0440\u0438","\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0438\u043B","\u041C\u0430\u0458","\u0408\u0443\u043D\u0438","\u0408\u0443\u043B\u0438","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438","\u041E\u043A\u0442\u043E\u043C\u0432\u0440\u0438","\u041D\u043E\u0435\u043C\u0432\u0440\u0438","\u0414\u0435\u043A\u0435\u043C\u0432\u0440\u0438"]},firstDayOfWeek:1,weekAbbreviation:"\u041D\u0435\u0434.",rangeSeparator:" \u0434\u043E ",time_24hr:!0};Ge.l10ns.mk=Vt,Ge.l10ns;var At=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ye={firstDayOfWeek:1,weekdays:{shorthand:["\u0414\u0430","\u041C\u044F","\u041B\u0445","\u041F\u04AF","\u0411\u0430","\u0411\u044F","\u041D\u044F"],longhand:["\u0414\u0430\u0432\u0430\u0430","\u041C\u044F\u0433\u043C\u0430\u0440","\u041B\u0445\u0430\u0433\u0432\u0430","\u041F\u04AF\u0440\u044D\u0432","\u0411\u0430\u0430\u0441\u0430\u043D","\u0411\u044F\u043C\u0431\u0430","\u041D\u044F\u043C"]},months:{shorthand:["1-\u0440 \u0441\u0430\u0440","2-\u0440 \u0441\u0430\u0440","3-\u0440 \u0441\u0430\u0440","4-\u0440 \u0441\u0430\u0440","5-\u0440 \u0441\u0430\u0440","6-\u0440 \u0441\u0430\u0440","7-\u0440 \u0441\u0430\u0440","8-\u0440 \u0441\u0430\u0440","9-\u0440 \u0441\u0430\u0440","10-\u0440 \u0441\u0430\u0440","11-\u0440 \u0441\u0430\u0440","12-\u0440 \u0441\u0430\u0440"],longhand:["\u041D\u044D\u0433\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0425\u043E\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0414\u04E9\u0440\u04E9\u0432\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0417\u0443\u0440\u0433\u0430\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0414\u043E\u043B\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u041D\u0430\u0439\u043C\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0415\u0441\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0410\u0440\u0432\u0430\u043D\u043D\u044D\u0433\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0410\u0440\u0432\u0430\u043D\u0445\u043E\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440"]},rangeSeparator:"-\u0441 ",time_24hr:!0};At.l10ns.mn=Ye,At.l10ns;var St=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Lt={weekdays:{shorthand:["Min","Isn","Sel","Rab","Kha","Jum","Sab"],longhand:["Minggu","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"]},months:{shorthand:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],longhand:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]},firstDayOfWeek:1,ordinal:function(){return""}};St.l10ns;var jr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},x={weekdays:{shorthand:["\u1014\u103D\u1031","\u101C\u102C","\u1002\u102B","\u101F\u1030\u1038","\u1000\u103C\u102C","\u101E\u1031\u102C","\u1014\u1031"],longhand:["\u1010\u1014\u1004\u103A\u1039\u1002\u1014\u103D\u1031","\u1010\u1014\u1004\u103A\u1039\u101C\u102C","\u1021\u1004\u103A\u1039\u1002\u102B","\u1017\u102F\u1012\u1039\u1013\u101F\u1030\u1038","\u1000\u103C\u102C\u101E\u1015\u1010\u1031\u1038","\u101E\u1031\u102C\u1000\u103C\u102C","\u1005\u1014\u1031"]},months:{shorthand:["\u1007\u1014\u103A","\u1016\u1031","\u1019\u1010\u103A","\u1015\u103C\u102E","\u1019\u1031","\u1007\u103D\u1014\u103A","\u101C\u102D\u102F\u1004\u103A","\u101E\u103C","\u1005\u1000\u103A","\u1021\u1031\u102C\u1000\u103A","\u1014\u102D\u102F","\u1012\u102E"],longhand:["\u1007\u1014\u103A\u1014\u101D\u102B\u101B\u102E","\u1016\u1031\u1016\u1031\u102C\u103A\u101D\u102B\u101B\u102E","\u1019\u1010\u103A","\u1027\u1015\u103C\u102E","\u1019\u1031","\u1007\u103D\u1014\u103A","\u1007\u1030\u101C\u102D\u102F\u1004\u103A","\u101E\u103C\u1002\u102F\u1010\u103A","\u1005\u1000\u103A\u1010\u1004\u103A\u1018\u102C","\u1021\u1031\u102C\u1000\u103A\u1010\u102D\u102F\u1018\u102C","\u1014\u102D\u102F\u101D\u1004\u103A\u1018\u102C","\u1012\u102E\u1007\u1004\u103A\u1018\u102C"]},firstDayOfWeek:1,ordinal:function(){return""},time_24hr:!0};jr.l10ns.my=x,jr.l10ns;var T=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},H={weekdays:{shorthand:["zo","ma","di","wo","do","vr","za"],longhand:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"]},months:{shorthand:["jan","feb","mrt","apr","mei","jun","jul","aug","sept","okt","nov","dec"],longhand:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]},firstDayOfWeek:1,weekAbbreviation:"wk",rangeSeparator:" t/m ",scrollTitle:"Scroll voor volgende / vorige",toggleTitle:"Klik om te wisselen",time_24hr:!0,ordinal:function(be){return be===1||be===8||be>=20?"ste":"de"}};T.l10ns.nl=H,T.l10ns;var W=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ae={weekdays:{shorthand:["S\xF8n","Man","Tir","Ons","Tor","Fre","L\xF8r"],longhand:["S\xF8ndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","L\xF8rdag"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],longhand:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"]},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"Uke",scrollTitle:"Scroll for \xE5 endre",toggleTitle:"Klikk for \xE5 veksle",time_24hr:!0,ordinal:function(){return"."}};W.l10ns.no=ae,W.l10ns;var Z=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ce={weekdays:{shorthand:["\u0A10\u0A24","\u0A38\u0A4B\u0A2E","\u0A2E\u0A70\u0A17\u0A32","\u0A2C\u0A41\u0A71\u0A27","\u0A35\u0A40\u0A30","\u0A38\u0A3C\u0A41\u0A71\u0A15\u0A30","\u0A38\u0A3C\u0A28\u0A3F\u0A71\u0A1A\u0A30"],longhand:["\u0A10\u0A24\u0A35\u0A3E\u0A30","\u0A38\u0A4B\u0A2E\u0A35\u0A3E\u0A30","\u0A2E\u0A70\u0A17\u0A32\u0A35\u0A3E\u0A30","\u0A2C\u0A41\u0A71\u0A27\u0A35\u0A3E\u0A30","\u0A35\u0A40\u0A30\u0A35\u0A3E\u0A30","\u0A38\u0A3C\u0A41\u0A71\u0A15\u0A30\u0A35\u0A3E\u0A30","\u0A38\u0A3C\u0A28\u0A3F\u0A71\u0A1A\u0A30\u0A35\u0A3E\u0A30"]},months:{shorthand:["\u0A1C\u0A28","\u0A2B\u0A3C\u0A30","\u0A2E\u0A3E\u0A30","\u0A05\u0A2A\u0A4D\u0A30\u0A48","\u0A2E\u0A08","\u0A1C\u0A42\u0A28","\u0A1C\u0A41\u0A32\u0A3E","\u0A05\u0A17","\u0A38\u0A24\u0A70","\u0A05\u0A15","\u0A28\u0A35\u0A70","\u0A26\u0A38\u0A70"],longhand:["\u0A1C\u0A28\u0A35\u0A30\u0A40","\u0A2B\u0A3C\u0A30\u0A35\u0A30\u0A40","\u0A2E\u0A3E\u0A30\u0A1A","\u0A05\u0A2A\u0A4D\u0A30\u0A48\u0A32","\u0A2E\u0A08","\u0A1C\u0A42\u0A28","\u0A1C\u0A41\u0A32\u0A3E\u0A08","\u0A05\u0A17\u0A38\u0A24","\u0A38\u0A24\u0A70\u0A2C\u0A30","\u0A05\u0A15\u0A24\u0A42\u0A2C\u0A30","\u0A28\u0A35\u0A70\u0A2C\u0A30","\u0A26\u0A38\u0A70\u0A2C\u0A30"]},time_24hr:!0};Z.l10ns.pa=ce,Z.l10ns;var ue=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},_e={weekdays:{shorthand:["Nd","Pn","Wt","\u015Ar","Cz","Pt","So"],longhand:["Niedziela","Poniedzia\u0142ek","Wtorek","\u015Aroda","Czwartek","Pi\u0105tek","Sobota"]},months:{shorthand:["Sty","Lut","Mar","Kwi","Maj","Cze","Lip","Sie","Wrz","Pa\u017A","Lis","Gru"],longhand:["Stycze\u0144","Luty","Marzec","Kwiecie\u0144","Maj","Czerwiec","Lipiec","Sierpie\u0144","Wrzesie\u0144","Pa\u017Adziernik","Listopad","Grudzie\u0144"]},rangeSeparator:" do ",weekAbbreviation:"tydz.",scrollTitle:"Przewi\u0144, aby zwi\u0119kszy\u0107",toggleTitle:"Kliknij, aby prze\u0142\u0105czy\u0107",firstDayOfWeek:1,time_24hr:!0,ordinal:function(){return"."}};ue.l10ns.pl=_e,ue.l10ns;var De=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ze={weekdays:{shorthand:["Dom","Seg","Ter","Qua","Qui","Sex","S\xE1b"],longhand:["Domingo","Segunda-feira","Ter\xE7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xE1bado"]},months:{shorthand:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],longhand:["Janeiro","Fevereiro","Mar\xE7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"]},rangeSeparator:" at\xE9 ",time_24hr:!0};De.l10ns.pt=ze,De.l10ns;var xt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},lt={weekdays:{shorthand:["Dum","Lun","Mar","Mie","Joi","Vin","S\xE2m"],longhand:["Duminic\u0103","Luni","Mar\u021Bi","Miercuri","Joi","Vineri","S\xE2mb\u0103t\u0103"]},months:{shorthand:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec"],longhand:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"]},firstDayOfWeek:1,time_24hr:!0,ordinal:function(){return""}};xt.l10ns.ro=lt,xt.l10ns;var Un=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Pt={weekdays:{shorthand:["\u0412\u0441","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431"],longhand:["\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435","\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A","\u0412\u0442\u043E\u0440\u043D\u0438\u043A","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0435\u0440\u0433","\u041F\u044F\u0442\u043D\u0438\u0446\u0430","\u0421\u0443\u0431\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],longhand:["\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u041D\u0435\u0434.",scrollTitle:"\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0435 \u0434\u043B\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F",toggleTitle:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F",amPM:["\u0414\u041F","\u041F\u041F"],yearAriaLabel:"\u0413\u043E\u0434",time_24hr:!0};Un.l10ns.ru=Pt,Un.l10ns;var bn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Dn={weekdays:{shorthand:["\u0D89","\u0DC3","\u0D85","\u0DB6","\u0DB6\u0DCA\u200D\u0DBB","\u0DC3\u0DD2","\u0DC3\u0DD9"],longhand:["\u0D89\u0DBB\u0DD2\u0DAF\u0DCF","\u0DC3\u0DB3\u0DD4\u0DAF\u0DCF","\u0D85\u0D9F\u0DC4\u0DBB\u0DD4\u0DC0\u0DCF\u0DAF\u0DCF","\u0DB6\u0DAF\u0DCF\u0DAF\u0DCF","\u0DB6\u0DCA\u200D\u0DBB\u0DC4\u0DC3\u0DCA\u0DB4\u0DAD\u0DD2\u0DB1\u0DCA\u0DAF\u0DCF","\u0DC3\u0DD2\u0D9A\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF","\u0DC3\u0DD9\u0DB1\u0DC3\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF"]},months:{shorthand:["\u0DA2\u0DB1","\u0DB4\u0DD9\u0DB6","\u0DB8\u0DCF\u0DBB\u0DCA","\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA","\u0DB8\u0DD0\u0DBA\u0DD2","\u0DA2\u0DD4\u0DB1\u0DD2","\u0DA2\u0DD6\u0DBD\u0DD2","\u0D85\u0D9C\u0DDD","\u0DC3\u0DD0\u0DB4\u0DCA","\u0D94\u0D9A\u0DCA","\u0DB1\u0DDC\u0DC0\u0DD0","\u0DAF\u0DD9\u0DC3\u0DD0"],longhand:["\u0DA2\u0DB1\u0DC0\u0DCF\u0DBB\u0DD2","\u0DB4\u0DD9\u0DB6\u0DBB\u0DC0\u0DCF\u0DBB\u0DD2","\u0DB8\u0DCF\u0DBB\u0DCA\u0DAD\u0DD4","\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA\u0DBD\u0DCA","\u0DB8\u0DD0\u0DBA\u0DD2","\u0DA2\u0DD4\u0DB1\u0DD2","\u0DA2\u0DD6\u0DBD\u0DD2","\u0D85\u0D9C\u0DDD\u0DC3\u0DCA\u0DAD\u0DD4","\u0DC3\u0DD0\u0DB4\u0DCA\u0DAD\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA","\u0D94\u0D9A\u0DCA\u0DAD\u0DDD\u0DB6\u0DBB\u0DCA","\u0DB1\u0DDC\u0DC0\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA","\u0DAF\u0DD9\u0DC3\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA"]},time_24hr:!0};bn.l10ns.si=Dn,bn.l10ns;var Cn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},jn={weekdays:{shorthand:["Ned","Pon","Ut","Str","\u0160tv","Pia","Sob"],longhand:["Nede\u013Ea","Pondelok","Utorok","Streda","\u0160tvrtok","Piatok","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","M\xE1j","J\xFAn","J\xFAl","Aug","Sep","Okt","Nov","Dec"],longhand:["Janu\xE1r","Febru\xE1r","Marec","Apr\xEDl","M\xE1j","J\xFAn","J\xFAl","August","September","Okt\xF3ber","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};Cn.l10ns.sk=jn,Cn.l10ns;var Sr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},zr={weekdays:{shorthand:["Ned","Pon","Tor","Sre","\u010Cet","Pet","Sob"],longhand:["Nedelja","Ponedeljek","Torek","Sreda","\u010Cetrtek","Petek","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};Sr.l10ns.sl=zr,Sr.l10ns;var Vr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},qr={weekdays:{shorthand:["Di","H\xEB","Ma","M\xEB","En","Pr","Sh"],longhand:["E Diel","E H\xEBn\xEB","E Mart\xEB","E M\xEBrkur\xEB","E Enjte","E Premte","E Shtun\xEB"]},months:{shorthand:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","N\xEBn","Dhj"],longhand:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","N\xEBntor","Dhjetor"]},time_24hr:!0};Vr.l10ns.sq=qr,Vr.l10ns;var Wr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},rl={weekdays:{shorthand:["Ned","Pon","Uto","Sre","\u010Cet","Pet","Sub"],longhand:["Nedelja","Ponedeljak","Utorak","Sreda","\u010Cetvrtak","Petak","Subota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"]},firstDayOfWeek:1,weekAbbreviation:"Ned.",rangeSeparator:" do ",time_24hr:!0};Wr.l10ns.sr=rl,Wr.l10ns;var O=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},y={firstDayOfWeek:1,weekAbbreviation:"v",weekdays:{shorthand:["S\xF6n","M\xE5n","Tis","Ons","Tor","Fre","L\xF6r"],longhand:["S\xF6ndag","M\xE5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xF6rdag"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],longhand:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"]},time_24hr:!0,ordinal:function(){return"."}};O.l10ns.sv=y,O.l10ns;var b=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},m={weekdays:{shorthand:["\u0E2D\u0E32","\u0E08","\u0E2D","\u0E1E","\u0E1E\u0E24","\u0E28","\u0E2A"],longhand:["\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C","\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C","\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23","\u0E1E\u0E38\u0E18","\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35","\u0E28\u0E38\u0E01\u0E23\u0E4C","\u0E40\u0E2A\u0E32\u0E23\u0E4C"]},months:{shorthand:["\u0E21.\u0E04.","\u0E01.\u0E1E.","\u0E21\u0E35.\u0E04.","\u0E40\u0E21.\u0E22.","\u0E1E.\u0E04.","\u0E21\u0E34.\u0E22.","\u0E01.\u0E04.","\u0E2A.\u0E04.","\u0E01.\u0E22.","\u0E15.\u0E04.","\u0E1E.\u0E22.","\u0E18.\u0E04."],longhand:["\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21","\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C","\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21","\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19","\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21","\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19","\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21","\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21","\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19","\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21","\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19","\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21"]},firstDayOfWeek:1,rangeSeparator:" \u0E16\u0E36\u0E07 ",scrollTitle:"\u0E40\u0E25\u0E37\u0E48\u0E2D\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2B\u0E23\u0E37\u0E2D\u0E25\u0E14",toggleTitle:"\u0E04\u0E25\u0E34\u0E01\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19",time_24hr:!0,ordinal:function(){return""}};b.l10ns.th=m,b.l10ns;var E=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},M={weekdays:{shorthand:["Paz","Pzt","Sal","\xC7ar","Per","Cum","Cmt"],longhand:["Pazar","Pazartesi","Sal\u0131","\xC7ar\u015Famba","Per\u015Fembe","Cuma","Cumartesi"]},months:{shorthand:["Oca","\u015Eub","Mar","Nis","May","Haz","Tem","A\u011Fu","Eyl","Eki","Kas","Ara"],longhand:["Ocak","\u015Eubat","Mart","Nisan","May\u0131s","Haziran","Temmuz","A\u011Fustos","Eyl\xFCl","Ekim","Kas\u0131m","Aral\u0131k"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" - ",weekAbbreviation:"Hf",scrollTitle:"Art\u0131rmak i\xE7in kayd\u0131r\u0131n",toggleTitle:"A\xE7/Kapa",amPM:["\xD6\xD6","\xD6S"],time_24hr:!0};E.l10ns.tr=M,E.l10ns;var L=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},R={firstDayOfWeek:1,weekdays:{shorthand:["\u041D\u0434","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431"],longhand:["\u041D\u0435\u0434\u0456\u043B\u044F","\u041F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A","\u0412\u0456\u0432\u0442\u043E\u0440\u043E\u043A","\u0421\u0435\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0435\u0440","\u041F'\u044F\u0442\u043D\u0438\u0446\u044F","\u0421\u0443\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u0421\u0456\u0447","\u041B\u044E\u0442","\u0411\u0435\u0440","\u041A\u0432\u0456","\u0422\u0440\u0430","\u0427\u0435\u0440","\u041B\u0438\u043F","\u0421\u0435\u0440","\u0412\u0435\u0440","\u0416\u043E\u0432","\u041B\u0438\u0441","\u0413\u0440\u0443"],longhand:["\u0421\u0456\u0447\u0435\u043D\u044C","\u041B\u044E\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043D\u044C","\u041A\u0432\u0456\u0442\u0435\u043D\u044C","\u0422\u0440\u0430\u0432\u0435\u043D\u044C","\u0427\u0435\u0440\u0432\u0435\u043D\u044C","\u041B\u0438\u043F\u0435\u043D\u044C","\u0421\u0435\u0440\u043F\u0435\u043D\u044C","\u0412\u0435\u0440\u0435\u0441\u0435\u043D\u044C","\u0416\u043E\u0432\u0442\u0435\u043D\u044C","\u041B\u0438\u0441\u0442\u043E\u043F\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043D\u044C"]},time_24hr:!0};L.l10ns.uk=R,L.l10ns;var q=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},te={weekdays:{shorthand:["\u042F\u043A\u0448","\u0414\u0443\u0448","\u0421\u0435\u0448","\u0427\u043E\u0440","\u041F\u0430\u0439","\u0416\u0443\u043C","\u0428\u0430\u043D"],longhand:["\u042F\u043A\u0448\u0430\u043D\u0431\u0430","\u0414\u0443\u0448\u0430\u043D\u0431\u0430","\u0421\u0435\u0448\u0430\u043D\u0431\u0430","\u0427\u043E\u0440\u0448\u0430\u043D\u0431\u0430","\u041F\u0430\u0439\u0448\u0430\u043D\u0431\u0430","\u0416\u0443\u043C\u0430","\u0428\u0430\u043D\u0431\u0430"]},months:{shorthand:["\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],longhand:["\u042F\u043D\u0432\u0430\u0440","\u0424\u0435\u0432\u0440\u0430\u043B","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440","\u041E\u043A\u0442\u044F\u0431\u0440","\u041D\u043E\u044F\u0431\u0440","\u0414\u0435\u043A\u0430\u0431\u0440"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u04B2\u0430\u0444\u0442\u0430",scrollTitle:"\u041A\u0430\u0442\u0442\u0430\u043B\u0430\u0448\u0442\u0438\u0440\u0438\u0448 \u0443\u0447\u0443\u043D \u0430\u0439\u043B\u0430\u043D\u0442\u0438\u0440\u0438\u043D\u0433",toggleTitle:"\u040E\u0442\u0438\u0448 \u0443\u0447\u0443\u043D \u0431\u043E\u0441\u0438\u043D\u0433",amPM:["AM","PM"],yearAriaLabel:"\u0419\u0438\u043B",time_24hr:!0};q.l10ns.uz=te,q.l10ns;var oe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ve={weekdays:{shorthand:["Ya","Du","Se","Cho","Pa","Ju","Sha"],longhand:["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"]},months:{shorthand:["Yan","Fev","Mar","Apr","May","Iyun","Iyul","Avg","Sen","Okt","Noy","Dek"],longhand:["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"Hafta",scrollTitle:"Kattalashtirish uchun aylantiring",toggleTitle:"O\u2018tish uchun bosing",amPM:["AM","PM"],yearAriaLabel:"Yil",time_24hr:!0};oe.l10ns.uz_latn=ve,oe.l10ns;var pe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Me={weekdays:{shorthand:["CN","T2","T3","T4","T5","T6","T7"],longhand:["Ch\u1EE7 nh\u1EADt","Th\u1EE9 hai","Th\u1EE9 ba","Th\u1EE9 t\u01B0","Th\u1EE9 n\u0103m","Th\u1EE9 s\xE1u","Th\u1EE9 b\u1EA3y"]},months:{shorthand:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],longhand:["Th\xE1ng m\u1ED9t","Th\xE1ng hai","Th\xE1ng ba","Th\xE1ng t\u01B0","Th\xE1ng n\u0103m","Th\xE1ng s\xE1u","Th\xE1ng b\u1EA3y","Th\xE1ng t\xE1m","Th\xE1ng ch\xEDn","Th\xE1ng m\u01B0\u1EDDi","Th\xE1ng m\u01B0\u1EDDi m\u1ED9t","Th\xE1ng m\u01B0\u1EDDi hai"]},firstDayOfWeek:1,rangeSeparator:" \u0111\u1EBFn "};pe.l10ns.vn=Me,pe.l10ns;var Ie=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},xe={weekdays:{shorthand:["\u5468\u65E5","\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D"],longhand:["\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"]},months:{shorthand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],longhand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"]},rangeSeparator:" \u81F3 ",weekAbbreviation:"\u5468",scrollTitle:"\u6EDA\u52A8\u5207\u6362",toggleTitle:"\u70B9\u51FB\u5207\u6362 12/24 \u5C0F\u65F6\u65F6\u5236"};Ie.l10ns.zh=xe,Ie.l10ns;var Oe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ce={weekdays:{shorthand:["\u9031\u65E5","\u9031\u4E00","\u9031\u4E8C","\u9031\u4E09","\u9031\u56DB","\u9031\u4E94","\u9031\u516D"],longhand:["\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"]},months:{shorthand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],longhand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"]},rangeSeparator:" \u81F3 ",weekAbbreviation:"\u9031",scrollTitle:"\u6EFE\u52D5\u5207\u63DB",toggleTitle:"\u9EDE\u64CA\u5207\u63DB 12/24 \u5C0F\u6642\u6642\u5236"};Oe.l10ns.zh_tw=Ce,Oe.l10ns;var Le={ar:r,at:a,az:s,be:l,bg:h,bn:g,bs:d,ca:S,cat:S,cs:k,cy:I,da:N,de:j,default:n({},X),en:X,eo:ie,es:J,et:le,fa:fe,fi:Te,fo:A,fr:$e,gr:z,he:G,hi:Ee,hr:rt,hu:dt,id:dn,is:Ct,it:Kn,ja:yn,ka:fn,ko:It,km:V,kz:ye,lt:ft,lv:Ue,mk:Vt,mn:Ye,ms:Lt,my:x,nl:H,no:ae,pa:ce,pl:_e,pt:ze,ro:lt,ru:Pt,si:Dn,sk:jn,sl:zr,sq:qr,sr:rl,sv:y,th:m,tr:M,uk:R,vn:Me,zh:xe,zh_tw:Ce,uz:te,uz_latn:ve};t.default=Le,Object.defineProperty(t,"__esModule",{value:!0})})});var ga=Fe((_M,dc)=>{"use strict";var iS=Object.prototype.hasOwnProperty,Ut="~";function ma(){}Object.create&&(ma.prototype=Object.create(null),new ma().__proto__||(Ut=!1));function aS(t,n,e){this.fn=t,this.context=n,this.once=e||!1}function Mp(t,n,e,r,i){if(typeof e!="function")throw new TypeError("The listener must be a function");var a=new aS(e,r||t,i),o=Ut?Ut+n:n;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],a]:t._events[o].push(a):(t._events[o]=a,t._eventsCount++),t}function Wo(t,n){--t._eventsCount==0?t._events=new ma:delete t._events[n]}function Ht(){this._events=new ma,this._eventsCount=0}Ht.prototype.eventNames=function(){var n=[],e,r;if(this._eventsCount===0)return n;for(r in e=this._events)iS.call(e,r)&&n.push(Ut?r.slice(1):r);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n};Ht.prototype.listeners=function(n){var e=Ut?Ut+n:n,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,a=r.length,o=new Array(a);i{"use strict";Object.defineProperty(Yo,"__esModule",{value:!0});Yo.SearchResult=void 0;var oS=/\$&/g,sS=/\$(\d)/g,Dp=class{constructor(n,e,r){this.data=n,this.term=e,this.strategy=r}getReplacementData(n){let e=this.strategy.replace(this.data);if(e==null)return null;let r="";Array.isArray(e)&&(r=e[1],e=e[0]);let i=this.strategy.match(n);if(i==null||i.index==null)return null;let a=e.replace(oS,i[0]).replace(sS,(o,s)=>i[parseInt(s)]);return{start:i.index,end:i.index+i[0].length,beforeCursor:a,afterCursor:r}}replace(n,e){let r=this.getReplacementData(n);if(r!==null)return e=r.afterCursor+e,[[n.slice(0,r.start),r.beforeCursor,n.slice(r.end)].join(""),e]}render(){return this.strategy.renderTemplate(this.data,this.term)}getStrategyId(){return this.strategy.getId()}};Yo.SearchResult=Dp});var hc=Fe(Lr=>{"use strict";Object.defineProperty(Lr,"__esModule",{value:!0});Lr.Strategy=Lr.DEFAULT_INDEX=void 0;var lS=fc();Lr.DEFAULT_INDEX=1;var Cp=class{constructor(n){this.props=n,this.cache={}}destroy(){return this.cache={},this}replace(n){return this.props.replace(n)}execute(n,e){var r;let i=this.matchWithContext(n);if(!i)return!1;let a=i[(r=this.props.index)!==null&&r!==void 0?r:Lr.DEFAULT_INDEX];return this.search(a,o=>{e(o.map(s=>new lS.SearchResult(s,a,this)))},i),!0}renderTemplate(n,e){if(this.props.template)return this.props.template(n,e);if(typeof n=="string")return n;throw new Error(`Unexpected render data type: ${typeof n}. Please implement template parameter by yourself`)}getId(){return this.props.id||null}match(n){return typeof this.props.match=="function"?this.props.match(n):n.match(this.props.match)}search(n,e,r){this.props.cache?this.searchWithCach(n,e,r):this.props.search(n,e,r)}matchWithContext(n){let e=this.context(n);return e===!1?null:this.match(e===!0?n:e)}context(n){return this.props.context?this.props.context(n):!0}searchWithCach(n,e,r){this.cache[n]!=null?e(this.cache[n]):this.props.search(n,i=>{this.cache[n]=i,e(i)},r)}};Lr.Strategy=Cp});var pc=Fe(Jo=>{"use strict";Object.defineProperty(Jo,"__esModule",{value:!0});Jo.Completer=void 0;var cS=ga(),uS=hc(),Ip=class extends cS.EventEmitter{constructor(n){super();this.handleQueryResult=e=>{this.emit("hit",{searchResults:e})},this.strategies=n.map(e=>new uS.Strategy(e))}destroy(){return this.strategies.forEach(n=>n.destroy()),this}run(n){for(let e of this.strategies)if(e.execute(n,this.handleQueryResult))return;this.handleQueryResult([])}};Jo.Completer=Ip});var Qo=Fe(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.createCustomEvent=void 0;var dS=typeof window!="undefined"&&!!window.CustomEvent,fS=(t,n)=>{if(dS)return new CustomEvent(t,n);let e=document.createEvent("CustomEvent");return e.initCustomEvent(t,!1,(n==null?void 0:n.cancelable)||!1,(n==null?void 0:n.detail)||void 0),e};Go.createCustomEvent=fS});var mc=Fe(mt=>{"use strict";Object.defineProperty(mt,"__esModule",{value:!0});mt.Dropdown=mt.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME=mt.DEFAULT_DROPDOWN_ITEM_CLASS_NAME=mt.DEFAULT_DROPDOWN_CLASS_NAME=mt.DEFAULT_DROPDOWN_PLACEMENT=mt.DEFAULT_DROPDOWN_MAX_COUNT=void 0;var hS=ga(),mr=Qo();mt.DEFAULT_DROPDOWN_MAX_COUNT=10;mt.DEFAULT_DROPDOWN_PLACEMENT="auto";mt.DEFAULT_DROPDOWN_CLASS_NAME="dropdown-menu textcomplete-dropdown";mt.DEFAULT_DROPDOWN_ITEM_CLASS_NAME="textcomplete-item";mt.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME=`${mt.DEFAULT_DROPDOWN_ITEM_CLASS_NAME} active`;var Xo=class extends hS.EventEmitter{constructor(n,e){super();this.el=n,this.option=e,this.shown=!1,this.items=[],this.activeIndex=null}static create(n){let e=document.createElement("ul");e.className=n.className||mt.DEFAULT_DROPDOWN_CLASS_NAME,Object.assign(e.style,{display:"none",position:"absolute",zIndex:"1000"},n.style);let r=n.parent||document.body;return r==null||r.appendChild(e),new Xo(e,n)}render(n,e){let r=(0,mr.createCustomEvent)("render",{cancelable:!0});return this.emit("render",r),r.defaultPrevented?this:(this.clear(),n.length===0?this.hide():(this.items=n.slice(0,this.option.maxCount||mt.DEFAULT_DROPDOWN_MAX_COUNT).map((i,a)=>{var o;return new Ap(this,a,i,((o=this.option)===null||o===void 0?void 0:o.item)||{})}),this.setStrategyId(n[0]).renderEdge(n,"header").renderItems().renderEdge(n,"footer").show().setOffset(e).activate(0),this.emit("rendered",(0,mr.createCustomEvent)("rendered")),this))}destroy(){var n;return this.clear(),(n=this.el.parentNode)===null||n===void 0||n.removeChild(this.el),this}select(n){let e={searchResult:n.searchResult},r=(0,mr.createCustomEvent)("select",{cancelable:!0,detail:e});return this.emit("select",r),r.defaultPrevented?this:(this.hide(),this.emit("selected",(0,mr.createCustomEvent)("selected",{detail:e})),this)}show(){if(!this.shown){let n=(0,mr.createCustomEvent)("show",{cancelable:!0});if(this.emit("show",n),n.defaultPrevented)return this;this.el.style.display="block",this.shown=!0,this.emit("shown",(0,mr.createCustomEvent)("shown"))}return this}hide(){if(this.shown){let n=(0,mr.createCustomEvent)("hide",{cancelable:!0});if(this.emit("hide",n),n.defaultPrevented)return this;this.el.style.display="none",this.shown=!1,this.clear(),this.emit("hidden",(0,mr.createCustomEvent)("hidden"))}return this}clear(){return this.items.forEach(n=>n.destroy()),this.items=[],this.el.innerHTML="",this.activeIndex=null,this}up(n){return this.shown?this.moveActiveItem("prev",n):this}down(n){return this.shown?this.moveActiveItem("next",n):this}moveActiveItem(n,e){if(this.activeIndex!=null){let r=n==="next"?this.getNextActiveIndex():this.getPrevActiveIndex();r!=null&&(this.activate(r),e.preventDefault())}return this}activate(n){return this.activeIndex!==n&&(this.activeIndex!=null&&this.items[this.activeIndex].deactivate(),this.activeIndex=n,this.items[n].activate()),this}isShown(){return this.shown}getActiveItem(){return this.activeIndex!=null?this.items[this.activeIndex]:null}setOffset(n){let e=document.documentElement;if(e){let r=this.el.offsetWidth;if(n.left){let o=this.option.dynamicWidth?e.scrollWidth:e.clientWidth;n.left+r>o&&(n.left=o-r),this.el.style.left=`${n.left}px`}else n.right&&(n.right-r<0&&(n.right=0),this.el.style.right=`${n.right}px`);let i=!1,a=this.option.placement||mt.DEFAULT_DROPDOWN_PLACEMENT;if(a==="auto"){let o=this.items.length*n.lineHeight;i=n.clientTop!=null&&n.clientTop+o>e.clientHeight}a==="top"||i?(this.el.style.bottom=`${e.clientHeight-n.top+n.lineHeight}px`,this.el.style.top="auto"):(this.el.style.top=`${n.top}px`,this.el.style.bottom="auto")}return this}getNextActiveIndex(){if(this.activeIndex==null)throw new Error;return this.activeIndexa.data)):r||"",this.el.appendChild(i),this}};mt.Dropdown=Xo;var Ap=class{constructor(n,e,r,i){this.dropdown=n,this.index=e,this.searchResult=r,this.props=i,this.active=!1,this.onClick=s=>{s.preventDefault(),this.dropdown.select(this)},this.className=this.props.className||mt.DEFAULT_DROPDOWN_ITEM_CLASS_NAME,this.activeClassName=this.props.activeClassName||mt.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME;let a=document.createElement("li");a.className=this.active?this.activeClassName:this.className;let o=document.createElement("span");o.tabIndex=-1,o.innerHTML=this.searchResult.render(),a.appendChild(o),a.addEventListener("mousedown",this.onClick),a.addEventListener("touchstart",this.onClick),this.el=a}destroy(){var n;let e=this.el;return(n=e.parentNode)===null||n===void 0||n.removeChild(e),e.removeEventListener("mousedown",this.onClick,!1),e.removeEventListener("touchstart",this.onClick,!1),this}activate(){return this.active||(this.active=!0,this.el.className=this.activeClassName,this.dropdown.el.scrollTop=this.el.offsetTop),this}deactivate(){return this.active&&(this.active=!1,this.el.className=this.className),this}}});var Pp=Fe(es=>{"use strict";Object.defineProperty(es,"__esModule",{value:!0});es.Editor=void 0;var pS=ga(),Zo=Qo(),Lp=class extends pS.EventEmitter{destroy(){return this}applySearchResult(n){throw new Error("Not implemented.")}getCursorOffset(){throw new Error("Not implemented.")}getBeforeCursor(){throw new Error("Not implemented.")}emitMoveEvent(n){let e=(0,Zo.createCustomEvent)("move",{cancelable:!0,detail:{code:n}});return this.emit("move",e),e}emitEnterEvent(){let n=(0,Zo.createCustomEvent)("enter",{cancelable:!0});return this.emit("enter",n),n}emitChangeEvent(){let n=(0,Zo.createCustomEvent)("change",{detail:{beforeCursor:this.getBeforeCursor()}});return this.emit("change",n),n}emitEscEvent(){let n=(0,Zo.createCustomEvent)("esc",{cancelable:!0});return this.emit("esc",n),n}getCode(n){return n.keyCode===9||n.keyCode===13?"ENTER":n.keyCode===27?"ESC":n.keyCode===38?"UP":n.keyCode===40||n.keyCode===78&&n.ctrlKey?"DOWN":n.keyCode===80&&n.ctrlKey?"UP":"OTHER"}};es.Editor=Lp});var Np=Fe(ts=>{"use strict";Object.defineProperty(ts,"__esModule",{value:!0});ts.Textcomplete=void 0;var mS=ga(),gS=mc(),vS=pc(),yS=["show","shown","render","rendered","selected","hidden","hide"],Op=class extends mS.EventEmitter{constructor(n,e,r){super();this.editor=n,this.isQueryInFlight=!1,this.nextPendingQuery=null,this.handleHit=({searchResults:i})=>{i.length?this.dropdown.render(i,this.editor.getCursorOffset()):this.dropdown.hide(),this.isQueryInFlight=!1,this.nextPendingQuery!==null&&this.trigger(this.nextPendingQuery)},this.handleMove=i=>{i.detail.code==="UP"?this.dropdown.up(i):this.dropdown.down(i)},this.handleEnter=i=>{let a=this.dropdown.getActiveItem();a?(this.dropdown.select(a),i.preventDefault()):this.dropdown.hide()},this.handleEsc=i=>{this.dropdown.isShown()&&(this.dropdown.hide(),i.preventDefault())},this.handleChange=i=>{i.detail.beforeCursor!=null?this.trigger(i.detail.beforeCursor):this.dropdown.hide()},this.handleSelect=i=>{this.emit("select",i),i.defaultPrevented||this.editor.applySearchResult(i.detail.searchResult)},this.handleResize=()=>{this.dropdown.isShown()&&this.dropdown.setOffset(this.editor.getCursorOffset())},this.completer=new vS.Completer(e),this.dropdown=gS.Dropdown.create((r==null?void 0:r.dropdown)||{}),this.startListening()}destroy(n=!0){return this.completer.destroy(),this.dropdown.destroy(),n&&this.editor.destroy(),this.stopListening(),this}isShown(){return this.dropdown.isShown()}hide(){return this.dropdown.hide(),this}trigger(n){return this.isQueryInFlight?this.nextPendingQuery=n:(this.isQueryInFlight=!0,this.nextPendingQuery=null,this.completer.run(n)),this}startListening(){var n;this.editor.on("move",this.handleMove).on("enter",this.handleEnter).on("esc",this.handleEsc).on("change",this.handleChange),this.dropdown.on("select",this.handleSelect);for(let e of yS)this.dropdown.on(e,r=>this.emit(e,r));this.completer.on("hit",this.handleHit),(n=this.dropdown.el.ownerDocument.defaultView)===null||n===void 0||n.addEventListener("resize",this.handleResize)}stopListening(){var n;(n=this.dropdown.el.ownerDocument.defaultView)===null||n===void 0||n.removeEventListener("resize",this.handleResize),this.completer.removeAllListeners(),this.dropdown.removeAllListeners(),this.editor.removeListener("move",this.handleMove).removeListener("enter",this.handleEnter).removeListener("esc",this.handleEsc).removeListener("change",this.handleChange)}};ts.Textcomplete=Op});var gc=Fe(an=>{"use strict";var bS=an&&an.__createBinding||(Object.create?function(t,n,e,r){r===void 0&&(r=e),Object.defineProperty(t,r,{enumerable:!0,get:function(){return n[e]}})}:function(t,n,e,r){r===void 0&&(r=e),t[r]=n[e]}),Pr=an&&an.__exportStar||function(t,n){for(var e in t)e!=="default"&&!Object.prototype.hasOwnProperty.call(n,e)&&bS(n,t,e)};Object.defineProperty(an,"__esModule",{value:!0});Pr(pc(),an);Pr(mc(),an);Pr(Pp(),an);Pr(fc(),an);Pr(hc(),an);Pr(Np(),an);Pr(Qo(),an)});var Rp={};Yr(Rp,{update:()=>Fp,wrapCursor:()=>wS});function Fp(t,n,e){let r=t.value,i=n+(e||""),a=document.activeElement,o=0,s=0;for(;o=0&&i.length-s-1>=0&&r[r.length-s-1]===i[i.length-s-1];)s++;o=Math.min(o,Math.min(r.length,i.length)-s),t.setSelectionRange(o,r.length-s);let u=i.substring(o,i.length-s);if(t.focus(),!document.execCommand("insertText",!1,u)){t.value=i;let l=document.createEvent("Event");l.initEvent("input",!0,!0),t.dispatchEvent(l)}return t.setSelectionRange(n.length,n.length),a.focus(),t}function wS(t,n,e){let r=t.selectionEnd,i=t.value.substr(0,t.selectionStart)+n,a=t.value.substring(t.selectionStart,r)+(e||"")+t.value.substr(r);return Fp(t,i,a),t.selectionEnd=r+n.length,t}var Hp=zu(()=>{});var Bp=Fe((OM,ns)=>{(function(){var t=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n=typeof window!="undefined",e=n&&window.mozInnerScreenX!=null;function r(i,a,o){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var s=o&&o.debug||!1;if(s){var u=document.querySelector("#input-textarea-caret-position-mirror-div");u&&u.parentNode.removeChild(u)}var l=document.createElement("div");l.id="input-textarea-caret-position-mirror-div",document.body.appendChild(l);var c=l.style,d=window.getComputedStyle?window.getComputedStyle(i):i.currentStyle,f=i.nodeName==="INPUT";c.whiteSpace="pre-wrap",f||(c.wordWrap="break-word"),c.position="absolute",s||(c.visibility="hidden"),t.forEach(function(g){f&&g==="lineHeight"?c.lineHeight=d.height:c[g]=d[g]}),e?i.scrollHeight>parseInt(d.height)&&(c.overflowY="scroll"):c.overflow="hidden",l.textContent=i.value.substring(0,a),f&&(l.textContent=l.textContent.replace(/\s/g,"\xA0"));var h=document.createElement("span");h.textContent=i.value.substring(a)||".",l.appendChild(h);var p={top:h.offsetTop+parseInt(d.borderTopWidth),left:h.offsetLeft+parseInt(d.borderLeftWidth),height:parseInt(d.lineHeight)};return s?h.style.backgroundColor="#aaa":document.body.removeChild(l),p}typeof ns!="undefined"&&typeof ns.exports!="undefined"?ns.exports=r:n&&(window.getCaretCoordinates=r)})()});var Kp=Fe(rs=>{"use strict";Object.defineProperty(rs,"__esModule",{value:!0});rs.calculateElementOffset=void 0;var ES=t=>{let n=t.getBoundingClientRect(),e=t.ownerDocument;if(e==null)throw new Error("Given element does not belong to document");let{defaultView:r,documentElement:i}=e;if(r==null)throw new Error("Given element does not belong to window");let a={top:n.top+r.pageYOffset,left:n.left+r.pageXOffset};return i&&(a.top-=i.clientTop,a.left-=i.clientLeft),a};rs.calculateElementOffset=ES});var Up=Fe(is=>{"use strict";Object.defineProperty(is,"__esModule",{value:!0});is.getLineHeightPx=void 0;var SS="0".charCodeAt(0),xS="9".charCodeAt(0),$p=t=>SS<=t&&t<=xS,kS=t=>{let n=getComputedStyle(t),e=n.lineHeight;if($p(e.charCodeAt(0))){let r=parseFloat(e);return $p(e.charCodeAt(e.length-1))?r*parseFloat(n.fontSize):r}return _S(t.nodeName,n)};is.getLineHeightPx=kS;var _S=(t,n)=>{let e=document.body;if(!e)return 0;let r=document.createElement(t);r.innerHTML=" ",Object.assign(r.style,{fontSize:n.fontSize,fontFamily:n.fontFamily,padding:"0"}),e.appendChild(r),r instanceof HTMLTextAreaElement&&(r.rows=1);let i=r.offsetHeight;return e.removeChild(r),i}});var jp=Fe(as=>{"use strict";Object.defineProperty(as,"__esModule",{value:!0});as.isSafari=void 0;var TS=()=>/^((?!chrome|android).)*safari/i.test(navigator.userAgent);as.isSafari=TS});var zp=Fe(Qn=>{"use strict";var MS=Qn&&Qn.__createBinding||(Object.create?function(t,n,e,r){r===void 0&&(r=e),Object.defineProperty(t,r,{enumerable:!0,get:function(){return n[e]}})}:function(t,n,e,r){r===void 0&&(r=e),t[r]=n[e]}),vc=Qn&&Qn.__exportStar||function(t,n){for(var e in t)e!=="default"&&!Object.prototype.hasOwnProperty.call(n,e)&&MS(n,t,e)};Object.defineProperty(Qn,"__esModule",{value:!0});vc(Kp(),Qn);vc(Up(),Qn);vc(jp(),Qn)});var Yp=Fe(Si=>{"use strict";var DS=Si&&Si.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Si,"__esModule",{value:!0});Si.TextareaEditor=void 0;var CS=(Hp(),Rp),IS=DS(Bp()),Vp=gc(),qp=zp(),Wp=class extends Vp.Editor{constructor(n){super();this.el=n,this.onInput=()=>{this.emitChangeEvent()},this.onKeydown=e=>{let r=this.getCode(e),i;r==="UP"||r==="DOWN"?i=this.emitMoveEvent(r):r==="ENTER"?i=this.emitEnterEvent():r==="ESC"&&(i=this.emitEscEvent()),i&&i.defaultPrevented&&e.preventDefault()},this.startListening()}destroy(){return super.destroy(),this.stopListening(),this}applySearchResult(n){let e=this.getBeforeCursor();if(e!=null){let r=n.replace(e,this.getAfterCursor());this.el.focus(),Array.isArray(r)&&((0,CS.update)(this.el,r[0],r[1]),this.el&&this.el.dispatchEvent((0,Vp.createCustomEvent)("input")))}}getCursorOffset(){let n=(0,qp.calculateElementOffset)(this.el),e=this.getElScroll(),r=this.getCursorPosition(),i=(0,qp.getLineHeightPx)(this.el),a=n.top-e.top+r.top+i,o=n.left-e.left+r.left,s=this.el.getBoundingClientRect().top;if(this.el.dir!=="rtl")return{top:a,left:o,lineHeight:i,clientTop:s};{let u=document.documentElement?document.documentElement.clientWidth-o:0;return{top:a,right:u,lineHeight:i,clientTop:s}}}getBeforeCursor(){return this.el.selectionStart!==this.el.selectionEnd?null:this.el.value.substring(0,this.el.selectionEnd)}getAfterCursor(){return this.el.value.substring(this.el.selectionEnd)}getElScroll(){return{top:this.el.scrollTop,left:this.el.scrollLeft}}getCursorPosition(){return(0,IS.default)(this.el,this.el.selectionEnd)}startListening(){this.el.addEventListener("input",this.onInput),this.el.addEventListener("keydown",this.onKeydown)}stopListening(){this.el.removeEventListener("input",this.onInput),this.el.removeEventListener("keydown",this.onKeydown)}};Si.TextareaEditor=Wp});var Jp=Fe(os=>{"use strict";Object.defineProperty(os,"__esModule",{value:!0});os.TextareaEditor=void 0;var AS=Yp();Object.defineProperty(os,"TextareaEditor",{enumerable:!0,get:function(){return AS.TextareaEditor}})});var Bm=Fe((Hc,Bc)=>{(function(t,n){typeof Hc=="object"&&typeof Bc!="undefined"?Bc.exports=n():typeof define=="function"&&define.amd?define(n):t.Mark=n()})(Hc,function(){"use strict";var t=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(s){return typeof s}:function(s){return s&&typeof Symbol=="function"&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},n=function(s,u){if(!(s instanceof u))throw new TypeError("Cannot call a class as a function")},e=function(){function s(u,l){for(var c=0;c1&&arguments[1]!==void 0?arguments[1]:!0,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],d=arguments.length>3&&arguments[3]!==void 0?arguments[3]:5e3;n(this,s),this.ctx=u,this.iframes=l,this.exclude=c,this.iframesTimeout=d}return e(s,[{key:"getContexts",value:function(){var l=void 0,c=[];return typeof this.ctx=="undefined"||!this.ctx?l=[]:NodeList.prototype.isPrototypeOf(this.ctx)?l=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?l=this.ctx:typeof this.ctx=="string"?l=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):l=[this.ctx],l.forEach(function(d){var f=c.filter(function(h){return h.contains(d)}).length>0;c.indexOf(d)===-1&&!f&&c.push(d)}),c}},{key:"getIframeContents",value:function(l,c){var d=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){},f=void 0;try{var h=l.contentWindow;if(f=h.document,!h||!f)throw new Error("iframe inaccessible")}catch(p){d()}f&&c(f)}},{key:"isIframeBlank",value:function(l){var c="about:blank",d=l.getAttribute("src").trim(),f=l.contentWindow.location.href;return f===c&&d!==c&&d}},{key:"observeIframeLoad",value:function(l,c,d){var f=this,h=!1,p=null,g=function w(){if(!h){h=!0,clearTimeout(p);try{f.isIframeBlank(l)||(l.removeEventListener("load",w),f.getIframeContents(l,c,d))}catch(S){d()}}};l.addEventListener("load",g),p=setTimeout(g,this.iframesTimeout)}},{key:"onIframeReady",value:function(l,c,d){try{l.contentWindow.document.readyState==="complete"?this.isIframeBlank(l)?this.observeIframeLoad(l,c,d):this.getIframeContents(l,c,d):this.observeIframeLoad(l,c,d)}catch(f){d()}}},{key:"waitForIframes",value:function(l,c){var d=this,f=0;this.forEachIframe(l,function(){return!0},function(h){f++,d.waitForIframes(h.querySelector("html"),function(){--f||c()})},function(h){h||c()})}},{key:"forEachIframe",value:function(l,c,d){var f=this,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:function(){},p=l.querySelectorAll("iframe"),g=p.length,w=0;p=Array.prototype.slice.call(p);var S=function(){--g<=0&&h(w)};g||S(),p.forEach(function(_){s.matches(_,f.exclude)?S():f.onIframeReady(_,function(k){c(_)&&(w++,d(k)),S()},S)})}},{key:"createIterator",value:function(l,c,d){return document.createNodeIterator(l,c,d,!1)}},{key:"createInstanceOnIframe",value:function(l){return new s(l.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(l,c,d){var f=l.compareDocumentPosition(d),h=Node.DOCUMENT_POSITION_PRECEDING;if(f&h)if(c!==null){var p=c.compareDocumentPosition(d),g=Node.DOCUMENT_POSITION_FOLLOWING;if(p&g)return!0}else return!0;return!1}},{key:"getIteratorNode",value:function(l){var c=l.previousNode(),d=void 0;return c===null?d=l.nextNode():d=l.nextNode()&&l.nextNode(),{prevNode:c,node:d}}},{key:"checkIframeFilter",value:function(l,c,d,f){var h=!1,p=!1;return f.forEach(function(g,w){g.val===d&&(h=w,p=g.handled)}),this.compareNodeIframe(l,c,d)?(h===!1&&!p?f.push({val:d,handled:!0}):h!==!1&&!p&&(f[h].handled=!0),!0):(h===!1&&f.push({val:d,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(l,c,d,f){var h=this;l.forEach(function(p){p.handled||h.getIframeContents(p.val,function(g){h.createInstanceOnIframe(g).forEachNode(c,d,f)})})}},{key:"iterateThroughNodes",value:function(l,c,d,f,h){for(var p=this,g=this.createIterator(c,l,f),w=[],S=[],_=void 0,k=void 0,P=function(){var D=p.getIteratorNode(g);return k=D.prevNode,_=D.node,_};P();)this.iframes&&this.forEachIframe(c,function(I){return p.checkIframeFilter(_,k,I,w)},function(I){p.createInstanceOnIframe(I).forEachNode(l,function(D){return S.push(D)},f)}),S.push(_);S.forEach(function(I){d(I)}),this.iframes&&this.handleOpenIframes(w,l,d,f),h()}},{key:"forEachNode",value:function(l,c,d){var f=this,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:function(){},p=this.getContexts(),g=p.length;g||h(),p.forEach(function(w){var S=function(){f.iterateThroughNodes(l,w,c,d,function(){--g<=0&&h()})};f.iframes?f.waitForIframes(w,S):S()})}}],[{key:"matches",value:function(l,c){var d=typeof c=="string"?[c]:c,f=l.matches||l.matchesSelector||l.msMatchesSelector||l.mozMatchesSelector||l.oMatchesSelector||l.webkitMatchesSelector;if(f){var h=!1;return d.every(function(p){return f.call(l,p)?(h=!0,!1):!0}),h}else return!1}}]),s}(),a=function(){function s(u){n(this,s),this.ctx=u,this.ie=!1;var l=window.navigator.userAgent;(l.indexOf("MSIE")>-1||l.indexOf("Trident")>-1)&&(this.ie=!0)}return e(s,[{key:"log",value:function(l){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"debug",d=this.opt.log;!this.opt.debug||(typeof d=="undefined"?"undefined":t(d))==="object"&&typeof d[c]=="function"&&d[c]("mark.js: "+l)}},{key:"escapeStr",value:function(l){return l.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(l){return this.opt.wildcards!=="disabled"&&(l=this.setupWildcardsRegExp(l)),l=this.escapeStr(l),Object.keys(this.opt.synonyms).length&&(l=this.createSynonymsRegExp(l)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.setupIgnoreJoinersRegExp(l)),this.opt.diacritics&&(l=this.createDiacriticsRegExp(l)),l=this.createMergedBlanksRegExp(l),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.createJoinersRegExp(l)),this.opt.wildcards!=="disabled"&&(l=this.createWildcardsRegExp(l)),l=this.createAccuracyRegExp(l),l}},{key:"createSynonymsRegExp",value:function(l){var c=this.opt.synonyms,d=this.opt.caseSensitive?"":"i",f=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var h in c)if(c.hasOwnProperty(h)){var p=c[h],g=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(h):this.escapeStr(h),w=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(p):this.escapeStr(p);g!==""&&w!==""&&(l=l.replace(new RegExp("("+this.escapeStr(g)+"|"+this.escapeStr(w)+")","gm"+d),f+("("+this.processSynomyms(g)+"|")+(this.processSynomyms(w)+")")+f))}return l}},{key:"processSynomyms",value:function(l){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.setupIgnoreJoinersRegExp(l)),l}},{key:"setupWildcardsRegExp",value:function(l){return l=l.replace(/(?:\\)*\?/g,function(c){return c.charAt(0)==="\\"?"?":""}),l.replace(/(?:\\)*\*/g,function(c){return c.charAt(0)==="\\"?"*":""})}},{key:"createWildcardsRegExp",value:function(l){var c=this.opt.wildcards==="withSpaces";return l.replace(/\u0001/g,c?"[\\S\\s]?":"\\S?").replace(/\u0002/g,c?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(l){return l.replace(/[^(|)\\]/g,function(c,d,f){var h=f.charAt(d+1);return/[(|)\\]/.test(h)||h===""?c:c+"\0"})}},{key:"createJoinersRegExp",value:function(l){var c=[],d=this.opt.ignorePunctuation;return Array.isArray(d)&&d.length&&c.push(this.escapeStr(d.join(""))),this.opt.ignoreJoiners&&c.push("\\u00ad\\u200b\\u200c\\u200d"),c.length?l.split(/\u0000+/).join("["+c.join("")+"]*"):l}},{key:"createDiacriticsRegExp",value:function(l){var c=this.opt.caseSensitive?"":"i",d=this.opt.caseSensitive?["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105","A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104","c\xE7\u0107\u010D","C\xC7\u0106\u010C","d\u0111\u010F","D\u0110\u010E","e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119","E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118","i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B","I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A","l\u0142","L\u0141","n\xF1\u0148\u0144","N\xD1\u0147\u0143","o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D","O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C","r\u0159","R\u0158","s\u0161\u015B\u0219\u015F","S\u0160\u015A\u0218\u015E","t\u0165\u021B\u0163","T\u0164\u021A\u0162","u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B","U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A","y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF","Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178","z\u017E\u017C\u017A","Z\u017D\u017B\u0179"]:["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104","c\xE7\u0107\u010DC\xC7\u0106\u010C","d\u0111\u010FD\u0110\u010E","e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118","i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A","l\u0142L\u0141","n\xF1\u0148\u0144N\xD1\u0147\u0143","o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C","r\u0159R\u0158","s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E","t\u0165\u021B\u0163T\u0164\u021A\u0162","u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A","y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178","z\u017E\u017C\u017AZ\u017D\u017B\u0179"],f=[];return l.split("").forEach(function(h){d.every(function(p){if(p.indexOf(h)!==-1){if(f.indexOf(p)>-1)return!1;l=l.replace(new RegExp("["+p+"]","gm"+c),"["+p+"]"),f.push(p)}return!0})}),l}},{key:"createMergedBlanksRegExp",value:function(l){return l.replace(/[\s]+/gmi,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(l){var c=this,d="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF",f=this.opt.accuracy,h=typeof f=="string"?f:f.value,p=typeof f=="string"?[]:f.limiters,g="";switch(p.forEach(function(w){g+="|"+c.escapeStr(w)}),h){case"partially":default:return"()("+l+")";case"complementary":return g="\\s"+(g||this.escapeStr(d)),"()([^"+g+"]*"+l+"[^"+g+"]*)";case"exactly":return"(^|\\s"+g+")("+l+")(?=$|\\s"+g+")"}}},{key:"getSeparatedKeywords",value:function(l){var c=this,d=[];return l.forEach(function(f){c.opt.separateWordSearch?f.split(" ").forEach(function(h){h.trim()&&d.indexOf(h)===-1&&d.push(h)}):f.trim()&&d.indexOf(f)===-1&&d.push(f)}),{keywords:d.sort(function(f,h){return h.length-f.length}),length:d.length}}},{key:"isNumeric",value:function(l){return Number(parseFloat(l))==l}},{key:"checkRanges",value:function(l){var c=this;if(!Array.isArray(l)||Object.prototype.toString.call(l[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(l),[];var d=[],f=0;return l.sort(function(h,p){return h.start-p.start}).forEach(function(h){var p=c.callNoMatchOnInvalidRanges(h,f),g=p.start,w=p.end,S=p.valid;S&&(h.start=g,h.length=w-g,d.push(h),f=w)}),d}},{key:"callNoMatchOnInvalidRanges",value:function(l,c){var d=void 0,f=void 0,h=!1;return l&&typeof l.start!="undefined"?(d=parseInt(l.start,10),f=d+parseInt(l.length,10),this.isNumeric(l.start)&&this.isNumeric(l.length)&&f-c>0&&f-d>0?h=!0:(this.log("Ignoring invalid or overlapping range: "+(""+JSON.stringify(l))),this.opt.noMatch(l))):(this.log("Ignoring invalid range: "+JSON.stringify(l)),this.opt.noMatch(l)),{start:d,end:f,valid:h}}},{key:"checkWhitespaceRanges",value:function(l,c,d){var f=void 0,h=!0,p=d.length,g=c-p,w=parseInt(l.start,10)-g;return w=w>p?p:w,f=w+parseInt(l.length,10),f>p&&(f=p,this.log("End range automatically set to the max value of "+p)),w<0||f-w<0||w>p||f>p?(h=!1,this.log("Invalid range: "+JSON.stringify(l)),this.opt.noMatch(l)):d.substring(w,f).replace(/\s+/g,"")===""&&(h=!1,this.log("Skipping whitespace only range: "+JSON.stringify(l)),this.opt.noMatch(l)),{start:w,end:f,valid:h}}},{key:"getTextNodes",value:function(l){var c=this,d="",f=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(h){f.push({start:d.length,end:(d+=h.textContent).length,node:h})},function(h){return c.matchesExclude(h.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){l({value:d,nodes:f})})}},{key:"matchesExclude",value:function(l){return i.matches(l,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(l,c,d){var f=this.opt.element?this.opt.element:"mark",h=l.splitText(c),p=h.splitText(d-c),g=document.createElement(f);return g.setAttribute("data-markjs","true"),this.opt.className&&g.setAttribute("class",this.opt.className),g.textContent=h.textContent,h.parentNode.replaceChild(g,h),p}},{key:"wrapRangeInMappedTextNode",value:function(l,c,d,f,h){var p=this;l.nodes.every(function(g,w){var S=l.nodes[w+1];if(typeof S=="undefined"||S.start>c){if(!f(g.node))return!1;var _=c-g.start,k=(d>g.end?g.end:d)-g.start,P=l.value.substr(0,g.start),I=l.value.substr(k+g.start);if(g.node=p.wrapRangeInTextNode(g.node,_,k),l.value=P+I,l.nodes.forEach(function(D,N){N>=w&&(l.nodes[N].start>0&&N!==w&&(l.nodes[N].start-=k),l.nodes[N].end-=k)}),d-=k,h(g.node.previousSibling,g.start),d>g.end)c=g.end;else return!1}return!0})}},{key:"wrapMatches",value:function(l,c,d,f,h){var p=this,g=c===0?0:c+1;this.getTextNodes(function(w){w.nodes.forEach(function(S){S=S.node;for(var _=void 0;(_=l.exec(S.textContent))!==null&&_[g]!=="";)if(!!d(_[g],S)){var k=_.index;if(g!==0)for(var P=1;P{"use strict";var hs=rr&&rr.__assign||function(){return hs=Object.assign||function(t){for(var n,e=1,r=arguments.length;e0&&a[a.length-1])&&(l[0]===6||l[0]===2)){e=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]-1&&(n&&nr.cancelMethods[e](),nr.elements.splice(e,1),nr.cancelMethods.splice(e,1))}},xg=typeof window!="undefined",hk={cancelOnUserAction:!0,easing:function(t){return--t*t*t+1},elementToScroll:xg?window:null,horizontalOffset:0,maxDuration:3e3,minDuration:250,speed:500,verticalOffset:0};function pk(t,n){return n===void 0&&(n={}),ck(this,void 0,void 0,function(){var e,r,i,a,o,s,u,l,c,d,f,h,p,g,w,S,_,k;return uk(this,function(P){if(xg){if(!window.Promise)throw"Browser doesn't support Promises, and animated-scroll-to depends on it, please provide a polyfill."}else return[2,new Promise(function(I){I(!1)})];if(a=hs(hs({},hk),n),o=a.elementToScroll===window,s=!!a.elementToScroll.nodeName,!o&&!s)throw"Element to scroll needs to be either window or DOM element.";if(u=o?document.documentElement:a.elementToScroll,l=getComputedStyle(u).getPropertyValue("scroll-behavior"),l==="smooth"&&console.warn(u.tagName+` has "scroll-behavior: smooth" which can mess up with animated-scroll-to's animations`),c=o?new fk:new dk(a.elementToScroll),t instanceof Element){if(i=t,s&&(!a.elementToScroll.contains(i)||a.elementToScroll.isSameNode(i)))throw"options.elementToScroll has to be a parent of scrollToElement";e=c.getHorizontalElementScrollOffset(i,a.elementToScroll),r=c.getVerticalElementScrollOffset(i,a.elementToScroll)}else if(typeof t=="number")e=c.getHorizontalScroll(),r=t;else if(Array.isArray(t)&&t.length===2)e=t[0]===null?c.getHorizontalScroll():t[0],r=t[1]===null?c.getVerticalScroll():t[1];else throw`Wrong function signature. Check documentation. +var by=Object.create;var Na=Object.defineProperty;var wy=Object.getOwnPropertyDescriptor;var Ey=Object.getOwnPropertyNames;var Sy=Object.getPrototypeOf,xy=Object.prototype.hasOwnProperty;var Pu=t=>Na(t,"__esModule",{value:!0});var ky=(t,n)=>()=>(t&&(n=t(t=0)),n),rt=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),Oi=(t,n)=>{for(var e in n)Na(t,e,{get:n[e],enumerable:!0})},_y=(t,n,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Ey(n))!xy.call(t,r)&&r!=="default"&&Na(t,r,{get:()=>n[r],enumerable:!(e=wy(n,r))||e.enumerable});return t},me=t=>_y(Pu(Na(t!=null?by(Sy(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var It=rt((Nn,Td)=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});function En(t){return typeof t=="object"&&!("toString"in t)?Object.prototype.toString.call(t).slice(8,-1):t}var nb=typeof process=="object"&&!0;function pn(t,n){if(!t)throw nb?new Error("Invariant failed"):new Error(n())}Nn.invariant=pn;var sl=Object.prototype.hasOwnProperty,rb=Array.prototype.splice,ib=Object.prototype.toString;function xr(t){return ib.call(t).slice(8,-1)}var qa=Object.assign||function(t,n){return ll(n).forEach(function(e){sl.call(n,e)&&(t[e]=n[e])}),t},ll=typeof Object.getOwnPropertySymbols=="function"?function(t){return Object.keys(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.keys(t)};function or(t){return Array.isArray(t)?qa(t.constructor(t.length),t):xr(t)==="Map"?new Map(t):xr(t)==="Set"?new Set(t):t&&typeof t=="object"?qa(Object.create(Object.getPrototypeOf(t)),t):t}var Sd=function(){function t(){this.commands=qa({},ab),this.update=this.update.bind(this),this.update.extend=this.extend=this.extend.bind(this),this.update.isEquals=function(n,e){return n===e},this.update.newContext=function(){return new t().update}}return Object.defineProperty(t.prototype,"isEquals",{get:function(){return this.update.isEquals},set:function(n){this.update.isEquals=n},enumerable:!0,configurable:!0}),t.prototype.extend=function(n,e){this.commands[n]=e},t.prototype.update=function(n,e){var r=this,i=typeof e=="function"?{$apply:e}:e;Array.isArray(n)&&Array.isArray(i)||pn(!Array.isArray(i),function(){return"update(): You provided an invalid spec to update(). The spec may not contain an array except as the value of $set, $push, $unshift, $splice or any custom command allowing an array value."}),pn(typeof i=="object"&&i!==null,function(){return"update(): You provided an invalid spec to update(). The spec and every included key path must be plain objects containing one of the "+("following commands: "+Object.keys(r.commands).join(", ")+".")});var a=n;return ll(i).forEach(function(o){if(sl.call(r.commands,o)){var s=n===a;a=r.commands[o](i[o],a,i,n),s&&r.isEquals(a,n)&&(a=n)}else{var u=xr(n)==="Map"?r.update(n.get(o),i[o]):r.update(n[o],i[o]),l=xr(a)==="Map"?a.get(o):a[o];(!r.isEquals(u,l)||typeof u=="undefined"&&!sl.call(n,o))&&(a===n&&(a=or(n)),xr(a)==="Map"?a.set(o,u):a[o]=u)}}),a},t}();Nn.Context=Sd;var ab={$push:function(t,n,e){return xd(n,e,"$push"),t.length?n.concat(t):n},$unshift:function(t,n,e){return xd(n,e,"$unshift"),t.length?t.concat(n):n},$splice:function(t,n,e,r){return ob(n,e),t.forEach(function(i){kd(i),n===r&&i.length&&(n=or(r)),rb.apply(n,i)}),n},$set:function(t,n,e){return lb(e),t},$toggle:function(t,n){Ki(t,"$toggle");var e=t.length?or(n):n;return t.forEach(function(r){e[r]=!n[r]}),e},$unset:function(t,n,e,r){return Ki(t,"$unset"),t.forEach(function(i){Object.hasOwnProperty.call(n,i)&&(n===r&&(n=or(r)),delete n[i])}),n},$add:function(t,n,e,r){return _d(n,"$add"),Ki(t,"$add"),xr(n)==="Map"?t.forEach(function(i){var a=i[0],o=i[1];n===r&&n.get(a)!==o&&(n=or(r)),n.set(a,o)}):t.forEach(function(i){n===r&&!n.has(i)&&(n=or(r)),n.add(i)}),n},$remove:function(t,n,e,r){return _d(n,"$remove"),Ki(t,"$remove"),t.forEach(function(i){n===r&&n.has(i)&&(n=or(r)),n.delete(i)}),n},$merge:function(t,n,e,r){return cb(n,t),ll(t).forEach(function(i){t[i]!==n[i]&&(n===r&&(n=or(r)),n[i]=t[i])}),n},$apply:function(t,n){return sb(t),t(n)}},cl=new Sd;Nn.isEquals=cl.update.isEquals;Nn.extend=cl.extend;Nn.default=cl.update;Nn.default.default=Td.exports=qa(Nn.default,Nn);function xd(t,n,e){pn(Array.isArray(t),function(){return"update(): expected target of "+En(e)+" to be an array; got "+En(t)+"."}),Ki(n[e],e)}function Ki(t,n){pn(Array.isArray(t),function(){return"update(): expected spec of "+En(n)+" to be an array; got "+En(t)+". Did you forget to wrap your parameter in an array?"})}function ob(t,n){pn(Array.isArray(t),function(){return"Expected $splice target to be an array; got "+En(t)}),kd(n.$splice)}function kd(t){pn(Array.isArray(t),function(){return"update(): expected spec of $splice to be an array of arrays; got "+En(t)+". Did you forget to wrap your parameters in an array?"})}function sb(t){pn(typeof t=="function",function(){return"update(): expected spec of $apply to be a function; got "+En(t)+"."})}function lb(t){pn(Object.keys(t).length===1,function(){return"Cannot have more than one key in an object with $set"})}function cb(t,n){pn(n&&typeof n=="object",function(){return"update(): $merge expects a spec of type 'object'; got "+En(n)}),pn(t&&typeof t=="object",function(){return"update(): $merge expects a target of type 'object'; got "+En(t)})}function _d(t,n){var e=xr(t);pn(e==="Map"||e==="Set",function(){return"update(): "+En(n)+" expects a target of type Set or Map; got "+En(e)})}});var Ad=rt((L_,Dd)=>{"use strict";var ub=function(n){return db(n)&&!fb(n)};function db(t){return!!t&&typeof t=="object"}function fb(t){var n=Object.prototype.toString.call(t);return n==="[object RegExp]"||n==="[object Date]"||mb(t)}var hb=typeof Symbol=="function"&&Symbol.for,pb=hb?Symbol.for("react.element"):60103;function mb(t){return t.$$typeof===pb}function gb(t){return Array.isArray(t)?[]:{}}function $i(t,n){return n.clone!==!1&&n.isMergeableObject(t)?Gr(gb(t),t,n):t}function vb(t,n,e){return t.concat(n).map(function(r){return $i(r,e)})}function yb(t,n){if(!n.customMerge)return Gr;var e=n.customMerge(t);return typeof e=="function"?e:Gr}function bb(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(n){return t.propertyIsEnumerable(n)}):[]}function Md(t){return Object.keys(t).concat(bb(t))}function Cd(t,n){try{return n in t}catch(e){return!1}}function wb(t,n){return Cd(t,n)&&!(Object.hasOwnProperty.call(t,n)&&Object.propertyIsEnumerable.call(t,n))}function Eb(t,n,e){var r={};return e.isMergeableObject(t)&&Md(t).forEach(function(i){r[i]=$i(t[i],e)}),Md(n).forEach(function(i){wb(t,i)||(Cd(t,i)&&e.isMergeableObject(n[i])?r[i]=yb(i,e)(t[i],n[i],e):r[i]=$i(n[i],e))}),r}function Gr(t,n,e){e=e||{},e.arrayMerge=e.arrayMerge||vb,e.isMergeableObject=e.isMergeableObject||ub,e.cloneUnlessOtherwiseSpecified=$i;var r=Array.isArray(n),i=Array.isArray(t),a=r===i;return a?r?e.arrayMerge(t,n,e):Eb(t,n,e):$i(n,e)}Gr.all=function(n,e){if(!Array.isArray(n))throw new Error("first argument should be an array");return n.reduce(function(r,i){return Gr(r,i,e)},{})};var Sb=Gr;Dd.exports=Sb});var to=rt(ot=>{"use strict";var wl=32;ot.INT_BITS=wl;ot.INT_MAX=2147483647;ot.INT_MIN=-1<0)-(t<0)};ot.abs=function(t){var n=t>>wl-1;return(t^n)-n};ot.min=function(t,n){return n^(t^n)&-(t65535)<<4,t>>>=n,e=(t>255)<<3,t>>>=e,n|=e,e=(t>15)<<2,t>>>=e,n|=e,e=(t>3)<<1,t>>>=e,n|=e,n|t>>1};ot.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0};ot.popCount=function(t){return t=t-(t>>>1&1431655765),t=(t&858993459)+(t>>>2&858993459),(t+(t>>>4)&252645135)*16843009>>>24};function qd(t){var n=32;return t&=-t,t&&n--,t&65535&&(n-=16),t&16711935&&(n-=8),t&252645135&&(n-=4),t&858993459&&(n-=2),t&1431655765&&(n-=1),n}ot.countTrailingZeros=qd;ot.nextPow2=function(t){return t+=t===0,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t+1};ot.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t-(t>>>1)};ot.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,t&=15,27030>>>t&1};var Yi=new Array(256);(function(t){for(var n=0;n<256;++n){var e=n,r=n,i=7;for(e>>>=1;e;e>>>=1)r<<=1,r|=e&1,--i;t[n]=r<>>8&255]<<16|Yi[t>>>16&255]<<8|Yi[t>>>24&255]};ot.interleave2=function(t,n){return t&=65535,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,n&=65535,n=(n|n<<8)&16711935,n=(n|n<<4)&252645135,n=(n|n<<2)&858993459,n=(n|n<<1)&1431655765,t|n<<1};ot.deinterleave2=function(t,n){return t=t>>>n&1431655765,t=(t|t>>>1)&858993459,t=(t|t>>>2)&252645135,t=(t|t>>>4)&16711935,t=(t|t>>>16)&65535,t<<16>>16};ot.interleave3=function(t,n,e){return t&=1023,t=(t|t<<16)&4278190335,t=(t|t<<8)&251719695,t=(t|t<<4)&3272356035,t=(t|t<<2)&1227133513,n&=1023,n=(n|n<<16)&4278190335,n=(n|n<<8)&251719695,n=(n|n<<4)&3272356035,n=(n|n<<2)&1227133513,t|=n<<1,e&=1023,e=(e|e<<16)&4278190335,e=(e|e<<8)&251719695,e=(e|e<<4)&3272356035,e=(e|e<<2)&1227133513,t|e<<2};ot.deinterleave3=function(t,n){return t=t>>>n&1227133513,t=(t|t>>>2)&3272356035,t=(t|t>>>4)&251719695,t=(t|t>>>8)&4278190335,t=(t|t>>>16)&1023,t<<22>>22};ot.nextCombination=function(t){var n=t|t-1;return n+1|(~n&-~n)-1>>>qd(t)+1}});var Gd=rt((u1,Jd)=>{"use strict";function Yd(t,n,e){var r=t[e]|0;if(r<=0)return[];var i=new Array(r),a;if(e===t.length-1)for(a=0;a0)return Pb(t|0,n);break;case"object":if(typeof t.length=="number")return Yd(t,n,0);break}return[]}Jd.exports=Ob});var vf={};Oi(vf,{Buffer:()=>Z,INSPECT_MAX_BYTES:()=>tf,SlowBuffer:()=>jb,isBuffer:()=>mf,kMaxLength:()=>Kb});function Qd(){El=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,e=t.length;n0)throw new Error("Invalid string. Length must be a multiple of 4");a=t[s-2]==="="?2:t[s-1]==="="?1:0,o=new Nb(s*3/4-a),r=a>0?s-4:s;var u=0;for(n=0,e=0;n>16&255,o[u++]=i>>8&255,o[u++]=i&255;return a===2?(i=mn[t.charCodeAt(n)]<<2|mn[t.charCodeAt(n+1)]>>4,o[u++]=i&255):a===1&&(i=mn[t.charCodeAt(n)]<<10|mn[t.charCodeAt(n+1)]<<4|mn[t.charCodeAt(n+2)]>>2,o[u++]=i>>8&255,o[u++]=i&255),o}function Rb(t){return Hn[t>>18&63]+Hn[t>>12&63]+Hn[t>>6&63]+Hn[t&63]}function Hb(t,n,e){for(var r,i=[],a=n;au?u:s+o));return r===1?(n=t[e-1],i+=Hn[n>>2],i+=Hn[n<<4&63],i+="=="):r===2&&(n=(t[e-2]<<8)+t[e-1],i+=Hn[n>>10],i+=Hn[n>>4&63],i+=Hn[n<<2&63],i+="="),a.push(i),a.join("")}function no(t,n,e,r,i){var a,o,s=i*8-r-1,u=(1<>1,c=-7,d=e?i-1:0,f=e?-1:1,h=t[n+d];for(d+=f,a=h&(1<<-c)-1,h>>=-c,c+=s;c>0;a=a*256+t[n+d],d+=f,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=r;c>0;o=o*256+t[n+d],d+=f,c-=8);if(a===0)a=1-l;else{if(a===u)return o?NaN:(h?-1:1)*Infinity;o=o+Math.pow(2,r),a=a-l}return(h?-1:1)*o*Math.pow(2,a-r)}function Zd(t,n,e,r,i,a){var o,s,u,l=a*8-i-1,c=(1<>1,f=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,p=r?1:-1,g=n<0||n===0&&1/n<0?1:0;for(n=Math.abs(n),isNaN(n)||n===Infinity?(s=isNaN(n)?1:0,o=c):(o=Math.floor(Math.log(n)/Math.LN2),n*(u=Math.pow(2,-o))<1&&(o--,u*=2),o+d>=1?n+=f/u:n+=f*Math.pow(2,1-d),n*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(n*u-1)*Math.pow(2,i),o=o+d):(s=n*Math.pow(2,d-1)*Math.pow(2,i),o=0));i>=8;t[e+h]=s&255,h+=p,s/=256,i-=8);for(o=o<0;t[e+h]=o&255,h+=p,o/=256,l-=8);t[e+h-p]|=g*128}function ro(){return Z.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function qn(t,n){if(ro()=ro())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ro().toString(16)+" bytes");return t|0}function jb(t){return+t!=t&&(t=0),Z.alloc(+t)}function Bn(t){return!!(t!=null&&t._isBuffer)}function af(t,n){if(Bn(t))return t.length;if(typeof ArrayBuffer!="undefined"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;typeof t!="string"&&(t=""+t);var e=t.length;if(e===0)return 0;for(var r=!1;;)switch(n){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return oo(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return e*2;case"hex":return e>>>1;case"base64":return pf(t).length;default:if(r)return oo(t).length;n=(""+n).toLowerCase(),r=!0}}function Wb(t,n,e){var r=!1;if((n===void 0||n<0)&&(n=0),n>this.length||((e===void 0||e>this.length)&&(e=this.length),e<=0)||(e>>>=0,n>>>=0,e<=n))return"";for(t||(t="utf8");;)switch(t){case"hex":return nw(this,n,e);case"utf8":case"utf-8":return cf(this,n,e);case"ascii":return ew(this,n,e);case"latin1":case"binary":return tw(this,n,e);case"base64":return Xb(this,n,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return rw(this,n,e);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function _r(t,n,e){var r=t[n];t[n]=t[e],t[e]=r}function of(t,n,e,r,i){if(t.length===0)return-1;if(typeof e=="string"?(r=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=i?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(i)return-1;e=t.length-1}else if(e<0)if(i)e=0;else return-1;if(typeof n=="string"&&(n=Z.from(n,r)),Bn(n))return n.length===0?-1:sf(t,n,e,r,i);if(typeof n=="number")return n=n&255,Z.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?i?Uint8Array.prototype.indexOf.call(t,n,e):Uint8Array.prototype.lastIndexOf.call(t,n,e):sf(t,[n],e,r,i);throw new TypeError("val must be string, number or Buffer")}function sf(t,n,e,r,i){var a=1,o=t.length,s=n.length;if(r!==void 0&&(r=String(r).toLowerCase(),r==="ucs2"||r==="ucs-2"||r==="utf16le"||r==="utf-16le")){if(t.length<2||n.length<2)return-1;a=2,o/=2,s/=2,e/=2}function u(h,p){return a===1?h[p]:h.readUInt16BE(p*a)}var l;if(i){var c=-1;for(l=e;lo&&(e=o-s),l=e;l>=0;l--){for(var d=!0,f=0;fi&&(r=i)):r=i;var a=n.length;if(a%2!=0)throw new TypeError("Invalid hex string");r>a/2&&(r=a/2);for(var o=0;o239?4:a>223?3:a>191?2:1;if(i+s<=e){var u,l,c,d;switch(s){case 1:a<128&&(o=a);break;case 2:u=t[i+1],(u&192)==128&&(d=(a&31)<<6|u&63,d>127&&(o=d));break;case 3:u=t[i+1],l=t[i+2],(u&192)==128&&(l&192)==128&&(d=(a&15)<<12|(u&63)<<6|l&63,d>2047&&(d<55296||d>57343)&&(o=d));break;case 4:u=t[i+1],l=t[i+2],c=t[i+3],(u&192)==128&&(l&192)==128&&(c&192)==128&&(d=(a&15)<<18|(u&63)<<12|(l&63)<<6|c&63,d>65535&&d<1114112&&(o=d))}}o===null?(o=65533,s=1):o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|o&1023),r.push(o),i+=s}return Zb(r)}function Zb(t){var n=t.length;if(n<=uf)return String.fromCharCode.apply(String,t);for(var e="",r=0;rr)&&(e=r);for(var i="",a=n;ae)throw new RangeError("Trying to access beyond buffer length")}function Jt(t,n,e,r,i,a){if(!Bn(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(n>i||nt.length)throw new RangeError("Index out of range")}function io(t,n,e,r){n<0&&(n=65535+n+1);for(var i=0,a=Math.min(t.length-e,2);i>>(r?i:1-i)*8}function ao(t,n,e,r){n<0&&(n=4294967295+n+1);for(var i=0,a=Math.min(t.length-e,4);i>>(r?i:3-i)*8&255}function df(t,n,e,r,i,a){if(e+r>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function ff(t,n,e,r,i){return i||df(t,n,e,4),Zd(t,n,e,r,23,4),e+4}function hf(t,n,e,r,i){return i||df(t,n,e,8),Zd(t,n,e,r,52,8),e+8}function aw(t){if(t=ow(t).replace(iw,""),t.length<2)return"";for(;t.length%4!=0;)t=t+"=";return t}function ow(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function sw(t){return t<16?"0"+t.toString(16):t.toString(16)}function oo(t,n){n=n||Infinity;for(var e,r=t.length,i=null,a=[],o=0;o55295&&e<57344){if(!i){if(e>56319){(n-=3)>-1&&a.push(239,191,189);continue}else if(o+1===r){(n-=3)>-1&&a.push(239,191,189);continue}i=e;continue}if(e<56320){(n-=3)>-1&&a.push(239,191,189),i=e;continue}e=(i-55296<<10|e-56320)+65536}else i&&(n-=3)>-1&&a.push(239,191,189);if(i=null,e<128){if((n-=1)<0)break;a.push(e)}else if(e<2048){if((n-=2)<0)break;a.push(e>>6|192,e&63|128)}else if(e<65536){if((n-=3)<0)break;a.push(e>>12|224,e>>6&63|128,e&63|128)}else if(e<1114112){if((n-=4)<0)break;a.push(e>>18|240,e>>12&63|128,e>>6&63|128,e&63|128)}else throw new Error("Invalid code point")}return a}function lw(t){for(var n=[],e=0;e>8,i=e%256,a.push(i),a.push(r);return a}function pf(t){return Fb(aw(t))}function so(t,n,e,r){for(var i=0;i=n.length||i>=t.length);++i)n[i+e]=t[i];return i}function uw(t){return t!==t}function mf(t){return t!=null&&(!!t._isBuffer||gf(t)||dw(t))}function gf(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function dw(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&gf(t.slice(0,0))}var Hn,mn,Nb,El,Bb,ef,tf,Kb,uf,iw,yf=ky(()=>{Hn=[],mn=[],Nb=typeof Uint8Array!="undefined"?Uint8Array:Array,El=!1;Bb={}.toString,ef=Array.isArray||function(t){return Bb.call(t)=="[object Array]"};tf=50;Z.TYPED_ARRAY_SUPPORT=window.TYPED_ARRAY_SUPPORT!==void 0?window.TYPED_ARRAY_SUPPORT:!0;Kb=ro();Z.poolSize=8192;Z._augment=function(t){return t.__proto__=Z.prototype,t};Z.from=function(t,n,e){return nf(null,t,n,e)};Z.TYPED_ARRAY_SUPPORT&&(Z.prototype.__proto__=Uint8Array.prototype,Z.__proto__=Uint8Array);Z.alloc=function(t,n,e){return $b(null,t,n,e)};Z.allocUnsafe=function(t){return Sl(null,t)};Z.allocUnsafeSlow=function(t){return Sl(null,t)};Z.isBuffer=mf;Z.compare=function(n,e){if(!Bn(n)||!Bn(e))throw new TypeError("Arguments must be Buffers");if(n===e)return 0;for(var r=n.length,i=e.length,a=0,o=Math.min(r,i);a0&&(n=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(n+=" ... ")),""};Z.prototype.compare=function(n,e,r,i,a){if(!Bn(n))throw new TypeError("Argument must be a Buffer");if(e===void 0&&(e=0),r===void 0&&(r=n?n.length:0),i===void 0&&(i=0),a===void 0&&(a=this.length),e<0||r>n.length||i<0||a>this.length)throw new RangeError("out of range index");if(i>=a&&e>=r)return 0;if(i>=a)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,i>>>=0,a>>>=0,this===n)return 0;for(var o=a-i,s=r-e,u=Math.min(o,s),l=this.slice(i,a),c=n.slice(e,r),d=0;da)&&(r=a),n.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return qb(this,n,e,r);case"utf8":case"utf-8":return Yb(this,n,e,r);case"ascii":return lf(this,n,e,r);case"latin1":case"binary":return Jb(this,n,e,r);case"base64":return Gb(this,n,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Qb(this,n,e,r);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}};Z.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};uf=4096;Z.prototype.slice=function(n,e){var r=this.length;n=~~n,e=e===void 0?r:~~e,n<0?(n+=r,n<0&&(n=0)):n>r&&(n=r),e<0?(e+=r,e<0&&(e=0)):e>r&&(e=r),e0&&(a*=256);)i+=this[n+--e]*a;return i};Z.prototype.readUInt8=function(n,e){return e||St(n,1,this.length),this[n]};Z.prototype.readUInt16LE=function(n,e){return e||St(n,2,this.length),this[n]|this[n+1]<<8};Z.prototype.readUInt16BE=function(n,e){return e||St(n,2,this.length),this[n]<<8|this[n+1]};Z.prototype.readUInt32LE=function(n,e){return e||St(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+this[n+3]*16777216};Z.prototype.readUInt32BE=function(n,e){return e||St(n,4,this.length),this[n]*16777216+(this[n+1]<<16|this[n+2]<<8|this[n+3])};Z.prototype.readIntLE=function(n,e,r){n=n|0,e=e|0,r||St(n,e,this.length);for(var i=this[n],a=1,o=0;++o=a&&(i-=Math.pow(2,8*e)),i};Z.prototype.readIntBE=function(n,e,r){n=n|0,e=e|0,r||St(n,e,this.length);for(var i=e,a=1,o=this[n+--i];i>0&&(a*=256);)o+=this[n+--i]*a;return a*=128,o>=a&&(o-=Math.pow(2,8*e)),o};Z.prototype.readInt8=function(n,e){return e||St(n,1,this.length),this[n]&128?(255-this[n]+1)*-1:this[n]};Z.prototype.readInt16LE=function(n,e){e||St(n,2,this.length);var r=this[n]|this[n+1]<<8;return r&32768?r|4294901760:r};Z.prototype.readInt16BE=function(n,e){e||St(n,2,this.length);var r=this[n+1]|this[n]<<8;return r&32768?r|4294901760:r};Z.prototype.readInt32LE=function(n,e){return e||St(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24};Z.prototype.readInt32BE=function(n,e){return e||St(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]};Z.prototype.readFloatLE=function(n,e){return e||St(n,4,this.length),no(this,n,!0,23,4)};Z.prototype.readFloatBE=function(n,e){return e||St(n,4,this.length),no(this,n,!1,23,4)};Z.prototype.readDoubleLE=function(n,e){return e||St(n,8,this.length),no(this,n,!0,52,8)};Z.prototype.readDoubleBE=function(n,e){return e||St(n,8,this.length),no(this,n,!1,52,8)};Z.prototype.writeUIntLE=function(n,e,r,i){if(n=+n,e=e|0,r=r|0,!i){var a=Math.pow(2,8*r)-1;Jt(this,n,e,r,a,0)}var o=1,s=0;for(this[e]=n&255;++s=0&&(s*=256);)this[e+o]=n/s&255;return e+r};Z.prototype.writeUInt8=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,1,255,0),Z.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[e]=n&255,e+1};Z.prototype.writeUInt16LE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,2,65535,0),Z.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8):io(this,n,e,!0),e+2};Z.prototype.writeUInt16BE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,2,65535,0),Z.TYPED_ARRAY_SUPPORT?(this[e]=n>>>8,this[e+1]=n&255):io(this,n,e,!1),e+2};Z.prototype.writeUInt32LE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,4,4294967295,0),Z.TYPED_ARRAY_SUPPORT?(this[e+3]=n>>>24,this[e+2]=n>>>16,this[e+1]=n>>>8,this[e]=n&255):ao(this,n,e,!0),e+4};Z.prototype.writeUInt32BE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,4,4294967295,0),Z.TYPED_ARRAY_SUPPORT?(this[e]=n>>>24,this[e+1]=n>>>16,this[e+2]=n>>>8,this[e+3]=n&255):ao(this,n,e,!1),e+4};Z.prototype.writeIntLE=function(n,e,r,i){if(n=+n,e=e|0,!i){var a=Math.pow(2,8*r-1);Jt(this,n,e,r,a-1,-a)}var o=0,s=1,u=0;for(this[e]=n&255;++o>0)-u&255;return e+r};Z.prototype.writeIntBE=function(n,e,r,i){if(n=+n,e=e|0,!i){var a=Math.pow(2,8*r-1);Jt(this,n,e,r,a-1,-a)}var o=r-1,s=1,u=0;for(this[e+o]=n&255;--o>=0&&(s*=256);)n<0&&u===0&&this[e+o+1]!==0&&(u=1),this[e+o]=(n/s>>0)-u&255;return e+r};Z.prototype.writeInt8=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,1,127,-128),Z.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[e]=n&255,e+1};Z.prototype.writeInt16LE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,2,32767,-32768),Z.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8):io(this,n,e,!0),e+2};Z.prototype.writeInt16BE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,2,32767,-32768),Z.TYPED_ARRAY_SUPPORT?(this[e]=n>>>8,this[e+1]=n&255):io(this,n,e,!1),e+2};Z.prototype.writeInt32LE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,4,2147483647,-2147483648),Z.TYPED_ARRAY_SUPPORT?(this[e]=n&255,this[e+1]=n>>>8,this[e+2]=n>>>16,this[e+3]=n>>>24):ao(this,n,e,!0),e+4};Z.prototype.writeInt32BE=function(n,e,r){return n=+n,e=e|0,r||Jt(this,n,e,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),Z.TYPED_ARRAY_SUPPORT?(this[e]=n>>>24,this[e+1]=n>>>16,this[e+2]=n>>>8,this[e+3]=n&255):ao(this,n,e,!1),e+4};Z.prototype.writeFloatLE=function(n,e,r){return ff(this,n,e,!0,r)};Z.prototype.writeFloatBE=function(n,e,r){return ff(this,n,e,!1,r)};Z.prototype.writeDoubleLE=function(n,e,r){return hf(this,n,e,!0,r)};Z.prototype.writeDoubleBE=function(n,e,r){return hf(this,n,e,!1,r)};Z.prototype.copy=function(n,e,r,i){if(r||(r=0),!i&&i!==0&&(i=this.length),e>=n.length&&(e=n.length),e||(e=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),n.length-e=0;--o)n[o+e]=this[o+r];else if(a<1e3||!Z.TYPED_ARRAY_SUPPORT)for(o=0;o>>0,r=r===void 0?this.length:r>>>0,n||(n=0);var o;if(typeof n=="number")for(o=e;o{var Tr=(yf(),vf);if(Tr&&Tr.default){lo.exports=Tr.default;for(let t in Tr)lo.exports[t]=Tr[t]}else Tr&&(lo.exports=Tr)});var fo=rt(Re=>{"use strict";var dr=to(),xt=Gd(),wf=bf().Buffer;window.__TYPEDARRAY_POOL||(window.__TYPEDARRAY_POOL={UINT8:xt([32,0]),UINT16:xt([32,0]),UINT32:xt([32,0]),BIGUINT64:xt([32,0]),INT8:xt([32,0]),INT16:xt([32,0]),INT32:xt([32,0]),BIGINT64:xt([32,0]),FLOAT:xt([32,0]),DOUBLE:xt([32,0]),DATA:xt([32,0]),UINT8C:xt([32,0]),BUFFER:xt([32,0])});var fw=typeof Uint8ClampedArray!="undefined",hw=typeof BigUint64Array!="undefined",pw=typeof BigInt64Array!="undefined",ut=window.__TYPEDARRAY_POOL;ut.UINT8C||(ut.UINT8C=xt([32,0]));ut.BIGUINT64||(ut.BIGUINT64=xt([32,0]));ut.BIGINT64||(ut.BIGINT64=xt([32,0]));ut.BUFFER||(ut.BUFFER=xt([32,0]));var co=ut.DATA,uo=ut.BUFFER;Re.free=function(n){if(wf.isBuffer(n))uo[dr.log2(n.length)].push(n);else{if(Object.prototype.toString.call(n)!=="[object ArrayBuffer]"&&(n=n.buffer),!n)return;var e=n.length||n.byteLength,r=dr.log2(e)|0;co[r].push(n)}};function Ef(t){if(!!t){var n=t.length||t.byteLength,e=dr.log2(n);co[e].push(t)}}function mw(t){Ef(t.buffer)}Re.freeUint8=Re.freeUint16=Re.freeUint32=Re.freeBigUint64=Re.freeInt8=Re.freeInt16=Re.freeInt32=Re.freeBigInt64=Re.freeFloat32=Re.freeFloat=Re.freeFloat64=Re.freeDouble=Re.freeUint8Clamped=Re.freeDataView=mw;Re.freeArrayBuffer=Ef;Re.freeBuffer=function(n){uo[dr.log2(n.length)].push(n)};Re.malloc=function(n,e){if(e===void 0||e==="arraybuffer")return Gt(n);switch(e){case"uint8":return _l(n);case"uint16":return Sf(n);case"uint32":return xf(n);case"int8":return kf(n);case"int16":return _f(n);case"int32":return Tf(n);case"float":case"float32":return Mf(n);case"double":case"float64":return Cf(n);case"uint8_clamped":return Df(n);case"bigint64":return If(n);case"biguint64":return Af(n);case"buffer":return Pf(n);case"data":case"dataview":return Lf(n);default:return null}return null};function Gt(t){var t=dr.nextPow2(t),n=dr.log2(t),e=co[n];return e.length>0?e.pop():new ArrayBuffer(t)}Re.mallocArrayBuffer=Gt;function _l(t){return new Uint8Array(Gt(t),0,t)}Re.mallocUint8=_l;function Sf(t){return new Uint16Array(Gt(2*t),0,t)}Re.mallocUint16=Sf;function xf(t){return new Uint32Array(Gt(4*t),0,t)}Re.mallocUint32=xf;function kf(t){return new Int8Array(Gt(t),0,t)}Re.mallocInt8=kf;function _f(t){return new Int16Array(Gt(2*t),0,t)}Re.mallocInt16=_f;function Tf(t){return new Int32Array(Gt(4*t),0,t)}Re.mallocInt32=Tf;function Mf(t){return new Float32Array(Gt(4*t),0,t)}Re.mallocFloat32=Re.mallocFloat=Mf;function Cf(t){return new Float64Array(Gt(8*t),0,t)}Re.mallocFloat64=Re.mallocDouble=Cf;function Df(t){return fw?new Uint8ClampedArray(Gt(t),0,t):_l(t)}Re.mallocUint8Clamped=Df;function Af(t){return hw?new BigUint64Array(Gt(8*t),0,t):null}Re.mallocBigUint64=Af;function If(t){return pw?new BigInt64Array(Gt(8*t),0,t):null}Re.mallocBigInt64=If;function Lf(t){return new DataView(Gt(t),0,t)}Re.mallocDataView=Lf;function Pf(t){t=dr.nextPow2(t);var n=dr.log2(t),e=uo[n];return e.length>0?e.pop():new wf(t)}Re.mallocBuffer=Pf;Re.clearCache=function(){for(var n=0;n<32;++n)ut.UINT8[n].length=0,ut.UINT16[n].length=0,ut.UINT32[n].length=0,ut.INT8[n].length=0,ut.INT16[n].length=0,ut.INT32[n].length=0,ut.FLOAT[n].length=0,ut.DOUBLE[n].length=0,ut.BIGUINT64[n].length=0,ut.BIGINT64[n].length=0,ut.UINT8C[n].length=0,co[n].length=0,uo[n].length=0}});var Hf=rt((h1,Rf)=>{"use strict";Rf.exports=gw;var ho=32;function gw(t,n){n<=4*ho?po(0,n-1,t):go(0,n-1,t)}function po(t,n,e){for(var r=2*(t+1),i=t+1;i<=n;++i){for(var a=e[r++],o=e[r++],s=i,u=r-2;s-- >t;){var l=e[u-2],c=e[u-1];if(le[n+1]:!0}function mo(t,n,e,r){t*=2;var i=r[t];return i>1,s=o-r,u=o+r,l=i,c=s,d=o,f=u,h=a,p=t+1,g=n-1,w=0;Yn(l,c,e)&&(w=l,l=c,c=w),Yn(f,h,e)&&(w=f,f=h,h=w),Yn(l,d,e)&&(w=l,l=d,d=w),Yn(c,d,e)&&(w=c,c=d,d=w),Yn(l,f,e)&&(w=l,l=f,f=w),Yn(d,f,e)&&(w=d,d=f,f=w),Yn(c,h,e)&&(w=c,c=h,h=w),Yn(c,d,e)&&(w=c,c=d,d=w),Yn(f,h,e)&&(w=f,f=h,h=w);for(var S=e[2*c],T=e[2*c+1],k=e[2*f],D=e[2*f+1],N=2*l,C=2*d,O=2*h,B=2*i,z=2*o,Q=2*a,X=0;X<2;++X){var ie=e[N+X],q=e[C+X],J=e[O+X];e[B+X]=ie,e[z+X]=q,e[Q+X]=J}Nf(s,t,e),Nf(u,n,e);for(var te=p;te<=g;++te)if(mo(te,S,T,e))te!==p&&Of(te,p,e),++p;else if(!mo(te,k,D,e))for(;;)if(mo(g,k,D,e)){mo(g,S,T,e)?(vw(te,p,g,e),++p,--g):(Of(te,g,e),--g);break}else{if(--g{"use strict";Bf.exports={init:bw,sweepBipartite:ww,sweepComplete:Ew,scanBipartite:Sw,scanComplete:xw};var dt=fo(),yw=to(),vo=Hf(),sn=1<<28,Mr=1024,kt=dt.mallocInt32(Mr),Jn=dt.mallocInt32(Mr),Gn=dt.mallocInt32(Mr),Cr=dt.mallocInt32(Mr),ei=dt.mallocInt32(Mr),Ji=dt.mallocInt32(Mr),Pe=dt.mallocDouble(Mr*8);function bw(t){var n=yw.nextPow2(t);kt.length>>1;vo(Pe,T);for(var k=0,D=0,p=0;p=sn)N=N-sn|0,ti(Gn,Cr,D--,N);else if(N>=0)ti(kt,Jn,k--,N);else if(N<=-sn){N=-N-sn|0;for(var C=0;C>>1;vo(Pe,T);for(var k=0,D=0,N=0,p=0;p>1==Pe[2*p+3]>>1&&(O=2,p+=1),C<0){for(var B=-(C>>1)-1,z=0;z>1)-1;O===0?ti(kt,Jn,k--,B):O===1?ti(Gn,Cr,D--,B):O===2&&ti(ei,Ji,N--,B)}}}function Sw(t,n,e,r,i,a,o,s,u,l,c,d){var f=0,h=2*t,p=n,g=n+t,w=1,S=1;r?S=sn:w=sn;for(var T=i;T>>1;vo(Pe,C);for(var O=0,T=0;T=sn?(z=!r,k-=sn):(z=!!r,k-=1),z)ni(kt,Jn,O++,k);else{var Q=d[k],X=h*k,ie=c[X+n+1],q=c[X+n+1+t];e:for(var J=0;J>>1;vo(Pe,k);for(var D=0,g=0;g=sn)kt[D++]=w-sn;else{w-=1;var C=c[w],O=f*w,B=l[O+n+1],z=l[O+n+1+t];e:for(var Q=0;Q=0;--Q)if(kt[Q]===w){for(var J=Q+1;J{"use strict";var Dr="d",ri="ax",Kf="vv",Ml="fp",Gi="es",yo="rs",Cl="re",Qi="rb",$f="ri",ii="rp",bo="bs",Dl="be",Xi="bb",Uf="bi",ai="bp",Al="rv",Il="Q",Ll=[Dr,ri,Kf,yo,Cl,Qi,$f,bo,Dl,Xi,Uf];function kw(t,n,e){var r="bruteForce"+(t?"Red":"Blue")+(n?"Flip":"")+(e?"Full":""),i=["function ",r,"(",Ll.join(),"){","var ",Gi,"=2*",Dr,";"],a="for(var i="+yo+","+ii+"="+Gi+"*"+yo+";i<"+Cl+";++i,"+ii+"+="+Gi+"){var x0="+Qi+"["+ri+"+"+ii+"],x1="+Qi+"["+ri+"+"+ii+"+"+Dr+"],xi="+$f+"[i];",o="for(var j="+bo+","+ai+"="+Gi+"*"+bo+";j<"+Dl+";++j,"+ai+"+="+Gi+"){var y0="+Xi+"["+ri+"+"+ai+"],"+(e?"y1="+Xi+"["+ri+"+"+ai+"+"+Dr+"],":"")+"yi="+Uf+"[j];";return t?i.push(a,Il,":",o):i.push(o,Il,":",a),e?i.push("if(y1"+Dl+"-"+bo+"){"),t?(a(!0,!1),i.push("}else{"),a(!1,!1)):(i.push("if("+Ml+"){"),a(!0,!0),i.push("}else{"),a(!0,!1),i.push("}}else{if("+Ml+"){"),a(!1,!0),i.push("}else{"),a(!1,!1),i.push("}")),i.push("}}return "+n);var o=e.join("")+i.join(""),s=new Function(o);return s()}Pl.partial=zf(!1);Pl.full=zf(!0)});var Ol=rt((g1,jf)=>{"use strict";jf.exports=Tw;var _w="for(var j=2*a,k=j*c,l=k,m=c,n=b,o=a+b,p=c;d>p;++p,k+=j){var _;if($)if(m===p)m+=1,l+=j;else{for(var s=0;j>s;++s){var t=e[k+s];e[k+s]=e[l],e[l++]=t}var u=f[p];f[p]=f[m],f[m++]=u}}return m";function Tw(t,n){var e="abcdef".split("").concat(n),r=[];return t.indexOf("lo")>=0&&r.push("lo=e[k+n]"),t.indexOf("hi")>=0&&r.push("hi=e[k+o]"),e.push(_w.replace("_",r.join()).replace("$",t)),Function.apply(void 0,e)}});var Yf=rt((v1,qf)=>{"use strict";qf.exports=Aw;var Mw=Ol(),Wf=Mw("loe&&i[d+n]>l;--c,d-=o){for(var f=d,h=d+o,p=0;p>>1,l=2*t,c=u,d=i[l*u+n];o=w?(c=g,d=w):p>=T?(c=h,d=p):(c=S,d=T):w>=T?(c=g,d=w):T>=p?(c=h,d=p):(c=S,d=T);for(var k=l*(s-1),D=l*c,N=0;N{"use strict";eh.exports=zw;var oi=fo(),Nl=to(),Jf=Vf(),Iw=Jf.partial,Lw=Jf.full,fr=Tl(),Pw=Yf(),si=Ol(),Gf=128,Ow=1<<22,Nw=1<<22,Fw=si("!(lo>=p0)&&!(p1>=hi)",["p0","p1"]),Qf=si("lo===p0",["p0"]),Rw=si("lo0;){l-=1;var f=l*Fl,h=Ut[f],p=Ut[f+1],g=Ut[f+2],w=Ut[f+3],S=Ut[f+4],T=Ut[f+5],k=l*Rl,D=Ar[k],N=Ar[k+1],C=T&1,O=!!(T&16),B=i,z=a,Q=s,X=u;if(C&&(B=s,z=u,Q=i,X=a),!(T&2&&(g=Rw(t,h,p,g,B,z,N),p>=g))&&!(T&4&&(p=Hw(t,h,p,g,B,z,D),p>=g))){var ie=g-p,q=S-w;if(O){if(t*ie*(ie+q){"use strict";ih.exports=Yw;var hr=fo(),wo=Tl(),Vw=th();function jw(t,n){for(var e=0;e>>1;if(!(o<=0)){var s,u=hr.mallocDouble(2*o*i),l=hr.mallocInt32(i);if(i=nh(t,o,u,l),i>0){if(o===1&&r)wo.init(i),s=wo.sweepComplete(o,e,0,i,u,l,0,i,u,l);else{var c=hr.mallocDouble(2*o*a),d=hr.mallocInt32(a);a=nh(n,o,c,d),a>0&&(wo.init(i+a),o===1?s=wo.sweepBipartite(o,e,0,i,u,l,0,a,c,d):s=Vw(o,e,r,i,u,l,a,c,d),hr.free(c),hr.free(d))}hr.free(u),hr.free(l)}return s}}}var Zi;function rh(t,n){Zi.push([t,n])}function Ww(t){return Zi=[],Eo(t,t,rh,!0),Zi}function qw(t,n){return Zi=[],Eo(t,n,rh,!1),Zi}function Yw(t,n,e){var r;switch(arguments.length){case 1:return Ww(t);case 2:return typeof n=="function"?Eo(t,t,n,!0):qw(t,n);case 3:return Eo(t,n,e,!1);default:throw new Error("box-intersect: Invalid arguments")}}});var Th=rt((E1,_o)=>{var oh,sh,lh,ch,uh,dh,fh,hh,ph,xo,Hl,mh,gh,vh,li,yh,bh,wh,Eh,Sh,xh,kh,_h,ko;(function(t){var n=typeof window=="object"?window:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(r){t(e(n,e(r)))}):typeof _o=="object"&&typeof _o.exports=="object"?t(e(n,e(_o.exports))):t(e(n));function e(r,i){return r!==n&&(typeof Object.create=="function"?Object.defineProperty(r,"__esModule",{value:!0}):r.__esModule=!0),function(a,o){return r[a]=i?i(a,o):o}}})(function(t){var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(r[a]=i[a])};oh=function(r,i){if(typeof i!="function"&&i!==null)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");n(r,i);function a(){this.constructor=r}r.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)},sh=Object.assign||function(r){for(var i,a=1,o=arguments.length;a=0;c--)(l=r[c])&&(u=(s<3?l(u):s>3?l(i,a,u):l(i,a))||u);return s>3&&u&&Object.defineProperty(i,a,u),u},uh=function(r,i){return function(a,o){i(a,o,r)}},dh=function(r,i){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,i)},fh=function(r,i,a,o){function s(u){return u instanceof a?u:new a(function(l){l(u)})}return new(a||(a=Promise))(function(u,l){function c(h){try{f(o.next(h))}catch(p){l(p)}}function d(h){try{f(o.throw(h))}catch(p){l(p)}}function f(h){h.done?u(h.value):s(h.value).then(c,d)}f((o=o.apply(r,i||[])).next())})},hh=function(r,i){var a={label:0,sent:function(){if(u[0]&1)throw u[1];return u[1]},trys:[],ops:[]},o,s,u,l;return l={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function c(f){return function(h){return d([f,h])}}function d(f){if(o)throw new TypeError("Generator is already executing.");for(;a;)try{if(o=1,s&&(u=f[0]&2?s.return:f[0]?s.throw||((u=s.return)&&u.call(s),0):s.next)&&!(u=u.call(s,f[1])).done)return u;switch(s=0,u&&(f=[f[0]&2,u.value]),f[0]){case 0:case 1:u=f;break;case 4:return a.label++,{value:f[1],done:!1};case 5:a.label++,s=f[1],f=[0];continue;case 7:f=a.ops.pop(),a.trys.pop();continue;default:if(u=a.trys,!(u=u.length>0&&u[u.length-1])&&(f[0]===6||f[0]===2)){a=0;continue}if(f[0]===3&&(!u||f[1]>u[0]&&f[1]=r.length&&(r=void 0),{value:r&&r[o++],done:!r}}};throw new TypeError(i?"Object is not iterable.":"Symbol.iterator is not defined.")},Hl=function(r,i){var a=typeof Symbol=="function"&&r[Symbol.iterator];if(!a)return r;var o=a.call(r),s,u=[],l;try{for(;(i===void 0||i-- >0)&&!(s=o.next()).done;)u.push(s.value)}catch(c){l={error:c}}finally{try{s&&!s.done&&(a=o.return)&&a.call(o)}finally{if(l)throw l.error}}return u},mh=function(){for(var r=[],i=0;i1||c(g,w)})})}function c(g,w){try{d(o[g](w))}catch(S){p(u[0][3],S)}}function d(g){g.value instanceof li?Promise.resolve(g.value.v).then(f,h):p(u[0][2],g)}function f(g){c("next",g)}function h(g){c("throw",g)}function p(g,w){g(w),u.shift(),u.length&&c(u[0][0],u[0][1])}},bh=function(r){var i,a;return i={},o("next"),o("throw",function(s){throw s}),o("return"),i[Symbol.iterator]=function(){return this},i;function o(s,u){i[s]=r[s]?function(l){return(a=!a)?{value:li(r[s](l)),done:s==="return"}:u?u(l):l}:u}},wh=function(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=r[Symbol.asyncIterator],a;return i?i.call(r):(r=typeof xo=="function"?xo(r):r[Symbol.iterator](),a={},o("next"),o("throw"),o("return"),a[Symbol.asyncIterator]=function(){return this},a);function o(u){a[u]=r[u]&&function(l){return new Promise(function(c,d){l=r[u](l),s(c,d,l.done,l.value)})}}function s(u,l,c,d){Promise.resolve(d).then(function(f){u({value:f,done:c})},l)}},Eh=function(r,i){return Object.defineProperty?Object.defineProperty(r,"raw",{value:i}):r.raw=i,r};var e=Object.create?function(r,i){Object.defineProperty(r,"default",{enumerable:!0,value:i})}:function(r,i){r.default=i};Sh=function(r){if(r&&r.__esModule)return r;var i={};if(r!=null)for(var a in r)a!=="default"&&Object.prototype.hasOwnProperty.call(r,a)&&ko(i,r,a);return e(i,r),i},xh=function(r){return r&&r.__esModule?r:{default:r}},kh=function(r,i,a,o){if(a==="a"&&!o)throw new TypeError("Private accessor was defined without a getter");if(typeof i=="function"?r!==i||!o:!i.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return a==="m"?o:a==="a"?o.call(r):o?o.value:i.get(r)},_h=function(r,i,a,o,s){if(o==="m")throw new TypeError("Private method is not writable");if(o==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof i=="function"?r!==i||!s:!i.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return o==="a"?s.call(r,a):s?s.value=a:i.set(r,a),a},t("__extends",oh),t("__assign",sh),t("__rest",lh),t("__decorate",ch),t("__param",uh),t("__metadata",dh),t("__awaiter",fh),t("__generator",hh),t("__exportStar",ph),t("__createBinding",ko),t("__values",xo),t("__read",Hl),t("__spread",mh),t("__spreadArrays",gh),t("__spreadArray",vh),t("__await",li),t("__asyncGenerator",yh),t("__asyncDelegator",bh),t("__asyncValues",wh),t("__makeTemplateObject",Eh),t("__importStar",Sh),t("__importDefault",xh),t("__classPrivateFieldGet",kh),t("__classPrivateFieldSet",_h)})});var ql=rt(Ne=>{"use strict";Object.defineProperty(Ne,"__esModule",{value:!0});var it=require("obsidian"),jl="YYYY-MM-DD",Wl="gggg-[W]ww",Hh="YYYY-MM",Bh="YYYY-[Q]Q",Kh="YYYY";function ia(t){let n=window.app.plugins.getPlugin("periodic-notes");return n&&n.settings?.[t]?.enabled}function aa(){try{let{internalPlugins:t,plugins:n}=window.app;if(ia("daily")){let{format:a,folder:o,template:s}=n.getPlugin("periodic-notes")?.settings?.daily||{};return{format:a||jl,folder:o?.trim()||"",template:s?.trim()||""}}let{folder:e,format:r,template:i}=t.getPluginById("daily-notes")?.instance?.options||{};return{format:r||jl,folder:e?.trim()||"",template:i?.trim()||""}}catch(t){console.info("No custom daily note settings found!",t)}}function oa(){try{let t=window.app.plugins,n=t.getPlugin("calendar")?.options,e=t.getPlugin("periodic-notes")?.settings?.weekly;if(ia("weekly"))return{format:e.format||Wl,folder:e.folder?.trim()||"",template:e.template?.trim()||""};let r=n||{};return{format:r.weeklyNoteFormat||Wl,folder:r.weeklyNoteFolder?.trim()||"",template:r.weeklyNoteTemplate?.trim()||""}}catch(t){console.info("No custom weekly note settings found!",t)}}function sa(){let t=window.app.plugins;try{let n=ia("monthly")&&t.getPlugin("periodic-notes")?.settings?.monthly||{};return{format:n.format||Hh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom monthly note settings found!",n)}}function la(){let t=window.app.plugins;try{let n=ia("quarterly")&&t.getPlugin("periodic-notes")?.settings?.quarterly||{};return{format:n.format||Bh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom quarterly note settings found!",n)}}function ca(){let t=window.app.plugins;try{let n=ia("yearly")&&t.getPlugin("periodic-notes")?.settings?.yearly||{};return{format:n.format||Kh,folder:n.folder?.trim()||"",template:n.template?.trim()||""}}catch(n){console.info("No custom yearly note settings found!",n)}}function $h(...t){let n=[];for(let r=0,i=t.length;r{let T=r(),k=t.clone().set({hour:T.get("hour"),minute:T.get("minute"),second:T.get("second")});return p&&k.add(parseInt(g,10),w),S?k.format(S.substring(1).trim()):k.format(a)}).replace(/{{\s*yesterday\s*}}/gi,t.clone().subtract(1,"day").format(a)).replace(/{{\s*tomorrow\s*}}/gi,t.clone().add(1,"d").format(a)));return n.foldManager.save(d,u),d}catch(d){console.error(`Failed to create file: '${c}'`,d),new it.Notice("Unable to create new file.")}}function fE(t,n){return n[xn(t,"day")]??null}function hE(){let{vault:t}=window.app,{folder:n}=aa(),e=t.getAbstractFileByPath(it.normalizePath(n));if(!e)throw new Vh("Failed to find daily notes folder");let r={};return it.Vault.recurseChildren(e,i=>{if(i instanceof it.TFile){let a=pi(i,"day");if(a){let o=xn(a,"day");r[o]=i}}}),r}var Wh=class extends Error{};function pE(){let{moment:t}=window,n=t.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;n;)e.push(e.shift()),n--;return e}function mE(t){return pE().indexOf(t.toLowerCase())}async function qh(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=oa(),[a,o]=await hi(e),s=t.format(r),u=await ua(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*title\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(c,d,f)=>{let h=mE(d);return t.weekday(h).format(f.trim())}));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new it.Notice("Unable to create new file.")}}function gE(t,n){return n[xn(t,"week")]??null}function vE(){let t={};if(!Xh())return t;let{vault:n}=window.app,{folder:e}=oa(),r=n.getAbstractFileByPath(it.normalizePath(e));if(!r)throw new Wh("Failed to find weekly notes folder");return it.Vault.recurseChildren(r,i=>{if(i instanceof it.TFile){let a=pi(i,"week");if(a){let o=xn(a,"week");t[o]=i}}}),t}var Yh=class extends Error{};async function Jh(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=sa(),[a,o]=await hi(e),s=t.format(r),u=await ua(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new it.Notice("Unable to create new file.")}}function yE(t,n){return n[xn(t,"month")]??null}function bE(){let t={};if(!Zh())return t;let{vault:n}=window.app,{folder:e}=sa(),r=n.getAbstractFileByPath(it.normalizePath(e));if(!r)throw new Yh("Failed to find monthly notes folder");return it.Vault.recurseChildren(r,i=>{if(i instanceof it.TFile){let a=pi(i,"month");if(a){let o=xn(a,"month");t[o]=i}}}),t}var Gh=class extends Error{};async function wE(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=la(),[a,o]=await hi(e),s=t.format(r),u=await ua(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new it.Notice("Unable to create new file.")}}function EE(t,n){return n[xn(t,"quarter")]??null}function SE(){let t={};if(!ep())return t;let{vault:n}=window.app,{folder:e}=la(),r=n.getAbstractFileByPath(it.normalizePath(e));if(!r)throw new Gh("Failed to find quarterly notes folder");return it.Vault.recurseChildren(r,i=>{if(i instanceof it.TFile){let a=pi(i,"quarter");if(a){let o=xn(a,"quarter");t[o]=i}}}),t}var Qh=class extends Error{};async function xE(t){let{vault:n}=window.app,{template:e,format:r,folder:i}=ca(),[a,o]=await hi(e),s=t.format(r),u=await ua(i,s);try{let l=await n.create(u,a.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(c,d,f,h,p,g)=>{let w=window.moment(),S=t.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return f&&S.add(parseInt(h,10),p),g?S.format(g.substring(1).trim()):S.format(r)}).replace(/{{\s*date\s*}}/gi,s).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,s));return window.app.foldManager.save(l,o),l}catch(l){console.error(`Failed to create file: '${u}'`,l),new it.Notice("Unable to create new file.")}}function kE(t,n){return n[xn(t,"year")]??null}function _E(){let t={};if(!tp())return t;let{vault:n}=window.app,{folder:e}=ca(),r=n.getAbstractFileByPath(it.normalizePath(e));if(!r)throw new Qh("Failed to find yearly notes folder");return it.Vault.recurseChildren(r,i=>{if(i instanceof it.TFile){let a=pi(i,"year");if(a){let o=xn(a,"year");t[o]=i}}}),t}function TE(){let{app:t}=window,n=t.internalPlugins.plugins["daily-notes"];if(n&&n.enabled)return!0;let e=t.plugins.getPlugin("periodic-notes");return e&&e.settings?.daily?.enabled}function Xh(){let{app:t}=window;if(t.plugins.getPlugin("calendar"))return!0;let n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.weekly?.enabled}function Zh(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.monthly?.enabled}function ep(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.quarterly?.enabled}function tp(){let{app:t}=window,n=t.plugins.getPlugin("periodic-notes");return n&&n.settings?.yearly?.enabled}function ME(t){return{day:aa,week:oa,month:sa,quarter:la,year:ca}[t]()}function CE(t,n){return{day:jh,month:Jh,week:qh}[t](n)}Ne.DEFAULT_DAILY_NOTE_FORMAT=jl;Ne.DEFAULT_MONTHLY_NOTE_FORMAT=Hh;Ne.DEFAULT_QUARTERLY_NOTE_FORMAT=Bh;Ne.DEFAULT_WEEKLY_NOTE_FORMAT=Wl;Ne.DEFAULT_YEARLY_NOTE_FORMAT=Kh;Ne.appHasDailyNotesPluginLoaded=TE;Ne.appHasMonthlyNotesPluginLoaded=Zh;Ne.appHasQuarterlyNotesPluginLoaded=ep;Ne.appHasWeeklyNotesPluginLoaded=Xh;Ne.appHasYearlyNotesPluginLoaded=tp;Ne.createDailyNote=jh;Ne.createMonthlyNote=Jh;Ne.createPeriodicNote=CE;Ne.createQuarterlyNote=wE;Ne.createWeeklyNote=qh;Ne.createYearlyNote=xE;Ne.getAllDailyNotes=hE;Ne.getAllMonthlyNotes=bE;Ne.getAllQuarterlyNotes=SE;Ne.getAllWeeklyNotes=vE;Ne.getAllYearlyNotes=_E;Ne.getDailyNote=fE;Ne.getDailyNoteSettings=aa;Ne.getDateFromFile=pi;Ne.getDateFromPath=dE;Ne.getDateUID=xn;Ne.getMonthlyNote=yE;Ne.getMonthlyNoteSettings=sa;Ne.getPeriodicNoteSettings=ME;Ne.getQuarterlyNote=EE;Ne.getQuarterlyNoteSettings=la;Ne.getTemplateInfo=hi;Ne.getWeeklyNote=gE;Ne.getWeeklyNoteSettings=oa;Ne.getYearlyNote=kE;Ne.getYearlyNoteSettings=ca});var op=rt((No,ap)=>{(function(t,n){typeof No=="object"&&typeof ap!="undefined"?n(No):typeof define=="function"&&define.amd?define(["exports"],n):(t=typeof globalThis!="undefined"?globalThis:t||self,n(t.index={}))})(No,function(t){"use strict";var n=function(){return n=Object.assign||function(Ln){for(var Oa,qs=1,yy=arguments.length;qs3&&Ln<21)return"\xE8";switch(Ln%10){case 1:return"r";case 2:return"n";case 3:return"r";case 4:return"t";default:return"\xE8"}},firstDayOfWeek:1,rangeSeparator:" a ",time_24hr:!0};w.l10ns.cat=w.l10ns.ca=S,w.l10ns;var T=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},k={weekdays:{shorthand:["\u06CC\u06D5\u06A9\u0634\u06D5\u0645\u0645\u06D5","\u062F\u0648\u0648\u0634\u06D5\u0645\u0645\u06D5","\u0633\u06CE\u0634\u06D5\u0645\u0645\u06D5","\u0686\u0648\u0627\u0631\u0634\u06D5\u0645\u0645\u06D5","\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645\u0645\u06D5","\u0647\u06D5\u06CC\u0646\u06CC","\u0634\u06D5\u0645\u0645\u06D5"],longhand:["\u06CC\u06D5\u06A9\u0634\u06D5\u0645\u0645\u06D5","\u062F\u0648\u0648\u0634\u06D5\u0645\u0645\u06D5","\u0633\u06CE\u0634\u06D5\u0645\u0645\u06D5","\u0686\u0648\u0627\u0631\u0634\u06D5\u0645\u0645\u06D5","\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645\u0645\u06D5","\u0647\u06D5\u06CC\u0646\u06CC","\u0634\u06D5\u0645\u0645\u06D5"]},months:{shorthand:["\u0695\u06CE\u0628\u06D5\u0646\u062F\u0627\u0646","\u0695\u06D5\u0634\u06D5\u0645\u06D5","\u0646\u06D5\u0648\u0631\u06C6\u0632","\u06AF\u0648\u06B5\u0627\u0646","\u062C\u06C6\u0632\u06D5\u0631\u062F\u0627\u0646","\u067E\u0648\u0648\u0634\u067E\u06D5\u0695","\u06AF\u06D5\u0644\u0627\u0648\u06CE\u0698","\u062E\u06D5\u0631\u0645\u0627\u0646\u0627\u0646","\u0695\u06D5\u0632\u0628\u06D5\u0631","\u06AF\u06D5\u06B5\u0627\u0695\u06CE\u0632\u0627\u0646","\u0633\u06D5\u0631\u0645\u0627\u0648\u06D5\u0632","\u0628\u06D5\u0641\u0631\u0627\u0646\u0628\u0627\u0631"],longhand:["\u0695\u06CE\u0628\u06D5\u0646\u062F\u0627\u0646","\u0695\u06D5\u0634\u06D5\u0645\u06D5","\u0646\u06D5\u0648\u0631\u06C6\u0632","\u06AF\u0648\u06B5\u0627\u0646","\u062C\u06C6\u0632\u06D5\u0631\u062F\u0627\u0646","\u067E\u0648\u0648\u0634\u067E\u06D5\u0695","\u06AF\u06D5\u0644\u0627\u0648\u06CE\u0698","\u062E\u06D5\u0631\u0645\u0627\u0646\u0627\u0646","\u0695\u06D5\u0632\u0628\u06D5\u0631","\u06AF\u06D5\u06B5\u0627\u0695\u06CE\u0632\u0627\u0646","\u0633\u06D5\u0631\u0645\u0627\u0648\u06D5\u0632","\u0628\u06D5\u0641\u0631\u0627\u0646\u0628\u0627\u0631"]},firstDayOfWeek:6,ordinal:function(){return""}};T.l10ns.ckb=k,T.l10ns;var D=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},N={weekdays:{shorthand:["Ne","Po","\xDAt","St","\u010Ct","P\xE1","So"],longhand:["Ned\u011Ble","Pond\u011Bl\xED","\xDAter\xFD","St\u0159eda","\u010Ctvrtek","P\xE1tek","Sobota"]},months:{shorthand:["Led","\xDAn","B\u0159e","Dub","Kv\u011B","\u010Cer","\u010Cvc","Srp","Z\xE1\u0159","\u0158\xEDj","Lis","Pro"],longhand:["Leden","\xDAnor","B\u0159ezen","Duben","Kv\u011Bten","\u010Cerven","\u010Cervenec","Srpen","Z\xE1\u0159\xED","\u0158\xEDjen","Listopad","Prosinec"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" do ",weekAbbreviation:"T\xFDd.",scrollTitle:"Rolujte pro zm\u011Bnu",toggleTitle:"P\u0159epnout dopoledne/odpoledne",amPM:["dop.","odp."],yearAriaLabel:"Rok",time_24hr:!0};D.l10ns.cs=N,D.l10ns;var C=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},O={weekdays:{shorthand:["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],longhand:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"]},months:{shorthand:["Ion","Chwef","Maw","Ebr","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag"],longhand:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"]},firstDayOfWeek:1,ordinal:function(je){return je===1?"af":je===2?"ail":je===3||je===4?"ydd":je===5||je===6?"ed":je>=7&&je<=10||je==12||je==15||je==18||je==20?"fed":je==11||je==13||je==14||je==16||je==17||je==19?"eg":je>=21&&je<=39?"ain":""},time_24hr:!0};C.l10ns.cy=O,C.l10ns;var B=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},z={weekdays:{shorthand:["s\xF8n","man","tir","ons","tors","fre","l\xF8r"],longhand:["s\xF8ndag","mandag","tirsdag","onsdag","torsdag","fredag","l\xF8rdag"]},months:{shorthand:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],longhand:["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"uge",time_24hr:!0};B.l10ns.da=z,B.l10ns;var Q=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},X={weekdays:{shorthand:["So","Mo","Di","Mi","Do","Fr","Sa"],longhand:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]},months:{shorthand:["Jan","Feb","M\xE4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],longhand:["Januar","Februar","M\xE4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]},firstDayOfWeek:1,weekAbbreviation:"KW",rangeSeparator:" bis ",scrollTitle:"Zum \xC4ndern scrollen",toggleTitle:"Zum Umschalten klicken",time_24hr:!0};Q.l10ns.de=X,Q.l10ns;var ie={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(je){var Ln=je%100;if(Ln>3&&Ln<21)return"th";switch(Ln%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},q=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},J={firstDayOfWeek:1,rangeSeparator:" \u011Dis ",weekAbbreviation:"Sem",scrollTitle:"Rulumu por pligrandigi la valoron",toggleTitle:"Klaku por \u015Dalti",weekdays:{shorthand:["Dim","Lun","Mar","Mer","\u0134a\u016D","Ven","Sab"],longhand:["diman\u0109o","lundo","mardo","merkredo","\u0135a\u016Ddo","vendredo","sabato"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","A\u016Dg","Sep","Okt","Nov","Dec"],longhand:["januaro","februaro","marto","aprilo","majo","junio","julio","a\u016Dgusto","septembro","oktobro","novembro","decembro"]},ordinal:function(){return"-a"},time_24hr:!0};q.l10ns.eo=J,q.l10ns;var te=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ce={weekdays:{shorthand:["Dom","Lun","Mar","Mi\xE9","Jue","Vie","S\xE1b"],longhand:["Domingo","Lunes","Martes","Mi\xE9rcoles","Jueves","Viernes","S\xE1bado"]},months:{shorthand:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],longhand:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]},ordinal:function(){return"\xBA"},firstDayOfWeek:1,rangeSeparator:" a ",time_24hr:!0};te.l10ns.es=ce,te.l10ns;var de=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},fe={weekdays:{shorthand:["P","E","T","K","N","R","L"],longhand:["P\xFChap\xE4ev","Esmasp\xE4ev","Teisip\xE4ev","Kolmap\xE4ev","Neljap\xE4ev","Reede","Laup\xE4ev"]},months:{shorthand:["Jaan","Veebr","M\xE4rts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],longhand:["Jaanuar","Veebruar","M\xE4rts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"]},firstDayOfWeek:1,ordinal:function(){return"."},weekAbbreviation:"N\xE4d",rangeSeparator:" kuni ",scrollTitle:"Keri, et suurendada",toggleTitle:"Kl\xF5psa, et vahetada",time_24hr:!0};de.l10ns.et=fe,de.l10ns;var he=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},De={weekdays:{shorthand:["\u06CC\u06A9","\u062F\u0648","\u0633\u0647","\u0686\u0647\u0627\u0631","\u067E\u0646\u062C","\u062C\u0645\u0639\u0647","\u0634\u0646\u0628\u0647"],longhand:["\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647","\u062F\u0648\u0634\u0646\u0628\u0647","\u0633\u0647\u200C\u0634\u0646\u0628\u0647","\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647","\u067E\u0646\u0686\u200C\u0634\u0646\u0628\u0647","\u062C\u0645\u0639\u0647","\u0634\u0646\u0628\u0647"]},months:{shorthand:["\u0698\u0627\u0646\u0648\u06CC\u0647","\u0641\u0648\u0631\u06CC\u0647","\u0645\u0627\u0631\u0633","\u0622\u0648\u0631\u06CC\u0644","\u0645\u0647","\u0698\u0648\u0626\u0646","\u0698\u0648\u0626\u06CC\u0647","\u0627\u0648\u062A","\u0633\u067E\u062A\u0627\u0645\u0628\u0631","\u0627\u06A9\u062A\u0628\u0631","\u0646\u0648\u0627\u0645\u0628\u0631","\u062F\u0633\u0627\u0645\u0628\u0631"],longhand:["\u0698\u0627\u0646\u0648\u06CC\u0647","\u0641\u0648\u0631\u06CC\u0647","\u0645\u0627\u0631\u0633","\u0622\u0648\u0631\u06CC\u0644","\u0645\u0647","\u0698\u0648\u0626\u0646","\u0698\u0648\u0626\u06CC\u0647","\u0627\u0648\u062A","\u0633\u067E\u062A\u0627\u0645\u0628\u0631","\u0627\u06A9\u062A\u0628\u0631","\u0646\u0648\u0627\u0645\u0628\u0631","\u062F\u0633\u0627\u0645\u0628\u0631"]},firstDayOfWeek:6,ordinal:function(){return""}};he.l10ns.fa=De,he.l10ns;var A=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},I={firstDayOfWeek:1,weekdays:{shorthand:["su","ma","ti","ke","to","pe","la"],longhand:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"]},months:{shorthand:["tammi","helmi","maalis","huhti","touko","kes\xE4","hein\xE4","elo","syys","loka","marras","joulu"],longhand:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kes\xE4kuu","hein\xE4kuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"]},ordinal:function(){return"."},time_24hr:!0};A.l10ns.fi=I,A.l10ns;var et=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},qe={weekdays:{shorthand:["Sun","M\xE1n","T\xFDs","Mik","H\xF3s","Fr\xED","Ley"],longhand:["Sunnudagur","M\xE1nadagur","T\xFDsdagur","Mikudagur","H\xF3sdagur","Fr\xEDggjadagur","Leygardagur"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],longhand:["Januar","Februar","Mars","Apr\xEDl","Mai","Juni","Juli","August","Septembur","Oktobur","Novembur","Desembur"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"vika",scrollTitle:"Rulla fyri at broyta",toggleTitle:"Tr\xFDst fyri at skifta",yearAriaLabel:"\xC1r",time_24hr:!0};et.l10ns.fo=qe,et.l10ns;var K=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},V={firstDayOfWeek:1,weekdays:{shorthand:["dim","lun","mar","mer","jeu","ven","sam"],longhand:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]},months:{shorthand:["janv","f\xE9vr","mars","avr","mai","juin","juil","ao\xFBt","sept","oct","nov","d\xE9c"],longhand:["janvier","f\xE9vrier","mars","avril","mai","juin","juillet","ao\xFBt","septembre","octobre","novembre","d\xE9cembre"]},ordinal:function(je){return je>1?"":"er"},rangeSeparator:" au ",weekAbbreviation:"Sem",scrollTitle:"D\xE9filer pour augmenter la valeur",toggleTitle:"Cliquer pour basculer",time_24hr:!0};K.l10ns.fr=V,K.l10ns;var U=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},G={weekdays:{shorthand:["\u039A\u03C5","\u0394\u03B5","\u03A4\u03C1","\u03A4\u03B5","\u03A0\u03AD","\u03A0\u03B1","\u03A3\u03AC"],longhand:["\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE","\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1","\u03A4\u03C1\u03AF\u03C4\u03B7","\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7","\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7","\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE","\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF"]},months:{shorthand:["\u0399\u03B1\u03BD","\u03A6\u03B5\u03B2","\u039C\u03AC\u03C1","\u0391\u03C0\u03C1","\u039C\u03AC\u03B9","\u0399\u03BF\u03CD\u03BD","\u0399\u03BF\u03CD\u03BB","\u0391\u03CD\u03B3","\u03A3\u03B5\u03C0","\u039F\u03BA\u03C4","\u039D\u03BF\u03AD","\u0394\u03B5\u03BA"],longhand:["\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2","\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2","\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2","\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2","\u039C\u03AC\u03B9\u03BF\u03C2","\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2","\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2","\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2","\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2","\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2","\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2","\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2"]},firstDayOfWeek:1,ordinal:function(){return""},weekAbbreviation:"\u0395\u03B2\u03B4",rangeSeparator:" \u03AD\u03C9\u03C2 ",scrollTitle:"\u039C\u03B5\u03C4\u03B1\u03BA\u03C5\u03BB\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B1\u03CD\u03BE\u03B7\u03C3\u03B7",toggleTitle:"\u039A\u03AC\u03BD\u03C4\u03B5 \u03BA\u03BB\u03B9\u03BA \u03B3\u03B9\u03B1 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE",amPM:["\u03A0\u039C","\u039C\u039C"],yearAriaLabel:"\u03C7\u03C1\u03CC\u03BD\u03BF\u03C2",monthAriaLabel:"\u03BC\u03AE\u03BD\u03B1\u03C2",hourAriaLabel:"\u03CE\u03C1\u03B1",minuteAriaLabel:"\u03BB\u03B5\u03C0\u03C4\u03CC"};U.l10ns.gr=G,U.l10ns;var ye=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ee={weekdays:{shorthand:["\u05D0","\u05D1","\u05D2","\u05D3","\u05D4","\u05D5","\u05E9"],longhand:["\u05E8\u05D0\u05E9\u05D5\u05DF","\u05E9\u05E0\u05D9","\u05E9\u05DC\u05D9\u05E9\u05D9","\u05E8\u05D1\u05D9\u05E2\u05D9","\u05D7\u05DE\u05D9\u05E9\u05D9","\u05E9\u05D9\u05E9\u05D9","\u05E9\u05D1\u05EA"]},months:{shorthand:["\u05D9\u05E0\u05D5\u05F3","\u05E4\u05D1\u05E8\u05F3","\u05DE\u05E8\u05E5","\u05D0\u05E4\u05E8\u05F3","\u05DE\u05D0\u05D9","\u05D9\u05D5\u05E0\u05D9","\u05D9\u05D5\u05DC\u05D9","\u05D0\u05D5\u05D2\u05F3","\u05E1\u05E4\u05D8\u05F3","\u05D0\u05D5\u05E7\u05F3","\u05E0\u05D5\u05D1\u05F3","\u05D3\u05E6\u05DE\u05F3"],longhand:["\u05D9\u05E0\u05D5\u05D0\u05E8","\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8","\u05DE\u05E8\u05E5","\u05D0\u05E4\u05E8\u05D9\u05DC","\u05DE\u05D0\u05D9","\u05D9\u05D5\u05E0\u05D9","\u05D9\u05D5\u05DC\u05D9","\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8","\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8","\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8","\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8","\u05D3\u05E6\u05DE\u05D1\u05E8"]},rangeSeparator:" \u05D0\u05DC ",time_24hr:!0};ye.l10ns.he=Ee,ye.l10ns;var Fe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ge={weekdays:{shorthand:["\u0930\u0935\u093F","\u0938\u094B\u092E","\u092E\u0902\u0917\u0932","\u092C\u0941\u0927","\u0917\u0941\u0930\u0941","\u0936\u0941\u0915\u094D\u0930","\u0936\u0928\u093F"],longhand:["\u0930\u0935\u093F\u0935\u093E\u0930","\u0938\u094B\u092E\u0935\u093E\u0930","\u092E\u0902\u0917\u0932\u0935\u093E\u0930","\u092C\u0941\u0927\u0935\u093E\u0930","\u0917\u0941\u0930\u0941\u0935\u093E\u0930","\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930","\u0936\u0928\u093F\u0935\u093E\u0930"]},months:{shorthand:["\u091C\u0928","\u092B\u0930","\u092E\u093E\u0930\u094D\u091A","\u0905\u092A\u094D\u0930\u0947\u0932","\u092E\u0908","\u091C\u0942\u0928","\u091C\u0942\u0932\u093E\u0908","\u0905\u0917","\u0938\u093F\u0924","\u0905\u0915\u094D\u091F","\u0928\u0935","\u0926\u093F"],longhand:["\u091C\u0928\u0935\u0930\u0940 ","\u092B\u0930\u0935\u0930\u0940","\u092E\u093E\u0930\u094D\u091A","\u0905\u092A\u094D\u0930\u0947\u0932","\u092E\u0908","\u091C\u0942\u0928","\u091C\u0942\u0932\u093E\u0908","\u0905\u0917\u0938\u094D\u0924 ","\u0938\u093F\u0924\u092E\u094D\u092C\u0930","\u0905\u0915\u094D\u091F\u0942\u092C\u0930","\u0928\u0935\u092E\u094D\u092C\u0930","\u0926\u093F\u0938\u092E\u094D\u092C\u0930"]}};Fe.l10ns.hi=Ge,Fe.l10ns;var ht=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},pt={firstDayOfWeek:1,weekdays:{shorthand:["Ned","Pon","Uto","Sri","\u010Cet","Pet","Sub"],longhand:["Nedjelja","Ponedjeljak","Utorak","Srijeda","\u010Cetvrtak","Petak","Subota"]},months:{shorthand:["Sij","Velj","O\u017Eu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],longhand:["Sije\u010Danj","Velja\u010Da","O\u017Eujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"]},time_24hr:!0};ht.l10ns.hr=pt,ht.l10ns;var tn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},yn={firstDayOfWeek:1,weekdays:{shorthand:["V","H","K","Sz","Cs","P","Szo"],longhand:["Vas\xE1rnap","H\xE9tf\u0151","Kedd","Szerda","Cs\xFCt\xF6rt\xF6k","P\xE9ntek","Szombat"]},months:{shorthand:["Jan","Feb","M\xE1r","\xC1pr","M\xE1j","J\xFAn","J\xFAl","Aug","Szep","Okt","Nov","Dec"],longhand:["Janu\xE1r","Febru\xE1r","M\xE1rcius","\xC1prilis","M\xE1jus","J\xFAnius","J\xFAlius","Augusztus","Szeptember","Okt\xF3ber","November","December"]},ordinal:function(){return"."},weekAbbreviation:"H\xE9t",scrollTitle:"G\xF6rgessen",toggleTitle:"Kattintson a v\xE1lt\xE1shoz",rangeSeparator:" - ",time_24hr:!0};tn.l10ns.hu=yn,tn.l10ns;var nn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Wt={weekdays:{shorthand:["\u053F\u056B\u0580","\u0535\u0580\u056F","\u0535\u0580\u0584","\u0549\u0580\u0584","\u0540\u0576\u0563","\u0548\u0582\u0580\u0562","\u0547\u0562\u0569"],longhand:["\u053F\u056B\u0580\u0561\u056F\u056B","\u0535\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B","\u0535\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B","\u0549\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B","\u0540\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B","\u0548\u0582\u0580\u0562\u0561\u0569","\u0547\u0561\u0562\u0561\u0569"]},months:{shorthand:["\u0540\u0576\u057E","\u0553\u057F\u0580","\u0544\u0561\u0580","\u0531\u057A\u0580","\u0544\u0561\u0575","\u0540\u0576\u057D","\u0540\u056C\u057D","\u0555\u0563\u057D","\u054D\u0565\u057A","\u0540\u0578\u056F","\u0546\u0574\u0562","\u0534\u0565\u056F"],longhand:["\u0540\u0578\u0582\u0576\u057E\u0561\u0580","\u0553\u0565\u057F\u0580\u057E\u0561\u0580","\u0544\u0561\u0580\u057F","\u0531\u057A\u0580\u056B\u056C","\u0544\u0561\u0575\u056B\u057D","\u0540\u0578\u0582\u0576\u056B\u057D","\u0540\u0578\u0582\u056C\u056B\u057D","\u0555\u0563\u0578\u057D\u057F\u0578\u057D","\u054D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580","\u0540\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580","\u0546\u0578\u0575\u0565\u0574\u0562\u0565\u0580","\u0534\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u0547\u0532\u054F",scrollTitle:"\u0548\u056C\u0578\u0580\u0565\u0584\u055D \u0574\u0565\u056E\u0561\u0581\u0576\u0565\u056C\u0578\u0582 \u0570\u0561\u0574\u0561\u0580",toggleTitle:"\u054D\u0565\u0572\u0574\u0565\u0584\u055D \u0583\u0578\u056D\u0565\u056C\u0578\u0582 \u0570\u0561\u0574\u0561\u0580",amPM:["\u0544\u053F","\u053F\u0540"],yearAriaLabel:"\u054F\u0561\u0580\u056B",monthAriaLabel:"\u0531\u0574\u056B\u057D",hourAriaLabel:"\u053A\u0561\u0574",minuteAriaLabel:"\u0550\u0578\u057A\u0565",time_24hr:!0};nn.l10ns.hy=Wt,nn.l10ns;var Ct=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Un={weekdays:{shorthand:["Min","Sen","Sel","Rab","Kam","Jum","Sab"],longhand:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"],longhand:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]},firstDayOfWeek:1,ordinal:function(){return""},time_24hr:!0,rangeSeparator:" - "};Ct.l10ns.id=Un,Ct.l10ns;var zn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Tn={weekdays:{shorthand:["Sun","M\xE1n","\xDEri","Mi\xF0","Fim","F\xF6s","Lau"],longhand:["Sunnudagur","M\xE1nudagur","\xDEri\xF0judagur","Mi\xF0vikudagur","Fimmtudagur","F\xF6studagur","Laugardagur"]},months:{shorthand:["Jan","Feb","Mar","Apr","Ma\xED","J\xFAn","J\xFAl","\xC1g\xFA","Sep","Okt","N\xF3v","Des"],longhand:["Jan\xFAar","Febr\xFAar","Mars","Apr\xEDl","Ma\xED","J\xFAn\xED","J\xFAl\xED","\xC1g\xFAst","September","Okt\xF3ber","N\xF3vember","Desember"]},ordinal:function(){return"."},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"vika",yearAriaLabel:"\xC1r",time_24hr:!0};zn.l10ns.is=Tn,zn.l10ns;var Mn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Cn={weekdays:{shorthand:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],longhand:["Domenica","Luned\xEC","Marted\xEC","Mercoled\xEC","Gioved\xEC","Venerd\xEC","Sabato"]},months:{shorthand:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],longhand:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"]},firstDayOfWeek:1,ordinal:function(){return"\xB0"},rangeSeparator:" al ",weekAbbreviation:"Se",scrollTitle:"Scrolla per aumentare",toggleTitle:"Clicca per cambiare",time_24hr:!0};Mn.l10ns.it=Cn,Mn.l10ns;var lt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Bt={weekdays:{shorthand:["\u65E5","\u6708","\u706B","\u6C34","\u6728","\u91D1","\u571F"],longhand:["\u65E5\u66DC\u65E5","\u6708\u66DC\u65E5","\u706B\u66DC\u65E5","\u6C34\u66DC\u65E5","\u6728\u66DC\u65E5","\u91D1\u66DC\u65E5","\u571F\u66DC\u65E5"]},months:{shorthand:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"],longhand:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"]},time_24hr:!0,rangeSeparator:" \u304B\u3089 ",monthAriaLabel:"\u6708",amPM:["\u5348\u524D","\u5348\u5F8C"],yearAriaLabel:"\u5E74",hourAriaLabel:"\u6642\u9593",minuteAriaLabel:"\u5206"};lt.l10ns.ja=Bt,lt.l10ns;var tt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},j={weekdays:{shorthand:["\u10D9\u10D5","\u10DD\u10E0","\u10E1\u10D0","\u10DD\u10D7","\u10EE\u10E3","\u10DE\u10D0","\u10E8\u10D0"],longhand:["\u10D9\u10D5\u10D8\u10E0\u10D0","\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8","\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8","\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8"]},months:{shorthand:["\u10D8\u10D0\u10DC","\u10D7\u10D4\u10D1","\u10DB\u10D0\u10E0","\u10D0\u10DE\u10E0","\u10DB\u10D0\u10D8","\u10D8\u10D5\u10DC","\u10D8\u10D5\u10DA","\u10D0\u10D2\u10D5","\u10E1\u10D4\u10E5","\u10DD\u10E5\u10E2","\u10DC\u10DD\u10D4","\u10D3\u10D4\u10D9"],longhand:["\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8","\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8","\u10DB\u10D0\u10E0\u10E2\u10D8","\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8","\u10DB\u10D0\u10D8\u10E1\u10D8","\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8","\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8","\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD","\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8","\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8","\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8","\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u10D9\u10D5.",scrollTitle:"\u10D3\u10D0\u10E1\u10E5\u10E0\u10DD\u10DA\u10D4\u10D7 \u10D2\u10D0\u10E1\u10D0\u10D3\u10D8\u10D3\u10D4\u10D1\u10DA\u10D0\u10D3",toggleTitle:"\u10D3\u10D0\u10D0\u10D9\u10DA\u10D8\u10D9\u10D4\u10D7 \u10D2\u10D0\u10D3\u10D0\u10E0\u10D7\u10D5\u10D8\u10E1\u10D7\u10D5\u10D8\u10E1",amPM:["AM","PM"],yearAriaLabel:"\u10EC\u10D4\u10DA\u10D8",time_24hr:!0};tt.l10ns.ka=j,tt.l10ns;var ne=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},be={weekdays:{shorthand:["\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0"],longhand:["\uC77C\uC694\uC77C","\uC6D4\uC694\uC77C","\uD654\uC694\uC77C","\uC218\uC694\uC77C","\uBAA9\uC694\uC77C","\uAE08\uC694\uC77C","\uD1A0\uC694\uC77C"]},months:{shorthand:["1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"],longhand:["1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"]},ordinal:function(){return"\uC77C"},rangeSeparator:" ~ ",amPM:["\uC624\uC804","\uC624\uD6C4"]};ne.l10ns.ko=be,ne.l10ns;var Be=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ct={weekdays:{shorthand:["\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799","\u1785\u1793\u17D2\u1791","\u17A2\u1784\u17D2\u1782\u17B6\u179A","\u1796\u17BB\u1792","\u1796\u17D2\u179A\u17A0\u179F.","\u179F\u17BB\u1780\u17D2\u179A","\u179F\u17C5\u179A\u17CD"],longhand:["\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799","\u1785\u1793\u17D2\u1791","\u17A2\u1784\u17D2\u1782\u17B6\u179A","\u1796\u17BB\u1792","\u1796\u17D2\u179A\u17A0\u179F\u17D2\u1794\u178F\u17B7\u17CD","\u179F\u17BB\u1780\u17D2\u179A","\u179F\u17C5\u179A\u17CD"]},months:{shorthand:["\u1798\u1780\u179A\u17B6","\u1780\u17BB\u1798\u17D2\u1797\u17C7","\u1798\u17B8\u1793\u17B6","\u1798\u17C1\u179F\u17B6","\u17A7\u179F\u1797\u17B6","\u1798\u17B7\u1790\u17BB\u1793\u17B6","\u1780\u1780\u17D2\u1780\u178A\u17B6","\u179F\u17B8\u17A0\u17B6","\u1780\u1789\u17D2\u1789\u17B6","\u178F\u17BB\u179B\u17B6","\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6","\u1792\u17D2\u1793\u17BC"],longhand:["\u1798\u1780\u179A\u17B6","\u1780\u17BB\u1798\u17D2\u1797\u17C7","\u1798\u17B8\u1793\u17B6","\u1798\u17C1\u179F\u17B6","\u17A7\u179F\u1797\u17B6","\u1798\u17B7\u1790\u17BB\u1793\u17B6","\u1780\u1780\u17D2\u1780\u178A\u17B6","\u179F\u17B8\u17A0\u17B6","\u1780\u1789\u17D2\u1789\u17B6","\u178F\u17BB\u179B\u17B6","\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6","\u1792\u17D2\u1793\u17BC"]},ordinal:function(){return""},firstDayOfWeek:1,rangeSeparator:" \u178A\u179B\u17CB ",weekAbbreviation:"\u179F\u1794\u17D2\u178F\u17B6\u17A0\u17CD",scrollTitle:"\u179A\u17C6\u1780\u17B7\u179B\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1794\u1784\u17D2\u1780\u17BE\u1793",toggleTitle:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1795\u17D2\u179B\u17B6\u179F\u17CB\u1794\u17D2\u178A\u17BC\u179A",yearAriaLabel:"\u1786\u17D2\u1793\u17B6\u17C6",time_24hr:!0};Be.l10ns.km=ct,Be.l10ns;var rn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ue={weekdays:{shorthand:["\u0416\u0441","\u0414\u0441","\u0421c","\u0421\u0440","\u0411\u0441","\u0416\u043C","\u0421\u0431"],longhand:["\u0416\u0435\u043A\u0441\u0435\u043D\u0431i","\u0414\u04AF\u0439\u0441\u0435\u043D\u0431i","\u0421\u0435\u0439\u0441\u0435\u043D\u0431i","\u0421\u04D9\u0440\u0441\u0435\u043D\u0431i","\u0411\u0435\u0439\u0441\u0435\u043D\u0431i","\u0416\u04B1\u043C\u0430","\u0421\u0435\u043D\u0431i"]},months:{shorthand:["\u049A\u0430\u04A3","\u0410\u049B\u043F","\u041D\u0430\u0443","\u0421\u04D9\u0443","\u041C\u0430\u043C","\u041C\u0430\u0443","\u0428i\u043B","\u0422\u0430\u043C","\u049A\u044B\u0440","\u049A\u0430\u0437","\u049A\u0430\u0440","\u0416\u0435\u043B"],longhand:["\u049A\u0430\u04A3\u0442\u0430\u0440","\u0410\u049B\u043F\u0430\u043D","\u041D\u0430\u0443\u0440\u044B\u0437","\u0421\u04D9\u0443i\u0440","\u041C\u0430\u043C\u044B\u0440","\u041C\u0430\u0443\u0441\u044B\u043C","\u0428i\u043B\u0434\u0435","\u0422\u0430\u043C\u044B\u0437","\u049A\u044B\u0440\u043A\u04AF\u0439\u0435\u043A","\u049A\u0430\u0437\u0430\u043D","\u049A\u0430\u0440\u0430\u0448\u0430","\u0416\u0435\u043B\u0442\u043E\u049B\u0441\u0430\u043D"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u0410\u043F\u0442\u0430",scrollTitle:"\u04AE\u043B\u043A\u0435\u0439\u0442\u0443 \u04AF\u0448\u0456\u043D \u0430\u0439\u043D\u0430\u043B\u0434\u044B\u0440\u044B\u04A3\u044B\u0437",toggleTitle:"\u0410\u0443\u044B\u0441\u0442\u044B\u0440\u0443 \u04AF\u0448\u0456\u043D \u0431\u0430\u0441\u044B\u04A3\u044B\u0437",amPM:["\u0422\u0414","\u0422\u041A"],yearAriaLabel:"\u0416\u044B\u043B"};rn.l10ns.kz=Ue,rn.l10ns;var Se=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Dt={weekdays:{shorthand:["S","Pr","A","T","K","Pn","\u0160"],longhand:["Sekmadienis","Pirmadienis","Antradienis","Tre\u010Diadienis","Ketvirtadienis","Penktadienis","\u0160e\u0161tadienis"]},months:{shorthand:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd"],longhand:["Sausis","Vasaris","Kovas","Balandis","Gegu\u017E\u0117","Bir\u017Eelis","Liepa","Rugpju\u0304tis","Rugse\u0307jis","Spalis","Lapkritis","Gruodis"]},firstDayOfWeek:1,ordinal:function(){return"-a"},rangeSeparator:" iki ",weekAbbreviation:"Sav",scrollTitle:"Keisti laik\u0105 pel\u0117s rateliu",toggleTitle:"Perjungti laiko format\u0105",time_24hr:!0};Se.l10ns.lt=Dt,Se.l10ns;var Kt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ye={firstDayOfWeek:1,weekdays:{shorthand:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],longhand:["Sv\u0113tdiena","Pirmdiena","Otrdiena","Tre\u0161diena","Ceturtdiena","Piektdiena","Sestdiena"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","J\u016Bn","J\u016Bl","Aug","Sep","Okt","Nov","Dec"],longhand:["Janv\u0101ris","Febru\u0101ris","Marts","Apr\u012Blis","Maijs","J\u016Bnijs","J\u016Blijs","Augusts","Septembris","Oktobris","Novembris","Decembris"]},rangeSeparator:" l\u012Bdz ",time_24hr:!0};Kt.l10ns.lv=Ye,Kt.l10ns;var qt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},yt={weekdays:{shorthand:["\u041D\u0435","\u041F\u043E","\u0412\u0442","\u0421\u0440","\u0427\u0435","\u041F\u0435","\u0421\u0430"],longhand:["\u041D\u0435\u0434\u0435\u043B\u0430","\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A","\u0412\u0442\u043E\u0440\u043D\u0438\u043A","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0440\u0442\u043E\u043A","\u041F\u0435\u0442\u043E\u043A","\u0421\u0430\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u0408\u0430\u043D","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0458","\u0408\u0443\u043D","\u0408\u0443\u043B","\u0410\u0432\u0433","\u0421\u0435\u043F","\u041E\u043A\u0442","\u041D\u043E\u0435","\u0414\u0435\u043A"],longhand:["\u0408\u0430\u043D\u0443\u0430\u0440\u0438","\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0438\u043B","\u041C\u0430\u0458","\u0408\u0443\u043D\u0438","\u0408\u0443\u043B\u0438","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438","\u041E\u043A\u0442\u043E\u043C\u0432\u0440\u0438","\u041D\u043E\u0435\u043C\u0432\u0440\u0438","\u0414\u0435\u043A\u0435\u043C\u0432\u0440\u0438"]},firstDayOfWeek:1,weekAbbreviation:"\u041D\u0435\u0434.",rangeSeparator:" \u0434\u043E ",time_24hr:!0};qt.l10ns.mk=yt,qt.l10ns;var Yt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},$r={firstDayOfWeek:1,weekdays:{shorthand:["\u0414\u0430","\u041C\u044F","\u041B\u0445","\u041F\u04AF","\u0411\u0430","\u0411\u044F","\u041D\u044F"],longhand:["\u0414\u0430\u0432\u0430\u0430","\u041C\u044F\u0433\u043C\u0430\u0440","\u041B\u0445\u0430\u0433\u0432\u0430","\u041F\u04AF\u0440\u044D\u0432","\u0411\u0430\u0430\u0441\u0430\u043D","\u0411\u044F\u043C\u0431\u0430","\u041D\u044F\u043C"]},months:{shorthand:["1-\u0440 \u0441\u0430\u0440","2-\u0440 \u0441\u0430\u0440","3-\u0440 \u0441\u0430\u0440","4-\u0440 \u0441\u0430\u0440","5-\u0440 \u0441\u0430\u0440","6-\u0440 \u0441\u0430\u0440","7-\u0440 \u0441\u0430\u0440","8-\u0440 \u0441\u0430\u0440","9-\u0440 \u0441\u0430\u0440","10-\u0440 \u0441\u0430\u0440","11-\u0440 \u0441\u0430\u0440","12-\u0440 \u0441\u0430\u0440"],longhand:["\u041D\u044D\u0433\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0425\u043E\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0414\u04E9\u0440\u04E9\u0432\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0417\u0443\u0440\u0433\u0430\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0414\u043E\u043B\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u041D\u0430\u0439\u043C\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0415\u0441\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440","\u0410\u0440\u0432\u0430\u043D\u043D\u044D\u0433\u0434\u04AF\u0433\u044D\u044D\u0440 \u0441\u0430\u0440","\u0410\u0440\u0432\u0430\u043D\u0445\u043E\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440"]},rangeSeparator:"-\u0441 ",time_24hr:!0};Yt.l10ns.mn=$r,Yt.l10ns;var Li=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},x={weekdays:{shorthand:["Aha","Isn","Sel","Rab","Kha","Jum","Sab"],longhand:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"]},months:{shorthand:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],longhand:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]},firstDayOfWeek:1,ordinal:function(){return""}};Li.l10ns;var _=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},R={weekdays:{shorthand:["\u1014\u103D\u1031","\u101C\u102C","\u1002\u102B","\u101F\u1030\u1038","\u1000\u103C\u102C","\u101E\u1031\u102C","\u1014\u1031"],longhand:["\u1010\u1014\u1004\u103A\u1039\u1002\u1014\u103D\u1031","\u1010\u1014\u1004\u103A\u1039\u101C\u102C","\u1021\u1004\u103A\u1039\u1002\u102B","\u1017\u102F\u1012\u1039\u1013\u101F\u1030\u1038","\u1000\u103C\u102C\u101E\u1015\u1010\u1031\u1038","\u101E\u1031\u102C\u1000\u103C\u102C","\u1005\u1014\u1031"]},months:{shorthand:["\u1007\u1014\u103A","\u1016\u1031","\u1019\u1010\u103A","\u1015\u103C\u102E","\u1019\u1031","\u1007\u103D\u1014\u103A","\u101C\u102D\u102F\u1004\u103A","\u101E\u103C","\u1005\u1000\u103A","\u1021\u1031\u102C\u1000\u103A","\u1014\u102D\u102F","\u1012\u102E"],longhand:["\u1007\u1014\u103A\u1014\u101D\u102B\u101B\u102E","\u1016\u1031\u1016\u1031\u102C\u103A\u101D\u102B\u101B\u102E","\u1019\u1010\u103A","\u1027\u1015\u103C\u102E","\u1019\u1031","\u1007\u103D\u1014\u103A","\u1007\u1030\u101C\u102D\u102F\u1004\u103A","\u101E\u103C\u1002\u102F\u1010\u103A","\u1005\u1000\u103A\u1010\u1004\u103A\u1018\u102C","\u1021\u1031\u102C\u1000\u103A\u1010\u102D\u102F\u1018\u102C","\u1014\u102D\u102F\u101D\u1004\u103A\u1018\u102C","\u1012\u102E\u1007\u1004\u103A\u1018\u102C"]},firstDayOfWeek:1,ordinal:function(){return""},time_24hr:!0};_.l10ns.my=R,_.l10ns;var W=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},re={weekdays:{shorthand:["zo","ma","di","wo","do","vr","za"],longhand:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"]},months:{shorthand:["jan","feb","mrt","apr","mei","jun","jul","aug","sept","okt","nov","dec"],longhand:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]},firstDayOfWeek:1,weekAbbreviation:"wk",rangeSeparator:" t/m ",scrollTitle:"Scroll voor volgende / vorige",toggleTitle:"Klik om te wisselen",time_24hr:!0,ordinal:function(je){return je===1||je===8||je>=20?"ste":"de"}};W.l10ns.nl=re,W.l10ns;var ae=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},xe={weekdays:{shorthand:["S\xF8.","M\xE5.","Ty.","On.","To.","Fr.","La."],longhand:["S\xF8ndag","M\xE5ndag","Tysdag","Onsdag","Torsdag","Fredag","Laurdag"]},months:{shorthand:["Jan","Feb","Mars","Apr","Mai","Juni","Juli","Aug","Sep","Okt","Nov","Des"],longhand:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"]},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"Veke",scrollTitle:"Scroll for \xE5 endre",toggleTitle:"Klikk for \xE5 veksle",time_24hr:!0,ordinal:function(){return"."}};ae.l10ns.nn=xe,ae.l10ns;var ue=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},_e={weekdays:{shorthand:["S\xF8n","Man","Tir","Ons","Tor","Fre","L\xF8r"],longhand:["S\xF8ndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","L\xF8rdag"]},months:{shorthand:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],longhand:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"]},firstDayOfWeek:1,rangeSeparator:" til ",weekAbbreviation:"Uke",scrollTitle:"Scroll for \xE5 endre",toggleTitle:"Klikk for \xE5 veksle",time_24hr:!0,ordinal:function(){return"."}};ue.l10ns.no=_e,ue.l10ns;var le=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},we={weekdays:{shorthand:["\u0A10\u0A24","\u0A38\u0A4B\u0A2E","\u0A2E\u0A70\u0A17\u0A32","\u0A2C\u0A41\u0A71\u0A27","\u0A35\u0A40\u0A30","\u0A38\u0A3C\u0A41\u0A71\u0A15\u0A30","\u0A38\u0A3C\u0A28\u0A3F\u0A71\u0A1A\u0A30"],longhand:["\u0A10\u0A24\u0A35\u0A3E\u0A30","\u0A38\u0A4B\u0A2E\u0A35\u0A3E\u0A30","\u0A2E\u0A70\u0A17\u0A32\u0A35\u0A3E\u0A30","\u0A2C\u0A41\u0A71\u0A27\u0A35\u0A3E\u0A30","\u0A35\u0A40\u0A30\u0A35\u0A3E\u0A30","\u0A38\u0A3C\u0A41\u0A71\u0A15\u0A30\u0A35\u0A3E\u0A30","\u0A38\u0A3C\u0A28\u0A3F\u0A71\u0A1A\u0A30\u0A35\u0A3E\u0A30"]},months:{shorthand:["\u0A1C\u0A28","\u0A2B\u0A3C\u0A30","\u0A2E\u0A3E\u0A30","\u0A05\u0A2A\u0A4D\u0A30\u0A48","\u0A2E\u0A08","\u0A1C\u0A42\u0A28","\u0A1C\u0A41\u0A32\u0A3E","\u0A05\u0A17","\u0A38\u0A24\u0A70","\u0A05\u0A15","\u0A28\u0A35\u0A70","\u0A26\u0A38\u0A70"],longhand:["\u0A1C\u0A28\u0A35\u0A30\u0A40","\u0A2B\u0A3C\u0A30\u0A35\u0A30\u0A40","\u0A2E\u0A3E\u0A30\u0A1A","\u0A05\u0A2A\u0A4D\u0A30\u0A48\u0A32","\u0A2E\u0A08","\u0A1C\u0A42\u0A28","\u0A1C\u0A41\u0A32\u0A3E\u0A08","\u0A05\u0A17\u0A38\u0A24","\u0A38\u0A24\u0A70\u0A2C\u0A30","\u0A05\u0A15\u0A24\u0A42\u0A2C\u0A30","\u0A28\u0A35\u0A70\u0A2C\u0A30","\u0A26\u0A38\u0A70\u0A2C\u0A30"]},time_24hr:!0};le.l10ns.pa=we,le.l10ns;var ze=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},At={weekdays:{shorthand:["Nd","Pn","Wt","\u015Ar","Cz","Pt","So"],longhand:["Niedziela","Poniedzia\u0142ek","Wtorek","\u015Aroda","Czwartek","Pi\u0105tek","Sobota"]},months:{shorthand:["Sty","Lut","Mar","Kwi","Maj","Cze","Lip","Sie","Wrz","Pa\u017A","Lis","Gru"],longhand:["Stycze\u0144","Luty","Marzec","Kwiecie\u0144","Maj","Czerwiec","Lipiec","Sierpie\u0144","Wrzesie\u0144","Pa\u017Adziernik","Listopad","Grudzie\u0144"]},rangeSeparator:" do ",weekAbbreviation:"tydz.",scrollTitle:"Przewi\u0144, aby zwi\u0119kszy\u0107",toggleTitle:"Kliknij, aby prze\u0142\u0105czy\u0107",firstDayOfWeek:1,time_24hr:!0,ordinal:function(){return"."}};ze.l10ns.pl=At,ze.l10ns;var mt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Dn={weekdays:{shorthand:["Dom","Seg","Ter","Qua","Qui","Sex","S\xE1b"],longhand:["Domingo","Segunda-feira","Ter\xE7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xE1bado"]},months:{shorthand:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],longhand:["Janeiro","Fevereiro","Mar\xE7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"]},rangeSeparator:" at\xE9 ",time_24hr:!0};mt.l10ns.pt=Dn,mt.l10ns;var bn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Sr={weekdays:{shorthand:["Dum","Lun","Mar","Mie","Joi","Vin","S\xE2m"],longhand:["Duminic\u0103","Luni","Mar\u021Bi","Miercuri","Joi","Vineri","S\xE2mb\u0103t\u0103"]},months:{shorthand:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec"],longhand:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"]},firstDayOfWeek:1,time_24hr:!0,ordinal:function(){return""}};bn.l10ns.ro=Sr,bn.l10ns;var Vn=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ur={weekdays:{shorthand:["\u0412\u0441","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431"],longhand:["\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435","\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A","\u0412\u0442\u043E\u0440\u043D\u0438\u043A","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0435\u0440\u0433","\u041F\u044F\u0442\u043D\u0438\u0446\u0430","\u0421\u0443\u0431\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],longhand:["\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u041D\u0435\u0434.",scrollTitle:"\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0435 \u0434\u043B\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F",toggleTitle:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F",amPM:["\u0414\u041F","\u041F\u041F"],yearAriaLabel:"\u0413\u043E\u0434",time_24hr:!0};Vn.l10ns.ru=Ur,Vn.l10ns;var zr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Vr={weekdays:{shorthand:["\u0D89","\u0DC3","\u0D85","\u0DB6","\u0DB6\u0DCA\u200D\u0DBB","\u0DC3\u0DD2","\u0DC3\u0DD9"],longhand:["\u0D89\u0DBB\u0DD2\u0DAF\u0DCF","\u0DC3\u0DB3\u0DD4\u0DAF\u0DCF","\u0D85\u0D9F\u0DC4\u0DBB\u0DD4\u0DC0\u0DCF\u0DAF\u0DCF","\u0DB6\u0DAF\u0DCF\u0DAF\u0DCF","\u0DB6\u0DCA\u200D\u0DBB\u0DC4\u0DC3\u0DCA\u0DB4\u0DAD\u0DD2\u0DB1\u0DCA\u0DAF\u0DCF","\u0DC3\u0DD2\u0D9A\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF","\u0DC3\u0DD9\u0DB1\u0DC3\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF"]},months:{shorthand:["\u0DA2\u0DB1","\u0DB4\u0DD9\u0DB6","\u0DB8\u0DCF\u0DBB\u0DCA","\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA","\u0DB8\u0DD0\u0DBA\u0DD2","\u0DA2\u0DD4\u0DB1\u0DD2","\u0DA2\u0DD6\u0DBD\u0DD2","\u0D85\u0D9C\u0DDD","\u0DC3\u0DD0\u0DB4\u0DCA","\u0D94\u0D9A\u0DCA","\u0DB1\u0DDC\u0DC0\u0DD0","\u0DAF\u0DD9\u0DC3\u0DD0"],longhand:["\u0DA2\u0DB1\u0DC0\u0DCF\u0DBB\u0DD2","\u0DB4\u0DD9\u0DB6\u0DBB\u0DC0\u0DCF\u0DBB\u0DD2","\u0DB8\u0DCF\u0DBB\u0DCA\u0DAD\u0DD4","\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA\u0DBD\u0DCA","\u0DB8\u0DD0\u0DBA\u0DD2","\u0DA2\u0DD4\u0DB1\u0DD2","\u0DA2\u0DD6\u0DBD\u0DD2","\u0D85\u0D9C\u0DDD\u0DC3\u0DCA\u0DAD\u0DD4","\u0DC3\u0DD0\u0DB4\u0DCA\u0DAD\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA","\u0D94\u0D9A\u0DCA\u0DAD\u0DDD\u0DB6\u0DBB\u0DCA","\u0DB1\u0DDC\u0DC0\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA","\u0DAF\u0DD9\u0DC3\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA"]},time_24hr:!0};zr.l10ns.si=Vr,zr.l10ns;var jr=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Pi={weekdays:{shorthand:["Ned","Pon","Ut","Str","\u0160tv","Pia","Sob"],longhand:["Nede\u013Ea","Pondelok","Utorok","Streda","\u0160tvrtok","Piatok","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","M\xE1j","J\xFAn","J\xFAl","Aug","Sep","Okt","Nov","Dec"],longhand:["Janu\xE1r","Febru\xE1r","Marec","Apr\xEDl","M\xE1j","J\xFAn","J\xFAl","August","September","Okt\xF3ber","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};jr.l10ns.sk=Pi,jr.l10ns;var L=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},y={weekdays:{shorthand:["Ned","Pon","Tor","Sre","\u010Cet","Pet","Sob"],longhand:["Nedelja","Ponedeljek","Torek","Sreda","\u010Cetrtek","Petek","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};L.l10ns.sl=y,L.l10ns;var b=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},m={weekdays:{shorthand:["Di","H\xEB","Ma","M\xEB","En","Pr","Sh"],longhand:["E Diel","E H\xEBn\xEB","E Mart\xEB","E M\xEBrkur\xEB","E Enjte","E Premte","E Shtun\xEB"]},months:{shorthand:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","N\xEBn","Dhj"],longhand:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","N\xEBntor","Dhjetor"]},time_24hr:!0};b.l10ns.sq=m,b.l10ns;var E=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},M={weekdays:{shorthand:["Ned","Pon","Uto","Sre","\u010Cet","Pet","Sub"],longhand:["Nedelja","Ponedeljak","Utorak","Sreda","\u010Cetvrtak","Petak","Subota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"]},firstDayOfWeek:1,weekAbbreviation:"Ned.",rangeSeparator:" do ",time_24hr:!0};E.l10ns.sr=M,E.l10ns;var P=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},H={firstDayOfWeek:1,weekAbbreviation:"v",weekdays:{shorthand:["s\xF6n","m\xE5n","tis","ons","tor","fre","l\xF6r"],longhand:["s\xF6ndag","m\xE5ndag","tisdag","onsdag","torsdag","fredag","l\xF6rdag"]},months:{shorthand:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],longhand:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"]},rangeSeparator:" till ",time_24hr:!0,ordinal:function(){return"."}};P.l10ns.sv=H,P.l10ns;var Y=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ee={weekdays:{shorthand:["\u0E2D\u0E32","\u0E08","\u0E2D","\u0E1E","\u0E1E\u0E24","\u0E28","\u0E2A"],longhand:["\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C","\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C","\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23","\u0E1E\u0E38\u0E18","\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35","\u0E28\u0E38\u0E01\u0E23\u0E4C","\u0E40\u0E2A\u0E32\u0E23\u0E4C"]},months:{shorthand:["\u0E21.\u0E04.","\u0E01.\u0E1E.","\u0E21\u0E35.\u0E04.","\u0E40\u0E21.\u0E22.","\u0E1E.\u0E04.","\u0E21\u0E34.\u0E22.","\u0E01.\u0E04.","\u0E2A.\u0E04.","\u0E01.\u0E22.","\u0E15.\u0E04.","\u0E1E.\u0E22.","\u0E18.\u0E04."],longhand:["\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21","\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C","\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21","\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19","\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21","\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19","\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21","\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21","\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19","\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21","\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19","\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21"]},firstDayOfWeek:1,rangeSeparator:" \u0E16\u0E36\u0E07 ",scrollTitle:"\u0E40\u0E25\u0E37\u0E48\u0E2D\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2B\u0E23\u0E37\u0E2D\u0E25\u0E14",toggleTitle:"\u0E04\u0E25\u0E34\u0E01\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19",time_24hr:!0,ordinal:function(){return""}};Y.l10ns.th=ee,Y.l10ns;var oe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},ve={weekdays:{shorthand:["Paz","Pzt","Sal","\xC7ar","Per","Cum","Cmt"],longhand:["Pazar","Pazartesi","Sal\u0131","\xC7ar\u015Famba","Per\u015Fembe","Cuma","Cumartesi"]},months:{shorthand:["Oca","\u015Eub","Mar","Nis","May","Haz","Tem","A\u011Fu","Eyl","Eki","Kas","Ara"],longhand:["Ocak","\u015Eubat","Mart","Nisan","May\u0131s","Haziran","Temmuz","A\u011Fustos","Eyl\xFCl","Ekim","Kas\u0131m","Aral\u0131k"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" - ",weekAbbreviation:"Hf",scrollTitle:"Art\u0131rmak i\xE7in kayd\u0131r\u0131n",toggleTitle:"A\xE7/Kapa",amPM:["\xD6\xD6","\xD6S"],time_24hr:!0};oe.l10ns.tr=ve,oe.l10ns;var pe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ce={firstDayOfWeek:1,weekdays:{shorthand:["\u041D\u0434","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431"],longhand:["\u041D\u0435\u0434\u0456\u043B\u044F","\u041F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A","\u0412\u0456\u0432\u0442\u043E\u0440\u043E\u043A","\u0421\u0435\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0435\u0440","\u041F'\u044F\u0442\u043D\u0438\u0446\u044F","\u0421\u0443\u0431\u043E\u0442\u0430"]},months:{shorthand:["\u0421\u0456\u0447","\u041B\u044E\u0442","\u0411\u0435\u0440","\u041A\u0432\u0456","\u0422\u0440\u0430","\u0427\u0435\u0440","\u041B\u0438\u043F","\u0421\u0435\u0440","\u0412\u0435\u0440","\u0416\u043E\u0432","\u041B\u0438\u0441","\u0413\u0440\u0443"],longhand:["\u0421\u0456\u0447\u0435\u043D\u044C","\u041B\u044E\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043D\u044C","\u041A\u0432\u0456\u0442\u0435\u043D\u044C","\u0422\u0440\u0430\u0432\u0435\u043D\u044C","\u0427\u0435\u0440\u0432\u0435\u043D\u044C","\u041B\u0438\u043F\u0435\u043D\u044C","\u0421\u0435\u0440\u043F\u0435\u043D\u044C","\u0412\u0435\u0440\u0435\u0441\u0435\u043D\u044C","\u0416\u043E\u0432\u0442\u0435\u043D\u044C","\u041B\u0438\u0441\u0442\u043E\u043F\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043D\u044C"]},time_24hr:!0};pe.l10ns.uk=Ce,pe.l10ns;var Ie=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Te={weekdays:{shorthand:["\u042F\u043A\u0448","\u0414\u0443\u0448","\u0421\u0435\u0448","\u0427\u043E\u0440","\u041F\u0430\u0439","\u0416\u0443\u043C","\u0428\u0430\u043D"],longhand:["\u042F\u043A\u0448\u0430\u043D\u0431\u0430","\u0414\u0443\u0448\u0430\u043D\u0431\u0430","\u0421\u0435\u0448\u0430\u043D\u0431\u0430","\u0427\u043E\u0440\u0448\u0430\u043D\u0431\u0430","\u041F\u0430\u0439\u0448\u0430\u043D\u0431\u0430","\u0416\u0443\u043C\u0430","\u0428\u0430\u043D\u0431\u0430"]},months:{shorthand:["\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],longhand:["\u042F\u043D\u0432\u0430\u0440","\u0424\u0435\u0432\u0440\u0430\u043B","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440","\u041E\u043A\u0442\u044F\u0431\u0440","\u041D\u043E\u044F\u0431\u0440","\u0414\u0435\u043A\u0430\u0431\u0440"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"\u04B2\u0430\u0444\u0442\u0430",scrollTitle:"\u041A\u0430\u0442\u0442\u0430\u043B\u0430\u0448\u0442\u0438\u0440\u0438\u0448 \u0443\u0447\u0443\u043D \u0430\u0439\u043B\u0430\u043D\u0442\u0438\u0440\u0438\u043D\u0433",toggleTitle:"\u040E\u0442\u0438\u0448 \u0443\u0447\u0443\u043D \u0431\u043E\u0441\u0438\u043D\u0433",amPM:["AM","PM"],yearAriaLabel:"\u0419\u0438\u043B",time_24hr:!0};Ie.l10ns.uz=Te,Ie.l10ns;var Oe=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},Ae={weekdays:{shorthand:["Ya","Du","Se","Cho","Pa","Ju","Sha"],longhand:["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"]},months:{shorthand:["Yan","Fev","Mar","Apr","May","Iyun","Iyul","Avg","Sen","Okt","Noy","Dek"],longhand:["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" \u2014 ",weekAbbreviation:"Hafta",scrollTitle:"Kattalashtirish uchun aylantiring",toggleTitle:"O\u2018tish uchun bosing",amPM:["AM","PM"],yearAriaLabel:"Yil",time_24hr:!0};Oe.l10ns.uz_latn=Ae,Oe.l10ns;var Le=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},nt={weekdays:{shorthand:["CN","T2","T3","T4","T5","T6","T7"],longhand:["Ch\u1EE7 nh\u1EADt","Th\u1EE9 hai","Th\u1EE9 ba","Th\u1EE9 t\u01B0","Th\u1EE9 n\u0103m","Th\u1EE9 s\xE1u","Th\u1EE9 b\u1EA3y"]},months:{shorthand:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],longhand:["Th\xE1ng m\u1ED9t","Th\xE1ng hai","Th\xE1ng ba","Th\xE1ng t\u01B0","Th\xE1ng n\u0103m","Th\xE1ng s\xE1u","Th\xE1ng b\u1EA3y","Th\xE1ng t\xE1m","Th\xE1ng ch\xEDn","Th\xE1ng m\u01B0\u1EDDi","Th\xE1ng m\u01B0\u1EDDi m\u1ED9t","Th\xE1ng m\u01B0\u1EDDi hai"]},firstDayOfWeek:1,rangeSeparator:" \u0111\u1EBFn "};Le.l10ns.vn=nt,Le.l10ns;var gt=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},bt={weekdays:{shorthand:["\u5468\u65E5","\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D"],longhand:["\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"]},months:{shorthand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],longhand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"]},rangeSeparator:" \u81F3 ",weekAbbreviation:"\u5468",scrollTitle:"\u6EDA\u52A8\u5207\u6362",toggleTitle:"\u70B9\u51FB\u5207\u6362 12/24 \u5C0F\u65F6\u65F6\u5236"};gt.l10ns.zh=bt,gt.l10ns;var An=typeof window!="undefined"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},In={weekdays:{shorthand:["\u9031\u65E5","\u9031\u4E00","\u9031\u4E8C","\u9031\u4E09","\u9031\u56DB","\u9031\u4E94","\u9031\u516D"],longhand:["\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"]},months:{shorthand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],longhand:["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"]},rangeSeparator:" \u81F3 ",weekAbbreviation:"\u9031",scrollTitle:"\u6EFE\u52D5\u5207\u63DB",toggleTitle:"\u9EDE\u64CA\u5207\u63DB 12/24 \u5C0F\u6642\u6642\u5236"};An.l10ns.zh_tw=In,An.l10ns;var ar={ar:r,at:a,az:s,be:l,bg:h,bn:g,bs:d,ca:S,ckb:k,cat:S,cs:N,cy:O,da:z,de:X,default:n({},ie),en:ie,eo:J,es:ce,et:fe,fa:De,fi:I,fo:qe,fr:V,gr:G,he:Ee,hi:Ge,hr:pt,hu:yn,hy:Wt,id:Un,is:Tn,it:Cn,ja:Bt,ka:j,ko:be,km:ct,kz:Ue,lt:Dt,lv:Ye,mk:yt,mn:$r,ms:x,my:R,nl:re,nn:xe,no:_e,pa:we,pl:At,pt:Dn,ro:Sr,ru:Ur,si:Vr,sk:Pi,sl:y,sq:m,sr:M,sv:H,th:ee,tr:ve,uk:Ce,vn:nt,zh:bt,zh_tw:In,uz:Te,uz_latn:Ae};t.default=ar,Object.defineProperty(t,"__esModule",{value:!0})})});var pa=rt((uM,mc)=>{"use strict";var DS=Object.prototype.hasOwnProperty,zt="~";function ha(){}Object.create&&(ha.prototype=Object.create(null),new ha().__proto__||(zt=!1));function AS(t,n,e){this.fn=t,this.context=n,this.once=e||!1}function Wp(t,n,e,r,i){if(typeof e!="function")throw new TypeError("The listener must be a function");var a=new AS(e,r||t,i),o=zt?zt+n:n;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],a]:t._events[o].push(a):(t._events[o]=a,t._eventsCount++),t}function Xo(t,n){--t._eventsCount==0?t._events=new ha:delete t._events[n]}function Ft(){this._events=new ha,this._eventsCount=0}Ft.prototype.eventNames=function(){var n=[],e,r;if(this._eventsCount===0)return n;for(r in e=this._events)DS.call(e,r)&&n.push(zt?r.slice(1):r);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n};Ft.prototype.listeners=function(n){var e=zt?zt+n:n,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,a=r.length,o=new Array(a);i{(function(){var t=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n=typeof window!="undefined",e=n&&window.mozInnerScreenX!=null;function r(i,a,o){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var s=o&&o.debug||!1;if(s){var u=document.querySelector("#input-textarea-caret-position-mirror-div");u&&u.parentNode.removeChild(u)}var l=document.createElement("div");l.id="input-textarea-caret-position-mirror-div",document.body.appendChild(l);var c=l.style,d=window.getComputedStyle?window.getComputedStyle(i):i.currentStyle,f=i.nodeName==="INPUT";c.whiteSpace="pre-wrap",f||(c.wordWrap="break-word"),c.position="absolute",s||(c.visibility="hidden"),t.forEach(function(g){f&&g==="lineHeight"?c.lineHeight=d.height:c[g]=d[g]}),e?i.scrollHeight>parseInt(d.height)&&(c.overflowY="scroll"):c.overflow="hidden",l.textContent=i.value.substring(0,a),f&&(l.textContent=l.textContent.replace(/\s/g,"\xA0"));var h=document.createElement("span");h.textContent=i.value.substring(a)||".",l.appendChild(h);var p={top:h.offsetTop+parseInt(d.borderTopWidth),left:h.offsetLeft+parseInt(d.borderLeftWidth),height:parseInt(d.lineHeight)};return s?h.style.backgroundColor="#aaa":document.body.removeChild(l),p}typeof Zo!="undefined"&&typeof Zo.exports!="undefined"?Zo.exports=r:n&&(window.getCaretCoordinates=r)})()});var $m=rt((Ac,Ic)=>{(function(t,n){typeof Ac=="object"&&typeof Ic!="undefined"?Ic.exports=n():typeof define=="function"&&define.amd?define(n):t.Mark=n()})(Ac,function(){"use strict";var t=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(s){return typeof s}:function(s){return s&&typeof Symbol=="function"&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},n=function(s,u){if(!(s instanceof u))throw new TypeError("Cannot call a class as a function")},e=function(){function s(u,l){for(var c=0;c1&&arguments[1]!==void 0?arguments[1]:!0,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],d=arguments.length>3&&arguments[3]!==void 0?arguments[3]:5e3;n(this,s),this.ctx=u,this.iframes=l,this.exclude=c,this.iframesTimeout=d}return e(s,[{key:"getContexts",value:function(){var l=void 0,c=[];return typeof this.ctx=="undefined"||!this.ctx?l=[]:NodeList.prototype.isPrototypeOf(this.ctx)?l=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?l=this.ctx:typeof this.ctx=="string"?l=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):l=[this.ctx],l.forEach(function(d){var f=c.filter(function(h){return h.contains(d)}).length>0;c.indexOf(d)===-1&&!f&&c.push(d)}),c}},{key:"getIframeContents",value:function(l,c){var d=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){},f=void 0;try{var h=l.contentWindow;if(f=h.document,!h||!f)throw new Error("iframe inaccessible")}catch(p){d()}f&&c(f)}},{key:"isIframeBlank",value:function(l){var c="about:blank",d=l.getAttribute("src").trim(),f=l.contentWindow.location.href;return f===c&&d!==c&&d}},{key:"observeIframeLoad",value:function(l,c,d){var f=this,h=!1,p=null,g=function w(){if(!h){h=!0,clearTimeout(p);try{f.isIframeBlank(l)||(l.removeEventListener("load",w),f.getIframeContents(l,c,d))}catch(S){d()}}};l.addEventListener("load",g),p=setTimeout(g,this.iframesTimeout)}},{key:"onIframeReady",value:function(l,c,d){try{l.contentWindow.document.readyState==="complete"?this.isIframeBlank(l)?this.observeIframeLoad(l,c,d):this.getIframeContents(l,c,d):this.observeIframeLoad(l,c,d)}catch(f){d()}}},{key:"waitForIframes",value:function(l,c){var d=this,f=0;this.forEachIframe(l,function(){return!0},function(h){f++,d.waitForIframes(h.querySelector("html"),function(){--f||c()})},function(h){h||c()})}},{key:"forEachIframe",value:function(l,c,d){var f=this,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:function(){},p=l.querySelectorAll("iframe"),g=p.length,w=0;p=Array.prototype.slice.call(p);var S=function(){--g<=0&&h(w)};g||S(),p.forEach(function(T){s.matches(T,f.exclude)?S():f.onIframeReady(T,function(k){c(T)&&(w++,d(k)),S()},S)})}},{key:"createIterator",value:function(l,c,d){return document.createNodeIterator(l,c,d,!1)}},{key:"createInstanceOnIframe",value:function(l){return new s(l.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(l,c,d){var f=l.compareDocumentPosition(d),h=Node.DOCUMENT_POSITION_PRECEDING;if(f&h)if(c!==null){var p=c.compareDocumentPosition(d),g=Node.DOCUMENT_POSITION_FOLLOWING;if(p&g)return!0}else return!0;return!1}},{key:"getIteratorNode",value:function(l){var c=l.previousNode(),d=void 0;return c===null?d=l.nextNode():d=l.nextNode()&&l.nextNode(),{prevNode:c,node:d}}},{key:"checkIframeFilter",value:function(l,c,d,f){var h=!1,p=!1;return f.forEach(function(g,w){g.val===d&&(h=w,p=g.handled)}),this.compareNodeIframe(l,c,d)?(h===!1&&!p?f.push({val:d,handled:!0}):h!==!1&&!p&&(f[h].handled=!0),!0):(h===!1&&f.push({val:d,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(l,c,d,f){var h=this;l.forEach(function(p){p.handled||h.getIframeContents(p.val,function(g){h.createInstanceOnIframe(g).forEachNode(c,d,f)})})}},{key:"iterateThroughNodes",value:function(l,c,d,f,h){for(var p=this,g=this.createIterator(c,l,f),w=[],S=[],T=void 0,k=void 0,D=function(){var C=p.getIteratorNode(g);return k=C.prevNode,T=C.node,T};D();)this.iframes&&this.forEachIframe(c,function(N){return p.checkIframeFilter(T,k,N,w)},function(N){p.createInstanceOnIframe(N).forEachNode(l,function(C){return S.push(C)},f)}),S.push(T);S.forEach(function(N){d(N)}),this.iframes&&this.handleOpenIframes(w,l,d,f),h()}},{key:"forEachNode",value:function(l,c,d){var f=this,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:function(){},p=this.getContexts(),g=p.length;g||h(),p.forEach(function(w){var S=function(){f.iterateThroughNodes(l,w,c,d,function(){--g<=0&&h()})};f.iframes?f.waitForIframes(w,S):S()})}}],[{key:"matches",value:function(l,c){var d=typeof c=="string"?[c]:c,f=l.matches||l.matchesSelector||l.msMatchesSelector||l.mozMatchesSelector||l.oMatchesSelector||l.webkitMatchesSelector;if(f){var h=!1;return d.every(function(p){return f.call(l,p)?(h=!0,!1):!0}),h}else return!1}}]),s}(),a=function(){function s(u){n(this,s),this.ctx=u,this.ie=!1;var l=window.navigator.userAgent;(l.indexOf("MSIE")>-1||l.indexOf("Trident")>-1)&&(this.ie=!0)}return e(s,[{key:"log",value:function(l){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"debug",d=this.opt.log;!this.opt.debug||(typeof d=="undefined"?"undefined":t(d))==="object"&&typeof d[c]=="function"&&d[c]("mark.js: "+l)}},{key:"escapeStr",value:function(l){return l.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(l){return this.opt.wildcards!=="disabled"&&(l=this.setupWildcardsRegExp(l)),l=this.escapeStr(l),Object.keys(this.opt.synonyms).length&&(l=this.createSynonymsRegExp(l)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.setupIgnoreJoinersRegExp(l)),this.opt.diacritics&&(l=this.createDiacriticsRegExp(l)),l=this.createMergedBlanksRegExp(l),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.createJoinersRegExp(l)),this.opt.wildcards!=="disabled"&&(l=this.createWildcardsRegExp(l)),l=this.createAccuracyRegExp(l),l}},{key:"createSynonymsRegExp",value:function(l){var c=this.opt.synonyms,d=this.opt.caseSensitive?"":"i",f=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var h in c)if(c.hasOwnProperty(h)){var p=c[h],g=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(h):this.escapeStr(h),w=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(p):this.escapeStr(p);g!==""&&w!==""&&(l=l.replace(new RegExp("("+this.escapeStr(g)+"|"+this.escapeStr(w)+")","gm"+d),f+("("+this.processSynomyms(g)+"|")+(this.processSynomyms(w)+")")+f))}return l}},{key:"processSynomyms",value:function(l){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(l=this.setupIgnoreJoinersRegExp(l)),l}},{key:"setupWildcardsRegExp",value:function(l){return l=l.replace(/(?:\\)*\?/g,function(c){return c.charAt(0)==="\\"?"?":""}),l.replace(/(?:\\)*\*/g,function(c){return c.charAt(0)==="\\"?"*":""})}},{key:"createWildcardsRegExp",value:function(l){var c=this.opt.wildcards==="withSpaces";return l.replace(/\u0001/g,c?"[\\S\\s]?":"\\S?").replace(/\u0002/g,c?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(l){return l.replace(/[^(|)\\]/g,function(c,d,f){var h=f.charAt(d+1);return/[(|)\\]/.test(h)||h===""?c:c+"\0"})}},{key:"createJoinersRegExp",value:function(l){var c=[],d=this.opt.ignorePunctuation;return Array.isArray(d)&&d.length&&c.push(this.escapeStr(d.join(""))),this.opt.ignoreJoiners&&c.push("\\u00ad\\u200b\\u200c\\u200d"),c.length?l.split(/\u0000+/).join("["+c.join("")+"]*"):l}},{key:"createDiacriticsRegExp",value:function(l){var c=this.opt.caseSensitive?"":"i",d=this.opt.caseSensitive?["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105","A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104","c\xE7\u0107\u010D","C\xC7\u0106\u010C","d\u0111\u010F","D\u0110\u010E","e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119","E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118","i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B","I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A","l\u0142","L\u0141","n\xF1\u0148\u0144","N\xD1\u0147\u0143","o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D","O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C","r\u0159","R\u0158","s\u0161\u015B\u0219\u015F","S\u0160\u015A\u0218\u015E","t\u0165\u021B\u0163","T\u0164\u021A\u0162","u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B","U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A","y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF","Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178","z\u017E\u017C\u017A","Z\u017D\u017B\u0179"]:["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104","c\xE7\u0107\u010DC\xC7\u0106\u010C","d\u0111\u010FD\u0110\u010E","e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118","i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A","l\u0142L\u0141","n\xF1\u0148\u0144N\xD1\u0147\u0143","o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C","r\u0159R\u0158","s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E","t\u0165\u021B\u0163T\u0164\u021A\u0162","u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A","y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178","z\u017E\u017C\u017AZ\u017D\u017B\u0179"],f=[];return l.split("").forEach(function(h){d.every(function(p){if(p.indexOf(h)!==-1){if(f.indexOf(p)>-1)return!1;l=l.replace(new RegExp("["+p+"]","gm"+c),"["+p+"]"),f.push(p)}return!0})}),l}},{key:"createMergedBlanksRegExp",value:function(l){return l.replace(/[\s]+/gmi,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(l){var c=this,d="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF",f=this.opt.accuracy,h=typeof f=="string"?f:f.value,p=typeof f=="string"?[]:f.limiters,g="";switch(p.forEach(function(w){g+="|"+c.escapeStr(w)}),h){case"partially":default:return"()("+l+")";case"complementary":return g="\\s"+(g||this.escapeStr(d)),"()([^"+g+"]*"+l+"[^"+g+"]*)";case"exactly":return"(^|\\s"+g+")("+l+")(?=$|\\s"+g+")"}}},{key:"getSeparatedKeywords",value:function(l){var c=this,d=[];return l.forEach(function(f){c.opt.separateWordSearch?f.split(" ").forEach(function(h){h.trim()&&d.indexOf(h)===-1&&d.push(h)}):f.trim()&&d.indexOf(f)===-1&&d.push(f)}),{keywords:d.sort(function(f,h){return h.length-f.length}),length:d.length}}},{key:"isNumeric",value:function(l){return Number(parseFloat(l))==l}},{key:"checkRanges",value:function(l){var c=this;if(!Array.isArray(l)||Object.prototype.toString.call(l[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(l),[];var d=[],f=0;return l.sort(function(h,p){return h.start-p.start}).forEach(function(h){var p=c.callNoMatchOnInvalidRanges(h,f),g=p.start,w=p.end,S=p.valid;S&&(h.start=g,h.length=w-g,d.push(h),f=w)}),d}},{key:"callNoMatchOnInvalidRanges",value:function(l,c){var d=void 0,f=void 0,h=!1;return l&&typeof l.start!="undefined"?(d=parseInt(l.start,10),f=d+parseInt(l.length,10),this.isNumeric(l.start)&&this.isNumeric(l.length)&&f-c>0&&f-d>0?h=!0:(this.log("Ignoring invalid or overlapping range: "+(""+JSON.stringify(l))),this.opt.noMatch(l))):(this.log("Ignoring invalid range: "+JSON.stringify(l)),this.opt.noMatch(l)),{start:d,end:f,valid:h}}},{key:"checkWhitespaceRanges",value:function(l,c,d){var f=void 0,h=!0,p=d.length,g=c-p,w=parseInt(l.start,10)-g;return w=w>p?p:w,f=w+parseInt(l.length,10),f>p&&(f=p,this.log("End range automatically set to the max value of "+p)),w<0||f-w<0||w>p||f>p?(h=!1,this.log("Invalid range: "+JSON.stringify(l)),this.opt.noMatch(l)):d.substring(w,f).replace(/\s+/g,"")===""&&(h=!1,this.log("Skipping whitespace only range: "+JSON.stringify(l)),this.opt.noMatch(l)),{start:w,end:f,valid:h}}},{key:"getTextNodes",value:function(l){var c=this,d="",f=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(h){f.push({start:d.length,end:(d+=h.textContent).length,node:h})},function(h){return c.matchesExclude(h.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){l({value:d,nodes:f})})}},{key:"matchesExclude",value:function(l){return i.matches(l,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(l,c,d){var f=this.opt.element?this.opt.element:"mark",h=l.splitText(c),p=h.splitText(d-c),g=document.createElement(f);return g.setAttribute("data-markjs","true"),this.opt.className&&g.setAttribute("class",this.opt.className),g.textContent=h.textContent,h.parentNode.replaceChild(g,h),p}},{key:"wrapRangeInMappedTextNode",value:function(l,c,d,f,h){var p=this;l.nodes.every(function(g,w){var S=l.nodes[w+1];if(typeof S=="undefined"||S.start>c){if(!f(g.node))return!1;var T=c-g.start,k=(d>g.end?g.end:d)-g.start,D=l.value.substr(0,g.start),N=l.value.substr(k+g.start);if(g.node=p.wrapRangeInTextNode(g.node,T,k),l.value=D+N,l.nodes.forEach(function(C,O){O>=w&&(l.nodes[O].start>0&&O!==w&&(l.nodes[O].start-=k),l.nodes[O].end-=k)}),d-=k,h(g.node.previousSibling,g.start),d>g.end)c=g.end;else return!1}return!0})}},{key:"wrapMatches",value:function(l,c,d,f,h){var p=this,g=c===0?0:c+1;this.getTextNodes(function(w){w.nodes.forEach(function(S){S=S.node;for(var T=void 0;(T=l.exec(S.textContent))!==null&&T[g]!=="";)if(!!d(T[g],S)){var k=T.index;if(g!==0)for(var D=1;D{"use strict";var rs=rr&&rr.__assign||function(){return rs=Object.assign||function(t){for(var n,e=1,r=arguments.length;e0&&a[a.length-1])&&(l[0]===6||l[0]===2)){e=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]-1&&(n&&nr.cancelMethods[e](),nr.elements.splice(e,1),nr.cancelMethods.splice(e,1))}},rg=typeof window!="undefined",Hx={cancelOnUserAction:!0,easing:function(t){return--t*t*t+1},elementToScroll:rg?window:null,horizontalOffset:0,maxDuration:3e3,minDuration:250,speed:500,verticalOffset:0};function Bx(t,n){return n===void 0&&(n={}),Ox(this,void 0,void 0,function(){var e,r,i,a,o,s,u,l,c,d,f,h,p,g,w,S,T,k;return Nx(this,function(D){if(rg){if(!window.Promise)throw"Browser doesn't support Promises, and animated-scroll-to depends on it, please provide a polyfill."}else return[2,new Promise(function(N){N(!1)})];if(a=rs(rs({},Hx),n),o=a.elementToScroll===window,s=!!a.elementToScroll.nodeName,!o&&!s)throw"Element to scroll needs to be either window or DOM element.";if(u=o?document.documentElement:a.elementToScroll,l=getComputedStyle(u).getPropertyValue("scroll-behavior"),l==="smooth"&&console.warn(u.tagName+` has "scroll-behavior: smooth" which can mess up with animated-scroll-to's animations`),c=o?new Rx:new Fx(a.elementToScroll),t instanceof Element){if(i=t,s&&(!a.elementToScroll.contains(i)||a.elementToScroll.isSameNode(i)))throw"options.elementToScroll has to be a parent of scrollToElement";e=c.getHorizontalElementScrollOffset(i,a.elementToScroll),r=c.getVerticalElementScrollOffset(i,a.elementToScroll)}else if(typeof t=="number")e=c.getHorizontalScroll(),r=t;else if(Array.isArray(t)&&t.length===2)e=t[0]===null?c.getHorizontalScroll():t[0],r=t[1]===null?c.getVerticalScroll():t[1];else throw`Wrong function signature. Check documentation. Available method signatures are: animateScrollTo(y:number, options) animateScrollTo([x:number | null, y:number | null], options) - animateScrollTo(scrollToElement:Element, options)`;return e+=a.horizontalOffset,r+=a.verticalOffset,d=c.getMaxHorizontalScroll(),f=c.getHorizontalScroll(),e>d&&(e=d),h=e-f,p=c.getMaxVerticalScroll(),g=c.getVerticalScroll(),r>p&&(r=p),w=r-g,S=Math.abs(Math.round(h/1e3*a.speed)),_=Math.abs(Math.round(w/1e3*a.speed)),k=S>_?S:_,ka.maxDuration&&(k=a.maxDuration),[2,new Promise(function(I,D){h===0&&w===0&&I(!0),nr.remove(a.elementToScroll,!0);var N,K=function(){Y(),cancelAnimationFrame(N),I(!1)};nr.add(a.elementToScroll,K);var j=function(le){return le.preventDefault()},X=a.cancelOnUserAction?K:j,Q=a.cancelOnUserAction?{passive:!0}:{passive:!1},ie=["wheel","touchstart","keydown","mousedown"],Y=function(){ie.forEach(function(le){a.elementToScroll.removeEventListener(le,X,Q)})};ie.forEach(function(le){a.elementToScroll.addEventListener(le,X,Q)});var J=Date.now(),ne=function(){var le=Date.now()-J,de=le/k,fe=Math.round(f+h*a.easing(de)),he=Math.round(g+w*a.easing(de));le{(function(n,e){typeof Ts=="object"&&typeof tu=="object"?tu.exports=e():typeof define=="function"&&define.amd?define([],e):typeof Ts=="object"?Ts.Choices=e():n.Choices=e()})(window,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(r,i,a){e.o(r,i)||Object.defineProperty(r,i,{enumerable:!0,get:a})},e.r=function(r){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},e.t=function(r,i){if(i&1&&(r=e(r)),i&8||i&4&&typeof r=="object"&&r&&r.__esModule)return r;var a=Object.create(null);if(e.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:r}),i&2&&typeof r!="string")for(var o in r)e.d(a,o,function(s){return r[s]}.bind(null,o));return a},e.n=function(r){var i=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(i,"a",i),i},e.o=function(r,i){return Object.prototype.hasOwnProperty.call(r,i)},e.p="/public/assets/scripts/",e(e.s=4)}([function(t,n,e){"use strict";var r=function(P){return i(P)&&!a(P)};function i(k){return!!k&&typeof k=="object"}function a(k){var P=Object.prototype.toString.call(k);return P==="[object RegExp]"||P==="[object Date]"||u(k)}var o=typeof Symbol=="function"&&Symbol.for,s=o?Symbol.for("react.element"):60103;function u(k){return k.$$typeof===s}function l(k){return Array.isArray(k)?[]:{}}function c(k,P){return P.clone!==!1&&P.isMergeableObject(k)?S(l(k),k,P):k}function d(k,P,I){return k.concat(P).map(function(D){return c(D,I)})}function f(k,P){if(!P.customMerge)return S;var I=P.customMerge(k);return typeof I=="function"?I:S}function h(k){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(k).filter(function(P){return k.propertyIsEnumerable(P)}):[]}function p(k){return Object.keys(k).concat(h(k))}function g(k,P){try{return P in k&&!(Object.hasOwnProperty.call(k,P)&&Object.propertyIsEnumerable.call(k,P))}catch(I){return!1}}function w(k,P,I){var D={};return I.isMergeableObject(k)&&p(k).forEach(function(N){D[N]=c(k[N],I)}),p(P).forEach(function(N){g(k,N)||(!I.isMergeableObject(P[N])||!k[N]?D[N]=c(P[N],I):D[N]=f(N,I)(k[N],P[N],I))}),D}function S(k,P,I){I=I||{},I.arrayMerge=I.arrayMerge||d,I.isMergeableObject=I.isMergeableObject||r,I.cloneUnlessOtherwiseSpecified=c;var D=Array.isArray(P),N=Array.isArray(k),K=D===N;return K?D?I.arrayMerge(k,P,I):w(k,P,I):c(P,I)}S.all=function(P,I){if(!Array.isArray(P))throw new Error("first argument should be an array");return P.reduce(function(D,N){return S(D,N,I)},{})};var _=S;t.exports=_},function(t,n,e){"use strict";(function(r,i){var a=e(3),o;typeof self!="undefined"?o=self:typeof window!="undefined"?o=window:typeof r!="undefined"?o=r:o=i;var s=Object(a.a)(o);n.a=s}).call(this,e(5),e(6)(t))},function(t,n,e){(function(r,i){t.exports=i()})(this,function(){return function(r){var i={};function a(o){if(i[o])return i[o].exports;var s=i[o]={i:o,l:!1,exports:{}};return r[o].call(s.exports,s,s.exports,a),s.l=!0,s.exports}return a.m=r,a.c=i,a.d=function(o,s,u){a.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:u})},a.r=function(o){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},a.t=function(o,s){if(1&s&&(o=a(o)),8&s||4&s&&typeof o=="object"&&o&&o.__esModule)return o;var u=Object.create(null);if(a.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:o}),2&s&&typeof o!="string")for(var l in o)a.d(u,l,function(c){return o[c]}.bind(null,l));return u},a.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return a.d(s,"a",s),s},a.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},a.p="",a(a.s=1)}([function(r,i){r.exports=function(a){return Array.isArray?Array.isArray(a):Object.prototype.toString.call(a)==="[object Array]"}},function(r,i,a){function o(f){return(o=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(h){return typeof h}:function(h){return h&&typeof Symbol=="function"&&h.constructor===Symbol&&h!==Symbol.prototype?"symbol":typeof h})(f)}function s(f,h){for(var p=0;p1&&arguments[1]!==void 0?arguments[1]:{limit:!1};this._log(`--------- -Search pattern: "`.concat(w,'"'));var _=this._prepareSearchers(w),k=_.tokenSearchers,P=_.fullSearcher,I=this._search(k,P),D=I.weights,N=I.results;return this._computeScore(D,N),this.options.shouldSort&&this._sort(N),S.limit&&typeof S.limit=="number"&&(N=N.slice(0,S.limit)),this._format(N)}},{key:"_prepareSearchers",value:function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",S=[];if(this.options.tokenize)for(var _=w.split(this.options.tokenSeparator),k=0,P=_.length;k0&&arguments[0]!==void 0?arguments[0]:[],S=arguments.length>1?arguments[1]:void 0,_=this.list,k={},P=[];if(typeof _[0]=="string"){for(var I=0,D=_.length;I1)throw new Error("Key weight has to be > 0 and <= 1");Y=Y.name}else N[Y]={weight:1};this._analyze({key:Y,value:this.options.getFn(X,Y),record:X,index:K},{resultMap:k,results:P,tokenSearchers:w,fullSearcher:S})}return{weights:N,results:P}}},{key:"_analyze",value:function(w,S){var _=w.key,k=w.arrayIndex,P=k===void 0?-1:k,I=w.value,D=w.record,N=w.index,K=S.tokenSearchers,j=K===void 0?[]:K,X=S.fullSearcher,Q=X===void 0?[]:X,ie=S.resultMap,Y=ie===void 0?{}:ie,J=S.results,ne=J===void 0?[]:J;if(I!=null){var le=!1,de=-1,fe=0;if(typeof I=="string"){this._log(` -Key: `.concat(_===""?"-":_));var he=Q.search(I);if(this._log('Full text: "'.concat(I,'", score: ').concat(he.score)),this.options.tokenize){for(var Te=I.split(this.options.tokenSeparator),C=[],A=0;A-1&&(Pe=(Pe+de)/2),this._log("Score average:",Pe);var rt=!this.options.tokenize||!this.options.matchAllTokens||fe>=j.length;if(this._log(` -Check Matches: `.concat(rt)),(le||he.isMatch)&&rt){var gt=Y[N];gt?gt.output.push({key:_,arrayIndex:P,value:I,score:Pe,matchedIndices:he.matchedIndices}):(Y[N]={item:D,output:[{key:_,arrayIndex:P,value:I,score:Pe,matchedIndices:he.matchedIndices}]},ne.push(Y[N]))}}else if(c(I))for(var dt=0,un=I.length;dtd&&(e=d),h=e-f,p=c.getMaxVerticalScroll(),g=c.getVerticalScroll(),r>p&&(r=p),w=r-g,S=Math.abs(Math.round(h/1e3*a.speed)),T=Math.abs(Math.round(w/1e3*a.speed)),k=S>T?S:T,ka.maxDuration&&(k=a.maxDuration),[2,new Promise(function(N,C){h===0&&w===0&&N(!0),nr.remove(a.elementToScroll,!0);var O,B=function(){q(),cancelAnimationFrame(O),N(!1)};nr.add(a.elementToScroll,B);var z=function(ce){return ce.preventDefault()},Q=a.cancelOnUserAction?B:z,X=a.cancelOnUserAction?{passive:!0}:{passive:!1},ie=["wheel","touchstart","keydown","mousedown"],q=function(){ie.forEach(function(ce){a.elementToScroll.removeEventListener(ce,Q,X)})};ie.forEach(function(ce){a.elementToScroll.addEventListener(ce,Q,X)});var J=Date.now(),te=function(){var ce=Date.now()-J,de=ce/k,fe=Math.round(f+h*a.easing(de)),he=Math.round(g+w*a.easing(de));ce{(function(n,e){typeof gs=="object"&&typeof jc=="object"?jc.exports=e():typeof define=="function"&&define.amd?define([],e):typeof gs=="object"?gs.Choices=e():n.Choices=e()})(window,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(r,i,a){e.o(r,i)||Object.defineProperty(r,i,{enumerable:!0,get:a})},e.r=function(r){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},e.t=function(r,i){if(i&1&&(r=e(r)),i&8||i&4&&typeof r=="object"&&r&&r.__esModule)return r;var a=Object.create(null);if(e.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:r}),i&2&&typeof r!="string")for(var o in r)e.d(a,o,function(s){return r[s]}.bind(null,o));return a},e.n=function(r){var i=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(i,"a",i),i},e.o=function(r,i){return Object.prototype.hasOwnProperty.call(r,i)},e.p="/public/assets/scripts/",e(e.s=4)}([function(t,n,e){"use strict";var r=function(D){return i(D)&&!a(D)};function i(k){return!!k&&typeof k=="object"}function a(k){var D=Object.prototype.toString.call(k);return D==="[object RegExp]"||D==="[object Date]"||u(k)}var o=typeof Symbol=="function"&&Symbol.for,s=o?Symbol.for("react.element"):60103;function u(k){return k.$$typeof===s}function l(k){return Array.isArray(k)?[]:{}}function c(k,D){return D.clone!==!1&&D.isMergeableObject(k)?S(l(k),k,D):k}function d(k,D,N){return k.concat(D).map(function(C){return c(C,N)})}function f(k,D){if(!D.customMerge)return S;var N=D.customMerge(k);return typeof N=="function"?N:S}function h(k){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(k).filter(function(D){return k.propertyIsEnumerable(D)}):[]}function p(k){return Object.keys(k).concat(h(k))}function g(k,D){try{return D in k&&!(Object.hasOwnProperty.call(k,D)&&Object.propertyIsEnumerable.call(k,D))}catch(N){return!1}}function w(k,D,N){var C={};return N.isMergeableObject(k)&&p(k).forEach(function(O){C[O]=c(k[O],N)}),p(D).forEach(function(O){g(k,O)||(!N.isMergeableObject(D[O])||!k[O]?C[O]=c(D[O],N):C[O]=f(O,N)(k[O],D[O],N))}),C}function S(k,D,N){N=N||{},N.arrayMerge=N.arrayMerge||d,N.isMergeableObject=N.isMergeableObject||r,N.cloneUnlessOtherwiseSpecified=c;var C=Array.isArray(D),O=Array.isArray(k),B=C===O;return B?C?N.arrayMerge(k,D,N):w(k,D,N):c(D,N)}S.all=function(D,N){if(!Array.isArray(D))throw new Error("first argument should be an array");return D.reduce(function(C,O){return S(C,O,N)},{})};var T=S;t.exports=T},function(t,n,e){"use strict";(function(r,i){var a=e(3),o;typeof self!="undefined"?o=self:typeof window!="undefined"?o=window:typeof r!="undefined"?o=r:o=i;var s=Object(a.a)(o);n.a=s}).call(this,e(5),e(6)(t))},function(t,n,e){(function(r,i){t.exports=i()})(this,function(){return function(r){var i={};function a(o){if(i[o])return i[o].exports;var s=i[o]={i:o,l:!1,exports:{}};return r[o].call(s.exports,s,s.exports,a),s.l=!0,s.exports}return a.m=r,a.c=i,a.d=function(o,s,u){a.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:u})},a.r=function(o){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},a.t=function(o,s){if(1&s&&(o=a(o)),8&s||4&s&&typeof o=="object"&&o&&o.__esModule)return o;var u=Object.create(null);if(a.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:o}),2&s&&typeof o!="string")for(var l in o)a.d(u,l,function(c){return o[c]}.bind(null,l));return u},a.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return a.d(s,"a",s),s},a.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},a.p="",a(a.s=1)}([function(r,i){r.exports=function(a){return Array.isArray?Array.isArray(a):Object.prototype.toString.call(a)==="[object Array]"}},function(r,i,a){function o(f){return(o=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(h){return typeof h}:function(h){return h&&typeof Symbol=="function"&&h.constructor===Symbol&&h!==Symbol.prototype?"symbol":typeof h})(f)}function s(f,h){for(var p=0;p1&&arguments[1]!==void 0?arguments[1]:{limit:!1};this._log(`--------- +Search pattern: "`.concat(w,'"'));var T=this._prepareSearchers(w),k=T.tokenSearchers,D=T.fullSearcher,N=this._search(k,D),C=N.weights,O=N.results;return this._computeScore(C,O),this.options.shouldSort&&this._sort(O),S.limit&&typeof S.limit=="number"&&(O=O.slice(0,S.limit)),this._format(O)}},{key:"_prepareSearchers",value:function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",S=[];if(this.options.tokenize)for(var T=w.split(this.options.tokenSeparator),k=0,D=T.length;k0&&arguments[0]!==void 0?arguments[0]:[],S=arguments.length>1?arguments[1]:void 0,T=this.list,k={},D=[];if(typeof T[0]=="string"){for(var N=0,C=T.length;N1)throw new Error("Key weight has to be > 0 and <= 1");q=q.name}else O[q]={weight:1};this._analyze({key:q,value:this.options.getFn(Q,q),record:Q,index:B},{resultMap:k,results:D,tokenSearchers:w,fullSearcher:S})}return{weights:O,results:D}}},{key:"_analyze",value:function(w,S){var T=w.key,k=w.arrayIndex,D=k===void 0?-1:k,N=w.value,C=w.record,O=w.index,B=S.tokenSearchers,z=B===void 0?[]:B,Q=S.fullSearcher,X=Q===void 0?[]:Q,ie=S.resultMap,q=ie===void 0?{}:ie,J=S.results,te=J===void 0?[]:J;if(N!=null){var ce=!1,de=-1,fe=0;if(typeof N=="string"){this._log(` +Key: `.concat(T===""?"-":T));var he=X.search(N);if(this._log('Full text: "'.concat(N,'", score: ').concat(he.score)),this.options.tokenize){for(var De=N.split(this.options.tokenSeparator),A=[],I=0;I-1&&(Fe=(Fe+de)/2),this._log("Score average:",Fe);var Ge=!this.options.tokenize||!this.options.matchAllTokens||fe>=z.length;if(this._log(` +Check Matches: `.concat(Ge)),(ce||he.isMatch)&&Ge){var ht=q[O];ht?ht.output.push({key:T,arrayIndex:D,value:N,score:Fe,matchedIndices:he.matchedIndices}):(q[O]={item:C,output:[{key:T,arrayIndex:D,value:N,score:Fe,matchedIndices:he.matchedIndices}]},te.push(q[O]))}}else if(c(N))for(var pt=0,tn=N.length;pt-1&&(le.arrayIndex=ne.arrayIndex),Q.matches.push(le)}}}),this.options.includeScore&&k.push(function(X,Q){Q.score=X.score});for(var P=0,I=w.length;PS)return s(g,this.pattern,_);var k=this.options,P=k.location,I=k.distance,D=k.threshold,N=k.findAllMatches,K=k.minMatchCharLength;return u(g,this.pattern,this.patternAlphabet,{location:P,distance:I,threshold:D,findAllMatches:N,minMatchCharLength:K})}}])&&o(f.prototype,h),p&&o(f,p),d}();r.exports=c},function(r,i){var a=/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;r.exports=function(o,s){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:/ +/g,l=new RegExp(s.replace(a,"\\$&").replace(u,"|")),c=o.match(l),d=!!c,f=[];if(d)for(var h=0,p=c.length;h=A;B-=1){var z=B-1,U=c[u.charAt(z)];if(U&&(Q[z]=1),$e[B]=($e[B+1]<<1|1)&U,he!==0&&($e[B]|=(ne[B+1]|ne[B])<<1|1|ne[B+1]),$e[B]&fe&&(le=o(l,{errors:he,currentLocation:z,expectedLocation:D,distance:g}))<=K){if(K=le,(j=z)<=D)break;A=Math.max(1,2*D-j)}}if(o(l,{errors:he+1,currentLocation:D,expectedLocation:D,distance:g})>K)break;ne=$e}return{isMatch:j>=0,score:le===0?.001:le,matchedIndices:s(Q,I)}}},function(r,i){r.exports=function(a,o){var s=o.errors,u=s===void 0?0:s,l=o.currentLocation,c=l===void 0?0:l,d=o.expectedLocation,f=d===void 0?0:d,h=o.distance,p=h===void 0?100:h,g=u/a.length,w=Math.abs(f-c);return p?g+w/p:w?1:g}},function(r,i){r.exports=function(){for(var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,s=[],u=-1,l=-1,c=0,d=a.length;c=o&&s.push([u,l]),u=-1)}return a[c-1]&&c-u>=o&&s.push([u,c-1]),s}},function(r,i){r.exports=function(a){for(var o={},s=a.length,u=0;u0)return"Unexpected "+(L.length>1?"keys":"key")+" "+('"'+L.join('", "')+'" found in '+M+". ")+"Expected to find one of the known reducer keys instead: "+('"'+E.join('", "')+'". Unexpected keys will be ignored.')}function g(O){Object.keys(O).forEach(function(y){var b=O[y],m=b(void 0,{type:l.INIT});if(typeof m=="undefined")throw new Error('Reducer "'+y+`" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(typeof b(void 0,{type:l.PROBE_UNKNOWN_ACTION()})=="undefined")throw new Error('Reducer "'+y+'" returned undefined when probed with a random type. '+("Don't try to handle "+l.INIT+' or other actions in "redux/*" ')+"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.")})}function w(O){for(var y=Object.keys(O),b={},m=0;m-1?O.map(function(b){var m=b;return m.id===parseInt(y.choiceId,10)&&(m.selected=!0),m}):O;case"REMOVE_ITEM":return y.choiceId>-1?O.map(function(b){var m=b;return m.id===parseInt(y.choiceId,10)&&(m.selected=!1),m}):O;case"FILTER_CHOICES":return O.map(function(b){var m=b;return m.active=y.results.some(function(E){var M=E.item,L=E.score;return M.id===m.id?(m.score=L,!0):!1}),m});case"ACTIVATE_CHOICES":return O.map(function(b){var m=b;return m.active=y.active,m});case"CLEAR_CHOICES":return Y;default:return O}}var ne={loading:!1},le=function(y,b){switch(y===void 0&&(y=ne),b.type){case"SET_IS_LOADING":return{loading:b.isLoading};default:return y}},de=le,fe=function(y,b){return Math.floor(Math.random()*(b-y)+y)},he=function(y){return Array.from({length:y},function(){return fe(0,36).toString(36)}).join("")},Te=function(y,b){var m=y.id||y.name&&y.name+"-"+he(2)||he(4);return m=m.replace(/(:|\.|\[|\]|,)/g,""),m=b+"-"+m,m},C=function(y){return Object.prototype.toString.call(y).slice(8,-1)},A=function(y,b){return b!=null&&C(b)===y},tt=function(y,b){return b===void 0&&(b=document.createElement("div")),y.nextSibling?y.parentNode.insertBefore(b,y.nextSibling):y.parentNode.appendChild(b),b.appendChild(y)},$e=function(y,b,m){if(m===void 0&&(m=1),!(!(y instanceof Element)||typeof b!="string")){for(var E=(m>0?"next":"previous")+"ElementSibling",M=y[E];M;){if(M.matches(b))return M;M=M[E]}return M}},B=function(y,b,m){if(m===void 0&&(m=1),!y)return!1;var E;return m>0?E=b.scrollTop+b.offsetHeight>=y.offsetTop+y.offsetHeight:E=y.offsetTop>=b.scrollTop,E},z=function(y){return typeof y!="string"?y:y.replace(/&/g,"&").replace(/>/g,"&rt;").replace(/"'+z(y)+'"'},maxItemText:function(y){return"Only "+y+" values can be added"},valueComparer:function(y,b){return y===b},fuseOptions:{includeScore:!0},callbackOnInit:null,callbackOnCreateTemplates:null,classNames:$n},yt={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice"},It={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL"},it={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34},V="text",re="select-one",ye="select-multiple",Be=4,ft=function(){function O(b){var m=b.element,E=b.type,M=b.classNames,L=b.position;this.element=m,this.classNames=M,this.type=E,this.position=L,this.isOpen=!1,this.isFlipped=!1,this.isFocussed=!1,this.isDisabled=!1,this.isLoading=!1,this._onFocus=this._onFocus.bind(this),this._onBlur=this._onBlur.bind(this)}var y=O.prototype;return y.addEventListeners=function(){this.element.addEventListener("focus",this._onFocus),this.element.addEventListener("blur",this._onBlur)},y.removeEventListeners=function(){this.element.removeEventListener("focus",this._onFocus),this.element.removeEventListener("blur",this._onBlur)},y.shouldFlip=function(m){if(typeof m!="number")return!1;var E=!1;return this.position==="auto"?E=!window.matchMedia("(min-height: "+(m+1)+"px)").matches:this.position==="top"&&(E=!0),E},y.setActiveDescendant=function(m){this.element.setAttribute("aria-activedescendant",m)},y.removeActiveDescendant=function(){this.element.removeAttribute("aria-activedescendant")},y.open=function(m){this.element.classList.add(this.classNames.openState),this.element.setAttribute("aria-expanded","true"),this.isOpen=!0,this.shouldFlip(m)&&(this.element.classList.add(this.classNames.flippedState),this.isFlipped=!0)},y.close=function(){this.element.classList.remove(this.classNames.openState),this.element.setAttribute("aria-expanded","false"),this.removeActiveDescendant(),this.isOpen=!1,this.isFlipped&&(this.element.classList.remove(this.classNames.flippedState),this.isFlipped=!1)},y.focus=function(){this.isFocussed||this.element.focus()},y.addFocusState=function(){this.element.classList.add(this.classNames.focusState)},y.removeFocusState=function(){this.element.classList.remove(this.classNames.focusState)},y.enable=function(){this.element.classList.remove(this.classNames.disabledState),this.element.removeAttribute("aria-disabled"),this.type===re&&this.element.setAttribute("tabindex","0"),this.isDisabled=!1},y.disable=function(){this.element.classList.add(this.classNames.disabledState),this.element.setAttribute("aria-disabled","true"),this.type===re&&this.element.setAttribute("tabindex","-1"),this.isDisabled=!0},y.wrap=function(m){tt(m,this.element)},y.unwrap=function(m){this.element.parentNode.insertBefore(m,this.element),this.element.parentNode.removeChild(this.element)},y.addLoadingState=function(){this.element.classList.add(this.classNames.loadingState),this.element.setAttribute("aria-busy","true"),this.isLoading=!0},y.removeLoadingState=function(){this.element.classList.remove(this.classNames.loadingState),this.element.removeAttribute("aria-busy"),this.isLoading=!1},y._onFocus=function(){this.isFocussed=!0},y._onBlur=function(){this.isFocussed=!1},O}();function Ke(O,y){for(var b=0;b0?this.element.scrollTop+te-R:m.offsetTop;requestAnimationFrame(function(){M._animateScroll(oe,E)})}},y._scrollDown=function(m,E,M){var L=(M-m)/E,R=L>1?L:1;this.element.scrollTop=m+R},y._scrollUp=function(m,E,M){var L=(m-M)/E,R=L>1?L:1;this.element.scrollTop=m-R},y._animateScroll=function(m,E){var M=this,L=Be,R=this.element.scrollTop,q=!1;E>0?(this._scrollDown(R,L,m),Rm&&(q=!0)),q&&requestAnimationFrame(function(){M._animateScroll(m,E)})},O}();function At(O,y){for(var b=0;b0?"treeitem":"option"),Object.assign(Le.dataset,{choice:"",id:oe,value:ve,selectText:m}),xe?(Le.classList.add(q),Le.dataset.choiceDisabled="",Le.setAttribute("aria-disabled","true")):(Le.classList.add(L),Le.dataset.choiceSelectable=""),Le},input:function(y,b){var m=y.input,E=y.inputCloned,M=Object.assign(document.createElement("input"),{type:"text",className:m+" "+E,autocomplete:"off",autocapitalize:"off",spellcheck:!1});return M.setAttribute("role","textbox"),M.setAttribute("aria-autocomplete","list"),M.setAttribute("aria-label",b),M},dropdown:function(y){var b=y.list,m=y.listDropdown,E=document.createElement("div");return E.classList.add(b,m),E.setAttribute("aria-expanded","false"),E},notice:function(y,b,m){var E=y.item,M=y.itemChoice,L=y.noResults,R=y.noChoices;m===void 0&&(m="");var q=[E,M];return m==="no-choices"?q.push(R):m==="no-results"&&q.push(L),Object.assign(document.createElement("div"),{innerHTML:b,className:q.join(" ")})},option:function(y){var b=y.label,m=y.value,E=y.customProperties,M=y.active,L=y.disabled,R=new Option(b,m,!1,M);return E&&(R.dataset.customProperties=E),R.disabled=L,R}},ue=ce,_e=function(y){var b=y.value,m=y.label,E=y.id,M=y.groupId,L=y.disabled,R=y.elementId,q=y.customProperties,te=y.placeholder,oe=y.keyCode;return{type:It.ADD_CHOICE,value:b,label:m,id:E,groupId:M,disabled:L,elementId:R,customProperties:q,placeholder:te,keyCode:oe}},De=function(y){return{type:It.FILTER_CHOICES,results:y}},ze=function(y){return y===void 0&&(y=!0),{type:It.ACTIVATE_CHOICES,active:y}},xt=function(){return{type:It.CLEAR_CHOICES}},lt=function(y){var b=y.value,m=y.label,E=y.id,M=y.choiceId,L=y.groupId,R=y.customProperties,q=y.placeholder,te=y.keyCode;return{type:It.ADD_ITEM,value:b,label:m,id:E,choiceId:M,groupId:L,customProperties:R,placeholder:q,keyCode:te}},Un=function(y,b){return{type:It.REMOVE_ITEM,id:y,choiceId:b}},Pt=function(y,b){return{type:It.HIGHLIGHT_ITEM,id:y,highlighted:b}},bn=function(y){var b=y.value,m=y.id,E=y.active,M=y.disabled;return{type:It.ADD_GROUP,value:b,id:m,active:E,disabled:M}},Dn=function(){return{type:"CLEAR_ALL"}},Cn=function(y){return{type:"RESET_TO",state:y}},jn=function(y){return{type:"SET_IS_LOADING",isLoading:y}};function Sr(O,y){for(var b=0;b=0?this._store.getGroupById(R):null;return this._store.dispatch(Pt(M,!0)),E&&this.passedElement.triggerEvent(yt.highlightItem,{id:M,value:te,label:ve,groupValue:pe&&pe.value?pe.value:null}),this},y.unhighlightItem=function(m){if(!m)return this;var E=m.id,M=m.groupId,L=M===void 0?-1:M,R=m.value,q=R===void 0?"":R,te=m.label,oe=te===void 0?"":te,ve=L>=0?this._store.getGroupById(L):null;return this._store.dispatch(Pt(E,!1)),this.passedElement.triggerEvent(yt.highlightItem,{id:E,value:q,label:oe,groupValue:ve&&ve.value?ve.value:null}),this},y.highlightAll=function(){var m=this;return this._store.items.forEach(function(E){return m.highlightItem(E)}),this},y.unhighlightAll=function(){var m=this;return this._store.items.forEach(function(E){return m.unhighlightItem(E)}),this},y.removeActiveItemsByValue=function(m){var E=this;return this._store.activeItems.filter(function(M){return M.value===m}).forEach(function(M){return E._removeItem(M)}),this},y.removeActiveItems=function(m){var E=this;return this._store.activeItems.filter(function(M){var L=M.id;return L!==m}).forEach(function(M){return E._removeItem(M)}),this},y.removeHighlightedItems=function(m){var E=this;return m===void 0&&(m=!1),this._store.highlightedActiveItems.forEach(function(M){E._removeItem(M),m&&E._triggerChange(M.value)}),this},y.showDropdown=function(m){var E=this;return this.dropdown.isActive?this:(requestAnimationFrame(function(){E.dropdown.show(),E.containerOuter.open(E.dropdown.distanceFromTopWindow),!m&&E._canSearch&&E.input.focus(),E.passedElement.triggerEvent(yt.showDropdown,{})}),this)},y.hideDropdown=function(m){var E=this;return this.dropdown.isActive?(requestAnimationFrame(function(){E.dropdown.hide(),E.containerOuter.close(),!m&&E._canSearch&&(E.input.removeActiveDescendant(),E.input.blur()),E.passedElement.triggerEvent(yt.hideDropdown,{})}),this):this},y.getValue=function(m){m===void 0&&(m=!1);var E=this._store.activeItems.reduce(function(M,L){var R=m?L.value:L;return M.push(R),M},[]);return this._isSelectOneElement?E[0]:E},y.setValue=function(m){var E=this;return this.initialised?(m.forEach(function(M){return E._setChoiceOrItem(M)}),this):this},y.setChoiceByValue=function(m){var E=this;if(!this.initialised||this._isTextElement)return this;var M=Array.isArray(m)?m:[m];return M.forEach(function(L){return E._findAndSelectChoiceByValue(L)}),this},y.setChoices=function(m,E,M,L){var R=this;if(m===void 0&&(m=[]),E===void 0&&(E="value"),M===void 0&&(M="label"),L===void 0&&(L=!1),!this.initialised)throw new ReferenceError("setChoices was called on a non-initialized instance of Choices");if(!this._isSelectElement)throw new TypeError("setChoices can't be used with INPUT based Choices");if(typeof E!="string"||!E)throw new TypeError("value parameter must be a name of 'value' field in passed objects");if(L&&this.clearChoices(),typeof m=="function"){var q=m(this);if(typeof Promise=="function"&&q instanceof Promise)return new Promise(function(te){return requestAnimationFrame(te)}).then(function(){return R._handleLoadingState(!0)}).then(function(){return q}).then(function(te){return R.setChoices(te,E,M,L)}).catch(function(te){R.config.silent||console.error(te)}).then(function(){return R._handleLoadingState(!1)}).then(function(){return R});if(!Array.isArray(q))throw new TypeError(".setChoices first argument function must return either array of choices or Promise, got: "+typeof q);return this.setChoices(q,E,M,!1)}if(!Array.isArray(m))throw new TypeError(".setChoices must be called either with array of choices with a function resulting into Promise of array of choices");return this.containerOuter.removeLoadingState(),this._startLoading(),m.forEach(function(te){te.choices?R._addGroup({id:parseInt(te.id,10)||null,group:te,valueKey:E,labelKey:M}):R._addChoice({value:te[E],label:te[M],isSelected:te.selected,isDisabled:te.disabled,customProperties:te.customProperties,placeholder:te.placeholder})}),this._stopLoading(),this},y.clearChoices=function(){return this._store.dispatch(xt()),this},y.clearStore=function(){return this._store.dispatch(Dn()),this},y.clearInput=function(){var m=!this._isSelectOneElement;return this.input.clear(m),!this._isTextElement&&this._canSearch&&(this._isSearching=!1,this._store.dispatch(ze(!0))),this},y._render=function(){if(!this._store.isLoading()){this._currentState=this._store.state;var m=this._currentState.choices!==this._prevState.choices||this._currentState.groups!==this._prevState.groups||this._currentState.items!==this._prevState.items,E=this._isSelectElement,M=this._currentState.items!==this._prevState.items;!m||(E&&this._renderChoices(),M&&this._renderItems(),this._prevState=this._currentState)}},y._renderChoices=function(){var m=this,E=this._store,M=E.activeGroups,L=E.activeChoices,R=document.createDocumentFragment();if(this.choiceList.clear(),this.config.resetScrollPosition&&requestAnimationFrame(function(){return m.choiceList.scrollToTop()}),M.length>=1&&!this._isSearching){var q=L.filter(function(Me){return Me.placeholder===!0&&Me.groupId===-1});q.length>=1&&(R=this._createChoicesFragment(q,R)),R=this._createGroupsFragment(M,L,R)}else L.length>=1&&(R=this._createChoicesFragment(L,R));if(R.childNodes&&R.childNodes.length>0){var te=this._store.activeItems,oe=this._canAddItem(te,this.input.value);oe.response?(this.choiceList.append(R),this._highlightChoice()):this.choiceList.append(this._getTemplate("notice",oe.notice))}else{var ve,pe;this._isSearching?(pe=typeof this.config.noResultsText=="function"?this.config.noResultsText():this.config.noResultsText,ve=this._getTemplate("notice",pe,"no-results")):(pe=typeof this.config.noChoicesText=="function"?this.config.noChoicesText():this.config.noChoicesText,ve=this._getTemplate("notice",pe,"no-choices")),this.choiceList.append(ve)}},y._renderItems=function(){var m=this._store.activeItems||[];this.itemList.clear();var E=this._createItemsFragment(m);E.childNodes&&this.itemList.append(E)},y._createGroupsFragment=function(m,E,M){var L=this;M===void 0&&(M=document.createDocumentFragment());var R=function(te){return E.filter(function(oe){return L._isSelectOneElement?oe.groupId===te.id:oe.groupId===te.id&&(L.config.renderSelectedChoices==="always"||!oe.selected)})};return this.config.shouldSort&&m.sort(this.config.sorter),m.forEach(function(q){var te=R(q);if(te.length>=1){var oe=L._getTemplate("choiceGroup",q);M.appendChild(oe),L._createChoicesFragment(te,M,!0)}}),M},y._createChoicesFragment=function(m,E,M){var L=this;E===void 0&&(E=document.createDocumentFragment()),M===void 0&&(M=!1);var R=this.config,q=R.renderSelectedChoices,te=R.searchResultLimit,oe=R.renderChoiceLimit,ve=this._isSearching?we:this.config.sorter,pe=function(ht){var wn=q==="auto"?L._isSelectOneElement||!ht.selected:!0;if(wn){var zn=L._getTemplate("choice",ht,L.config.itemSelectText);E.appendChild(zn)}},Me=m;q==="auto"&&!this._isSelectOneElement&&(Me=m.filter(function(Je){return!Je.selected}));var Ie=Me.reduce(function(Je,ht){return ht.placeholder?Je.placeholderChoices.push(ht):Je.normalChoices.push(ht),Je},{placeholderChoices:[],normalChoices:[]}),xe=Ie.placeholderChoices,Oe=Ie.normalChoices;(this.config.shouldSort||this._isSearching)&&Oe.sort(ve);var Ce=Me.length,Le=this._isSelectOneElement?[].concat(xe,Oe):Oe;this._isSearching?Ce=te:oe&&oe>0&&!M&&(Ce=oe);for(var be=0;be=L){var te=R?this._searchChoices(m):0;this.passedElement.triggerEvent(yt.search,{value:m,resultCount:te})}else q&&(this._isSearching=!1,this._store.dispatch(ze(!0)))}},y._canAddItem=function(m,E){var M=!0,L=typeof this.config.addItemText=="function"?this.config.addItemText(E):this.config.addItemText;if(!this._isSelectOneElement){var R=Pe(m,E);this.config.maxItemCount>0&&this.config.maxItemCount<=m.length&&(M=!1,L=typeof this.config.maxItemText=="function"?this.config.maxItemText(this.config.maxItemCount):this.config.maxItemText),!this.config.duplicateItemsAllowed&&R&&M&&(M=!1,L=typeof this.config.uniqueItemText=="function"?this.config.uniqueItemText(E):this.config.uniqueItemText),this._isTextElement&&this.config.addItems&&M&&typeof this.config.addItemFilter=="function"&&!this.config.addItemFilter(E)&&(M=!1,L=typeof this.config.customAddItemText=="function"?this.config.customAddItemText(E):this.config.customAddItemText)}return{response:M,notice:L}},y._searchChoices=function(m){var E=typeof m=="string"?m.trim():m,M=typeof this._currentValue=="string"?this._currentValue.trim():this._currentValue;if(E.length<1&&E===M+" ")return 0;var L=this._store.searchableChoices,R=E,q=[].concat(this.config.searchFields),te=Object.assign(this.config.fuseOptions,{keys:q}),oe=new i.a(L,te),ve=oe.search(R);return this._currentValue=E,this._highlightPosition=0,this._isSearching=!0,this._store.dispatch(De(ve)),ve.length},y._addEventListeners=function(){var m=document,E=m.documentElement;E.addEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.addEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.addEventListener("mousedown",this._onMouseDown,!0),E.addEventListener("click",this._onClick,{passive:!0}),E.addEventListener("touchmove",this._onTouchMove,{passive:!0}),this.dropdown.element.addEventListener("mouseover",this._onMouseOver,{passive:!0}),this._isSelectOneElement&&(this.containerOuter.element.addEventListener("focus",this._onFocus,{passive:!0}),this.containerOuter.element.addEventListener("blur",this._onBlur,{passive:!0})),this.input.element.addEventListener("keyup",this._onKeyUp,{passive:!0}),this.input.element.addEventListener("focus",this._onFocus,{passive:!0}),this.input.element.addEventListener("blur",this._onBlur,{passive:!0}),this.input.element.form&&this.input.element.form.addEventListener("reset",this._onFormReset,{passive:!0}),this.input.addEventListeners()},y._removeEventListeners=function(){var m=document,E=m.documentElement;E.removeEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.removeEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.removeEventListener("mousedown",this._onMouseDown,!0),E.removeEventListener("click",this._onClick),E.removeEventListener("touchmove",this._onTouchMove),this.dropdown.element.removeEventListener("mouseover",this._onMouseOver),this._isSelectOneElement&&(this.containerOuter.element.removeEventListener("focus",this._onFocus),this.containerOuter.element.removeEventListener("blur",this._onBlur)),this.input.element.removeEventListener("keyup",this._onKeyUp),this.input.element.removeEventListener("focus",this._onFocus),this.input.element.removeEventListener("blur",this._onBlur),this.input.element.form&&this.input.element.form.removeEventListener("reset",this._onFormReset),this.input.removeEventListeners()},y._onKeyDown=function(m){var E,M=m.target,L=m.keyCode,R=m.ctrlKey,q=m.metaKey,te=this._store.activeItems,oe=this.input.isFocussed,ve=this.dropdown.isActive,pe=this.itemList.hasChildren(),Me=String.fromCharCode(L),Ie=it.BACK_KEY,xe=it.DELETE_KEY,Oe=it.ENTER_KEY,Ce=it.A_KEY,Le=it.ESC_KEY,be=it.UP_KEY,Je=it.DOWN_KEY,ht=it.PAGE_UP_KEY,wn=it.PAGE_DOWN_KEY,zn=R||q;!this._isTextElement&&/[a-zA-Z0-9-_ ]/.test(Me)&&this.showDropdown();var In=(E={},E[Ce]=this._onAKey,E[Oe]=this._onEnterKey,E[Le]=this._onEscapeKey,E[be]=this._onDirectionKey,E[ht]=this._onDirectionKey,E[Je]=this._onDirectionKey,E[wn]=this._onDirectionKey,E[xe]=this._onDeleteKey,E[Ie]=this._onDeleteKey,E);In[L]&&In[L]({event:m,target:M,keyCode:L,metaKey:q,activeItems:te,hasFocusedInput:oe,hasActiveDropdown:ve,hasItems:pe,hasCtrlDownKeyPressed:zn})},y._onKeyUp=function(m){var E=m.target,M=m.keyCode,L=this.input.value,R=this._store.activeItems,q=this._canAddItem(R,L),te=it.BACK_KEY,oe=it.DELETE_KEY;if(this._isTextElement){var ve=q.notice&&L;if(ve){var pe=this._getTemplate("notice",q.notice);this.dropdown.element.innerHTML=pe.outerHTML,this.showDropdown(!0)}else this.hideDropdown(!0)}else{var Me=(M===te||M===oe)&&!E.value,Ie=!this._isTextElement&&this._isSearching,xe=this._canSearch&&q.response;Me&&Ie?(this._isSearching=!1,this._store.dispatch(ze(!0))):xe&&this._handleSearch(this.input.value)}this._canSearch=this.config.searchEnabled},y._onAKey=function(m){var E=m.hasItems,M=m.hasCtrlDownKeyPressed;if(M&&E){this._canSearch=!1;var L=this.config.removeItems&&!this.input.value&&this.input.element===document.activeElement;L&&this.highlightAll()}},y._onEnterKey=function(m){var E=m.event,M=m.target,L=m.activeItems,R=m.hasActiveDropdown,q=it.ENTER_KEY,te=M.hasAttribute("data-button");if(this._isTextElement&&M.value){var oe=this.input.value,ve=this._canAddItem(L,oe);ve.response&&(this.hideDropdown(!0),this._addItem({value:oe}),this._triggerChange(oe),this.clearInput())}if(te&&(this._handleButtonAction(L,M),E.preventDefault()),R){var pe=this.dropdown.getChild("."+this.config.classNames.highlightedState);pe&&(L[0]&&(L[0].keyCode=q),this._handleChoiceAction(L,pe)),E.preventDefault()}else this._isSelectOneElement&&(this.showDropdown(),E.preventDefault())},y._onEscapeKey=function(m){var E=m.hasActiveDropdown;E&&(this.hideDropdown(!0),this.containerOuter.focus())},y._onDirectionKey=function(m){var E=m.event,M=m.hasActiveDropdown,L=m.keyCode,R=m.metaKey,q=it.DOWN_KEY,te=it.PAGE_UP_KEY,oe=it.PAGE_DOWN_KEY;if(M||this._isSelectOneElement){this.showDropdown(),this._canSearch=!1;var ve=L===q||L===oe?1:-1,pe=R||L===oe||L===te,Me="[data-choice-selectable]",Ie;if(pe)ve>0?Ie=this.dropdown.element.querySelector(Me+":last-of-type"):Ie=this.dropdown.element.querySelector(Me);else{var xe=this.dropdown.element.querySelector("."+this.config.classNames.highlightedState);xe?Ie=$e(xe,Me,ve):Ie=this.dropdown.element.querySelector(Me)}Ie&&(B(Ie,this.choiceList.element,ve)||this.choiceList.scrollToChildElement(Ie,ve),this._highlightChoice(Ie)),E.preventDefault()}},y._onDeleteKey=function(m){var E=m.event,M=m.target,L=m.hasFocusedInput,R=m.activeItems;L&&!M.value&&!this._isSelectOneElement&&(this._handleBackspace(R),E.preventDefault())},y._onTouchMove=function(){this._wasTap&&(this._wasTap=!1)},y._onTouchEnd=function(m){var E=m||m.touches[0],M=E.target,L=this._wasTap&&this.containerOuter.element.contains(M);if(L){var R=M===this.containerOuter.element||M===this.containerInner.element;R&&(this._isTextElement?this.input.focus():this._isSelectMultipleElement&&this.showDropdown()),m.stopPropagation()}this._wasTap=!0},y._onMouseDown=function(m){var E=m.target;if(E instanceof HTMLElement){if(Vr&&this.choiceList.element.contains(E)){var M=this.choiceList.element.firstElementChild,L=this._direction==="ltr"?m.offsetX>=M.offsetWidth:m.offsetX0;L&&this.unhighlightAll(),this.containerOuter.removeFocusState(),this.hideDropdown(!0)}},y._onFocus=function(m){var E=this,M,L=m.target,R=this.containerOuter.element.contains(L);if(!!R){var q=(M={},M[V]=function(){L===E.input.element&&E.containerOuter.addFocusState()},M[re]=function(){E.containerOuter.addFocusState(),L===E.input.element&&E.showDropdown(!0)},M[ye]=function(){L===E.input.element&&(E.showDropdown(!0),E.containerOuter.addFocusState())},M);q[this.passedElement.element.type]()}},y._onBlur=function(m){var E=this,M=m.target,L=this.containerOuter.element.contains(M);if(L&&!this._isScrollingOnIe){var R,q=this._store.activeItems,te=q.some(function(ve){return ve.highlighted}),oe=(R={},R[V]=function(){M===E.input.element&&(E.containerOuter.removeFocusState(),te&&E.unhighlightAll(),E.hideDropdown(!0))},R[re]=function(){E.containerOuter.removeFocusState(),(M===E.input.element||M===E.containerOuter.element&&!E._canSearch)&&E.hideDropdown(!0)},R[ye]=function(){M===E.input.element&&(E.containerOuter.removeFocusState(),E.hideDropdown(!0),te&&E.unhighlightAll())},R);oe[this.passedElement.element.type]()}else this._isScrollingOnIe=!1,this.input.element.focus()},y._onFormReset=function(){this._store.dispatch(Cn(this._initialState))},y._highlightChoice=function(m){var E=this;m===void 0&&(m=null);var M=Array.from(this.dropdown.element.querySelectorAll("[data-choice-selectable]"));if(!!M.length){var L=m,R=Array.from(this.dropdown.element.querySelectorAll("."+this.config.classNames.highlightedState));R.forEach(function(q){q.classList.remove(E.config.classNames.highlightedState),q.setAttribute("aria-selected","false")}),L?this._highlightPosition=M.indexOf(L):(M.length>this._highlightPosition?L=M[this._highlightPosition]:L=M[M.length-1],L||(L=M[0])),L.classList.add(this.config.classNames.highlightedState),L.setAttribute("aria-selected","true"),this.passedElement.triggerEvent(yt.highlightChoice,{el:L}),this.dropdown.isActive&&(this.input.setActiveDescendant(L.id),this.containerOuter.setActiveDescendant(L.id))}},y._addItem=function(m){var E=m.value,M=m.label,L=M===void 0?null:M,R=m.choiceId,q=R===void 0?-1:R,te=m.groupId,oe=te===void 0?-1:te,ve=m.customProperties,pe=ve===void 0?null:ve,Me=m.placeholder,Ie=Me===void 0?!1:Me,xe=m.keyCode,Oe=xe===void 0?null:xe,Ce=typeof E=="string"?E.trim():E,Le=Oe,be=pe,Je=this._store.items,ht=L||Ce,wn=q||-1,zn=oe>=0?this._store.getGroupById(oe):null,In=Je?Je.length+1:1;return this.config.prependValue&&(Ce=this.config.prependValue+Ce.toString()),this.config.appendValue&&(Ce+=this.config.appendValue.toString()),this._store.dispatch(lt({value:Ce,label:ht,id:In,choiceId:wn,groupId:oe,customProperties:pe,placeholder:Ie,keyCode:Le})),this._isSelectOneElement&&this.removeActiveItems(In),this.passedElement.triggerEvent(yt.addItem,{id:In,value:Ce,label:ht,customProperties:be,groupValue:zn&&zn.value?zn.value:void 0,keyCode:Le}),this},y._removeItem=function(m){if(!m||!A("Object",m))return this;var E=m.id,M=m.value,L=m.label,R=m.choiceId,q=m.groupId,te=q>=0?this._store.getGroupById(q):null;return this._store.dispatch(Un(E,R)),te&&te.value?this.passedElement.triggerEvent(yt.removeItem,{id:E,value:M,label:L,groupValue:te.value}):this.passedElement.triggerEvent(yt.removeItem,{id:E,value:M,label:L}),this},y._addChoice=function(m){var E=m.value,M=m.label,L=M===void 0?null:M,R=m.isSelected,q=R===void 0?!1:R,te=m.isDisabled,oe=te===void 0?!1:te,ve=m.groupId,pe=ve===void 0?-1:ve,Me=m.customProperties,Ie=Me===void 0?null:Me,xe=m.placeholder,Oe=xe===void 0?!1:xe,Ce=m.keyCode,Le=Ce===void 0?null:Ce;if(!(typeof E=="undefined"||E===null)){var be=this._store.choices,Je=L||E,ht=be?be.length+1:1,wn=this._baseId+"-"+this._idNames.itemChoice+"-"+ht;this._store.dispatch(_e({id:ht,groupId:pe,elementId:wn,value:E,label:Je,disabled:oe,customProperties:Ie,placeholder:Oe,keyCode:Le})),q&&this._addItem({value:E,label:Je,choiceId:ht,customProperties:Ie,placeholder:Oe,keyCode:Le})}},y._addGroup=function(m){var E=this,M=m.group,L=m.id,R=m.valueKey,q=R===void 0?"value":R,te=m.labelKey,oe=te===void 0?"label":te,ve=A("Object",M)?M.choices:Array.from(M.getElementsByTagName("OPTION")),pe=L||Math.floor(new Date().valueOf()*Math.random()),Me=M.disabled?M.disabled:!1;if(ve){this._store.dispatch(bn({value:M.label,id:pe,active:!0,disabled:Me}));var Ie=function(Oe){var Ce=Oe.disabled||Oe.parentNode&&Oe.parentNode.disabled;E._addChoice({value:Oe[q],label:A("Object",Oe)?Oe[oe]:Oe.innerHTML,isSelected:Oe.selected,isDisabled:Ce,groupId:pe,customProperties:Oe.customProperties,placeholder:Oe.placeholder})};ve.forEach(Ie)}else this._store.dispatch(bn({value:M.label,id:M.id,active:!1,disabled:M.disabled}))},y._getTemplate=function(m){var E;if(!m)return null;for(var M=this.config.classNames,L=arguments.length,R=new Array(L>1?L-1:0),q=1;q{(function(t,n){typeof Bs=="object"&&typeof xv!="undefined"?n(Bs):typeof define=="function"&&define.amd?define(["exports"],n):(t=typeof globalThis!="undefined"?globalThis:t||self,n(t.immutableJSONPatch={}))})(Bs,function(t){"use strict";function n(B){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?n=function(U){return typeof U}:n=function(U){return U&&typeof Symbol=="function"&&U.constructor===Symbol&&U!==Symbol.prototype?"symbol":typeof U},n(B)}function e(B,z){return JSON.stringify(B)===JSON.stringify(z)}function r(B,z){return B===z}function i(B){return B.slice(0,B.length-1)}function a(B){return B[B.length-1]}function o(B,z){var U=arguments.length>2&&arguments[2]!==void 0?arguments[2]:r;if(B.length3&&arguments[3]!==void 0?arguments[3]:!1;if(z.length===0)return U;var we=z[0],Ee=g(B?B[we]:void 0,z.slice(1),U,G);if(!s(B))if(G){var Pe=typeof we=="number"?[]:{};return Pe[we]=Ee,Pe}else throw new Error("Path does not exist");return h(B,we,Ee)}function w(B,z,U){if(z.length===0)return U(B);if(!s(B))throw new Error("Path doesn't exist");var G=z[0],we=w(B[G],z.slice(1),U);return h(B,G,we)}function S(B,z){if(z.length===0)return B;if(!s(B))throw new Error("Path does not exist");if(z.length===1){var U=z[0];if(U in B){var G=f(B);return Array.isArray(G)?G.splice(U,1):delete G[U],G}else return B}var we=z[0],Ee=S(B[we],z.slice(1));return h(B,we,Ee)}function _(B,z,U){var G=z.slice(0,z.length-1),we=z[z.length-1];return w(B,G,function(Ee){if(!Array.isArray(Ee))throw new TypeError("Array expected at path "+JSON.stringify(G));var Pe=f(Ee);return Pe.splice(we,0,U),Pe})}function k(B,z){return B===void 0?!1:z.length===0?!0:k(B[z[0]],z.slice(1))}function P(B){var z=B.split("/");return z.shift(),z.map(function(U){return U.replace(/~1/g,"/").replace(/~0/g,"~")})}function I(B){return B.map(function(z){return"/"+String(z).replace(/~/g,"~0").replace(/\//g,"~1")}).join("")}function D(B,z,U){for(var G=B,we=0;we{(function(){var t;typeof Ou!="undefined"?t=Ou.exports=r:t=function(){return this||(0,eval)("this")}(),t.format=r,t.vsprintf=e,typeof console!="undefined"&&typeof console.log=="function"&&(t.printf=n);function n(){console.log(r.apply(null,arguments))}function e(i,a){return r.apply(null,[i].concat(a))}function r(i){for(var a=1,o=[].slice.call(arguments),s=0,u=i.length,l="",c,d=!1,f,h,p=!1,g,w=function(){return o[a++]},S=function(){for(var _="";/\d/.test(i[s]);)_+=i[s++],c=i[s];return _.length>0?parseInt(_):null};sUu});function Fa(t,n){let e=Object.keys(n).map(r=>zy(t,r,n[r]));return e.length===1?e[0]:function(){e.forEach(r=>r())}}function zy(t,n,e){let r=t[n],i=t.hasOwnProperty(n),a=e(r);return r&&Object.setPrototypeOf(a,r),Object.setPrototypeOf(o,a),t[n]=o,s;function o(...u){return a===r&&t[n]===o&&s(),a.apply(this,u)}function s(){t[n]===o&&(i?t[n]=r:delete t[n]),a!==r&&(a=r,Object.setPrototypeOf(o,r||Function))}}var vn=ge(require("obsidian"));var Fi,me,Vu,Vy,Ri,qu,Wu,Yu,Ra={},Ju=[],qy=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Vn(t,n){for(var e in n)t[e]=n[e];return t}function Gu(t){var n=t.parentNode;n&&n.removeChild(t)}function En(t,n,e){var r,i,a,o={};for(a in n)a=="key"?r=n[a]:a=="ref"?i=n[a]:o[a]=n[a];if(arguments.length>2&&(o.children=arguments.length>3?Fi.call(arguments,2):e),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)o[a]===void 0&&(o[a]=t.defaultProps[a]);return Hi(t,o,r,i,null)}function Hi(t,n,e,r,i){var a={type:t,props:n,key:e,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:i==null?++Vu:i};return i==null&&me.vnode!=null&&me.vnode(a),a}function il(){return{current:null}}function An(t){return t.children}function hn(t,n){this.props=t,this.context=n}function Jr(t,n){if(n==null)return t.__?Jr(t.__,t.__.__k.indexOf(t)+1):null;for(var e;n0?Hi(h.type,h.props,h.key,null,h.__v):h)!=null){if(h.__=e,h.__b=e.__b+1,(f=S[c])===null||f&&h.key==f.key&&h.type===f.type)S[c]=void 0;else for(d=0;d<_;d++){if((f=S[d])&&h.key==f.key&&h.type===f.type){S[d]=void 0;break}f=null}ol(t,h,f=f||Ra,i,a,o,s,u,l),p=h.__e,(d=h.ref)&&f.ref!=d&&(w||(w=[]),f.ref&&w.push(f.ref,null,h),w.push(d,h.__c||p,h)),p!=null?(g==null&&(g=p),typeof h.type=="function"&&h.__k===f.__k?h.__d=u=Zu(h,u,t):u=ed(t,h,f,S,p,u),typeof e.type=="function"&&(e.__d=u)):u&&f.__e==u&&u.parentNode!=t&&(u=Jr(f))}for(e.__e=g,c=_;c--;)S[c]!=null&&(typeof e.type=="function"&&S[c].__e!=null&&S[c].__e==e.__d&&(e.__d=Jr(r,c+1)),od(S[c],S[c]));if(w)for(c=0;c2&&(o.children=arguments.length>3?Fi.call(arguments,2):e),Hi(t.type,o,r||t.key,i||t.ref,null)}function ll(t,n){var e={__c:n="__cC"+Yu++,__:t,Consumer:function(r,i){return r.children(i)},Provider:function(r){var i,a;return this.getChildContext||(i=[],(a={})[n]=this,this.getChildContext=function(){return a},this.shouldComponentUpdate=function(o){this.props.value!==o.value&&i.some(al)},this.sub=function(o){i.push(o);var s=o.componentWillUnmount;o.componentWillUnmount=function(){i.splice(i.indexOf(o),1),s&&s.call(o)}}),r.children}};return e.Provider.__=e.Consumer.contextType=e}Fi=Ju.slice,me={__e:function(t,n){for(var e,r,i;n=n.__;)if((e=n.__c)&&!e.__)try{if((r=e.constructor)&&r.getDerivedStateFromError!=null&&(e.setState(r.getDerivedStateFromError(t)),i=e.__d),e.componentDidCatch!=null&&(e.componentDidCatch(t),i=e.__d),i)return e.__E=e}catch(a){t=a}throw t}},Vu=0,Vy=function(t){return t!=null&&t.constructor===void 0},hn.prototype.setState=function(t,n){var e;e=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Vn({},this.state),typeof t=="function"&&(t=t(Vn({},e),this.props)),t&&Vn(e,t),t!=null&&this.__v&&(n&&this.__h.push(n),al(this))},hn.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),al(this))},hn.prototype.render=An,Ri=[],qu=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ha.__r=0,Yu=0;var Qr,Kt,ld,Xr=0,cl=[],cd=me.__b,ud=me.__r,dd=me.diffed,fd=me.__c,hd=me.unmount;function Bi(t,n){me.__h&&me.__h(Kt,t,Xr||n),Xr=0;var e=Kt.__H||(Kt.__H={__:[],__h:[]});return t>=e.__.length&&e.__.push({}),e.__[t]}function Ka(t){return Xr=1,ul(yd,t)}function ul(t,n,e){var r=Bi(Qr++,2);return r.t=t,r.__c||(r.__=[e?e(n):yd(void 0,n),function(i){var a=r.t(r.__[0],i);r.__[0]!==a&&(r.__=[a,r.__[1]],r.__c.setState({}))}],r.__c=Kt),r.__}function $a(t,n){var e=Bi(Qr++,3);!me.__s&&hl(e.__H,n)&&(e.__=t,e.__H=n,Kt.__H.__h.push(e))}function dl(t,n){var e=Bi(Qr++,4);!me.__s&&hl(e.__H,n)&&(e.__=t,e.__H=n,Kt.__h.push(e))}function Ua(t){return Xr=5,ja(function(){return{current:t}},[])}function pd(t,n,e){Xr=6,dl(function(){typeof t=="function"?t(n()):t&&(t.current=n())},e==null?e:e.concat(t))}function ja(t,n){var e=Bi(Qr++,7);return hl(e.__H,n)&&(e.__=t(),e.__H=n,e.__h=t),e.__}function za(t,n){return Xr=8,ja(function(){return t},n)}function md(t){var n=Kt.context[t.__c],e=Bi(Qr++,9);return e.c=t,n?(e.__==null&&(e.__=!0,n.sub(Kt)),n.props.value):t.__}function gd(t,n){me.useDebugValue&&me.useDebugValue(n?n(t):t)}function Gy(){var t;for(cl.sort(function(n,e){return n.__v.__b-e.__v.__b});t=cl.pop();)if(t.__P)try{t.__H.__h.forEach(Va),t.__H.__h.forEach(fl),t.__H.__h=[]}catch(n){t.__H.__h=[],me.__e(n,t.__v)}}me.__b=function(t){Kt=null,cd&&cd(t)},me.__r=function(t){ud&&ud(t),Qr=0;var n=(Kt=t.__c).__H;n&&(n.__h.forEach(Va),n.__h.forEach(fl),n.__h=[])},me.diffed=function(t){dd&&dd(t);var n=t.__c;n&&n.__H&&n.__H.__h.length&&(cl.push(n)!==1&&ld===me.requestAnimationFrame||((ld=me.requestAnimationFrame)||function(e){var r,i=function(){clearTimeout(a),vd&&cancelAnimationFrame(r),setTimeout(e)},a=setTimeout(i,100);vd&&(r=requestAnimationFrame(i))})(Gy)),Kt=null},me.__c=function(t,n){n.some(function(e){try{e.__h.forEach(Va),e.__h=e.__h.filter(function(r){return!r.__||fl(r)})}catch(r){n.some(function(i){i.__h&&(i.__h=[])}),n=[],me.__e(r,e.__v)}}),fd&&fd(t,n)},me.unmount=function(t){hd&&hd(t);var n,e=t.__c;e&&e.__H&&(e.__H.__.forEach(function(r){try{Va(r)}catch(i){n=i}}),n&&me.__e(n,e.__v))};var vd=typeof requestAnimationFrame=="function";function Va(t){var n=Kt,e=t.__c;typeof e=="function"&&(t.__c=void 0,e()),Kt=n}function fl(t){var n=Kt;t.__c=t.__(),Kt=n}function hl(t,n){return!t||t.length!==n.length||n.some(function(e,r){return e!==t[r]})}function yd(t,n){return typeof n=="function"?n(t):n}function bd(t,n){for(var e in n)t[e]=n[e];return t}function pl(t,n){for(var e in t)if(e!=="__source"&&!(e in n))return!0;for(var r in n)if(r!=="__source"&&t[r]!==n[r])return!0;return!1}function ml(t){this.props=t}function Qy(t,n){function e(i){var a=this.props.ref,o=a==i.ref;return!o&&a&&(a.call?a(null):a.current=null),n?!n(this.props,i)||!o:pl(this.props,i)}function r(i){return this.shouldComponentUpdate=e,En(t,i)}return r.displayName="Memo("+(t.displayName||t.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(ml.prototype=new hn).isPureReactComponent=!0,ml.prototype.shouldComponentUpdate=function(t,n){return pl(this.props,t)||pl(this.state,n)};var wd=me.__b;me.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),wd&&wd(t)};var Xy=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Zy(t){function n(e,r){var i=bd({},e);return delete i.ref,t(i,(r=e.ref||r)&&(typeof r!="object"||"current"in r)?r:null)}return n.$$typeof=Xy,n.render=n,n.prototype.isReactComponent=n.__f=!0,n.displayName="ForwardRef("+(t.displayName||t.name)+")",n}var Ed=function(t,n){return t==null?null:Ln(Ln(t).map(n))},eb={map:Ed,forEach:Ed,count:function(t){return t?Ln(t).length:0},only:function(t){var n=Ln(t);if(n.length!==1)throw"Children.only";return n[0]},toArray:Ln},tb=me.__e;me.__e=function(t,n,e){if(t.then){for(var r,i=n;i=i.__;)if((r=i.__c)&&r.__c)return n.__e==null&&(n.__e=e.__e,n.__k=e.__k),r.__c(t,n)}tb(t,n,e)};var Sd=me.unmount;function qa(){this.__u=0,this.t=null,this.__b=null}function xd(t){var n=t.__.__c;return n&&n.__e&&n.__e(t)}function nb(t){var n,e,r;function i(a){if(n||(n=t()).then(function(o){e=o.default||o},function(o){r=o}),r)throw r;if(!e)throw n;return En(e,a)}return i.displayName="Lazy",i.__f=!0,i}function Ki(){this.u=null,this.o=null}me.unmount=function(t){var n=t.__c;n&&n.__R&&n.__R(),n&&t.__h===!0&&(t.type=null),Sd&&Sd(t)},(qa.prototype=new hn).__c=function(t,n){var e=n.__c,r=this;r.t==null&&(r.t=[]),r.t.push(e);var i=xd(r.__v),a=!1,o=function(){a||(a=!0,e.__R=null,i?i(s):s())};e.__R=o;var s=function(){if(!--r.__u){if(r.state.__e){var l=r.state.__e;r.__v.__k[0]=function d(f,h,p){return f&&(f.__v=null,f.__k=f.__k&&f.__k.map(function(g){return d(g,h,p)}),f.__c&&f.__c.__P===h&&(f.__e&&p.insertBefore(f.__e,f.__d),f.__c.__e=!0,f.__c.__P=p)),f}(l,l.__c.__P,l.__c.__O)}var c;for(r.setState({__e:r.__b=null});c=r.t.pop();)c.forceUpdate()}},u=n.__h===!0;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),t.then(o,o)},qa.prototype.componentWillUnmount=function(){this.t=[]},qa.prototype.render=function(t,n){if(this.__b){if(this.__v.__k){var e=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function a(o,s,u){return o&&(o.__c&&o.__c.__H&&(o.__c.__H.__.forEach(function(l){typeof l.__c=="function"&&l.__c()}),o.__c.__H=null),(o=bd({},o)).__c!=null&&(o.__c.__P===u&&(o.__c.__P=s),o.__c=null),o.__k=o.__k&&o.__k.map(function(l){return a(l,s,u)})),o}(this.__b,e,r.__O=r.__P)}this.__b=null}var i=n.__e&&En(An,null,t.fallback);return i&&(i.__h=null),[En(An,null,n.__e?null:t.children),i]};var kd=function(t,n,e){if(++e[1]===e[0]&&t.o.delete(n),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.o.size))for(e=t.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),n.i.removeChild(r)}}),Gr(En(rb,{context:n.context},t.__v),n.l)):n.l&&n.componentWillUnmount()}function gl(t,n){return En(ib,{__v:t,i:n})}(Ki.prototype=new hn).__e=function(t){var n=this,e=xd(n.__v),r=n.o.get(t);return r[0]++,function(i){var a=function(){n.props.revealOrder?(r.push(i),kd(n,t,r)):i()};e?e(a):a()}},Ki.prototype.render=function(t){this.u=null,this.o=new Map;var n=Ln(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&n.reverse();for(var e=n.length;e--;)this.o.set(n[e],this.u=[1,0,this.u]);return t.children},Ki.prototype.componentDidUpdate=Ki.prototype.componentDidMount=function(){var t=this;this.o.forEach(function(n,e){kd(t,e,n)})};var _d=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.element")||60103,ab=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,ob=typeof document!="undefined",sb=function(t){return(typeof Symbol!="undefined"&&typeof Symbol()=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(t)};function lb(t,n,e){return n.__k==null&&(n.textContent=""),Gr(t,n),typeof e=="function"&&e(),t?t.__c:null}function cb(t,n,e){return sl(t,n),typeof e=="function"&&e(),t?t.__c:null}hn.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(hn.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var Td=me.event;function ub(){}function db(){return this.cancelBubble}function fb(){return this.defaultPrevented}me.event=function(t){return Td&&(t=Td(t)),t.persist=ub,t.isPropagationStopped=db,t.isDefaultPrevented=fb,t.nativeEvent=t};var Md,Dd={configurable:!0,get:function(){return this.class}},Cd=me.vnode;me.vnode=function(t){var n=t.type,e=t.props,r=e;if(typeof n=="string"){var i=n.indexOf("-")===-1;for(var a in r={},e){var o=e[a];ob&&a==="children"&&n==="noscript"||a==="value"&&"defaultValue"in e&&o==null||(a==="defaultValue"&&"value"in e&&e.value==null?a="value":a==="download"&&o===!0?o="":/ondoubleclick/i.test(a)?a="ondblclick":/^onchange(textarea|input)/i.test(a+n)&&!sb(e.type)?a="oninput":/^onfocus$/i.test(a)?a="onfocusin":/^onblur$/i.test(a)?a="onfocusout":/^on(Ani|Tra|Tou|BeforeInp)/.test(a)?a=a.toLowerCase():i&&ab.test(a)?a=a.replace(/[A-Z0-9]/,"-$&").toLowerCase():o===null&&(o=void 0),r[a]=o)}n=="select"&&r.multiple&&Array.isArray(r.value)&&(r.value=Ln(e.children).forEach(function(s){s.props.selected=r.value.indexOf(s.props.value)!=-1})),n=="select"&&r.defaultValue!=null&&(r.value=Ln(e.children).forEach(function(s){s.props.selected=r.multiple?r.defaultValue.indexOf(s.props.value)!=-1:r.defaultValue==s.props.value})),t.props=r,e.class!=e.className&&(Dd.enumerable="className"in e,e.className!=null&&(r.class=e.className),Object.defineProperty(r,"className",Dd))}t.$$typeof=_d,Cd&&Cd(t)};var Id=me.__r;me.__r=function(t){Id&&Id(t),Md=t.__c};var hb={ReactCurrentDispatcher:{current:{readContext:function(t){return Md.__n[t.__c].props.value}}}};function pb(t){return En.bind(null,t)}function Ad(t){return!!t&&t.$$typeof===_d}function mb(t){return Ad(t)?sd.apply(null,arguments):t}function gb(t){return!!t.__k&&(Gr(null,t),!0)}function vb(t){return t&&(t.base||t.nodeType===1&&t)||null}var yb=function(t,n){return t(n)},bb=function(t,n){return t(n)};var v={useState:Ka,useReducer:ul,useEffect:$a,useLayoutEffect:dl,useRef:Ua,useImperativeHandle:pd,useMemo:ja,useCallback:za,useContext:md,useDebugValue:gd,version:"17.0.2",Children:eb,render:lb,hydrate:cb,unmountComponentAtNode:gb,createPortal:gl,createElement:En,createContext:ll,createFactory:pb,cloneElement:mb,createRef:il,Fragment:An,isValidElement:Ad,findDOMNode:vb,Component:hn,PureComponent:ml,memo:Qy,forwardRef:Zy,flushSync:bb,unstable_batchedUpdates:yb,StrictMode:An,Suspense:qa,SuspenseList:Ki,lazy:nb,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:hb};var Xg=ge(Ot());var qe=v.createContext(null),Ya=v.createContext(null);var Jd=ge(Ot()),Ja=ge(require("obsidian"));var jd=ge(Kd()),or=ge(Ot());function $d(t){return Object.prototype.toString.call(t)==="[object Object]"}function Ud(t){var n,e;return $d(t)===!1?!1:(n=t.constructor,n===void 0?!0:(e=n.prototype,!($d(e)===!1||e.hasOwnProperty("isPrototypeOf")===!1)))}function $b(t,n){return t.length!==n.length?!1:t.every((e,r,i)=>r===i.length-1?e!==n[r]:e===n[r])}function Ub(t,n){return t.length===n.length&&t.every((e,r)=>e===n[r])}var en;(function(i){i[i.Before=0]="Before",i[i.After=1]="After",i[i.Self=2]="Self",i[i.NotSiblings=3]="NotSiblings"})(en||(en={}));function ji(t,n){if(Ub(t,n))return 2;if(!$b(t,n))return 3;let e=t.length-1;return t[e]=0;r--)e={children:{[t[r]]:e}};return e}function zi(t,n){let e=n;for(let r=t.length-2;r>=0;r--)e={children:{[t[r]]:e}};return e}function zd(t){return zi(t,{children:{$splice:[[t[t.length-1],1]]}})}function Vd(t,n,e=0){return zi(t,{children:{$splice:[[t[t.length-1]+e,0,...n]]}})}function zb(t,n){return zi(t,{children:{$push:n}})}function Vb(t,n){return zi(t,{children:{$unshift:n}})}function qd(t,n,e,r){let i=r?r(vt(t,n)):vt(t,n),o=ji(n,e)===en.After?-1:0,s=zd(n),u=Vd(e,[i],o),l=(0,jd.default)(s,u,{isMergeableObject:d=>Ud(d)||Array.isArray(d)});return(0,or.default)(t,l)}function kr(t,n){return(0,or.default)(t,zd(n))}function sr(t,n,e){return(0,or.default)(t,Vd(n,e))}function wl(t,n,e){return(0,or.default)(t,zb(n,e))}function Wd(t,n,e){return(0,or.default)(t,Vb(n,e))}function Yd(t,n,e){return(0,or.default)(t,jb(n,e))}function El(t,n,e){return(0,or.default)(t,zi(n,e))}var Sl="kanban-plugin";function ei(){}function $(t){return`${Sl}__${t}`}function We(){return Math.random().toString(36).substr(2,9)}function xl(t,n,e,r,i){var l,c;let a=vt(t,n.slice(0,-1)),o=vt(e,r.slice(0,-1)),s=(l=a==null?void 0:a.data)==null?void 0:l.shouldMarkItemsComplete,u=(c=o==null?void 0:o.data)==null?void 0:c.shouldMarkItemsComplete;return!s&&!u||u===!!i.data.isComplete?i:(0,Jd.default)(i,{data:{isComplete:{$set:u}}})}function Ga(){let t=v.useRef(!1);return{oncompositionstart:()=>{t.current=!0},oncompositionend:()=>{t.current=!1},getShouldIMEBlockAction:()=>t.current}}var qb=/<%/;async function Gd(t,n){let e=n?t.app.vault.getAbstractFileByPath(n):null;if(e&&e instanceof Ja.TFile){let r=t.app.workspace.activeLeaf.view;try{r instanceof Ja.MarkdownView&&r.getMode()!=="source"&&await r.setState({...r.getState(),mode:"source"},{});let{templatesEnabled:i,templaterEnabled:a,templatesPlugin:o,templaterPlugin:s}=kl(t.app),u=await t.app.vault.read(e);if(i&&a)return qb.test(u)?await s.append_template_to_active_file(e):await o.instance.insertTemplate(e);if(i)return await o.instance.insertTemplate(e);if(a)return await s.append_template_to_active_file(e);await t.app.vault.modify(t.app.workspace.getActiveFile(),u)}catch(i){console.error(i),t.setError(i)}}}function ti(t){var s,u,l,c,d;let n=t.internalPlugins.plugins,e=(s=n["daily-notes"])==null?void 0:s.enabled,r=(u=n["daily-notes"])==null?void 0:u.instance.options.format,i=(l=t.plugins.plugins["nldates-obsidian"])==null?void 0:l.settings.format,a=(c=n.templates)==null?void 0:c.enabled,o=(d=n.templates)==null?void 0:d.instance.options.dateFormat;return e&&r||i||a&&o||"YYYY-MM-DD"}function Vi(t){var a,o,s;let n=t.internalPlugins.plugins,e=(a=t.plugins.plugins["nldates-obsidian"])==null?void 0:a.settings.timeFormat,r=(o=n.templates)==null?void 0:o.enabled,i=(s=n.templates)==null?void 0:s.instance.options.timeFormat;return e||r&&i||"HH:mm"}var Qd=/[\\^$.*+?()[\]{}|]/g,Wb=RegExp(Qd.source);function On(t){return t&&Wb.test(t)?t.replace(Qd,"\\$&"):t||""}function kl(t){var s;let n=t.internalPlugins.plugins.templates,e=n.enabled,r=t.plugins.plugins["templater-obsidian"],i=t.plugins.enabledPlugins.has("templater-obsidian"),a=r&&((s=this.app.plugins.plugins["templater-obsidian"].settings)==null?void 0:s.empty_file_template),o=e?n.instance.options.folder:r?r.settings.template_folder:void 0;return{templatesPlugin:n,templatesEnabled:e,templaterPlugin:r==null?void 0:r.templater,templaterEnabled:i,templaterEmptyFileTemplate:a,templateFolder:o}}function bt(t){if(typeof t=="string"||typeof t=="number")return""+t;let n="";if(Array.isArray(t))for(let e=0,r;e{r.has(n)&&(r.delete(n),r.size===0&&e.push(i))}),e.forEach(r=>{this.idScopes.delete(r),this.scrollStates.delete(r)})}};var wt=v.createContext(null),lr=v.createContext(""),Wi=v.createContext(null),Yi=v.createContext(new qi),Qa=v.createContext(null),Xa=v.createContext(null);var Xd={bottom:0,height:0,left:0,right:0,top:0,width:0,x:0,y:0,toJSON(){}},Zd=[0,0,0,0];function Xe(t){return t===void 0?0:t}function Za(t,n,e,r){return[t.left+Xe(n==null?void 0:n.x)+Xe(e==null?void 0:e.x)-Xe(r==null?void 0:r.x),t.top+Xe(n==null?void 0:n.y)+Xe(e==null?void 0:e.y)-Xe(r==null?void 0:r.y),t.left+t.width+Xe(n==null?void 0:n.x)+Xe(e==null?void 0:e.x)-Xe(r==null?void 0:r.x),t.top+t.height+Xe(n==null?void 0:n.y)+Xe(e==null?void 0:e.y)-Xe(r==null?void 0:r.y)]}function _l(t,n,e,r){let i=Za(t,n,e,null);return r==="top"?(i[3]=i[1]+35,i):r==="right"?(i[0]=i[0]+t.width-35,i):r==="bottom"?(i[1]=i[1]+t.height-35,i):(i[2]=i[0]+35,i)}function eo(t,n,e,r,i,a){return[t-Xe(i==null?void 0:i.x)-Xe(a==null?void 0:a.x),n-Xe(i==null?void 0:i.y)-Xe(a==null?void 0:a.y),e-Xe(i==null?void 0:i.x)-Xe(a==null?void 0:a.x),r-Xe(i==null?void 0:i.y)-Xe(a==null?void 0:a.y)]}var Yb=t=>Jb(t,(n,e)=>n{if(o.entityId===e)return Infinity;let s=o.getHitbox(),u=tf(s)[0],l=Gb(n),c=o.getData().sortAxis==="horizontal"?"x":"y",d=l[c]>r[c]?1e3:0;return ni(u,r)+d}),a=Yb(i);return t[a]?t[a]:null}function Ml(t){let{scrollLeft:n,scrollTop:e,scrollWidth:r,scrollHeight:i,offsetWidth:a,offsetHeight:o}=t,s=n,u=e,l=r-a,c=i-o;return{x:s,y:u,maxX:Math.max(l,0),maxY:Math.max(c,0)}}function nf(t,n,e){let r=Math.trunc((e.x-n.x)*100)/100,i=Math.trunc((e.y-n.y)*100)/100;return[t[0]+r,t[1]+i,t[2]+r,t[3]+i]}function Dl(t,n=[0,0,0,0]){let e=t[0]-n[0],r=t[1]-n[1],i=t[2]+n[2],o=t[3]+n[3]-r;return{width:i-e,height:o}}var Cl=class{constructor(n,e,r,i,a,o,s,u,l,c){this.isVisible=!1;this.id=r,this.instanceId=We(),this.scopeId=e,this.entityId=`${e}-${r}`,this.dndManager=n,this.index=i,this.children=new Map,this.parent=a,this.scrollParent=o,this.getEntityData=c,this.sortManager=s,this.pollForNodes(u,l)}pollForNodes(n,e){!n()||!e()?requestAnimationFrame(()=>this.pollForNodes(n,e)):this.initNodes(n(),e())}initNodes(n,e){var r,i;if(this.entityNode=n,this.measureNode=e,e.dataset.hitboxid=this.entityId,(r=this.sortManager)==null||r.registerSortable(this.entityId,this.getEntity(Xd),n,e),this.scrollParent)this.scrollParent.registerObserverHandler(this.entityId,e,a=>{var o,s;if(a.isIntersecting){let u=this.getEntity(a.boundingClientRect);(o=this.parent)==null||o.children.set(this.entityId,{entity:u,manager:this}),this.dndManager.observeResize(e),(!this.parent||this.parent.isVisible)&&(this.dndManager.registerHitboxEntity(this.entityId,u),this.children.forEach((l,c)=>{this.dndManager.registerHitboxEntity(c,l.entity)}),this.setVisibility(!0))}else this.dndManager.unregisterHitboxEntity(this.entityId),this.children.forEach((u,l)=>{this.dndManager.unregisterHitboxEntity(l)}),(s=this.parent)==null||s.children.delete(this.entityId),this.dndManager.unobserveResize(e),this.setVisibility(!1)});else{let a=this.getEntity(e.getBoundingClientRect());this.dndManager.observeResize(e),this.dndManager.registerHitboxEntity(this.entityId,a),(i=this.parent)==null||i.children.set(this.entityId,{entity:a,manager:this}),this.setVisibility(!0)}}setVisibility(n){this.isVisible=n,this.children.forEach(e=>{e.manager.setVisibility(n)})}destroy(){var n,e,r;this.dndManager.unobserveResize(this.measureNode),(n=this.sortManager)==null||n.unregisterSortable(this.entityId),(e=this.scrollParent)==null||e.unregisterObserverHandler(this.entityId,this.measureNode),this.dndManager.unregisterHitboxEntity(this.entityId),(r=this.parent)==null||r.children.delete(this.entityId)}getPath(){var n;return[...((n=this.parent)==null?void 0:n.getPath())||[],this.index]}getEntity(n){var r,i;let e=this;return{scopeId:this.scopeId,entityId:this.entityId,initial:Za(n,((r=e.scrollParent)==null?void 0:r.scrollState)||tn,((i=e.scrollParent)==null?void 0:i.getScrollShift())||Nn,null),getParentScrollState(){var a;return((a=e.scrollParent)==null?void 0:a.scrollState)||tn},getParentScrollShift(){var a;return((a=e.scrollParent)==null?void 0:a.getScrollShift())||Nn},recalcInitial(){var a,o;this.initial=Za(e.measureNode.getBoundingClientRect(),((a=e.scrollParent)==null?void 0:a.scrollState)||tn,((o=e.scrollParent)==null?void 0:o.getScrollShift())||Nn,null)},getHitbox(){return eo(this.initial[0],this.initial[1],this.initial[2],this.initial[3],this.getParentScrollState(),this.getParentScrollShift())},getPath(){return e.getPath()},getData(){var a;return{...e.getEntityData(),sortAxis:(a=e.sortManager)==null?void 0:a.axis}}}}};var cr=v.memo(function({id:n,index:e,elementRef:r,measureRef:i,children:a,data:o}){let s=v.useContext(wt),u=v.useContext(Qa),l=v.useContext(lr),c=v.useContext(Xa),d=v.useContext(Wi),f=v.useRef(o),h=v.useRef();f.current=o;let p=v.useMemo(()=>{if(s){h.current&&h.current.destroy();let g=new Cl(s,l,n,e,c,d,u,()=>r.current,()=>i.current,()=>f.current);return h.current=g,g}return null},[n,e,s,l,c,d,u]);return v.useEffect(()=>()=>{var g;return(g=h.current)==null?void 0:g.destroy()},[]),p?v.createElement(Xa.Provider,{value:p},a):null});function qn(t){let n=v.useContext(Xa),e=(n==null?void 0:n.getPath())||[];return t!==void 0&&e.push(t),v.useMemo(()=>e,e)}var sc=ge(mh()),bp=ge(require("obsidian"));var hE=function(n){var e=[],r=null,i=function(){for(var o=arguments.length,s=new Array(o),u=0;u0?r:t.name,writable:!1,configurable:!1,enumerable:!0})}return e}function mE(t){var n=t.name,e=n&&n.lastIndexOf(".")!==-1;if(e&&!t.type){var r=n.split(".").pop().toLowerCase(),i=pE.get(r);i&&Object.defineProperty(t,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return t}var gE=[".DS_Store","Thumbs.db"];function Jl(t){return fi(this,void 0,void 0,function(){return hi(this,function(n){return[2,vE(t)&&t.dataTransfer?wE(t.dataTransfer,t.type):yE(t)]})})}function vE(t){return!!t.dataTransfer}function yE(t){var n=bE(t.target)?t.target.files?Gl(t.target.files):[]:[];return n.map(function(e){return ta(e)})}function bE(t){return t!==null}function wE(t,n){return fi(this,void 0,void 0,function(){var e,r;return hi(this,function(i){switch(i.label){case 0:return t.items?(e=Gl(t.items).filter(function(a){return a.kind==="file"}),n!=="drop"?[2,e]:[4,Promise.all(e.map(EE))]):[3,2];case 1:return r=i.sent(),[2,Bh(Kh(r))];case 2:return[2,Bh(Gl(t.files).map(function(a){return ta(a)}))]}})})}function Bh(t){return t.filter(function(n){return gE.indexOf(n.name)===-1})}function Gl(t){for(var n=[],e=0;etypeof console!="undefined"&&console.warn(t),getWeek:t=>{let n=new Date(t.getTime());n.setHours(0,0,0,0),n.setDate(n.getDate()+3-(n.getDay()+6)%7);var e=new Date(n.getFullYear(),0,4);return 1+Math.round(((n.getTime()-e.getTime())/864e5-3+(e.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:"default",minuteIncrement:5,mode:"single",monthSelectorType:"dropdown",nextArrow:"",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1};var Mo={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:t=>{let n=t%100;if(n>3&&n<21)return"th";switch(n%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},Do=Mo;var Nt=(t,n=2)=>`000${t}`.slice(n*-1),Yt=t=>t===!0?1:0;function Ql(t,n){let e;return function(){clearTimeout(e),e=setTimeout(()=>t.apply(this,arguments),n)}}var Co=t=>t instanceof Array?t:[t];function Ft(t,n,e){if(e===!0)return t.classList.add(n);t.classList.remove(n)}function Ve(t,n,e){let r=window.document.createElement(t);return n=n||"",e=e||"",r.className=n,e!==void 0&&(r.textContent=e),r}function na(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function Xl(t,n){if(n(t))return t;if(t.parentNode)return Xl(t.parentNode,n)}function ra(t,n){let e=Ve("div","numInputWrapper"),r=Ve("input","numInput "+t),i=Ve("span","arrowUp"),a=Ve("span","arrowDown");if(navigator.userAgent.indexOf("MSIE 9.0")===-1?r.type="number":(r.type="text",r.pattern="\\d*"),n!==void 0)for(let o in n)r.setAttribute(o,n[o]);return e.appendChild(r),e.appendChild(i),e.appendChild(a),e}function Jt(t){try{return typeof t.composedPath=="function"?t.composedPath()[0]:t.target}catch(n){return t.target}}var Zl=()=>{},ia=(t,n,e)=>e.months[n?"shorthand":"longhand"][t],jh={D:Zl,F:function(t,n,e){t.setMonth(e.months.longhand.indexOf(n))},G:(t,n)=>{t.setHours(parseFloat(n))},H:(t,n)=>{t.setHours(parseFloat(n))},J:(t,n)=>{t.setDate(parseFloat(n))},K:(t,n,e)=>{t.setHours(t.getHours()%12+12*Yt(new RegExp(e.amPM[1],"i").test(n)))},M:function(t,n,e){t.setMonth(e.months.shorthand.indexOf(n))},S:(t,n)=>{t.setSeconds(parseFloat(n))},U:(t,n)=>new Date(parseFloat(n)*1e3),W:function(t,n,e){let r=parseInt(n),i=new Date(t.getFullYear(),0,2+(r-1)*7,0,0,0,0);return i.setDate(i.getDate()-i.getDay()+e.firstDayOfWeek),i},Y:(t,n)=>{t.setFullYear(parseFloat(n))},Z:(t,n)=>new Date(n),d:(t,n)=>{t.setDate(parseFloat(n))},h:(t,n)=>{t.setHours(parseFloat(n))},i:(t,n)=>{t.setMinutes(parseFloat(n))},j:(t,n)=>{t.setDate(parseFloat(n))},l:Zl,m:(t,n)=>{t.setMonth(parseFloat(n)-1)},n:(t,n)=>{t.setMonth(parseFloat(n)-1)},s:(t,n)=>{t.setSeconds(parseFloat(n))},u:(t,n)=>new Date(parseFloat(n)),w:Zl,y:(t,n)=>{t.setFullYear(2e3+parseFloat(n))}},aa={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},pi={Z:t=>t.toISOString(),D:function(t,n,e){return n.weekdays.shorthand[pi.w(t,n,e)]},F:function(t,n,e){return ia(pi.n(t,n,e)-1,!1,n)},G:function(t,n,e){return Nt(pi.h(t,n,e))},H:t=>Nt(t.getHours()),J:function(t,n){return n.ordinal!==void 0?t.getDate()+n.ordinal(t.getDate()):t.getDate()},K:(t,n)=>n.amPM[Yt(t.getHours()>11)],M:function(t,n){return ia(t.getMonth(),!0,n)},S:t=>Nt(t.getSeconds()),U:t=>t.getTime()/1e3,W:function(t,n,e){return e.getWeek(t)},Y:t=>Nt(t.getFullYear(),4),d:t=>Nt(t.getDate()),h:t=>t.getHours()%12?t.getHours()%12:12,i:t=>Nt(t.getMinutes()),j:t=>t.getDate(),l:function(t,n){return n.weekdays.longhand[t.getDay()]},m:t=>Nt(t.getMonth()+1),n:t=>t.getMonth()+1,s:t=>t.getSeconds(),u:t=>t.getTime(),w:t=>t.getDay(),y:t=>String(t.getFullYear()).substring(2)};var ec=({config:t=hr,l10n:n=Mo,isMobile:e=!1})=>(r,i,a)=>{let o=a||n;return t.formatDate!==void 0&&!e?t.formatDate(r,i,o):i.split("").map((s,u,l)=>pi[s]&&l[u-1]!=="\\"?pi[s](r,o,t):s!=="\\"?s:"").join("")},Io=({config:t=hr,l10n:n=Mo})=>(e,r,i,a)=>{if(e!==0&&!e)return;let o=a||n,s,u=e;if(e instanceof Date)s=new Date(e.getTime());else if(typeof e!="string"&&e.toFixed!==void 0)s=new Date(e);else if(typeof e=="string"){let l=r||(t||hr).dateFormat,c=String(e).trim();if(c==="today")s=new Date,i=!0;else if(/Z$/.test(c)||/GMT$/.test(c))s=new Date(e);else if(t&&t.parseDate)s=t.parseDate(e,l);else{s=!t||!t.noCalendar?new Date(new Date().getFullYear(),0,1,0,0,0,0):new Date(new Date().setHours(0,0,0,0));let d,f=[];for(let h=0,p=0,g="";hs=k(s,P,o)||s)}s=d?s:void 0}}if(!(s instanceof Date&&!isNaN(s.getTime()))){t.errorHandler(new Error(`Invalid date provided: ${u}`));return}return i===!0&&s.setHours(0,0,0,0),s};function Gt(t,n,e=!0){return e!==!1?new Date(t.getTime()).setHours(0,0,0,0)-new Date(n.getTime()).setHours(0,0,0,0):t.getTime()-n.getTime()}var zh=(t,n,e)=>t>Math.min(n,e)&&tt[r]=e[r]);return t});var kE=300;function _E(t,n){let e={config:Object.assign(Object.assign({},hr),pt.defaultConfig),l10n:Do};e.parseDate=Io({config:e.config,l10n:e.l10n}),e._handlers=[],e.pluginElements=[],e.loadedPlugins=[],e._bind=p,e._setHoursFromDate=d,e._positionCalendar=Ct,e.changeMonth=Te,e.changeYear=z,e.clear=C,e.close=A,e._createElement=Ve,e.destroy=tt,e.isEnabled=U,e.jumpToDate=S,e.open=gt,e.redraw=Mn,e.set=yt,e.setDate=it,e.toggle=ft;function r(){e.utils={getDaysInMonth(x=e.currentMonth,T=e.currentYear){return x===1&&(T%4==0&&T%100!=0||T%400==0)?29:e.l10n.daysInMonth[x]}}}function i(){e.element=e.input=t,e.isOpen=!1,un(),Xt(),ye(),re(),r(),e.isMobile||P(),w(),(e.selectedDates.length||e.config.noCalendar)&&(e.config.enableTime&&d(e.config.noCalendar?e.latestSelectedDateObj:void 0),St(!1)),o();let x=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!e.isMobile&&x&&Ct(),Ke("onReady")}function a(x){return x.bind(e)}function o(){let x=e.config;x.weekNumbers===!1&&x.showMonths===1||x.noCalendar!==!0&&window.requestAnimationFrame(function(){if(e.calendarContainer!==void 0&&(e.calendarContainer.style.visibility="hidden",e.calendarContainer.style.display="block"),e.daysContainer!==void 0){let T=(e.days.offsetWidth+1)*x.showMonths;e.daysContainer.style.width=T+"px",e.calendarContainer.style.width=T+(e.weekWrapper!==void 0?e.weekWrapper.offsetWidth:0)+"px",e.calendarContainer.style.removeProperty("visibility"),e.calendarContainer.style.removeProperty("display")}})}function s(x){if(e.selectedDates.length===0){let H=e.config.minDate===void 0||Gt(new Date,e.config.minDate)>=0?new Date:new Date(e.config.minDate.getTime()),W=Ao(e.config);H.setHours(W.hours,W.minutes,W.seconds,H.getMilliseconds()),e.selectedDates=[H],e.latestSelectedDateObj=H}x!==void 0&&x.type!=="blur"&&jr(x);let T=e._input.value;c(),St(),e._input.value!==T&&e._debouncedChange()}function u(x,T){return x%12+12*Yt(T===e.l10n.amPM[1])}function l(x){switch(x%24){case 0:case 12:return 12;default:return x%12}}function c(){if(e.hourElement===void 0||e.minuteElement===void 0)return;let x=(parseInt(e.hourElement.value.slice(-2),10)||0)%24,T=(parseInt(e.minuteElement.value,10)||0)%60,H=e.secondElement!==void 0?(parseInt(e.secondElement.value,10)||0)%60:0;e.amPM!==void 0&&(x=u(x,e.amPM.textContent));let W=e.config.minTime!==void 0||e.config.minDate&&e.minDateHasTime&&e.latestSelectedDateObj&&Gt(e.latestSelectedDateObj,e.config.minDate,!0)===0;if(e.config.maxTime!==void 0||e.config.maxDate&&e.maxDateHasTime&&e.latestSelectedDateObj&&Gt(e.latestSelectedDateObj,e.config.maxDate,!0)===0){let Z=e.config.maxTime!==void 0?e.config.maxTime:e.config.maxDate;x=Math.min(x,Z.getHours()),x===Z.getHours()&&(T=Math.min(T,Z.getMinutes())),T===Z.getMinutes()&&(H=Math.min(H,Z.getSeconds()))}if(W){let Z=e.config.minTime!==void 0?e.config.minTime:e.config.minDate;x=Math.max(x,Z.getHours()),x===Z.getHours()&&T=12)]),e.secondElement!==void 0&&(e.secondElement.value=Nt(H)))}function h(x){let T=Jt(x),H=parseInt(T.value)+(x.delta||0);(H/1e3>1||x.key==="Enter"&&!/[^\d]/.test(H.toString()))&&z(H)}function p(x,T,H,W){if(T instanceof Array)return T.forEach(ae=>p(x,ae,H,W));if(x instanceof Array)return x.forEach(ae=>p(ae,T,H,W));x.addEventListener(T,H,W),e._handlers.push({remove:()=>x.removeEventListener(T,H)})}function g(){Ke("onChange")}function w(){if(e.config.wrap&&["open","close","toggle","clear"].forEach(T=>{Array.prototype.forEach.call(e.element.querySelectorAll(`[data-${T}]`),H=>p(H,"click",e[T]))}),e.isMobile){Be();return}let x=Ql(rt,50);if(e._debouncedChange=Ql(g,kE),e.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&p(e.daysContainer,"mouseover",T=>{e.config.mode==="range"&&Pe(Jt(T))}),p(window.document.body,"keydown",Ee),!e.config.inline&&!e.config.static&&p(window,"resize",x),window.ontouchstart!==void 0?p(window.document,"touchstart",B):p(window.document,"mousedown",B),p(window.document,"focus",B,{capture:!0}),e.config.clickOpens===!0&&(p(e._input,"focus",e.open),p(e._input,"click",e.open)),e.daysContainer!==void 0&&(p(e.monthNav,"click",Lt),p(e.monthNav,["keyup","increment"],h),p(e.daysContainer,"click",$n)),e.timeContainer!==void 0&&e.minuteElement!==void 0&&e.hourElement!==void 0){let T=H=>Jt(H).select();p(e.timeContainer,["increment"],s),p(e.timeContainer,"blur",s,{capture:!0}),p(e.timeContainer,"click",_),p([e.hourElement,e.minuteElement],["focus","click"],T),e.secondElement!==void 0&&p(e.secondElement,"focus",()=>e.secondElement&&e.secondElement.select()),e.amPM!==void 0&&p(e.amPM,"click",H=>{s(H),g()})}e.config.allowInput&&p(e._input,"blur",we)}function S(x,T){let H=x!==void 0?e.parseDate(x):e.latestSelectedDateObj||(e.config.minDate&&e.config.minDate>e.now?e.config.minDate:e.config.maxDate&&e.config.maxDate1),e.calendarContainer.appendChild(x);let T=e.config.appendTo!==void 0&&e.config.appendTo.nodeType!==void 0;if((e.config.inline||e.config.static)&&(e.calendarContainer.classList.add(e.config.inline?"inline":"static"),e.config.inline&&(!T&&e.element.parentNode?e.element.parentNode.insertBefore(e.calendarContainer,e._input.nextSibling):e.config.appendTo!==void 0&&e.config.appendTo.appendChild(e.calendarContainer)),e.config.static)){let H=Ve("div","flatpickr-wrapper");e.element.parentNode&&e.element.parentNode.insertBefore(H,e.element),H.appendChild(e.element),e.altInput&&H.appendChild(e.altInput),H.appendChild(e.calendarContainer)}!e.config.static&&!e.config.inline&&(e.config.appendTo!==void 0?e.config.appendTo:window.document.body).appendChild(e.calendarContainer)}function I(x,T,H,W){let ae=U(T,!0),Z=Ve("span","flatpickr-day "+x,T.getDate().toString());return Z.dateObj=T,Z.$i=W,Z.setAttribute("aria-label",e.formatDate(T,e.config.ariaDateFormat)),x.indexOf("hidden")===-1&&Gt(T,e.now)===0&&(e.todayDateElem=Z,Z.classList.add("today"),Z.setAttribute("aria-current","date")),ae?(Z.tabIndex=-1,Ge(T)&&(Z.classList.add("selected"),e.selectedDateElem=Z,e.config.mode==="range"&&(Ft(Z,"startRange",e.selectedDates[0]&&Gt(T,e.selectedDates[0],!0)===0),Ft(Z,"endRange",e.selectedDates[1]&&Gt(T,e.selectedDates[1],!0)===0),x==="nextMonthDay"&&Z.classList.add("inRange")))):Z.classList.add("flatpickr-disabled"),e.config.mode==="range"&&Vt(T)&&!Ge(T)&&Z.classList.add("inRange"),e.weekNumbers&&e.config.showMonths===1&&x!=="prevMonthDay"&&H%7==1&&e.weekNumbers.insertAdjacentHTML("beforeend",""+e.config.getWeek(T)+""),Ke("onDayCreate",Z),Z}function D(x){x.focus(),e.config.mode==="range"&&Pe(x)}function N(x){let T=x>0?0:e.config.showMonths-1,H=x>0?e.config.showMonths:-1;for(let W=T;W!=H;W+=x){let ae=e.daysContainer.children[W],Z=x>0?0:ae.children.length-1,ce=x>0?ae.children.length:-1;for(let ue=Z;ue!=ce;ue+=x){let _e=ae.children[ue];if(_e.className.indexOf("hidden")===-1&&U(_e.dateObj))return _e}}}function K(x,T){let H=x.className.indexOf("Month")===-1?x.dateObj.getMonth():e.currentMonth,W=T>0?e.config.showMonths:-1,ae=T>0?1:-1;for(let Z=H-e.currentMonth;Z!=W;Z+=ae){let ce=e.daysContainer.children[Z],ue=H-e.currentMonth===Z?x.$i+T:T<0?ce.children.length-1:0,_e=ce.children.length;for(let De=ue;De>=0&&De<_e&&De!=(T>0?_e:-1);De+=ae){let ze=ce.children[De];if(ze.className.indexOf("hidden")===-1&&U(ze.dateObj)&&Math.abs(x.$i-De)>=Math.abs(T))return D(ze)}}e.changeMonth(ae),j(N(ae),0)}function j(x,T){let H=G(document.activeElement||document.body),W=x!==void 0?x:H?document.activeElement:e.selectedDateElem!==void 0&&G(e.selectedDateElem)?e.selectedDateElem:e.todayDateElem!==void 0&&G(e.todayDateElem)?e.todayDateElem:N(T>0?1:-1);W===void 0?e._input.focus():H?K(W,T):D(W)}function X(x,T){let H=(new Date(x,T,1).getDay()-e.l10n.firstDayOfWeek+7)%7,W=e.utils.getDaysInMonth((T-1+12)%12,x),ae=e.utils.getDaysInMonth(T,x),Z=window.document.createDocumentFragment(),ce=e.config.showMonths>1,ue=ce?"prevMonthDay hidden":"prevMonthDay",_e=ce?"nextMonthDay hidden":"nextMonthDay",De=W+1-H,ze=0;for(;De<=W;De++,ze++)Z.appendChild(I(ue,new Date(x,T-1,De),De,ze));for(De=1;De<=ae;De++,ze++)Z.appendChild(I("",new Date(x,T,De),De,ze));for(let lt=ae+1;lt<=42-H&&(e.config.showMonths===1||ze%7!=0);lt++,ze++)Z.appendChild(I(_e,new Date(x,T+1,lt%ae),lt,ze));let xt=Ve("div","dayContainer");return xt.appendChild(Z),xt}function Q(){if(e.daysContainer===void 0)return;na(e.daysContainer),e.weekNumbers&&na(e.weekNumbers);let x=document.createDocumentFragment();for(let T=0;T1||e.config.monthSelectorType!=="dropdown")return;let x=function(T){return e.config.minDate!==void 0&&e.currentYear===e.config.minDate.getFullYear()&&Te.config.maxDate.getMonth())};e.monthsDropdownContainer.tabIndex=-1,e.monthsDropdownContainer.innerHTML="";for(let T=0;T<12;T++){if(!x(T))continue;let H=Ve("option","flatpickr-monthDropdown-month");H.value=new Date(e.currentYear,T).getMonth().toString(),H.textContent=ia(T,e.config.shorthandCurrentMonth,e.l10n),H.tabIndex=-1,e.currentMonth===T&&(H.selected=!0),e.monthsDropdownContainer.appendChild(H)}}function Y(){let x=Ve("div","flatpickr-month"),T=window.document.createDocumentFragment(),H;e.config.showMonths>1||e.config.monthSelectorType==="static"?H=Ve("span","cur-month"):(e.monthsDropdownContainer=Ve("select","flatpickr-monthDropdown-months"),e.monthsDropdownContainer.setAttribute("aria-label",e.l10n.monthAriaLabel),p(e.monthsDropdownContainer,"change",ce=>{let ue=Jt(ce),_e=parseInt(ue.value,10);e.changeMonth(_e-e.currentMonth),Ke("onMonthChange")}),ie(),H=e.monthsDropdownContainer);let W=ra("cur-year",{tabindex:"-1"}),ae=W.getElementsByTagName("input")[0];ae.setAttribute("aria-label",e.l10n.yearAriaLabel),e.config.minDate&&ae.setAttribute("min",e.config.minDate.getFullYear().toString()),e.config.maxDate&&(ae.setAttribute("max",e.config.maxDate.getFullYear().toString()),ae.disabled=!!e.config.minDate&&e.config.minDate.getFullYear()===e.config.maxDate.getFullYear());let Z=Ve("div","flatpickr-current-month");return Z.appendChild(H),Z.appendChild(W),T.appendChild(Z),x.appendChild(T),{container:x,yearElement:ae,monthElement:H}}function J(){na(e.monthNav),e.monthNav.appendChild(e.prevMonthNav),e.config.showMonths&&(e.yearElements=[],e.monthElements=[]);for(let x=e.config.showMonths;x--;){let T=Y();e.yearElements.push(T.yearElement),e.monthElements.push(T.monthElement),e.monthNav.appendChild(T.container)}e.monthNav.appendChild(e.nextMonthNav)}function ne(){return e.monthNav=Ve("div","flatpickr-months"),e.yearElements=[],e.monthElements=[],e.prevMonthNav=Ve("span","flatpickr-prev-month"),e.prevMonthNav.innerHTML=e.config.prevArrow,e.nextMonthNav=Ve("span","flatpickr-next-month"),e.nextMonthNav.innerHTML=e.config.nextArrow,J(),Object.defineProperty(e,"_hidePrevMonthArrow",{get:()=>e.__hidePrevMonthArrow,set(x){e.__hidePrevMonthArrow!==x&&(Ft(e.prevMonthNav,"flatpickr-disabled",x),e.__hidePrevMonthArrow=x)}}),Object.defineProperty(e,"_hideNextMonthArrow",{get:()=>e.__hideNextMonthArrow,set(x){e.__hideNextMonthArrow!==x&&(Ft(e.nextMonthNav,"flatpickr-disabled",x),e.__hideNextMonthArrow=x)}}),e.currentYearElement=e.yearElements[0],At(),e.monthNav}function le(){e.calendarContainer.classList.add("hasTime"),e.config.noCalendar&&e.calendarContainer.classList.add("noCalendar");let x=Ao(e.config);e.timeContainer=Ve("div","flatpickr-time"),e.timeContainer.tabIndex=-1;let T=Ve("span","flatpickr-time-separator",":"),H=ra("flatpickr-hour",{"aria-label":e.l10n.hourAriaLabel});e.hourElement=H.getElementsByTagName("input")[0];let W=ra("flatpickr-minute",{"aria-label":e.l10n.minuteAriaLabel});if(e.minuteElement=W.getElementsByTagName("input")[0],e.hourElement.tabIndex=e.minuteElement.tabIndex=-1,e.hourElement.value=Nt(e.latestSelectedDateObj?e.latestSelectedDateObj.getHours():e.config.time_24hr?x.hours:l(x.hours)),e.minuteElement.value=Nt(e.latestSelectedDateObj?e.latestSelectedDateObj.getMinutes():x.minutes),e.hourElement.setAttribute("step",e.config.hourIncrement.toString()),e.minuteElement.setAttribute("step",e.config.minuteIncrement.toString()),e.hourElement.setAttribute("min",e.config.time_24hr?"0":"1"),e.hourElement.setAttribute("max",e.config.time_24hr?"23":"12"),e.hourElement.setAttribute("maxlength","2"),e.minuteElement.setAttribute("min","0"),e.minuteElement.setAttribute("max","59"),e.minuteElement.setAttribute("maxlength","2"),e.timeContainer.appendChild(H),e.timeContainer.appendChild(T),e.timeContainer.appendChild(W),e.config.time_24hr&&e.timeContainer.classList.add("time24hr"),e.config.enableSeconds){e.timeContainer.classList.add("hasSeconds");let ae=ra("flatpickr-second");e.secondElement=ae.getElementsByTagName("input")[0],e.secondElement.value=Nt(e.latestSelectedDateObj?e.latestSelectedDateObj.getSeconds():x.seconds),e.secondElement.setAttribute("step",e.minuteElement.getAttribute("step")),e.secondElement.setAttribute("min","0"),e.secondElement.setAttribute("max","59"),e.secondElement.setAttribute("maxlength","2"),e.timeContainer.appendChild(Ve("span","flatpickr-time-separator",":")),e.timeContainer.appendChild(ae)}return e.config.time_24hr||(e.amPM=Ve("span","flatpickr-am-pm",e.l10n.amPM[Yt((e.latestSelectedDateObj?e.hourElement.value:e.config.defaultHour)>11)]),e.amPM.title=e.l10n.toggleTitle,e.amPM.tabIndex=-1,e.timeContainer.appendChild(e.amPM)),e.timeContainer}function de(){e.weekdayContainer?na(e.weekdayContainer):e.weekdayContainer=Ve("div","flatpickr-weekdays");for(let x=e.config.showMonths;x--;){let T=Ve("div","flatpickr-weekdaycontainer");e.weekdayContainer.appendChild(T)}return fe(),e.weekdayContainer}function fe(){if(!e.weekdayContainer)return;let x=e.l10n.firstDayOfWeek,T=[...e.l10n.weekdays.shorthand];x>0&&x-1&&(ce.arrayIndex=te.arrayIndex),X.matches.push(ce)}}}),this.options.includeScore&&k.push(function(Q,X){X.score=Q.score});for(var D=0,N=w.length;DS)return s(g,this.pattern,T);var k=this.options,D=k.location,N=k.distance,C=k.threshold,O=k.findAllMatches,B=k.minMatchCharLength;return u(g,this.pattern,this.patternAlphabet,{location:D,distance:N,threshold:C,findAllMatches:O,minMatchCharLength:B})}}])&&o(f.prototype,h),p&&o(f,p),d}();r.exports=c},function(r,i){var a=/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;r.exports=function(o,s){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:/ +/g,l=new RegExp(s.replace(a,"\\$&").replace(u,"|")),c=o.match(l),d=!!c,f=[];if(d)for(var h=0,p=c.length;h=I;K-=1){var V=K-1,U=c[u.charAt(V)];if(U&&(X[V]=1),qe[K]=(qe[K+1]<<1|1)&U,he!==0&&(qe[K]|=(te[K+1]|te[K])<<1|1|te[K+1]),qe[K]&fe&&(ce=o(l,{errors:he,currentLocation:V,expectedLocation:C,distance:g}))<=B){if(B=ce,(z=V)<=C)break;I=Math.max(1,2*C-z)}}if(o(l,{errors:he+1,currentLocation:C,expectedLocation:C,distance:g})>B)break;te=qe}return{isMatch:z>=0,score:ce===0?.001:ce,matchedIndices:s(X,N)}}},function(r,i){r.exports=function(a,o){var s=o.errors,u=s===void 0?0:s,l=o.currentLocation,c=l===void 0?0:l,d=o.expectedLocation,f=d===void 0?0:d,h=o.distance,p=h===void 0?100:h,g=u/a.length,w=Math.abs(f-c);return p?g+w/p:w?1:g}},function(r,i){r.exports=function(){for(var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,s=[],u=-1,l=-1,c=0,d=a.length;c=o&&s.push([u,l]),u=-1)}return a[c-1]&&c-u>=o&&s.push([u,c-1]),s}},function(r,i){r.exports=function(a){for(var o={},s=a.length,u=0;u0)return"Unexpected "+(P.length>1?"keys":"key")+" "+('"'+P.join('", "')+'" found in '+M+". ")+"Expected to find one of the known reducer keys instead: "+('"'+E.join('", "')+'". Unexpected keys will be ignored.')}function g(L){Object.keys(L).forEach(function(y){var b=L[y],m=b(void 0,{type:l.INIT});if(typeof m=="undefined")throw new Error('Reducer "'+y+`" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(typeof b(void 0,{type:l.PROBE_UNKNOWN_ACTION()})=="undefined")throw new Error('Reducer "'+y+'" returned undefined when probed with a random type. '+("Don't try to handle "+l.INIT+' or other actions in "redux/*" ')+"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.")})}function w(L){for(var y=Object.keys(L),b={},m=0;m-1?L.map(function(b){var m=b;return m.id===parseInt(y.choiceId,10)&&(m.selected=!0),m}):L;case"REMOVE_ITEM":return y.choiceId>-1?L.map(function(b){var m=b;return m.id===parseInt(y.choiceId,10)&&(m.selected=!1),m}):L;case"FILTER_CHOICES":return L.map(function(b){var m=b;return m.active=y.results.some(function(E){var M=E.item,P=E.score;return M.id===m.id?(m.score=P,!0):!1}),m});case"ACTIVATE_CHOICES":return L.map(function(b){var m=b;return m.active=y.active,m});case"CLEAR_CHOICES":return q;default:return L}}var te={loading:!1},ce=function(y,b){switch(y===void 0&&(y=te),b.type){case"SET_IS_LOADING":return{loading:b.isLoading};default:return y}},de=ce,fe=function(y,b){return Math.floor(Math.random()*(b-y)+y)},he=function(y){return Array.from({length:y},function(){return fe(0,36).toString(36)}).join("")},De=function(y,b){var m=y.id||y.name&&y.name+"-"+he(2)||he(4);return m=m.replace(/(:|\.|\[|\]|,)/g,""),m=b+"-"+m,m},A=function(y){return Object.prototype.toString.call(y).slice(8,-1)},I=function(y,b){return b!=null&&A(b)===y},et=function(y,b){return b===void 0&&(b=document.createElement("div")),y.nextSibling?y.parentNode.insertBefore(b,y.nextSibling):y.parentNode.appendChild(b),b.appendChild(y)},qe=function(y,b,m){if(m===void 0&&(m=1),!(!(y instanceof Element)||typeof b!="string")){for(var E=(m>0?"next":"previous")+"ElementSibling",M=y[E];M;){if(M.matches(b))return M;M=M[E]}return M}},K=function(y,b,m){if(m===void 0&&(m=1),!y)return!1;var E;return m>0?E=b.scrollTop+b.offsetHeight>=y.offsetTop+y.offsetHeight:E=y.offsetTop>=b.scrollTop,E},V=function(y){return typeof y!="string"?y:y.replace(/&/g,"&").replace(/>/g,"&rt;").replace(/"'+V(y)+'"'},maxItemText:function(y){return"Only "+y+" values can be added"},valueComparer:function(y,b){return y===b},fuseOptions:{includeScore:!0},callbackOnInit:null,callbackOnCreateTemplates:null,classNames:Mn},lt={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice"},Bt={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL"},tt={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34},j="text",ne="select-one",be="select-multiple",Be=4,ct=function(){function L(b){var m=b.element,E=b.type,M=b.classNames,P=b.position;this.element=m,this.classNames=M,this.type=E,this.position=P,this.isOpen=!1,this.isFlipped=!1,this.isFocussed=!1,this.isDisabled=!1,this.isLoading=!1,this._onFocus=this._onFocus.bind(this),this._onBlur=this._onBlur.bind(this)}var y=L.prototype;return y.addEventListeners=function(){this.element.addEventListener("focus",this._onFocus),this.element.addEventListener("blur",this._onBlur)},y.removeEventListeners=function(){this.element.removeEventListener("focus",this._onFocus),this.element.removeEventListener("blur",this._onBlur)},y.shouldFlip=function(m){if(typeof m!="number")return!1;var E=!1;return this.position==="auto"?E=!window.matchMedia("(min-height: "+(m+1)+"px)").matches:this.position==="top"&&(E=!0),E},y.setActiveDescendant=function(m){this.element.setAttribute("aria-activedescendant",m)},y.removeActiveDescendant=function(){this.element.removeAttribute("aria-activedescendant")},y.open=function(m){this.element.classList.add(this.classNames.openState),this.element.setAttribute("aria-expanded","true"),this.isOpen=!0,this.shouldFlip(m)&&(this.element.classList.add(this.classNames.flippedState),this.isFlipped=!0)},y.close=function(){this.element.classList.remove(this.classNames.openState),this.element.setAttribute("aria-expanded","false"),this.removeActiveDescendant(),this.isOpen=!1,this.isFlipped&&(this.element.classList.remove(this.classNames.flippedState),this.isFlipped=!1)},y.focus=function(){this.isFocussed||this.element.focus()},y.addFocusState=function(){this.element.classList.add(this.classNames.focusState)},y.removeFocusState=function(){this.element.classList.remove(this.classNames.focusState)},y.enable=function(){this.element.classList.remove(this.classNames.disabledState),this.element.removeAttribute("aria-disabled"),this.type===ne&&this.element.setAttribute("tabindex","0"),this.isDisabled=!1},y.disable=function(){this.element.classList.add(this.classNames.disabledState),this.element.setAttribute("aria-disabled","true"),this.type===ne&&this.element.setAttribute("tabindex","-1"),this.isDisabled=!0},y.wrap=function(m){et(m,this.element)},y.unwrap=function(m){this.element.parentNode.insertBefore(m,this.element),this.element.parentNode.removeChild(this.element)},y.addLoadingState=function(){this.element.classList.add(this.classNames.loadingState),this.element.setAttribute("aria-busy","true"),this.isLoading=!0},y.removeLoadingState=function(){this.element.classList.remove(this.classNames.loadingState),this.element.removeAttribute("aria-busy"),this.isLoading=!1},y._onFocus=function(){this.isFocussed=!0},y._onBlur=function(){this.isFocussed=!1},L}();function rn(L,y){for(var b=0;b0?this.element.scrollTop+ee-H:m.offsetTop;requestAnimationFrame(function(){M._animateScroll(oe,E)})}},y._scrollDown=function(m,E,M){var P=(M-m)/E,H=P>1?P:1;this.element.scrollTop=m+H},y._scrollUp=function(m,E,M){var P=(m-M)/E,H=P>1?P:1;this.element.scrollTop=m-H},y._animateScroll=function(m,E){var M=this,P=Be,H=this.element.scrollTop,Y=!1;E>0?(this._scrollDown(H,P,m),Hm&&(Y=!0)),Y&&requestAnimationFrame(function(){M._animateScroll(m,E)})},L}();function Kt(L,y){for(var b=0;b0?"treeitem":"option"),Object.assign(Le.dataset,{choice:"",id:oe,value:ve,selectText:m}),Te?(Le.classList.add(Y),Le.dataset.choiceDisabled="",Le.setAttribute("aria-disabled","true")):(Le.classList.add(P),Le.dataset.choiceSelectable=""),Le},input:function(y,b){var m=y.input,E=y.inputCloned,M=Object.assign(document.createElement("input"),{type:"text",className:m+" "+E,autocomplete:"off",autocapitalize:"off",spellcheck:!1});return M.setAttribute("role","textbox"),M.setAttribute("aria-autocomplete","list"),M.setAttribute("aria-label",b),M},dropdown:function(y){var b=y.list,m=y.listDropdown,E=document.createElement("div");return E.classList.add(b,m),E.setAttribute("aria-expanded","false"),E},notice:function(y,b,m){var E=y.item,M=y.itemChoice,P=y.noResults,H=y.noChoices;m===void 0&&(m="");var Y=[E,M];return m==="no-choices"?Y.push(H):m==="no-results"&&Y.push(P),Object.assign(document.createElement("div"),{innerHTML:b,className:Y.join(" ")})},option:function(y){var b=y.label,m=y.value,E=y.customProperties,M=y.active,P=y.disabled,H=new Option(b,m,!1,M);return E&&(H.dataset.customProperties=E),H.disabled=P,H}},ae=re,xe=function(y){var b=y.value,m=y.label,E=y.id,M=y.groupId,P=y.disabled,H=y.elementId,Y=y.customProperties,ee=y.placeholder,oe=y.keyCode;return{type:Bt.ADD_CHOICE,value:b,label:m,id:E,groupId:M,disabled:P,elementId:H,customProperties:Y,placeholder:ee,keyCode:oe}},ue=function(y){return{type:Bt.FILTER_CHOICES,results:y}},_e=function(y){return y===void 0&&(y=!0),{type:Bt.ACTIVATE_CHOICES,active:y}},le=function(){return{type:Bt.CLEAR_CHOICES}},we=function(y){var b=y.value,m=y.label,E=y.id,M=y.choiceId,P=y.groupId,H=y.customProperties,Y=y.placeholder,ee=y.keyCode;return{type:Bt.ADD_ITEM,value:b,label:m,id:E,choiceId:M,groupId:P,customProperties:H,placeholder:Y,keyCode:ee}},ze=function(y,b){return{type:Bt.REMOVE_ITEM,id:y,choiceId:b}},At=function(y,b){return{type:Bt.HIGHLIGHT_ITEM,id:y,highlighted:b}},mt=function(y){var b=y.value,m=y.id,E=y.active,M=y.disabled;return{type:Bt.ADD_GROUP,value:b,id:m,active:E,disabled:M}},Dn=function(){return{type:"CLEAR_ALL"}},bn=function(y){return{type:"RESET_TO",state:y}},Sr=function(y){return{type:"SET_IS_LOADING",isLoading:y}};function Vn(L,y){for(var b=0;b=0?this._store.getGroupById(H):null;return this._store.dispatch(At(M,!0)),E&&this.passedElement.triggerEvent(lt.highlightItem,{id:M,value:ee,label:ve,groupValue:pe&&pe.value?pe.value:null}),this},y.unhighlightItem=function(m){if(!m)return this;var E=m.id,M=m.groupId,P=M===void 0?-1:M,H=m.value,Y=H===void 0?"":H,ee=m.label,oe=ee===void 0?"":ee,ve=P>=0?this._store.getGroupById(P):null;return this._store.dispatch(At(E,!1)),this.passedElement.triggerEvent(lt.highlightItem,{id:E,value:Y,label:oe,groupValue:ve&&ve.value?ve.value:null}),this},y.highlightAll=function(){var m=this;return this._store.items.forEach(function(E){return m.highlightItem(E)}),this},y.unhighlightAll=function(){var m=this;return this._store.items.forEach(function(E){return m.unhighlightItem(E)}),this},y.removeActiveItemsByValue=function(m){var E=this;return this._store.activeItems.filter(function(M){return M.value===m}).forEach(function(M){return E._removeItem(M)}),this},y.removeActiveItems=function(m){var E=this;return this._store.activeItems.filter(function(M){var P=M.id;return P!==m}).forEach(function(M){return E._removeItem(M)}),this},y.removeHighlightedItems=function(m){var E=this;return m===void 0&&(m=!1),this._store.highlightedActiveItems.forEach(function(M){E._removeItem(M),m&&E._triggerChange(M.value)}),this},y.showDropdown=function(m){var E=this;return this.dropdown.isActive?this:(requestAnimationFrame(function(){E.dropdown.show(),E.containerOuter.open(E.dropdown.distanceFromTopWindow),!m&&E._canSearch&&E.input.focus(),E.passedElement.triggerEvent(lt.showDropdown,{})}),this)},y.hideDropdown=function(m){var E=this;return this.dropdown.isActive?(requestAnimationFrame(function(){E.dropdown.hide(),E.containerOuter.close(),!m&&E._canSearch&&(E.input.removeActiveDescendant(),E.input.blur()),E.passedElement.triggerEvent(lt.hideDropdown,{})}),this):this},y.getValue=function(m){m===void 0&&(m=!1);var E=this._store.activeItems.reduce(function(M,P){var H=m?P.value:P;return M.push(H),M},[]);return this._isSelectOneElement?E[0]:E},y.setValue=function(m){var E=this;return this.initialised?(m.forEach(function(M){return E._setChoiceOrItem(M)}),this):this},y.setChoiceByValue=function(m){var E=this;if(!this.initialised||this._isTextElement)return this;var M=Array.isArray(m)?m:[m];return M.forEach(function(P){return E._findAndSelectChoiceByValue(P)}),this},y.setChoices=function(m,E,M,P){var H=this;if(m===void 0&&(m=[]),E===void 0&&(E="value"),M===void 0&&(M="label"),P===void 0&&(P=!1),!this.initialised)throw new ReferenceError("setChoices was called on a non-initialized instance of Choices");if(!this._isSelectElement)throw new TypeError("setChoices can't be used with INPUT based Choices");if(typeof E!="string"||!E)throw new TypeError("value parameter must be a name of 'value' field in passed objects");if(P&&this.clearChoices(),typeof m=="function"){var Y=m(this);if(typeof Promise=="function"&&Y instanceof Promise)return new Promise(function(ee){return requestAnimationFrame(ee)}).then(function(){return H._handleLoadingState(!0)}).then(function(){return Y}).then(function(ee){return H.setChoices(ee,E,M,P)}).catch(function(ee){H.config.silent||console.error(ee)}).then(function(){return H._handleLoadingState(!1)}).then(function(){return H});if(!Array.isArray(Y))throw new TypeError(".setChoices first argument function must return either array of choices or Promise, got: "+typeof Y);return this.setChoices(Y,E,M,!1)}if(!Array.isArray(m))throw new TypeError(".setChoices must be called either with array of choices with a function resulting into Promise of array of choices");return this.containerOuter.removeLoadingState(),this._startLoading(),m.forEach(function(ee){ee.choices?H._addGroup({id:parseInt(ee.id,10)||null,group:ee,valueKey:E,labelKey:M}):H._addChoice({value:ee[E],label:ee[M],isSelected:ee.selected,isDisabled:ee.disabled,customProperties:ee.customProperties,placeholder:ee.placeholder})}),this._stopLoading(),this},y.clearChoices=function(){return this._store.dispatch(le()),this},y.clearStore=function(){return this._store.dispatch(Dn()),this},y.clearInput=function(){var m=!this._isSelectOneElement;return this.input.clear(m),!this._isTextElement&&this._canSearch&&(this._isSearching=!1,this._store.dispatch(_e(!0))),this},y._render=function(){if(!this._store.isLoading()){this._currentState=this._store.state;var m=this._currentState.choices!==this._prevState.choices||this._currentState.groups!==this._prevState.groups||this._currentState.items!==this._prevState.items,E=this._isSelectElement,M=this._currentState.items!==this._prevState.items;!m||(E&&this._renderChoices(),M&&this._renderItems(),this._prevState=this._currentState)}},y._renderChoices=function(){var m=this,E=this._store,M=E.activeGroups,P=E.activeChoices,H=document.createDocumentFragment();if(this.choiceList.clear(),this.config.resetScrollPosition&&requestAnimationFrame(function(){return m.choiceList.scrollToTop()}),M.length>=1&&!this._isSearching){var Y=P.filter(function(Ce){return Ce.placeholder===!0&&Ce.groupId===-1});Y.length>=1&&(H=this._createChoicesFragment(Y,H)),H=this._createGroupsFragment(M,P,H)}else P.length>=1&&(H=this._createChoicesFragment(P,H));if(H.childNodes&&H.childNodes.length>0){var ee=this._store.activeItems,oe=this._canAddItem(ee,this.input.value);oe.response?(this.choiceList.append(H),this._highlightChoice()):this.choiceList.append(this._getTemplate("notice",oe.notice))}else{var ve,pe;this._isSearching?(pe=typeof this.config.noResultsText=="function"?this.config.noResultsText():this.config.noResultsText,ve=this._getTemplate("notice",pe,"no-results")):(pe=typeof this.config.noChoicesText=="function"?this.config.noChoicesText():this.config.noChoicesText,ve=this._getTemplate("notice",pe,"no-choices")),this.choiceList.append(ve)}},y._renderItems=function(){var m=this._store.activeItems||[];this.itemList.clear();var E=this._createItemsFragment(m);E.childNodes&&this.itemList.append(E)},y._createGroupsFragment=function(m,E,M){var P=this;M===void 0&&(M=document.createDocumentFragment());var H=function(ee){return E.filter(function(oe){return P._isSelectOneElement?oe.groupId===ee.id:oe.groupId===ee.id&&(P.config.renderSelectedChoices==="always"||!oe.selected)})};return this.config.shouldSort&&m.sort(this.config.sorter),m.forEach(function(Y){var ee=H(Y);if(ee.length>=1){var oe=P._getTemplate("choiceGroup",Y);M.appendChild(oe),P._createChoicesFragment(ee,M,!0)}}),M},y._createChoicesFragment=function(m,E,M){var P=this;E===void 0&&(E=document.createDocumentFragment()),M===void 0&&(M=!1);var H=this.config,Y=H.renderSelectedChoices,ee=H.searchResultLimit,oe=H.renderChoiceLimit,ve=this._isSearching?ye:this.config.sorter,pe=function(bt){var An=Y==="auto"?P._isSelectOneElement||!bt.selected:!0;if(An){var In=P._getTemplate("choice",bt,P.config.itemSelectText);E.appendChild(In)}},Ce=m;Y==="auto"&&!this._isSelectOneElement&&(Ce=m.filter(function(gt){return!gt.selected}));var Ie=Ce.reduce(function(gt,bt){return bt.placeholder?gt.placeholderChoices.push(bt):gt.normalChoices.push(bt),gt},{placeholderChoices:[],normalChoices:[]}),Te=Ie.placeholderChoices,Oe=Ie.normalChoices;(this.config.shouldSort||this._isSearching)&&Oe.sort(ve);var Ae=Ce.length,Le=this._isSelectOneElement?[].concat(Te,Oe):Oe;this._isSearching?Ae=ee:oe&&oe>0&&!M&&(Ae=oe);for(var nt=0;nt=P){var ee=H?this._searchChoices(m):0;this.passedElement.triggerEvent(lt.search,{value:m,resultCount:ee})}else Y&&(this._isSearching=!1,this._store.dispatch(_e(!0)))}},y._canAddItem=function(m,E){var M=!0,P=typeof this.config.addItemText=="function"?this.config.addItemText(E):this.config.addItemText;if(!this._isSelectOneElement){var H=Fe(m,E);this.config.maxItemCount>0&&this.config.maxItemCount<=m.length&&(M=!1,P=typeof this.config.maxItemText=="function"?this.config.maxItemText(this.config.maxItemCount):this.config.maxItemText),!this.config.duplicateItemsAllowed&&H&&M&&(M=!1,P=typeof this.config.uniqueItemText=="function"?this.config.uniqueItemText(E):this.config.uniqueItemText),this._isTextElement&&this.config.addItems&&M&&typeof this.config.addItemFilter=="function"&&!this.config.addItemFilter(E)&&(M=!1,P=typeof this.config.customAddItemText=="function"?this.config.customAddItemText(E):this.config.customAddItemText)}return{response:M,notice:P}},y._searchChoices=function(m){var E=typeof m=="string"?m.trim():m,M=typeof this._currentValue=="string"?this._currentValue.trim():this._currentValue;if(E.length<1&&E===M+" ")return 0;var P=this._store.searchableChoices,H=E,Y=[].concat(this.config.searchFields),ee=Object.assign(this.config.fuseOptions,{keys:Y}),oe=new i.a(P,ee),ve=oe.search(H);return this._currentValue=E,this._highlightPosition=0,this._isSearching=!0,this._store.dispatch(ue(ve)),ve.length},y._addEventListeners=function(){var m=document,E=m.documentElement;E.addEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.addEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.addEventListener("mousedown",this._onMouseDown,!0),E.addEventListener("click",this._onClick,{passive:!0}),E.addEventListener("touchmove",this._onTouchMove,{passive:!0}),this.dropdown.element.addEventListener("mouseover",this._onMouseOver,{passive:!0}),this._isSelectOneElement&&(this.containerOuter.element.addEventListener("focus",this._onFocus,{passive:!0}),this.containerOuter.element.addEventListener("blur",this._onBlur,{passive:!0})),this.input.element.addEventListener("keyup",this._onKeyUp,{passive:!0}),this.input.element.addEventListener("focus",this._onFocus,{passive:!0}),this.input.element.addEventListener("blur",this._onBlur,{passive:!0}),this.input.element.form&&this.input.element.form.addEventListener("reset",this._onFormReset,{passive:!0}),this.input.addEventListeners()},y._removeEventListeners=function(){var m=document,E=m.documentElement;E.removeEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.removeEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.removeEventListener("mousedown",this._onMouseDown,!0),E.removeEventListener("click",this._onClick),E.removeEventListener("touchmove",this._onTouchMove),this.dropdown.element.removeEventListener("mouseover",this._onMouseOver),this._isSelectOneElement&&(this.containerOuter.element.removeEventListener("focus",this._onFocus),this.containerOuter.element.removeEventListener("blur",this._onBlur)),this.input.element.removeEventListener("keyup",this._onKeyUp),this.input.element.removeEventListener("focus",this._onFocus),this.input.element.removeEventListener("blur",this._onBlur),this.input.element.form&&this.input.element.form.removeEventListener("reset",this._onFormReset),this.input.removeEventListeners()},y._onKeyDown=function(m){var E,M=m.target,P=m.keyCode,H=m.ctrlKey,Y=m.metaKey,ee=this._store.activeItems,oe=this.input.isFocussed,ve=this.dropdown.isActive,pe=this.itemList.hasChildren(),Ce=String.fromCharCode(P),Ie=tt.BACK_KEY,Te=tt.DELETE_KEY,Oe=tt.ENTER_KEY,Ae=tt.A_KEY,Le=tt.ESC_KEY,nt=tt.UP_KEY,gt=tt.DOWN_KEY,bt=tt.PAGE_UP_KEY,An=tt.PAGE_DOWN_KEY,In=H||Y;!this._isTextElement&&/[a-zA-Z0-9-_ ]/.test(Ce)&&this.showDropdown();var ar=(E={},E[Ae]=this._onAKey,E[Oe]=this._onEnterKey,E[Le]=this._onEscapeKey,E[nt]=this._onDirectionKey,E[bt]=this._onDirectionKey,E[gt]=this._onDirectionKey,E[An]=this._onDirectionKey,E[Te]=this._onDeleteKey,E[Ie]=this._onDeleteKey,E);ar[P]&&ar[P]({event:m,target:M,keyCode:P,metaKey:Y,activeItems:ee,hasFocusedInput:oe,hasActiveDropdown:ve,hasItems:pe,hasCtrlDownKeyPressed:In})},y._onKeyUp=function(m){var E=m.target,M=m.keyCode,P=this.input.value,H=this._store.activeItems,Y=this._canAddItem(H,P),ee=tt.BACK_KEY,oe=tt.DELETE_KEY;if(this._isTextElement){var ve=Y.notice&&P;if(ve){var pe=this._getTemplate("notice",Y.notice);this.dropdown.element.innerHTML=pe.outerHTML,this.showDropdown(!0)}else this.hideDropdown(!0)}else{var Ce=(M===ee||M===oe)&&!E.value,Ie=!this._isTextElement&&this._isSearching,Te=this._canSearch&&Y.response;Ce&&Ie?(this._isSearching=!1,this._store.dispatch(_e(!0))):Te&&this._handleSearch(this.input.value)}this._canSearch=this.config.searchEnabled},y._onAKey=function(m){var E=m.hasItems,M=m.hasCtrlDownKeyPressed;if(M&&E){this._canSearch=!1;var P=this.config.removeItems&&!this.input.value&&this.input.element===document.activeElement;P&&this.highlightAll()}},y._onEnterKey=function(m){var E=m.event,M=m.target,P=m.activeItems,H=m.hasActiveDropdown,Y=tt.ENTER_KEY,ee=M.hasAttribute("data-button");if(this._isTextElement&&M.value){var oe=this.input.value,ve=this._canAddItem(P,oe);ve.response&&(this.hideDropdown(!0),this._addItem({value:oe}),this._triggerChange(oe),this.clearInput())}if(ee&&(this._handleButtonAction(P,M),E.preventDefault()),H){var pe=this.dropdown.getChild("."+this.config.classNames.highlightedState);pe&&(P[0]&&(P[0].keyCode=Y),this._handleChoiceAction(P,pe)),E.preventDefault()}else this._isSelectOneElement&&(this.showDropdown(),E.preventDefault())},y._onEscapeKey=function(m){var E=m.hasActiveDropdown;E&&(this.hideDropdown(!0),this.containerOuter.focus())},y._onDirectionKey=function(m){var E=m.event,M=m.hasActiveDropdown,P=m.keyCode,H=m.metaKey,Y=tt.DOWN_KEY,ee=tt.PAGE_UP_KEY,oe=tt.PAGE_DOWN_KEY;if(M||this._isSelectOneElement){this.showDropdown(),this._canSearch=!1;var ve=P===Y||P===oe?1:-1,pe=H||P===oe||P===ee,Ce="[data-choice-selectable]",Ie;if(pe)ve>0?Ie=this.dropdown.element.querySelector(Ce+":last-of-type"):Ie=this.dropdown.element.querySelector(Ce);else{var Te=this.dropdown.element.querySelector("."+this.config.classNames.highlightedState);Te?Ie=qe(Te,Ce,ve):Ie=this.dropdown.element.querySelector(Ce)}Ie&&(K(Ie,this.choiceList.element,ve)||this.choiceList.scrollToChildElement(Ie,ve),this._highlightChoice(Ie)),E.preventDefault()}},y._onDeleteKey=function(m){var E=m.event,M=m.target,P=m.hasFocusedInput,H=m.activeItems;P&&!M.value&&!this._isSelectOneElement&&(this._handleBackspace(H),E.preventDefault())},y._onTouchMove=function(){this._wasTap&&(this._wasTap=!1)},y._onTouchEnd=function(m){var E=m||m.touches[0],M=E.target,P=this._wasTap&&this.containerOuter.element.contains(M);if(P){var H=M===this.containerOuter.element||M===this.containerInner.element;H&&(this._isTextElement?this.input.focus():this._isSelectMultipleElement&&this.showDropdown()),m.stopPropagation()}this._wasTap=!0},y._onMouseDown=function(m){var E=m.target;if(E instanceof HTMLElement){if(zr&&this.choiceList.element.contains(E)){var M=this.choiceList.element.firstElementChild,P=this._direction==="ltr"?m.offsetX>=M.offsetWidth:m.offsetX0;P&&this.unhighlightAll(),this.containerOuter.removeFocusState(),this.hideDropdown(!0)}},y._onFocus=function(m){var E=this,M,P=m.target,H=this.containerOuter.element.contains(P);if(!!H){var Y=(M={},M[j]=function(){P===E.input.element&&E.containerOuter.addFocusState()},M[ne]=function(){E.containerOuter.addFocusState(),P===E.input.element&&E.showDropdown(!0)},M[be]=function(){P===E.input.element&&(E.showDropdown(!0),E.containerOuter.addFocusState())},M);Y[this.passedElement.element.type]()}},y._onBlur=function(m){var E=this,M=m.target,P=this.containerOuter.element.contains(M);if(P&&!this._isScrollingOnIe){var H,Y=this._store.activeItems,ee=Y.some(function(ve){return ve.highlighted}),oe=(H={},H[j]=function(){M===E.input.element&&(E.containerOuter.removeFocusState(),ee&&E.unhighlightAll(),E.hideDropdown(!0))},H[ne]=function(){E.containerOuter.removeFocusState(),(M===E.input.element||M===E.containerOuter.element&&!E._canSearch)&&E.hideDropdown(!0)},H[be]=function(){M===E.input.element&&(E.containerOuter.removeFocusState(),E.hideDropdown(!0),ee&&E.unhighlightAll())},H);oe[this.passedElement.element.type]()}else this._isScrollingOnIe=!1,this.input.element.focus()},y._onFormReset=function(){this._store.dispatch(bn(this._initialState))},y._highlightChoice=function(m){var E=this;m===void 0&&(m=null);var M=Array.from(this.dropdown.element.querySelectorAll("[data-choice-selectable]"));if(!!M.length){var P=m,H=Array.from(this.dropdown.element.querySelectorAll("."+this.config.classNames.highlightedState));H.forEach(function(Y){Y.classList.remove(E.config.classNames.highlightedState),Y.setAttribute("aria-selected","false")}),P?this._highlightPosition=M.indexOf(P):(M.length>this._highlightPosition?P=M[this._highlightPosition]:P=M[M.length-1],P||(P=M[0])),P.classList.add(this.config.classNames.highlightedState),P.setAttribute("aria-selected","true"),this.passedElement.triggerEvent(lt.highlightChoice,{el:P}),this.dropdown.isActive&&(this.input.setActiveDescendant(P.id),this.containerOuter.setActiveDescendant(P.id))}},y._addItem=function(m){var E=m.value,M=m.label,P=M===void 0?null:M,H=m.choiceId,Y=H===void 0?-1:H,ee=m.groupId,oe=ee===void 0?-1:ee,ve=m.customProperties,pe=ve===void 0?null:ve,Ce=m.placeholder,Ie=Ce===void 0?!1:Ce,Te=m.keyCode,Oe=Te===void 0?null:Te,Ae=typeof E=="string"?E.trim():E,Le=Oe,nt=pe,gt=this._store.items,bt=P||Ae,An=Y||-1,In=oe>=0?this._store.getGroupById(oe):null,ar=gt?gt.length+1:1;return this.config.prependValue&&(Ae=this.config.prependValue+Ae.toString()),this.config.appendValue&&(Ae+=this.config.appendValue.toString()),this._store.dispatch(we({value:Ae,label:bt,id:ar,choiceId:An,groupId:oe,customProperties:pe,placeholder:Ie,keyCode:Le})),this._isSelectOneElement&&this.removeActiveItems(ar),this.passedElement.triggerEvent(lt.addItem,{id:ar,value:Ae,label:bt,customProperties:nt,groupValue:In&&In.value?In.value:void 0,keyCode:Le}),this},y._removeItem=function(m){if(!m||!I("Object",m))return this;var E=m.id,M=m.value,P=m.label,H=m.choiceId,Y=m.groupId,ee=Y>=0?this._store.getGroupById(Y):null;return this._store.dispatch(ze(E,H)),ee&&ee.value?this.passedElement.triggerEvent(lt.removeItem,{id:E,value:M,label:P,groupValue:ee.value}):this.passedElement.triggerEvent(lt.removeItem,{id:E,value:M,label:P}),this},y._addChoice=function(m){var E=m.value,M=m.label,P=M===void 0?null:M,H=m.isSelected,Y=H===void 0?!1:H,ee=m.isDisabled,oe=ee===void 0?!1:ee,ve=m.groupId,pe=ve===void 0?-1:ve,Ce=m.customProperties,Ie=Ce===void 0?null:Ce,Te=m.placeholder,Oe=Te===void 0?!1:Te,Ae=m.keyCode,Le=Ae===void 0?null:Ae;if(!(typeof E=="undefined"||E===null)){var nt=this._store.choices,gt=P||E,bt=nt?nt.length+1:1,An=this._baseId+"-"+this._idNames.itemChoice+"-"+bt;this._store.dispatch(xe({id:bt,groupId:pe,elementId:An,value:E,label:gt,disabled:oe,customProperties:Ie,placeholder:Oe,keyCode:Le})),Y&&this._addItem({value:E,label:gt,choiceId:bt,customProperties:Ie,placeholder:Oe,keyCode:Le})}},y._addGroup=function(m){var E=this,M=m.group,P=m.id,H=m.valueKey,Y=H===void 0?"value":H,ee=m.labelKey,oe=ee===void 0?"label":ee,ve=I("Object",M)?M.choices:Array.from(M.getElementsByTagName("OPTION")),pe=P||Math.floor(new Date().valueOf()*Math.random()),Ce=M.disabled?M.disabled:!1;if(ve){this._store.dispatch(mt({value:M.label,id:pe,active:!0,disabled:Ce}));var Ie=function(Oe){var Ae=Oe.disabled||Oe.parentNode&&Oe.parentNode.disabled;E._addChoice({value:Oe[Y],label:I("Object",Oe)?Oe[oe]:Oe.innerHTML,isSelected:Oe.selected,isDisabled:Ae,groupId:pe,customProperties:Oe.customProperties,placeholder:Oe.placeholder})};ve.forEach(Ie)}else this._store.dispatch(mt({value:M.label,id:M.id,active:!1,disabled:M.disabled}))},y._getTemplate=function(m){var E;if(!m)return null;for(var M=this.config.classNames,P=arguments.length,H=new Array(P>1?P-1:0),Y=1;Y{(function(t,n){typeof Ds=="object"&&typeof rv!="undefined"?n(Ds):typeof define=="function"&&define.amd?define(["exports"],n):(t=typeof globalThis!="undefined"?globalThis:t||self,n(t.immutableJSONPatch={}))})(Ds,function(t){"use strict";function n(K){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?n=function(U){return typeof U}:n=function(U){return U&&typeof Symbol=="function"&&U.constructor===Symbol&&U!==Symbol.prototype?"symbol":typeof U},n(K)}function e(K,V){return JSON.stringify(K)===JSON.stringify(V)}function r(K,V){return K===V}function i(K){return K.slice(0,K.length-1)}function a(K){return K[K.length-1]}function o(K,V){var U=arguments.length>2&&arguments[2]!==void 0?arguments[2]:r;if(K.length3&&arguments[3]!==void 0?arguments[3]:!1;if(V.length===0)return U;var ye=V[0],Ee=g(K?K[ye]:void 0,V.slice(1),U,G);if(!s(K))if(G){var Fe=typeof ye=="number"?[]:{};return Fe[ye]=Ee,Fe}else throw new Error("Path does not exist");return h(K,ye,Ee)}function w(K,V,U){if(V.length===0)return U(K);if(!s(K))throw new Error("Path doesn't exist");var G=V[0],ye=w(K[G],V.slice(1),U);return h(K,G,ye)}function S(K,V){if(V.length===0)return K;if(!s(K))throw new Error("Path does not exist");if(V.length===1){var U=V[0];if(U in K){var G=f(K);return Array.isArray(G)?G.splice(U,1):delete G[U],G}else return K}var ye=V[0],Ee=S(K[ye],V.slice(1));return h(K,ye,Ee)}function T(K,V,U){var G=V.slice(0,V.length-1),ye=V[V.length-1];return w(K,G,function(Ee){if(!Array.isArray(Ee))throw new TypeError("Array expected at path "+JSON.stringify(G));var Fe=f(Ee);return Fe.splice(ye,0,U),Fe})}function k(K,V){return K===void 0?!1:V.length===0?!0:k(K[V[0]],V.slice(1))}function D(K){var V=K.split("/");return V.shift(),V.map(function(U){return U.replace(/~1/g,"/").replace(/~0/g,"~")})}function N(K){return K.map(function(V){return"/"+String(V).replace(/~/g,"~0").replace(/\//g,"~1")}).join("")}function C(K,V,U){for(var G=K,ye=0;ye{(function(){var t;typeof ku!="undefined"?t=ku.exports=r:t=function(){return this||(0,eval)("this")}(),t.format=r,t.vsprintf=e,typeof console!="undefined"&&typeof console.log=="function"&&(t.printf=n);function n(){console.log(r.apply(null,arguments))}function e(i,a){return r.apply(null,[i].concat(a))}function r(i){for(var a=1,o=[].slice.call(arguments),s=0,u=i.length,l="",c,d=!1,f,h,p=!1,g,w=function(){return o[a++]},S=function(){for(var T="";/\d/.test(i[s]);)T+=i[s++],c=i[s];return T.length>0?parseInt(T):null};sLu});function Fa(t,n){let e=Object.keys(n).map(r=>Ty(t,r,n[r]));return e.length===1?e[0]:function(){e.forEach(r=>r())}}function Ty(t,n,e){let r=t[n],i=t.hasOwnProperty(n),a=e(r);return r&&Object.setPrototypeOf(a,r),Object.setPrototypeOf(o,a),t[n]=o,s;function o(...u){return a===r&&t[n]===o&&s(),a.apply(this,u)}function s(){t[n]===o&&(i?t[n]=r:delete t[n]),a!==r&&(a=r,Object.setPrototypeOf(o,r||Function))}}var vn=me(require("obsidian"));var Ni,ge,Ou,My,Fi,Nu,Fu,Ru,Ra={},Hu=[],Cy=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function jn(t,n){for(var e in n)t[e]=n[e];return t}function Bu(t){var n=t.parentNode;n&&n.removeChild(t)}function wn(t,n,e){var r,i,a,o={};for(a in n)a=="key"?r=n[a]:a=="ref"?i=n[a]:o[a]=n[a];if(arguments.length>2&&(o.children=arguments.length>3?Ni.call(arguments,2):e),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)o[a]===void 0&&(o[a]=t.defaultProps[a]);return Ri(t,o,r,i,null)}function Ri(t,n,e,r,i){var a={type:t,props:n,key:e,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:i==null?++Ou:i};return i==null&&ge.vnode!=null&&ge.vnode(a),a}function Js(){return{current:null}}function Pn(t){return t.children}function hn(t,n){this.props=t,this.context=n}function Wr(t,n){if(n==null)return t.__?Wr(t.__,t.__.__k.indexOf(t)+1):null;for(var e;n0?Ri(h.type,h.props,h.key,null,h.__v):h)!=null){if(h.__=e,h.__b=e.__b+1,(f=S[c])===null||f&&h.key==f.key&&h.type===f.type)S[c]=void 0;else for(d=0;d2&&(o.children=arguments.length>3?Ni.call(arguments,2):e),Ri(t.type,o,r||t.key,i||t.ref,null)}function Zs(t,n){var e={__c:n="__cC"+Ru++,__:t,Consumer:function(r,i){return r.children(i)},Provider:function(r){var i,a;return this.getChildContext||(i=[],(a={})[n]=this,this.getChildContext=function(){return a},this.shouldComponentUpdate=function(o){this.props.value!==o.value&&i.some(Gs)},this.sub=function(o){i.push(o);var s=o.componentWillUnmount;o.componentWillUnmount=function(){i.splice(i.indexOf(o),1),s&&s.call(o)}}),r.children}};return e.Provider.__=e.Consumer.contextType=e}Ni=Hu.slice,ge={__e:function(t,n,e,r){for(var i,a,o;n=n.__;)if((i=n.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(t)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,r||{}),o=i.__d),o)return i.__E=i}catch(s){t=s}throw t}},Ou=0,My=function(t){return t!=null&&t.constructor===void 0},hn.prototype.setState=function(t,n){var e;e=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=jn({},this.state),typeof t=="function"&&(t=t(jn({},e),this.props)),t&&jn(e,t),t!=null&&this.__v&&(n&&this.__h.push(n),Gs(this))},hn.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Gs(this))},hn.prototype.render=Pn,Fi=[],Nu=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ha.__r=0,Ru=0;var Yr,$t,Qu,Jr=0,Xu=[],Zu=ge.__b,ed=ge.__r,td=ge.diffed,nd=ge.__c,rd=ge.unmount;function Hi(t,n){ge.__h&&ge.__h($t,t,Jr||n),Jr=0;var e=$t.__H||($t.__H={__:[],__h:[]});return t>=e.__.length&&e.__.push({}),e.__[t]}function Ka(t){return Jr=1,el(ld,t)}function el(t,n,e){var r=Hi(Yr++,2);return r.t=t,r.__c||(r.__=[e?e(n):ld(void 0,n),function(i){var a=r.t(r.__[0],i);r.__[0]!==a&&(r.__=[a,r.__[1]],r.__c.setState({}))}],r.__c=$t),r.__}function $a(t,n){var e=Hi(Yr++,3);!ge.__s&&rl(e.__H,n)&&(e.__=t,e.__H=n,$t.__H.__h.push(e))}function tl(t,n){var e=Hi(Yr++,4);!ge.__s&&rl(e.__H,n)&&(e.__=t,e.__H=n,$t.__h.push(e))}function Ua(t){return Jr=5,za(function(){return{current:t}},[])}function id(t,n,e){Jr=6,tl(function(){return typeof t=="function"?(t(n()),function(){return t(null)}):t?(t.current=n(),function(){return t.current=null}):void 0},e==null?e:e.concat(t))}function za(t,n){var e=Hi(Yr++,7);return rl(e.__H,n)&&(e.__=t(),e.__H=n,e.__h=t),e.__}function Va(t,n){return Jr=8,za(function(){return t},n)}function ad(t){var n=$t.context[t.__c],e=Hi(Yr++,9);return e.c=t,n?(e.__==null&&(e.__=!0,n.sub($t)),n.props.value):t.__}function od(t,n){ge.useDebugValue&&ge.useDebugValue(n?n(t):t)}function Ly(){for(var t;t=Xu.shift();)if(t.__P)try{t.__H.__h.forEach(ja),t.__H.__h.forEach(nl),t.__H.__h=[]}catch(n){t.__H.__h=[],ge.__e(n,t.__v)}}ge.__b=function(t){$t=null,Zu&&Zu(t)},ge.__r=function(t){ed&&ed(t),Yr=0;var n=($t=t.__c).__H;n&&(n.__h.forEach(ja),n.__h.forEach(nl),n.__h=[])},ge.diffed=function(t){td&&td(t);var n=t.__c;n&&n.__H&&n.__H.__h.length&&(Xu.push(n)!==1&&Qu===ge.requestAnimationFrame||((Qu=ge.requestAnimationFrame)||function(e){var r,i=function(){clearTimeout(a),sd&&cancelAnimationFrame(r),setTimeout(e)},a=setTimeout(i,100);sd&&(r=requestAnimationFrame(i))})(Ly)),$t=null},ge.__c=function(t,n){n.some(function(e){try{e.__h.forEach(ja),e.__h=e.__h.filter(function(r){return!r.__||nl(r)})}catch(r){n.some(function(i){i.__h&&(i.__h=[])}),n=[],ge.__e(r,e.__v)}}),nd&&nd(t,n)},ge.unmount=function(t){rd&&rd(t);var n,e=t.__c;e&&e.__H&&(e.__H.__.forEach(function(r){try{ja(r)}catch(i){n=i}}),n&&ge.__e(n,e.__v))};var sd=typeof requestAnimationFrame=="function";function ja(t){var n=$t,e=t.__c;typeof e=="function"&&(t.__c=void 0,e()),$t=n}function nl(t){var n=$t;t.__c=t.__(),$t=n}function rl(t,n){return!t||t.length!==n.length||n.some(function(e,r){return e!==t[r]})}function ld(t,n){return typeof n=="function"?n(t):n}function cd(t,n){for(var e in n)t[e]=n[e];return t}function il(t,n){for(var e in t)if(e!=="__source"&&!(e in n))return!0;for(var r in n)if(r!=="__source"&&t[r]!==n[r])return!0;return!1}function al(t){this.props=t}function Py(t,n){function e(i){var a=this.props.ref,o=a==i.ref;return!o&&a&&(a.call?a(null):a.current=null),n?!n(this.props,i)||!o:il(this.props,i)}function r(i){return this.shouldComponentUpdate=e,wn(t,i)}return r.displayName="Memo("+(t.displayName||t.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(al.prototype=new hn).isPureReactComponent=!0,al.prototype.shouldComponentUpdate=function(t,n){return il(this.props,t)||il(this.state,n)};var ud=ge.__b;ge.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),ud&&ud(t)};var Oy=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Ny(t){function n(e,r){var i=cd({},e);return delete i.ref,t(i,!(r=e.ref||r)||typeof r=="object"&&Object.keys(r).length===0?null:r)}return n.$$typeof=Oy,n.render=n,n.prototype.isReactComponent=n.__f=!0,n.displayName="ForwardRef("+(t.displayName||t.name)+")",n}var dd=function(t,n){return t==null?null:On(On(t).map(n))},Fy={map:dd,forEach:dd,count:function(t){return t?On(t).length:0},only:function(t){var n=On(t);if(n.length!==1)throw"Children.only";return n[0]},toArray:On},Ry=ge.__e;ge.__e=function(t,n,e,r){if(t.then){for(var i,a=n;a=a.__;)if((i=a.__c)&&i.__c)return n.__e==null&&(n.__e=e.__e,n.__k=e.__k),i.__c(t,n)}Ry(t,n,e,r)};var fd=ge.unmount;function Wa(){this.__u=0,this.t=null,this.__b=null}function hd(t){var n=t.__.__c;return n&&n.__e&&n.__e(t)}function Hy(t){var n,e,r;function i(a){if(n||(n=t()).then(function(o){e=o.default||o},function(o){r=o}),r)throw r;if(!e)throw n;return wn(e,a)}return i.displayName="Lazy",i.__f=!0,i}function Bi(){this.u=null,this.o=null}ge.unmount=function(t){var n=t.__c;n&&n.__R&&n.__R(),n&&t.__h===!0&&(t.type=null),fd&&fd(t)},(Wa.prototype=new hn).__c=function(t,n){var e=n.__c,r=this;r.t==null&&(r.t=[]),r.t.push(e);var i=hd(r.__v),a=!1,o=function(){a||(a=!0,e.__R=null,i?i(s):s())};e.__R=o;var s=function(){if(!--r.__u){if(r.state.__e){var l=r.state.__e;r.__v.__k[0]=function d(f,h,p){return f&&(f.__v=null,f.__k=f.__k&&f.__k.map(function(g){return d(g,h,p)}),f.__c&&f.__c.__P===h&&(f.__e&&p.insertBefore(f.__e,f.__d),f.__c.__e=!0,f.__c.__P=p)),f}(l,l.__c.__P,l.__c.__O)}var c;for(r.setState({__e:r.__b=null});c=r.t.pop();)c.forceUpdate()}},u=n.__h===!0;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),t.then(o,o)},Wa.prototype.componentWillUnmount=function(){this.t=[]},Wa.prototype.render=function(t,n){if(this.__b){if(this.__v.__k){var e=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function a(o,s,u){return o&&(o.__c&&o.__c.__H&&(o.__c.__H.__.forEach(function(l){typeof l.__c=="function"&&l.__c()}),o.__c.__H=null),(o=cd({},o)).__c!=null&&(o.__c.__P===u&&(o.__c.__P=s),o.__c=null),o.__k=o.__k&&o.__k.map(function(l){return a(l,s,u)})),o}(this.__b,e,r.__O=r.__P)}this.__b=null}var i=n.__e&&wn(Pn,null,t.fallback);return i&&(i.__h=null),[wn(Pn,null,n.__e?null:t.children),i]};var pd=function(t,n,e){if(++e[1]===e[0]&&t.o.delete(n),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.o.size))for(e=t.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),n.i.removeChild(r)}}),qr(wn(By,{context:n.context},t.__v),n.l)):n.l&&n.componentWillUnmount()}function ol(t,n){return wn(Ky,{__v:t,i:n})}(Bi.prototype=new hn).__e=function(t){var n=this,e=hd(n.__v),r=n.o.get(t);return r[0]++,function(i){var a=function(){n.props.revealOrder?(r.push(i),pd(n,t,r)):i()};e?e(a):a()}},Bi.prototype.render=function(t){this.u=null,this.o=new Map;var n=On(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&n.reverse();for(var e=n.length;e--;)this.o.set(n[e],this.u=[1,0,this.u]);return t.children},Bi.prototype.componentDidUpdate=Bi.prototype.componentDidMount=function(){var t=this;this.o.forEach(function(n,e){pd(t,e,n)})};var md=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.element")||60103,$y=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Uy=typeof document!="undefined",zy=function(t){return(typeof Symbol!="undefined"&&typeof Symbol()=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(t)};function Vy(t,n,e){return n.__k==null&&(n.textContent=""),qr(t,n),typeof e=="function"&&e(),t?t.__c:null}function jy(t,n,e){return Xs(t,n),typeof e=="function"&&e(),t?t.__c:null}hn.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(hn.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var gd=ge.event;function Wy(){}function qy(){return this.cancelBubble}function Yy(){return this.defaultPrevented}ge.event=function(t){return gd&&(t=gd(t)),t.persist=Wy,t.isPropagationStopped=qy,t.isDefaultPrevented=Yy,t.nativeEvent=t};var vd,yd={configurable:!0,get:function(){return this.class}},bd=ge.vnode;ge.vnode=function(t){var n=t.type,e=t.props,r=e;if(typeof n=="string"){var i=n.indexOf("-")===-1;for(var a in r={},e){var o=e[a];Uy&&a==="children"&&n==="noscript"||a==="value"&&"defaultValue"in e&&o==null||(a==="defaultValue"&&"value"in e&&e.value==null?a="value":a==="download"&&o===!0?o="":/ondoubleclick/i.test(a)?a="ondblclick":/^onchange(textarea|input)/i.test(a+n)&&!zy(e.type)?a="oninput":/^onfocus$/i.test(a)?a="onfocusin":/^onblur$/i.test(a)?a="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(a)?a=a.toLowerCase():i&&$y.test(a)?a=a.replace(/[A-Z0-9]/,"-$&").toLowerCase():o===null&&(o=void 0),r[a]=o)}n=="select"&&r.multiple&&Array.isArray(r.value)&&(r.value=On(e.children).forEach(function(s){s.props.selected=r.value.indexOf(s.props.value)!=-1})),n=="select"&&r.defaultValue!=null&&(r.value=On(e.children).forEach(function(s){s.props.selected=r.multiple?r.defaultValue.indexOf(s.props.value)!=-1:r.defaultValue==s.props.value})),t.props=r,e.class!=e.className&&(yd.enumerable="className"in e,e.className!=null&&(r.class=e.className),Object.defineProperty(r,"className",yd))}t.$$typeof=md,bd&&bd(t)};var wd=ge.__r;ge.__r=function(t){wd&&wd(t),vd=t.__c};var Jy={ReactCurrentDispatcher:{current:{readContext:function(t){return vd.__n[t.__c].props.value}}}};function Gy(t){return wn.bind(null,t)}function Ed(t){return!!t&&t.$$typeof===md}function Qy(t){return Ed(t)?Gu.apply(null,arguments):t}function Xy(t){return!!t.__k&&(qr(null,t),!0)}function Zy(t){return t&&(t.base||t.nodeType===1&&t)||null}var eb=function(t,n){return t(n)},tb=function(t,n){return t(n)};var v={useState:Ka,useReducer:el,useEffect:$a,useLayoutEffect:tl,useRef:Ua,useImperativeHandle:id,useMemo:za,useCallback:Va,useContext:ad,useDebugValue:od,version:"17.0.2",Children:Fy,render:Vy,hydrate:jy,unmountComponentAtNode:Xy,createPortal:ol,createElement:wn,createContext:Zs,createFactory:Gy,cloneElement:Qy,createRef:Js,Fragment:Pn,isValidElement:Ed,findDOMNode:Zy,Component:hn,PureComponent:al,memo:Py,forwardRef:Ny,flushSync:tb,unstable_batchedUpdates:eb,StrictMode:Pn,Suspense:Wa,SuspenseList:Bi,lazy:Hy,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Jy};var Lg=me(It());var We=v.createContext(null),Ya=v.createContext(null);var Bd=me(It()),Ja=me(require("obsidian"));var Pd=me(Ad()),sr=me(It());function Id(t){return Object.prototype.toString.call(t)==="[object Object]"}function Ld(t){var n,e;return Id(t)===!1?!1:(n=t.constructor,n===void 0?!0:(e=n.prototype,!(Id(e)===!1||e.hasOwnProperty("isPrototypeOf")===!1)))}function xb(t,n){return t.length!==n.length?!1:t.every((e,r,i)=>r===i.length-1?e!==n[r]:e===n[r])}function kb(t,n){return t.length===n.length&&t.every((e,r)=>e===n[r])}var an;(function(i){i[i.Before=0]="Before",i[i.After=1]="After",i[i.Self=2]="Self",i[i.NotSiblings=3]="NotSiblings"})(an||(an={}));function Ui(t,n){if(kb(t,n))return 2;if(!xb(t,n))return 3;let e=t.length-1;return t[e]=0;r--)e={children:{[t[r]]:e}};return e}function zi(t,n){let e=n;for(let r=t.length-2;r>=0;r--)e={children:{[t[r]]:e}};return e}function Od(t){return zi(t,{children:{$splice:[[t[t.length-1],1]]}})}function Nd(t,n,e=0){return zi(t,{children:{$splice:[[t[t.length-1]+e,0,...n]]}})}function Tb(t,n){return zi(t,{children:{$push:n}})}function Mb(t,n){return zi(t,{children:{$unshift:n}})}function Fd(t,n,e,r){let i=r?r(vt(t,n)):vt(t,n),o=Ui(n,e)===an.After?-1:0,s=Od(n),u=Nd(e,[i],o),l=(0,Pd.default)(s,u,{isMergeableObject:d=>Ld(d)||Array.isArray(d)});return(0,sr.default)(t,l)}function kr(t,n){return(0,sr.default)(t,Od(n))}function lr(t,n,e){return(0,sr.default)(t,Nd(n,e))}function ul(t,n,e){return(0,sr.default)(t,Tb(n,e))}function Rd(t,n,e){return(0,sr.default)(t,Mb(n,e))}function Hd(t,n,e){return(0,sr.default)(t,_b(n,e))}function dl(t,n,e){return(0,sr.default)(t,zi(n,e))}var fl="kanban-plugin";function Qr(){}function $(t){return`${fl}__${t}`}function Ke(t=9){return Math.random().toString(36).slice(2,2+t)}function hl(t,n,e,r,i){var l,c;let a=vt(t,n.slice(0,-1)),o=vt(e,r.slice(0,-1)),s=(l=a==null?void 0:a.data)==null?void 0:l.shouldMarkItemsComplete,u=(c=o==null?void 0:o.data)==null?void 0:c.shouldMarkItemsComplete;return!s&&!u||u===!!i.data.isComplete?i:(0,Bd.default)(i,{data:{isComplete:{$set:u}}})}function Ga(){let t=v.useRef(!1);return{oncompositionstart:()=>{t.current=!0},oncompositionend:()=>{t.current=!1},getShouldIMEBlockAction:()=>t.current}}var Cb=/<%/;async function Kd(t,n){let e=n?t.app.vault.getAbstractFileByPath(n):null;if(e&&e instanceof Ja.TFile){let r=t.app.workspace.activeLeaf.view;try{r instanceof Ja.MarkdownView&&r.getMode()!=="source"&&await r.setState({...r.getState(),mode:"source"},{});let{templatesEnabled:i,templaterEnabled:a,templatesPlugin:o,templaterPlugin:s}=pl(t.app),u=await t.app.vault.read(e);if(i&&a)return Cb.test(u)?await s.append_template_to_active_file(e):await o.instance.insertTemplate(e);if(i)return await o.instance.insertTemplate(e);if(a)return await s.append_template_to_active_file(e);await t.app.vault.modify(t.app.workspace.getActiveFile(),u)}catch(i){console.error(i),t.setError(i)}}}function Xr(t){var s,u,l,c,d;let n=t.internalPlugins.plugins,e=(s=n["daily-notes"])==null?void 0:s.enabled,r=(u=n["daily-notes"])==null?void 0:u.instance.options.format,i=(l=t.plugins.plugins["nldates-obsidian"])==null?void 0:l.settings.format,a=(c=n.templates)==null?void 0:c.enabled,o=(d=n.templates)==null?void 0:d.instance.options.dateFormat;return e&&r||i||a&&o||"YYYY-MM-DD"}function Vi(t){var a,o,s;let n=t.internalPlugins.plugins,e=(a=t.plugins.plugins["nldates-obsidian"])==null?void 0:a.settings.timeFormat,r=(o=n.templates)==null?void 0:o.enabled,i=(s=n.templates)==null?void 0:s.instance.options.timeFormat;return e||r&&i||"HH:mm"}var $d=/[\\^$.*+?()[\]{}|]/g,Db=RegExp($d.source);function Fn(t){return t&&Db.test(t)?t.replace($d,"\\$&"):t||""}function pl(t){var s;let n=t.internalPlugins.plugins.templates,e=n.enabled,r=t.plugins.plugins["templater-obsidian"],i=t.plugins.enabledPlugins.has("templater-obsidian"),a=r&&((s=this.app.plugins.plugins["templater-obsidian"].settings)==null?void 0:s.empty_file_template),o=e?n.instance.options.folder:r?r.settings.template_folder:void 0;return{templatesPlugin:n,templatesEnabled:e,templaterPlugin:r==null?void 0:r.templater,templaterEnabled:i,templaterEmptyFileTemplate:a,templateFolder:o}}function wt(t){if(typeof t=="string"||typeof t=="number")return""+t;let n="";if(Array.isArray(t))for(let e=0,r;e{r.has(n)&&(r.delete(n),r.size===0&&e.push(i))}),e.forEach(r=>{this.idScopes.delete(r),this.scrollStates.delete(r)})}};var Et=v.createContext(null),cr=v.createContext(""),Wi=v.createContext(null),qi=v.createContext(new ji),Qa=v.createContext(null),Xa=v.createContext(null);var Ud={bottom:0,height:0,left:0,right:0,top:0,width:0,x:0,y:0,toJSON(){}},zd=[0,0,0,0];function Qe(t){return t===void 0?0:t}function Za(t,n,e,r){return[t.left+Qe(n==null?void 0:n.x)+Qe(e==null?void 0:e.x)-Qe(r==null?void 0:r.x),t.top+Qe(n==null?void 0:n.y)+Qe(e==null?void 0:e.y)-Qe(r==null?void 0:r.y),t.left+t.width+Qe(n==null?void 0:n.x)+Qe(e==null?void 0:e.x)-Qe(r==null?void 0:r.x),t.top+t.height+Qe(n==null?void 0:n.y)+Qe(e==null?void 0:e.y)-Qe(r==null?void 0:r.y)]}function ml(t,n,e,r){let i=Za(t,n,e,null);return r==="top"?(i[3]=i[1]+35,i):r==="right"?(i[0]=i[0]+t.width-35,i):r==="bottom"?(i[1]=i[1]+t.height-35,i):(i[2]=i[0]+35,i)}function eo(t,n,e,r,i,a){return[t-Qe(i==null?void 0:i.x)-Qe(a==null?void 0:a.x),n-Qe(i==null?void 0:i.y)-Qe(a==null?void 0:a.y),e-Qe(i==null?void 0:i.x)-Qe(a==null?void 0:a.x),r-Qe(i==null?void 0:i.y)-Qe(a==null?void 0:a.y)]}var Ab=t=>Ib(t,(n,e)=>n{if(o.entityId===e)return Infinity;let s=o.getHitbox(),u=jd(s)[0],l=Lb(n),c=o.getData().sortAxis==="horizontal"?"x":"y",d=l[c]>r[c]?1e3:0;return Zr(u,r)+d}),a=Ab(i);return t[a]?t[a]:null}function vl(t){let{scrollLeft:n,scrollTop:e,scrollWidth:r,scrollHeight:i,offsetWidth:a,offsetHeight:o}=t,s=n,u=e,l=r-a,c=i-o;return{x:s,y:u,maxX:Math.max(l,0),maxY:Math.max(c,0)}}function Wd(t,n,e){let r=Math.trunc((e.x-n.x)*100)/100,i=Math.trunc((e.y-n.y)*100)/100;return[t[0]+r,t[1]+i,t[2]+r,t[3]+i]}function yl(t,n=[0,0,0,0]){let e=t[0]-n[0],r=t[1]-n[1],i=t[2]+n[2],o=t[3]+n[3]-r;return{width:i-e,height:o}}var bl=class{constructor(n,e,r,i,a,o,s,u,l,c){this.isVisible=!1;this.id=r,this.instanceId=Ke(),this.scopeId=e,this.entityId=`${e}-${r}`,this.dndManager=n,this.index=i,this.children=new Map,this.parent=a,this.scrollParent=o,this.getEntityData=c,this.sortManager=s,this.pollForNodes(u,l)}pollForNodes(n,e){!n()||!e()?requestAnimationFrame(()=>this.pollForNodes(n,e)):this.initNodes(n(),e())}initNodes(n,e){var r,i;if(this.entityNode=n,this.measureNode=e,e.dataset.hitboxid=this.entityId,(r=this.sortManager)==null||r.registerSortable(this.entityId,this.getEntity(Ud),n,e),this.scrollParent)this.scrollParent.registerObserverHandler(this.entityId,e,a=>{var o,s;if(a.isIntersecting){let u=this.getEntity(a.boundingClientRect);(o=this.parent)==null||o.children.set(this.entityId,{entity:u,manager:this}),this.dndManager.observeResize(e),(!this.parent||this.parent.isVisible)&&(this.dndManager.registerHitboxEntity(this.entityId,u),this.children.forEach((l,c)=>{this.dndManager.registerHitboxEntity(c,l.entity)}),this.setVisibility(!0))}else this.dndManager.unregisterHitboxEntity(this.entityId),this.children.forEach((u,l)=>{this.dndManager.unregisterHitboxEntity(l)}),(s=this.parent)==null||s.children.delete(this.entityId),this.dndManager.unobserveResize(e),this.setVisibility(!1)});else{let a=this.getEntity(e.getBoundingClientRect());this.dndManager.observeResize(e),this.dndManager.registerHitboxEntity(this.entityId,a),(i=this.parent)==null||i.children.set(this.entityId,{entity:a,manager:this}),this.setVisibility(!0)}}setVisibility(n){this.isVisible=n,this.children.forEach(e=>{e.manager.setVisibility(n)})}destroy(){var n,e,r;this.dndManager.unobserveResize(this.measureNode),(n=this.sortManager)==null||n.unregisterSortable(this.entityId),(e=this.scrollParent)==null||e.unregisterObserverHandler(this.entityId,this.measureNode),this.dndManager.unregisterHitboxEntity(this.entityId),(r=this.parent)==null||r.children.delete(this.entityId)}getPath(){var n;return[...((n=this.parent)==null?void 0:n.getPath())||[],this.index]}getEntity(n){var r,i;let e=this;return{scopeId:this.scopeId,entityId:this.entityId,initial:Za(n,((r=e.scrollParent)==null?void 0:r.scrollState)||on,((i=e.scrollParent)==null?void 0:i.getScrollShift())||Rn,null),getParentScrollState(){var a;return((a=e.scrollParent)==null?void 0:a.scrollState)||on},getParentScrollShift(){var a;return((a=e.scrollParent)==null?void 0:a.getScrollShift())||Rn},recalcInitial(){var a,o;this.initial=Za(e.measureNode.getBoundingClientRect(),((a=e.scrollParent)==null?void 0:a.scrollState)||on,((o=e.scrollParent)==null?void 0:o.getScrollShift())||Rn,null)},getHitbox(){return eo(this.initial[0],this.initial[1],this.initial[2],this.initial[3],this.getParentScrollState(),this.getParentScrollShift())},getPath(){return e.getPath()},getData(){var a;return{...e.getEntityData(),sortAxis:(a=e.sortManager)==null?void 0:a.axis}}}}};var ur=v.memo(function({id:n,index:e,elementRef:r,measureRef:i,children:a,data:o}){let s=v.useContext(Et),u=v.useContext(Qa),l=v.useContext(cr),c=v.useContext(Xa),d=v.useContext(Wi),f=v.useRef(o),h=v.useRef();f.current=o;let p=v.useMemo(()=>{if(s){h.current&&h.current.destroy();let g=new bl(s,l,n,e,c,d,u,()=>r.current,()=>i.current,()=>f.current);return h.current=g,g}return null},[n,e,s,l,c,d,u]);return v.useEffect(()=>()=>{var g;return(g=h.current)==null?void 0:g.destroy()},[]),p?v.createElement(Xa.Provider,{value:p},a):null});function Wn(t){let n=v.useContext(Xa),e=(n==null?void 0:n.getPath())||[];return t!==void 0&&e.push(t),v.useMemo(()=>e,e)}var Ql=me(ah()),dp=me(require("obsidian"));var Jw=function(n){var e=[],r=null,i=function(){for(var o=arguments.length,s=new Array(o),u=0;u0?r:t.name,writable:!1,configurable:!1,enumerable:!0})}return e}function Qw(t){var n=t.name,e=n&&n.lastIndexOf(".")!==-1;if(e&&!t.type){var r=n.split(".").pop().toLowerCase(),i=Gw.get(r);i&&Object.defineProperty(t,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return t}var Xw=[".DS_Store","Thumbs.db"];function Bl(t){return ci(this,void 0,void 0,function(){return ui(this,function(n){return[2,Zw(t)&&t.dataTransfer?nE(t.dataTransfer,t.type):eE(t)]})})}function Zw(t){return!!t.dataTransfer}function eE(t){var n=tE(t.target)?t.target.files?Kl(t.target.files):[]:[];return n.map(function(e){return ea(e)})}function tE(t){return t!==null}function nE(t,n){return ci(this,void 0,void 0,function(){var e,r;return ui(this,function(i){switch(i.label){case 0:return t.items?(e=Kl(t.items).filter(function(a){return a.kind==="file"}),n!=="drop"?[2,e]:[4,Promise.all(e.map(rE))]):[3,2];case 1:return r=i.sent(),[2,Dh(Ah(r))];case 2:return[2,Dh(Kl(t.files).map(function(a){return ea(a)}))]}})})}function Dh(t){return t.filter(function(n){return Xw.indexOf(n.name)===-1})}function Kl(t){for(var n=[],e=0;e",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1};var Mo={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(t){var n=t%100;if(n>3&&n<21)return"th";switch(n%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},Co=Mo;var Lt=function(t,n){return n===void 0&&(n=2),("000"+t).slice(n*-1)},Qt=function(t){return t===!0?1:0};function $l(t,n){var e;return function(){var r=this,i=arguments;clearTimeout(e),e=setTimeout(function(){return t.apply(r,i)},n)}}var Do=function(t){return t instanceof Array?t:[t]};function Pt(t,n,e){if(e===!0)return t.classList.add(n);t.classList.remove(n)}function Ve(t,n,e){var r=window.document.createElement(t);return n=n||"",e=e||"",r.className=n,e!==void 0&&(r.textContent=e),r}function ta(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function Ul(t,n){if(n(t))return t;if(t.parentNode)return Ul(t.parentNode,n)}function na(t,n){var e=Ve("div","numInputWrapper"),r=Ve("input","numInput "+t),i=Ve("span","arrowUp"),a=Ve("span","arrowDown");if(navigator.userAgent.indexOf("MSIE 9.0")===-1?r.type="number":(r.type="text",r.pattern="\\d*"),n!==void 0)for(var o in n)r.setAttribute(o,n[o]);return e.appendChild(r),e.appendChild(i),e.appendChild(a),e}function Xt(t){try{if(typeof t.composedPath=="function"){var n=t.composedPath();return n[0]}return t.target}catch(e){return t.target}}var zl=function(){},ra=function(t,n,e){return e.months[n?"shorthand":"longhand"][t]},Ph={D:zl,F:function(t,n,e){t.setMonth(e.months.longhand.indexOf(n))},G:function(t,n){t.setHours((t.getHours()>=12?12:0)+parseFloat(n))},H:function(t,n){t.setHours(parseFloat(n))},J:function(t,n){t.setDate(parseFloat(n))},K:function(t,n,e){t.setHours(t.getHours()%12+12*Qt(new RegExp(e.amPM[1],"i").test(n)))},M:function(t,n,e){t.setMonth(e.months.shorthand.indexOf(n))},S:function(t,n){t.setSeconds(parseFloat(n))},U:function(t,n){return new Date(parseFloat(n)*1e3)},W:function(t,n,e){var r=parseInt(n),i=new Date(t.getFullYear(),0,2+(r-1)*7,0,0,0,0);return i.setDate(i.getDate()-i.getDay()+e.firstDayOfWeek),i},Y:function(t,n){t.setFullYear(parseFloat(n))},Z:function(t,n){return new Date(n)},d:function(t,n){t.setDate(parseFloat(n))},h:function(t,n){t.setHours((t.getHours()>=12?12:0)+parseFloat(n))},i:function(t,n){t.setMinutes(parseFloat(n))},j:function(t,n){t.setDate(parseFloat(n))},l:zl,m:function(t,n){t.setMonth(parseFloat(n)-1)},n:function(t,n){t.setMonth(parseFloat(n)-1)},s:function(t,n){t.setSeconds(parseFloat(n))},u:function(t,n){return new Date(parseFloat(n))},w:zl,y:function(t,n){t.setFullYear(2e3+parseFloat(n))}},Qn={D:"",F:"",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},di={Z:function(t){return t.toISOString()},D:function(t,n,e){return n.weekdays.shorthand[di.w(t,n,e)]},F:function(t,n,e){return ra(di.n(t,n,e)-1,!1,n)},G:function(t,n,e){return Lt(di.h(t,n,e))},H:function(t){return Lt(t.getHours())},J:function(t,n){return n.ordinal!==void 0?t.getDate()+n.ordinal(t.getDate()):t.getDate()},K:function(t,n){return n.amPM[Qt(t.getHours()>11)]},M:function(t,n){return ra(t.getMonth(),!0,n)},S:function(t){return Lt(t.getSeconds())},U:function(t){return t.getTime()/1e3},W:function(t,n,e){return e.getWeek(t)},Y:function(t){return Lt(t.getFullYear(),4)},d:function(t){return Lt(t.getDate())},h:function(t){return t.getHours()%12?t.getHours()%12:12},i:function(t){return Lt(t.getMinutes())},j:function(t){return t.getDate()},l:function(t,n){return n.weekdays.longhand[t.getDay()]},m:function(t){return Lt(t.getMonth()+1)},n:function(t){return t.getMonth()+1},s:function(t){return t.getSeconds()},u:function(t){return t.getTime()},w:function(t){return t.getDay()},y:function(t){return String(t.getFullYear()).substring(2)}};var Vl=function(t){var n=t.config,e=n===void 0?pr:n,r=t.l10n,i=r===void 0?Mo:r,a=t.isMobile,o=a===void 0?!1:a;return function(s,u,l){var c=l||i;return e.formatDate!==void 0&&!o?e.formatDate(s,u,c):u.split("").map(function(d,f,h){return di[d]&&h[f-1]!=="\\"?di[d](s,c,e):d!=="\\"?d:""}).join("")}},Ao=function(t){var n=t.config,e=n===void 0?pr:n,r=t.l10n,i=r===void 0?Mo:r;return function(a,o,s,u){if(!(a!==0&&!a)){var l=u||i,c,d=a;if(a instanceof Date)c=new Date(a.getTime());else if(typeof a!="string"&&a.toFixed!==void 0)c=new Date(a);else if(typeof a=="string"){var f=o||(e||pr).dateFormat,h=String(a).trim();if(h==="today")c=new Date,s=!0;else if(e&&e.parseDate)c=e.parseDate(a,f);else if(/Z$/.test(h)||/GMT$/.test(h))c=new Date(a);else{for(var p=void 0,g=[],w=0,S=0,T="";wMath.min(n,e)&&t=0?new Date:new Date(e.config.minDate.getTime()),R=Lo(e.config);_.setHours(R.hours,R.minutes,R.seconds,_.getMilliseconds()),e.selectedDates=[_],e.latestSelectedDateObj=_}x!==void 0&&x.type!=="blur"&&Li(x);var W=e._input.value;d(),Yt(),e._input.value!==W&&e._debouncedChange()}function l(x,_){return x%12+12*Qt(_===e.l10n.amPM[1])}function c(x){switch(x%24){case 0:case 12:return 12;default:return x%12}}function d(){if(!(e.hourElement===void 0||e.minuteElement===void 0)){var x=(parseInt(e.hourElement.value.slice(-2),10)||0)%24,_=(parseInt(e.minuteElement.value,10)||0)%60,R=e.secondElement!==void 0?(parseInt(e.secondElement.value,10)||0)%60:0;e.amPM!==void 0&&(x=l(x,e.amPM.textContent));var W=e.config.minTime!==void 0||e.config.minDate&&e.minDateHasTime&&e.latestSelectedDateObj&&Zt(e.latestSelectedDateObj,e.config.minDate,!0)===0,re=e.config.maxTime!==void 0||e.config.maxDate&&e.maxDateHasTime&&e.latestSelectedDateObj&&Zt(e.latestSelectedDateObj,e.config.maxDate,!0)===0;if(e.config.maxTime!==void 0&&e.config.minTime!==void 0&&e.config.minTime>e.config.maxTime){var ae=Io(e.config.minTime.getHours(),e.config.minTime.getMinutes(),e.config.minTime.getSeconds()),xe=Io(e.config.maxTime.getHours(),e.config.maxTime.getMinutes(),e.config.maxTime.getSeconds()),ue=Io(x,_,R);if(ue>xe&&ue=12)]),e.secondElement!==void 0&&(e.secondElement.value=Lt(R)))}function p(x){var _=Xt(x),R=parseInt(_.value)+(x.delta||0);(R/1e3>1||x.key==="Enter"&&!/[^\d]/.test(R.toString()))&&U(R)}function g(x,_,R,W){if(_ instanceof Array)return _.forEach(function(re){return g(x,re,R,W)});if(x instanceof Array)return x.forEach(function(re){return g(re,_,R,W)});x.addEventListener(_,R,W),e._handlers.push({remove:function(){return x.removeEventListener(_,R,W)}})}function w(){Se("onChange")}function S(){if(e.config.wrap&&["open","close","toggle","clear"].forEach(function(R){Array.prototype.forEach.call(e.element.querySelectorAll("[data-"+R+"]"),function(W){return g(W,"click",e[R])})}),e.isMobile){rn();return}var x=$l(ht,50);if(e._debouncedChange=$l(w,oE),e.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&g(e.daysContainer,"mouseover",function(R){e.config.mode==="range"&&Ge(Xt(R))}),g(e._input,"keydown",Fe),e.calendarContainer!==void 0&&g(e.calendarContainer,"keydown",Fe),!e.config.inline&&!e.config.static&&g(window,"resize",x),window.ontouchstart!==void 0?g(window.document,"touchstart",V):g(window.document,"mousedown",V),g(window.document,"focus",V,{capture:!0}),e.config.clickOpens===!0&&(g(e._input,"focus",e.open),g(e._input,"click",e.open)),e.daysContainer!==void 0&&(g(e.monthNav,"click",$r),g(e.monthNav,["keyup","increment"],p),g(e.daysContainer,"click",Cn)),e.timeContainer!==void 0&&e.minuteElement!==void 0&&e.hourElement!==void 0){var _=function(R){return Xt(R).select()};g(e.timeContainer,["increment"],u),g(e.timeContainer,"blur",u,{capture:!0}),g(e.timeContainer,"click",k),g([e.hourElement,e.minuteElement],["focus","click"],_),e.secondElement!==void 0&&g(e.secondElement,"focus",function(){return e.secondElement&&e.secondElement.select()}),e.amPM!==void 0&&g(e.amPM,"click",function(R){u(R)})}e.config.allowInput&&g(e._input,"blur",Ee)}function T(x,_){var R=x!==void 0?e.parseDate(x):e.latestSelectedDateObj||(e.config.minDate&&e.config.minDate>e.now?e.config.minDate:e.config.maxDate&&e.config.maxDate1),e.calendarContainer.appendChild(x);var re=e.config.appendTo!==void 0&&e.config.appendTo.nodeType!==void 0;if((e.config.inline||e.config.static)&&(e.calendarContainer.classList.add(e.config.inline?"inline":"static"),e.config.inline&&(!re&&e.element.parentNode?e.element.parentNode.insertBefore(e.calendarContainer,e._input.nextSibling):e.config.appendTo!==void 0&&e.config.appendTo.appendChild(e.calendarContainer)),e.config.static)){var ae=Ve("div","flatpickr-wrapper");e.element.parentNode&&e.element.parentNode.insertBefore(ae,e.element),ae.appendChild(e.element),e.altInput&&ae.appendChild(e.altInput),ae.appendChild(e.calendarContainer)}!e.config.static&&!e.config.inline&&(e.config.appendTo!==void 0?e.config.appendTo:window.document.body).appendChild(e.calendarContainer)}function C(x,_,R,W){var re=G(_,!0),ae=Ve("span",x,_.getDate().toString());return ae.dateObj=_,ae.$i=W,ae.setAttribute("aria-label",e.formatDate(_,e.config.ariaDateFormat)),x.indexOf("hidden")===-1&&Zt(_,e.now)===0&&(e.todayDateElem=ae,ae.classList.add("today"),ae.setAttribute("aria-current","date")),re?(ae.tabIndex=-1,Kt(_)&&(ae.classList.add("selected"),e.selectedDateElem=ae,e.config.mode==="range"&&(Pt(ae,"startRange",e.selectedDates[0]&&Zt(_,e.selectedDates[0],!0)===0),Pt(ae,"endRange",e.selectedDates[1]&&Zt(_,e.selectedDates[1],!0)===0),x==="nextMonthDay"&&ae.classList.add("inRange")))):ae.classList.add("flatpickr-disabled"),e.config.mode==="range"&&Ye(_)&&!Kt(_)&&ae.classList.add("inRange"),e.weekNumbers&&e.config.showMonths===1&&x!=="prevMonthDay"&&R%7==1&&e.weekNumbers.insertAdjacentHTML("beforeend",""+e.config.getWeek(_)+""),Se("onDayCreate",ae),ae}function O(x){x.focus(),e.config.mode==="range"&&Ge(x)}function B(x){for(var _=x>0?0:e.config.showMonths-1,R=x>0?e.config.showMonths:-1,W=_;W!=R;W+=x)for(var re=e.daysContainer.children[W],ae=x>0?0:re.children.length-1,xe=x>0?re.children.length:-1,ue=ae;ue!=xe;ue+=x){var _e=re.children[ue];if(_e.className.indexOf("hidden")===-1&&G(_e.dateObj))return _e}}function z(x,_){for(var R=x.className.indexOf("Month")===-1?x.dateObj.getMonth():e.currentMonth,W=_>0?e.config.showMonths:-1,re=_>0?1:-1,ae=R-e.currentMonth;ae!=W;ae+=re)for(var xe=e.daysContainer.children[ae],ue=R-e.currentMonth===ae?x.$i+_:_<0?xe.children.length-1:0,_e=xe.children.length,le=ue;le>=0&&le<_e&&le!=(_>0?_e:-1);le+=re){var we=xe.children[le];if(we.className.indexOf("hidden")===-1&&G(we.dateObj)&&Math.abs(x.$i-le)>=Math.abs(_))return O(we)}e.changeMonth(re),Q(B(re),0)}function Q(x,_){var R=a(),W=ye(R||document.body),re=x!==void 0?x:W?R:e.selectedDateElem!==void 0&&ye(e.selectedDateElem)?e.selectedDateElem:e.todayDateElem!==void 0&&ye(e.todayDateElem)?e.todayDateElem:B(_>0?1:-1);re===void 0?e._input.focus():W?z(re,_):O(re)}function X(x,_){for(var R=(new Date(x,_,1).getDay()-e.l10n.firstDayOfWeek+7)%7,W=e.utils.getDaysInMonth((_-1+12)%12,x),re=e.utils.getDaysInMonth(_,x),ae=window.document.createDocumentFragment(),xe=e.config.showMonths>1,ue=xe?"prevMonthDay hidden":"prevMonthDay",_e=xe?"nextMonthDay hidden":"nextMonthDay",le=W+1-R,we=0;le<=W;le++,we++)ae.appendChild(C("flatpickr-day "+ue,new Date(x,_-1,le),le,we));for(le=1;le<=re;le++,we++)ae.appendChild(C("flatpickr-day",new Date(x,_,le),le,we));for(var ze=re+1;ze<=42-R&&(e.config.showMonths===1||we%7!=0);ze++,we++)ae.appendChild(C("flatpickr-day "+_e,new Date(x,_+1,ze%re),ze,we));var At=Ve("div","dayContainer");return At.appendChild(ae),At}function ie(){if(e.daysContainer!==void 0){ta(e.daysContainer),e.weekNumbers&&ta(e.weekNumbers);for(var x=document.createDocumentFragment(),_=0;_1||e.config.monthSelectorType!=="dropdown")){var x=function(W){return e.config.minDate!==void 0&&e.currentYear===e.config.minDate.getFullYear()&&We.config.maxDate.getMonth())};e.monthsDropdownContainer.tabIndex=-1,e.monthsDropdownContainer.innerHTML="";for(var _=0;_<12;_++)if(!!x(_)){var R=Ve("option","flatpickr-monthDropdown-month");R.value=new Date(e.currentYear,_).getMonth().toString(),R.textContent=ra(_,e.config.shorthandCurrentMonth,e.l10n),R.tabIndex=-1,e.currentMonth===_&&(R.selected=!0),e.monthsDropdownContainer.appendChild(R)}}}function J(){var x=Ve("div","flatpickr-month"),_=window.document.createDocumentFragment(),R;e.config.showMonths>1||e.config.monthSelectorType==="static"?R=Ve("span","cur-month"):(e.monthsDropdownContainer=Ve("select","flatpickr-monthDropdown-months"),e.monthsDropdownContainer.setAttribute("aria-label",e.l10n.monthAriaLabel),g(e.monthsDropdownContainer,"change",function(xe){var ue=Xt(xe),_e=parseInt(ue.value,10);e.changeMonth(_e-e.currentMonth),Se("onMonthChange")}),q(),R=e.monthsDropdownContainer);var W=na("cur-year",{tabindex:"-1"}),re=W.getElementsByTagName("input")[0];re.setAttribute("aria-label",e.l10n.yearAriaLabel),e.config.minDate&&re.setAttribute("min",e.config.minDate.getFullYear().toString()),e.config.maxDate&&(re.setAttribute("max",e.config.maxDate.getFullYear().toString()),re.disabled=!!e.config.minDate&&e.config.minDate.getFullYear()===e.config.maxDate.getFullYear());var ae=Ve("div","flatpickr-current-month");return ae.appendChild(R),ae.appendChild(W),_.appendChild(ae),x.appendChild(_),{container:x,yearElement:re,monthElement:R}}function te(){ta(e.monthNav),e.monthNav.appendChild(e.prevMonthNav),e.config.showMonths&&(e.yearElements=[],e.monthElements=[]);for(var x=e.config.showMonths;x--;){var _=J();e.yearElements.push(_.yearElement),e.monthElements.push(_.monthElement),e.monthNav.appendChild(_.container)}e.monthNav.appendChild(e.nextMonthNav)}function ce(){return e.monthNav=Ve("div","flatpickr-months"),e.yearElements=[],e.monthElements=[],e.prevMonthNav=Ve("span","flatpickr-prev-month"),e.prevMonthNav.innerHTML=e.config.prevArrow,e.nextMonthNav=Ve("span","flatpickr-next-month"),e.nextMonthNav.innerHTML=e.config.nextArrow,te(),Object.defineProperty(e,"_hidePrevMonthArrow",{get:function(){return e.__hidePrevMonthArrow},set:function(x){e.__hidePrevMonthArrow!==x&&(Pt(e.prevMonthNav,"flatpickr-disabled",x),e.__hidePrevMonthArrow=x)}}),Object.defineProperty(e,"_hideNextMonthArrow",{get:function(){return e.__hideNextMonthArrow},set:function(x){e.__hideNextMonthArrow!==x&&(Pt(e.nextMonthNav,"flatpickr-disabled",x),e.__hideNextMonthArrow=x)}}),e.currentYearElement=e.yearElements[0],qt(),e.monthNav}function de(){e.calendarContainer.classList.add("hasTime"),e.config.noCalendar&&e.calendarContainer.classList.add("noCalendar");var x=Lo(e.config);e.timeContainer=Ve("div","flatpickr-time"),e.timeContainer.tabIndex=-1;var _=Ve("span","flatpickr-time-separator",":"),R=na("flatpickr-hour",{"aria-label":e.l10n.hourAriaLabel});e.hourElement=R.getElementsByTagName("input")[0];var W=na("flatpickr-minute",{"aria-label":e.l10n.minuteAriaLabel});if(e.minuteElement=W.getElementsByTagName("input")[0],e.hourElement.tabIndex=e.minuteElement.tabIndex=-1,e.hourElement.value=Lt(e.latestSelectedDateObj?e.latestSelectedDateObj.getHours():e.config.time_24hr?x.hours:c(x.hours)),e.minuteElement.value=Lt(e.latestSelectedDateObj?e.latestSelectedDateObj.getMinutes():x.minutes),e.hourElement.setAttribute("step",e.config.hourIncrement.toString()),e.minuteElement.setAttribute("step",e.config.minuteIncrement.toString()),e.hourElement.setAttribute("min",e.config.time_24hr?"0":"1"),e.hourElement.setAttribute("max",e.config.time_24hr?"23":"12"),e.hourElement.setAttribute("maxlength","2"),e.minuteElement.setAttribute("min","0"),e.minuteElement.setAttribute("max","59"),e.minuteElement.setAttribute("maxlength","2"),e.timeContainer.appendChild(R),e.timeContainer.appendChild(_),e.timeContainer.appendChild(W),e.config.time_24hr&&e.timeContainer.classList.add("time24hr"),e.config.enableSeconds){e.timeContainer.classList.add("hasSeconds");var re=na("flatpickr-second");e.secondElement=re.getElementsByTagName("input")[0],e.secondElement.value=Lt(e.latestSelectedDateObj?e.latestSelectedDateObj.getSeconds():x.seconds),e.secondElement.setAttribute("step",e.minuteElement.getAttribute("step")),e.secondElement.setAttribute("min","0"),e.secondElement.setAttribute("max","59"),e.secondElement.setAttribute("maxlength","2"),e.timeContainer.appendChild(Ve("span","flatpickr-time-separator",":")),e.timeContainer.appendChild(re)}return e.config.time_24hr||(e.amPM=Ve("span","flatpickr-am-pm",e.l10n.amPM[Qt((e.latestSelectedDateObj?e.hourElement.value:e.config.defaultHour)>11)]),e.amPM.title=e.l10n.toggleTitle,e.amPM.tabIndex=-1,e.timeContainer.appendChild(e.amPM)),e.timeContainer}function fe(){e.weekdayContainer?ta(e.weekdayContainer):e.weekdayContainer=Ve("div","flatpickr-weekdays");for(var x=e.config.showMonths;x--;){var _=Ve("div","flatpickr-weekdaycontainer");e.weekdayContainer.appendChild(_)}return he(),e.weekdayContainer}function he(){if(!!e.weekdayContainer){var x=e.l10n.firstDayOfWeek,_=Rh(e.l10n.weekdays.shorthand);x>0&&x<_.length&&(_=Rh(_.splice(x,_.length),_.splice(0,x)));for(var R=e.config.showMonths;R--;)e.weekdayContainer.children[R].innerHTML=` - ${T.join("")} + `+_.join("")+` - `}function he(){e.calendarContainer.classList.add("hasWeeks");let x=Ve("div","flatpickr-weekwrapper");x.appendChild(Ve("span","flatpickr-weekday",e.l10n.weekAbbreviation));let T=Ve("div","flatpickr-weeks");return x.appendChild(T),{weekWrapper:x,weekNumbers:T}}function Te(x,T=!0){let H=T?x:x-e.currentMonth;H<0&&e._hidePrevMonthArrow===!0||H>0&&e._hideNextMonthArrow===!0||(e.currentMonth+=H,(e.currentMonth<0||e.currentMonth>11)&&(e.currentYear+=e.currentMonth>11?1:-1,e.currentMonth=(e.currentMonth+12)%12,Ke("onYearChange"),ie()),Q(),Ke("onMonthChange"),At())}function C(x=!0,T=!0){if(e.input.value="",e.altInput!==void 0&&(e.altInput.value=""),e.mobileInput!==void 0&&(e.mobileInput.value=""),e.selectedDates=[],e.latestSelectedDateObj=void 0,T===!0&&(e.currentYear=e._initialDate.getFullYear(),e.currentMonth=e._initialDate.getMonth()),e.config.enableTime===!0){let{hours:H,minutes:W,seconds:ae}=Ao(e.config);f(H,W,ae)}e.redraw(),x&&Ke("onChange")}function A(){e.isOpen=!1,e.isMobile||(e.calendarContainer!==void 0&&e.calendarContainer.classList.remove("open"),e._input!==void 0&&e._input.classList.remove("active")),Ke("onClose")}function tt(){e.config!==void 0&&Ke("onDestroy");for(let x=e._handlers.length;x--;)e._handlers[x].remove();if(e._handlers=[],e.mobileInput)e.mobileInput.parentNode&&e.mobileInput.parentNode.removeChild(e.mobileInput),e.mobileInput=void 0;else if(e.calendarContainer&&e.calendarContainer.parentNode)if(e.config.static&&e.calendarContainer.parentNode){let x=e.calendarContainer.parentNode;if(x.lastChild&&x.removeChild(x.lastChild),x.parentNode){for(;x.firstChild;)x.parentNode.insertBefore(x.firstChild,x);x.parentNode.removeChild(x)}}else e.calendarContainer.parentNode.removeChild(e.calendarContainer);e.altInput&&(e.input.type="text",e.altInput.parentNode&&e.altInput.parentNode.removeChild(e.altInput),delete e.altInput),e.input&&(e.input.type=e.input._type,e.input.classList.remove("flatpickr-input"),e.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(x=>{try{delete e[x]}catch(T){}})}function $e(x){return e.config.appendTo&&e.config.appendTo.contains(x)?!0:e.calendarContainer.contains(x)}function B(x){if(e.isOpen&&!e.config.inline){let T=Jt(x),H=$e(T),W=T===e.input||T===e.altInput||e.element.contains(T)||x.path&&x.path.indexOf&&(~x.path.indexOf(e.input)||~x.path.indexOf(e.altInput)),ae=x.type==="blur"?W&&x.relatedTarget&&!$e(x.relatedTarget):!W&&!H&&!$e(x.relatedTarget),Z=!e.config.ignoredFocusElements.some(ce=>ce.contains(T));ae&&Z&&(e.timeContainer!==void 0&&e.minuteElement!==void 0&&e.hourElement!==void 0&&e.input.value!==""&&e.input.value!==void 0&&s(),e.close(),e.config&&e.config.mode==="range"&&e.selectedDates.length===1&&(e.clear(!1),e.redraw()))}}function z(x){if(!x||e.config.minDate&&xe.config.maxDate.getFullYear())return;let T=x,H=e.currentYear!==T;e.currentYear=T||e.currentYear,e.config.maxDate&&e.currentYear===e.config.maxDate.getFullYear()?e.currentMonth=Math.min(e.config.maxDate.getMonth(),e.currentMonth):e.config.minDate&&e.currentYear===e.config.minDate.getFullYear()&&(e.currentMonth=Math.max(e.config.minDate.getMonth(),e.currentMonth)),H&&(e.redraw(),Ke("onYearChange"),ie())}function U(x,T=!0){var H;let W=e.parseDate(x,void 0,T);if(e.config.minDate&&W&&Gt(W,e.config.minDate,T!==void 0?T:!e.minDateHasTime)<0||e.config.maxDate&&W&&Gt(W,e.config.maxDate,T!==void 0?T:!e.maxDateHasTime)>0)return!1;if(!e.config.enable&&e.config.disable.length===0)return!0;if(W===void 0)return!1;let ae=!!e.config.enable,Z=(H=e.config.enable)!==null&&H!==void 0?H:e.config.disable;for(let ce=0,ue;ce=ue.from.getTime()&&W.getTime()<=ue.to.getTime())return ae}return!ae}function G(x){return e.daysContainer!==void 0?x.className.indexOf("hidden")===-1&&x.className.indexOf("flatpickr-disabled")===-1&&e.daysContainer.contains(x):!1}function we(x){x.target===e._input&&(e.selectedDates.length>0||e._input.value.length>0)&&!(x.relatedTarget&&$e(x.relatedTarget))&&e.setDate(e._input.value,!0,x.target===e.altInput?e.config.altFormat:e.config.dateFormat)}function Ee(x){let T=Jt(x),H=e.config.wrap?t.contains(T):T===e._input,W=e.config.allowInput,ae=e.isOpen&&(!W||!H),Z=e.config.inline&&H&&!W;if(x.keyCode===13&&H){if(W)return e.setDate(e._input.value,!0,T===e.altInput?e.config.altFormat:e.config.dateFormat),T.blur();e.open()}else if($e(T)||ae||Z){let ce=!!e.timeContainer&&e.timeContainer.contains(T);switch(x.keyCode){case 13:ce?(x.preventDefault(),s(),yn()):$n(x);break;case 27:x.preventDefault(),yn();break;case 8:case 46:H&&!e.config.allowInput&&(x.preventDefault(),e.clear());break;case 37:case 39:if(!ce&&!H){if(x.preventDefault(),e.daysContainer!==void 0&&(W===!1||document.activeElement&&G(document.activeElement))){let _e=x.keyCode===39?1:-1;x.ctrlKey?(x.stopPropagation(),Te(_e),j(N(1),0)):j(void 0,_e)}}else e.hourElement&&e.hourElement.focus();break;case 38:case 40:x.preventDefault();let ue=x.keyCode===40?1:-1;e.daysContainer&&T.$i!==void 0||T===e.input||T===e.altInput?x.ctrlKey?(x.stopPropagation(),z(e.currentYear-ue),j(N(1),0)):ce||j(void 0,ue*7):T===e.currentYearElement?z(e.currentYear-ue):e.config.enableTime&&(!ce&&e.hourElement&&e.hourElement.focus(),s(x),e._debouncedChange());break;case 9:if(ce){let _e=[e.hourElement,e.minuteElement,e.secondElement,e.amPM].concat(e.pluginElements).filter(ze=>ze),De=_e.indexOf(T);if(De!==-1){let ze=_e[De+(x.shiftKey?-1:1)];x.preventDefault(),(ze||e._input).focus()}}else!e.config.noCalendar&&e.daysContainer&&e.daysContainer.contains(T)&&x.shiftKey&&(x.preventDefault(),e._input.focus());break;default:break}}if(e.amPM!==void 0&&T===e.amPM)switch(x.key){case e.l10n.amPM[0].charAt(0):case e.l10n.amPM[0].charAt(0).toLowerCase():e.amPM.textContent=e.l10n.amPM[0],c(),St();break;case e.l10n.amPM[1].charAt(0):case e.l10n.amPM[1].charAt(0).toLowerCase():e.amPM.textContent=e.l10n.amPM[1],c(),St();break}(H||$e(T))&&Ke("onKeyDown",x)}function Pe(x){if(e.selectedDates.length!==1||x&&(!x.classList.contains("flatpickr-day")||x.classList.contains("flatpickr-disabled")))return;let T=x?x.dateObj.getTime():e.days.firstElementChild.dateObj.getTime(),H=e.parseDate(e.selectedDates[0],void 0,!0).getTime(),W=Math.min(T,e.selectedDates[0].getTime()),ae=Math.max(T,e.selectedDates[0].getTime()),Z=!1,ce=0,ue=0;for(let _e=W;_eW&&_ece)?ce=_e:_e>H&&(!ue||_e0&&Pt0&&Pt>ue;if(bn){lt.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(Dn=>{lt.classList.remove(Dn)});continue}else if(Z&&!bn)continue;["startRange","inRange","endRange","notAllowed"].forEach(Dn=>{lt.classList.remove(Dn)}),x!==void 0&&(x.classList.add(T<=e.selectedDates[0].getTime()?"startRange":"endRange"),HT&&Pt===H&<.classList.add("endRange"),Pt>=ce&&(ue===0||Pt<=ue)&&zh(Pt,H,T)&<.classList.add("inRange"))}}}function rt(){e.isOpen&&!e.config.static&&!e.config.inline&&Ct()}function gt(x,T=e._positionElement){if(e.isMobile===!0){if(x){x.preventDefault();let W=Jt(x);W&&W.blur()}e.mobileInput!==void 0&&(e.mobileInput.focus(),e.mobileInput.click()),Ke("onOpen");return}else if(e._input.disabled||e.config.inline)return;let H=e.isOpen;e.isOpen=!0,H||(e.calendarContainer.classList.add("open"),e._input.classList.add("active"),Ke("onOpen"),Ct(T)),e.config.enableTime===!0&&e.config.noCalendar===!0&&e.config.allowInput===!1&&(x===void 0||!e.timeContainer.contains(x.relatedTarget))&&setTimeout(()=>e.hourElement.select(),50)}function dt(x){return T=>{let H=e.config[`_${x}Date`]=e.parseDate(T,e.config.dateFormat),W=e.config[`_${x==="min"?"max":"min"}Date`];H!==void 0&&(e[x==="min"?"minDateHasTime":"maxDateHasTime"]=H.getHours()>0||H.getMinutes()>0||H.getSeconds()>0),e.selectedDates&&(e.selectedDates=e.selectedDates.filter(ae=>U(ae)),!e.selectedDates.length&&x==="min"&&d(H),St()),e.daysContainer&&(Mn(),H!==void 0?e.currentYearElement[x]=H.getFullYear().toString():e.currentYearElement.removeAttribute(x),e.currentYearElement.disabled=!!W&&H!==void 0&&W.getFullYear()===H.getFullYear())}}function un(){let x=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],T=Object.assign(Object.assign({},JSON.parse(JSON.stringify(t.dataset||{}))),n),H={};e.config.parseDate=T.parseDate,e.config.formatDate=T.formatDate,Object.defineProperty(e.config,"enable",{get:()=>e.config._enable,set:Z=>{e.config._enable=V(Z)}}),Object.defineProperty(e.config,"disable",{get:()=>e.config._disable,set:Z=>{e.config._disable=V(Z)}});let W=T.mode==="time";if(!T.dateFormat&&(T.enableTime||W)){let Z=pt.defaultConfig.dateFormat||hr.dateFormat;H.dateFormat=T.noCalendar||W?"H:i"+(T.enableSeconds?":S":""):Z+" H:i"+(T.enableSeconds?":S":"")}if(T.altInput&&(T.enableTime||W)&&!T.altFormat){let Z=pt.defaultConfig.altFormat||hr.altFormat;H.altFormat=T.noCalendar||W?"h:i"+(T.enableSeconds?":S K":" K"):Z+` h:i${T.enableSeconds?":S":""} K`}Object.defineProperty(e.config,"minDate",{get:()=>e.config._minDate,set:dt("min")}),Object.defineProperty(e.config,"maxDate",{get:()=>e.config._maxDate,set:dt("max")});let ae=Z=>ce=>{e.config[Z==="min"?"_minTime":"_maxTime"]=e.parseDate(ce,"H:i:S")};Object.defineProperty(e.config,"minTime",{get:()=>e.config._minTime,set:ae("min")}),Object.defineProperty(e.config,"maxTime",{get:()=>e.config._maxTime,set:ae("max")}),T.mode==="time"&&(e.config.noCalendar=!0,e.config.enableTime=!0),Object.assign(e.config,H,T);for(let Z=0;Ze.config[Z]!==void 0).forEach(Z=>{e.config[Z]=Co(e.config[Z]||[]).map(a)}),e.isMobile=!e.config.disableMobile&&!e.config.inline&&e.config.mode==="single"&&!e.config.disable.length&&!e.config.enable&&!e.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);for(let Z=0;Z-1?e.config[ue]=Co(ce[ue]).map(a).concat(e.config[ue]):typeof T[ue]=="undefined"&&(e.config[ue]=ce[ue])}T.altInputClass||(e.config.altInputClass=dn().className+" "+e.config.altInputClass),Ke("onParseConfig")}function dn(){return e.config.wrap?t.querySelector("[data-input]"):t}function Xt(){typeof e.config.locale!="object"&&typeof pt.l10ns[e.config.locale]=="undefined"&&e.config.errorHandler(new Error(`flatpickr: invalid locale ${e.config.locale}`)),e.l10n=Object.assign(Object.assign({},pt.l10ns.default),typeof e.config.locale=="object"?e.config.locale:e.config.locale!=="default"?pt.l10ns[e.config.locale]:void 0),aa.K=`(${e.l10n.amPM[0]}|${e.l10n.amPM[1]}|${e.l10n.amPM[0].toLowerCase()}|${e.l10n.amPM[1].toLowerCase()})`,Object.assign(Object.assign({},n),JSON.parse(JSON.stringify(t.dataset||{}))).time_24hr===void 0&&pt.defaultConfig.time_24hr===void 0&&(e.config.time_24hr=e.l10n.time_24hr),e.formatDate=ec(e),e.parseDate=Io({config:e.config,l10n:e.l10n})}function Ct(x){if(typeof e.config.position=="function")return void e.config.position(e,x);if(e.calendarContainer===void 0)return;Ke("onPreCalendarPosition");let T=x||e._positionElement,H=Array.prototype.reduce.call(e.calendarContainer.children,(Cn,jn)=>Cn+jn.offsetHeight,0),W=e.calendarContainer.offsetWidth,ae=e.config.position.split(" "),Z=ae[0],ce=ae.length>1?ae[1]:null,ue=T.getBoundingClientRect(),_e=window.innerHeight-ue.bottom,De=Z==="above"||Z!=="below"&&_eH,ze=window.pageYOffset+ue.top+(De?-H-2:T.offsetHeight+2);if(Ft(e.calendarContainer,"arrowTop",!De),Ft(e.calendarContainer,"arrowBottom",De),e.config.inline)return;let xt=window.pageXOffset+ue.left,lt=!1,Un=!1;ce==="center"?(xt-=(W-ue.width)/2,lt=!0):ce==="right"&&(xt-=W-ue.width,Un=!0),Ft(e.calendarContainer,"arrowLeft",!lt&&!Un),Ft(e.calendarContainer,"arrowCenter",lt),Ft(e.calendarContainer,"arrowRight",Un);let Pt=window.document.body.offsetWidth-(window.pageXOffset+ue.right),bn=xt+W>window.document.body.offsetWidth,Dn=Pt+W>window.document.body.offsetWidth;if(Ft(e.calendarContainer,"rightMost",bn),!e.config.static)if(e.calendarContainer.style.top=`${ze}px`,!bn)e.calendarContainer.style.left=`${xt}px`,e.calendarContainer.style.right="auto";else if(!Dn)e.calendarContainer.style.left="auto",e.calendarContainer.style.right=`${Pt}px`;else{let Cn=Zt();if(Cn===void 0)return;let jn=window.document.body.offsetWidth,Sr=Math.max(0,jn/2-W/2),zr=".flatpickr-calendar.centerMost:before",Vr=".flatpickr-calendar.centerMost:after",qr=Cn.cssRules.length,Wr=`{left:${ue.left}px;right:auto;}`;Ft(e.calendarContainer,"rightMost",!1),Ft(e.calendarContainer,"centerMost",!0),Cn.insertRule(`${zr},${Vr}${Wr}`,qr),e.calendarContainer.style.left=`${Sr}px`,e.calendarContainer.style.right="auto"}}function Zt(){let x=null;for(let T=0;Tce.classList&&ce.classList.contains("flatpickr-day")&&!ce.classList.contains("flatpickr-disabled")&&!ce.classList.contains("notAllowed"),H=Xl(Jt(x),T);if(H===void 0)return;let W=H,ae=e.latestSelectedDateObj=new Date(W.dateObj.getTime()),Z=(ae.getMonth()e.currentMonth+e.config.showMonths-1)&&e.config.mode!=="range";if(e.selectedDateElem=W,e.config.mode==="single")e.selectedDates=[ae];else if(e.config.mode==="multiple"){let ce=Ge(ae);ce?e.selectedDates.splice(parseInt(ce),1):e.selectedDates.push(ae)}else e.config.mode==="range"&&(e.selectedDates.length===2&&e.clear(!1,!1),e.latestSelectedDateObj=ae,e.selectedDates.push(ae),Gt(ae,e.selectedDates[0],!0)!==0&&e.selectedDates.sort((ce,ue)=>ce.getTime()-ue.getTime()));if(c(),Z){let ce=e.currentYear!==ae.getFullYear();e.currentYear=ae.getFullYear(),e.currentMonth=ae.getMonth(),ce&&(Ke("onYearChange"),ie()),Ke("onMonthChange")}if(At(),Q(),St(),!Z&&e.config.mode!=="range"&&e.config.showMonths===1?D(W):e.selectedDateElem!==void 0&&e.hourElement===void 0&&e.selectedDateElem&&e.selectedDateElem.focus(),e.hourElement!==void 0&&e.hourElement!==void 0&&e.hourElement.focus(),e.config.closeOnSelect){let ce=e.config.mode==="single"&&!e.config.enableTime,ue=e.config.mode==="range"&&e.selectedDates.length===2&&!e.config.enableTime;(ce||ue)&&yn()}g()}let fn={locale:[Xt,fe],showMonths:[J,o,de],minDate:[S],maxDate:[S],clickOpens:[()=>{e.config.clickOpens===!0?(p(e._input,"focus",e.open),p(e._input,"click",e.open)):(e._input.removeEventListener("focus",e.open),e._input.removeEventListener("click",e.open))}]};function yt(x,T){if(x!==null&&typeof x=="object"){Object.assign(e.config,x);for(let H in x)fn[H]!==void 0&&fn[H].forEach(W=>W())}else e.config[x]=T,fn[x]!==void 0?fn[x].forEach(H=>H()):To.indexOf(x)>-1&&(e.config[x]=Co(T));e.redraw(),St(!0)}function It(x,T){let H=[];if(x instanceof Array)H=x.map(W=>e.parseDate(W,T));else if(x instanceof Date||typeof x=="number")H=[e.parseDate(x,T)];else if(typeof x=="string")switch(e.config.mode){case"single":case"time":H=[e.parseDate(x,T)];break;case"multiple":H=x.split(e.config.conjunction).map(W=>e.parseDate(W,T));break;case"range":H=x.split(e.l10n.rangeSeparator).map(W=>e.parseDate(W,T));break;default:break}else e.config.errorHandler(new Error(`Invalid date supplied: ${JSON.stringify(x)}`));e.selectedDates=e.config.allowInvalidPreload?H:H.filter(W=>W instanceof Date&&U(W,!1)),e.config.mode==="range"&&e.selectedDates.sort((W,ae)=>W.getTime()-ae.getTime())}function it(x,T=!1,H=e.config.dateFormat){if(x!==0&&!x||x instanceof Array&&x.length===0)return e.clear(T);It(x,H),e.latestSelectedDateObj=e.selectedDates[e.selectedDates.length-1],e.redraw(),S(void 0,T),d(),e.selectedDates.length===0&&e.clear(!1),St(T),T&&Ke("onChange")}function V(x){return x.slice().map(T=>typeof T=="string"||typeof T=="number"||T instanceof Date?e.parseDate(T,void 0,!0):T&&typeof T=="object"&&T.from&&T.to?{from:e.parseDate(T.from,void 0),to:e.parseDate(T.to,void 0)}:T).filter(T=>T)}function re(){e.selectedDates=[],e.now=e.parseDate(e.config.now)||new Date;let x=e.config.defaultDate||((e.input.nodeName==="INPUT"||e.input.nodeName==="TEXTAREA")&&e.input.placeholder&&e.input.value===e.input.placeholder?null:e.input.value);x&&It(x,e.config.dateFormat),e._initialDate=e.selectedDates.length>0?e.selectedDates[0]:e.config.minDate&&e.config.minDate.getTime()>e.now.getTime()?e.config.minDate:e.config.maxDate&&e.config.maxDate.getTime()0&&(e.latestSelectedDateObj=e.selectedDates[0]),e.config.minTime!==void 0&&(e.config.minTime=e.parseDate(e.config.minTime,"H:i")),e.config.maxTime!==void 0&&(e.config.maxTime=e.parseDate(e.config.maxTime,"H:i")),e.minDateHasTime=!!e.config.minDate&&(e.config.minDate.getHours()>0||e.config.minDate.getMinutes()>0||e.config.minDate.getSeconds()>0),e.maxDateHasTime=!!e.config.maxDate&&(e.config.maxDate.getHours()>0||e.config.maxDate.getMinutes()>0||e.config.maxDate.getSeconds()>0)}function ye(){if(e.input=dn(),!e.input){e.config.errorHandler(new Error("Invalid input element specified"));return}e.input._type=e.input.type,e.input.type="text",e.input.classList.add("flatpickr-input"),e._input=e.input,e.config.altInput&&(e.altInput=Ve(e.input.nodeName,e.config.altInputClass),e._input=e.altInput,e.altInput.placeholder=e.input.placeholder,e.altInput.disabled=e.input.disabled,e.altInput.required=e.input.required,e.altInput.tabIndex=e.input.tabIndex,e.altInput.type="text",e.input.setAttribute("type","hidden"),!e.config.static&&e.input.parentNode&&e.input.parentNode.insertBefore(e.altInput,e.input.nextSibling)),e.config.allowInput||e._input.setAttribute("readonly","readonly"),e._positionElement=e.config.positionElement||e._input}function Be(){let x=e.config.enableTime?e.config.noCalendar?"time":"datetime-local":"date";e.mobileInput=Ve("input",e.input.className+" flatpickr-mobile"),e.mobileInput.tabIndex=1,e.mobileInput.type=x,e.mobileInput.disabled=e.input.disabled,e.mobileInput.required=e.input.required,e.mobileInput.placeholder=e.input.placeholder,e.mobileFormatStr=x==="datetime-local"?"Y-m-d\\TH:i:S":x==="date"?"Y-m-d":"H:i:S",e.selectedDates.length>0&&(e.mobileInput.defaultValue=e.mobileInput.value=e.formatDate(e.selectedDates[0],e.mobileFormatStr)),e.config.minDate&&(e.mobileInput.min=e.formatDate(e.config.minDate,"Y-m-d")),e.config.maxDate&&(e.mobileInput.max=e.formatDate(e.config.maxDate,"Y-m-d")),e.input.getAttribute("step")&&(e.mobileInput.step=String(e.input.getAttribute("step"))),e.input.type="hidden",e.altInput!==void 0&&(e.altInput.type="hidden");try{e.input.parentNode&&e.input.parentNode.insertBefore(e.mobileInput,e.input.nextSibling)}catch(T){}p(e.mobileInput,"change",T=>{e.setDate(Jt(T).value,!1,e.mobileFormatStr),Ke("onChange"),Ke("onClose")})}function ft(x){if(e.isOpen===!0)return e.close();e.open(x)}function Ke(x,T){if(e.config===void 0)return;let H=e.config[x];if(H!==void 0&&H.length>0)for(let W=0;H[W]&&W=0&&Gt(x,e.selectedDates[1])<=0}function At(){e.config.noCalendar||e.isMobile||!e.monthNav||(e.yearElements.forEach((x,T)=>{let H=new Date(e.currentYear,e.currentMonth,1);H.setMonth(e.currentMonth+T),e.config.showMonths>1||e.config.monthSelectorType==="static"?e.monthElements[T].textContent=ia(H.getMonth(),e.config.shorthandCurrentMonth,e.l10n)+" ":e.monthsDropdownContainer.value=H.getMonth().toString(),x.value=H.getFullYear().toString()}),e._hidePrevMonthArrow=e.config.minDate!==void 0&&(e.currentYear===e.config.minDate.getFullYear()?e.currentMonth<=e.config.minDate.getMonth():e.currentYeare.config.maxDate.getMonth():e.currentYear>e.config.maxDate.getFullYear()))}function Ye(x){return e.selectedDates.map(T=>e.formatDate(T,x)).filter((T,H,W)=>e.config.mode!=="range"||e.config.enableTime||W.indexOf(T)===H).join(e.config.mode!=="range"?e.config.conjunction:e.l10n.rangeSeparator)}function St(x=!0){e.mobileInput!==void 0&&e.mobileFormatStr&&(e.mobileInput.value=e.latestSelectedDateObj!==void 0?e.formatDate(e.latestSelectedDateObj,e.mobileFormatStr):""),e.input.value=Ye(e.config.dateFormat),e.altInput!==void 0&&(e.altInput.value=Ye(e.config.altFormat)),x!==!1&&Ke("onValueUpdate")}function Lt(x){let T=Jt(x),H=e.prevMonthNav.contains(T),W=e.nextMonthNav.contains(T);H||W?Te(H?-1:1):e.yearElements.indexOf(T)>=0?T.select():T.classList.contains("arrowUp")?e.changeYear(e.currentYear+1):T.classList.contains("arrowDown")&&e.changeYear(e.currentYear-1)}function jr(x){x.preventDefault();let T=x.type==="keydown",H=Jt(x),W=H;e.amPM!==void 0&&H===e.amPM&&(e.amPM.textContent=e.l10n.amPM[Yt(e.amPM.textContent===e.l10n.amPM[0])]);let ae=parseFloat(W.getAttribute("min")),Z=parseFloat(W.getAttribute("max")),ce=parseFloat(W.getAttribute("step")),ue=parseInt(W.value,10),_e=x.delta||(T?x.which===38?1:-1:0),De=ue+ce*_e;if(typeof W.value!="undefined"&&W.value.length===2){let ze=W===e.hourElement,xt=W===e.minuteElement;DeZ&&(De=W===e.hourElement?De-Z-Yt(!e.amPM):ae,xt&&k(void 0,1,e.hourElement)),e.amPM&&ze&&(ce===1?De+ue===23:Math.abs(De-ue)>ce)&&(e.amPM.textContent=e.l10n.amPM[Yt(e.amPM.textContent===e.l10n.amPM[0])]),W.value=Nt(De)}}return i(),e}function mi(t,n){let e=Array.prototype.slice.call(t).filter(i=>i instanceof HTMLElement),r=[];for(let i=0;i{pt.l10ns.default=Object.assign(Object.assign({},pt.l10ns.default),t)};pt.setDefaults=t=>{pt.defaultConfig=Object.assign(Object.assign({},pt.defaultConfig),t)};pt.parseDate=Io({});pt.formatDate=ec({});pt.compareDates=Gt;typeof jQuery!="undefined"&&typeof jQuery.fn!="undefined"&&(jQuery.fn.flatpickr=function(t){return mi(this,t)});Date.prototype.fp_incr=function(t){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+(typeof t=="string"?parseInt(t,10):t))};typeof window!="undefined"&&(window.flatpickr=pt);var Lo=pt;var ot=ge(require("obsidian"));var ha=ge(rc());function up(t,n){let e=(0,ha.getDateFromFile)(n,"day");if(!e||!e.isValid())return;t.internalPlugins.plugins["daily-notes"].instance.gotoNextExisting(e)}function dp(t,n){let e=(0,ha.getDateFromFile)(n,"day");if(!e||!e.isValid())return;t.internalPlugins.plugins["daily-notes"].instance.gotoPreviousExisting(e)}function Po(t,n){let e=(0,ha.getDailyNoteSettings)();return t.vault.getConfig("useMarkdownLinks")?`[${n}](${e.folder?`${encodeURIComponent(e.folder)}/`:""}${encodeURIComponent(n)}.md)`:`[[${n}]]`}function fp(t){if(!t)return!1;let n=t.match(/---\s+([\w\W]+?)\s+---/);return!(!n||!n[1].contains("kanban-plugin"))}var et=ge(pp()),mp=ge(require("obsidian")),gp={ar:et.default.ar,cs:et.default.cs,da:et.default.da,de:et.default.de,en:et.default.en,"en-gb":et.default.en,es:et.default.es,fr:et.default.fr,hi:et.default.hi,id:et.default.id,it:et.default.it,ja:et.default.ja,ko:et.default.ko,nl:et.default.nl,nn:et.default.no,pl:et.default.pl,pt:et.default.pt,"pt-br":et.default.pt,ro:et.default.ro,ru:et.default.ru,tr:et.default.tr,"zh-cn":et.default.zh,"zh-tw":et.default.zh_tw},WE=gp[mp.moment.locale()];function No(t){let n=t==null?void 0:t.getSetting("date-picker-week-start"),e=WE||gp.en;return n?{...e,firstDayOfWeek:n}:e}function Fo(t,n,e,r){return document.body.createDiv({cls:`${$("date-picker")} ${$("ignore-click-outside")}`},i=>{i.style.left=`${n.x||0}px`,i.style.top=`${n.y||0}px`,i.createEl("input",{type:"text"},a=>{setTimeout(()=>{let o=null,s=c=>{c.target instanceof HTMLElement&&c.target.closest(`.${$("date-picker")}`)===null&&l()},u=c=>{c.key==="Escape"&&l()},l=()=>{o.destroy(),i.remove(),document.body.removeEventListener("click",s),document.removeEventListener("keydown",u)};o=Lo(a,{locale:No(t),defaultDate:r,inline:!0,onChange:c=>{e(c),l()}}),setTimeout(()=>{let c=i.clientHeight,d=i.clientWidth;n.y+c>window.innerHeight&&(i.style.top=`${(n.y||0)-c}px`),n.x+d>window.innerWidth&&(i.style.left=`${(n.x||0)-d}px`)}),document.body.addEventListener("click",s),document.addEventListener("keydown",u)})})})}function Ro({stateManager:t,boardModifiers:n,item:e,hasDate:r,path:i}){let a=t.getSetting("date-format"),o=t.getSetting("link-date-to-daily-note"),s=t.getSetting("date-trigger"),u=o?"(?:\\[[^\\]]+\\]\\([^)]+\\)|\\[\\[[^\\]]+\\]\\])":"{[^}]+}",l=new RegExp(`(^|\\s)${On(s)}${u}`);return c=>{let d=c[0],f=(0,ot.moment)(d).format(a),h=o?Po(t.app,f):`{${f}}`,p=e.data.titleRaw;r?p=e.data.titleRaw.replace(l,`$1${s}${h}`):p=`${e.data.titleRaw} ${s}${h}`,t.updateItemContent(e,p).then(g=>{n.updateItem(i,g)}).catch(g=>{t.setError(g),console.error(g)})}}function ic(t){let n=t.getSetting("time-format"),e=[];for(let r=0;r<24;r++)e.push((0,ot.moment)({hour:r}).format(n)),e.push((0,ot.moment)({hour:r,minute:15}).format(n)),e.push((0,ot.moment)({hour:r,minute:30}).format(n)),e.push((0,ot.moment)({hour:r,minute:45}).format(n));return e}function Ho(t,n,e,r){let i=$("time-picker"),a=t.getSetting("time-format"),o=r==null?void 0:r.format(a);document.body.createDiv({cls:`${i} ${$("ignore-click-outside")}`},s=>{let u=ic(t),l=g=>{g.target instanceof HTMLElement&&g.target.hasClass($("time-picker-item"))&&g.target.dataset.value&&(e(g.target.dataset.value),f())},c=g=>{g.target instanceof HTMLElement&&g.target.closest(`.${i}`)===null&&f()},d=g=>{g.key==="Escape"&&f()},f=()=>{s.remove(),s.removeEventListener("click",l),document.body.removeEventListener("click",c),document.removeEventListener("keydown",d)};s.style.left=`${n.x||0}px`,s.style.top=`${n.y||0}px`;let h=null,p=null;u.forEach((g,w)=>{let S=g===o;s.createDiv({cls:`${$("time-picker-item")} ${S?"is-selected":""}`,text:g},_=>{_.createEl("span",{cls:$("time-picker-check"),prepend:!0},k=>{(0,ot.setIcon)(k,"checkmark")}),w%4==0&&_.addClass("is-hour"),_.dataset.value=g,S&&(h=_),w===Math.floor(u.length/2)&&(p=_)})}),setTimeout(()=>{var S;let g=s.clientHeight,w=s.clientWidth;n.y+g>window.innerHeight&&(s.style.top=`${(n.y||0)-g}px`),n.x+w>window.innerWidth&&(s.style.left=`${(n.x||0)-w}px`),(S=h||p)==null||S.scrollIntoView({block:"center",inline:"nearest"}),s.addEventListener("click",l),document.body.addEventListener("click",c),document.addEventListener("keydown",d)})})}function Bo({stateManager:t,boardModifiers:n,item:e,hasTime:r,path:i}){let a=t.getSetting("time-trigger"),o=new RegExp(`(^|\\s)${On(a)}{([^}]+)}`);return s=>{let u=e.data.titleRaw;r?u=e.data.titleRaw.replace(o,`$1${a}{${s}}`):u=`${e.data.titleRaw} ${a}{${s}}`,t.updateItemContent(e,u).then(l=>{n.updateItem(i,l)}).catch(l=>{t.setError(l),console.error(l)})}}function vp(t){let n=t.data.metadata.date,e=[];n&&(n.isSame(new Date,"day")&&e.push("is-today"),n.isAfter(new Date,"day")&&e.push("is-future"),n.isBefore(new Date,"day")&&e.push("is-past")),t.data.isComplete&&e.push("is-complete");for(let r of t.data.metadata.tags)e.push(`has-tag-${r.slice(1)}`);return e}function Ar(t,n,e,r){return t.app.fileManager.generateMarkdownLink(n,e,r)}function YE(t,n,e){return ot.htmlToMarkdown?(0,ot.htmlToMarkdown)(e):ot.MarkdownSourceView.prototype.handleDataTransfer.call({app:t.app},n)}function JE(t){return t.replace(/^\[(.*)\]\(app:\/\/obsidian.md\/(.*)\)$/,"[$1]($2)")}function ac(){var n;let t=window.require("electron").remote.clipboard;if(process.platform==="darwin"){if(t.has("NSFilenamesPboardType"))return((n=t.read("NSFilenamesPboardType").match(/.*<\/string>/g))==null?void 0:n.map(e=>e.replace(/|<\/string>/g,"")))||[];{let e=t.readImage("clipboard");return e.isEmpty()?[t.read("public.file-url").replace("file://","")].filter(r=>r):[{buffer:e.toPNG(),mimeType:"image/png",originalName:`Pasted image ${(0,ot.moment)().format("YYYYMMDDHHmmss")}.png`}]}}else if(t.has("CF_HDROP")){let e=t.read("CF_HDROP")||"",r=[...e].filter((a,o)=>e.charCodeAt(o)!==0).join("").replace(/\\/g,"\\"),i=r.match(/[a-zA-Z]:\\/);if(i){let a=r.indexOf(i[0]);return a!==0&&(r=r.substring(a)),r.split(i[0]).filter(o=>o).map(o=>i+o)}}else{let e=t.readImage("clipboard");return e.isEmpty()?[t.readBuffer("FileNameW").toString("ucs2").replace(RegExp(String.fromCharCode(0),"g"),"")].filter(r=>r):[{buffer:e.toPNG(),mimeType:"image/png",originalName:`Pasted image ${(0,ot.moment)().format("YYYYMMDDHHmmss")}.png`}]}return null}function GE(t){return t.split("\\").pop().split("/").pop()}async function QE(t,n,e,r){let i=await t.app.vault.getAvailablePathForAttachments(n,e,t.file),a=await t.app.vault.createBinary(i,r);return Ar(t,a,t.file.path)}async function XE(t){let n=ac();if(!n||n.length===0)return null;let e=window.require("fs/promises"),r=window.require("path");return(await Promise.all(n.map(async i=>{if(typeof i=="string"){let o=GE(i).split("."),s=o.pop(),u=o.join("."),l=await t.app.vault.getAvailablePathForAttachments(u,s,t.file),c=t.app.vault.adapter.basePath;await e.copyFile(i,r.join(c,l)),await new Promise(f=>setTimeout(f,50));let d=t.app.vault.getAbstractFileByPath(l);return Ar(t,d,t.file.path)}else{let a=i.originalName.split("."),o=a.pop(),s=a.join(".");return await QE(t,s,o,i.buffer)}}))).filter(i=>i)}function yp(t,n,e){return Promise.all(n.map(r=>{let i=r.name.split("."),a=i.pop(),o=i.join(".");if(e){switch(r.type){case"text/jpg":a="jpg";break;case"text/jpeg":a="jpeg";break;case"text/png":a="png";break}o="Pasted image "+(0,ot.moment)().format("YYYYMMDDHHmmss")}return new Promise((s,u)=>{let l=new FileReader;l.onload=async c=>{try{let d=await t.app.vault.getAvailablePathForAttachments(o,a,t.file),f=await t.app.vault.createBinary(d,c.target.result);s(Ar(t,f,t.file.path))}catch(d){console.error(d),u(d)}},l.readAsArrayBuffer(r)})}))}async function ZE(t,n){let e=n instanceof DragEvent?n.shiftKey:!1,r=n instanceof DragEvent?n.dataTransfer:n.clipboardData;if(n instanceof DragEvent){let u=await Jl(n);if(u.length)return await yp(t,u)}else{if(ot.Platform.isDesktopApp){let c=await XE(t);if(c==null?void 0:c.length)return c}let u=[],l=n.clipboardData.items;for(let c in l){let d=l[c];d.kind==="file"&&u.push(d.getAsFile())}if(u.length)return await yp(t,u,!0)}let i=r.getData("text/html"),a=r.getData("text/plain"),o=r.getData("text/uri-list"),s=e?a||i:YE(t,r,i);return[JE(s||o||a||i||"")]}async function Ko(t,n){let e=t.app.dragManager.draggable,r=n instanceof DragEvent?n.dataTransfer:n.clipboardData;switch(e==null?void 0:e.type){case"file":return[Ar(t,e.file,t.file.path)];case"files":return e.files.map(i=>Ar(t,i,t.file.path));case"folder":return e.file.children.map(i=>i instanceof ot.TFolder?null:Ar(t,i,t.file.path)).filter(i=>i);case"link":{let i=e.file?Ar(t,e.file,(0,ot.parseLinktext)(e.linktext).subpath):`[[${e.linktext}]]`,a=new DOMParser().parseFromString(r.getData("text/html"),"text/html").documentElement.textContent;return i=i.replace(/]]$/,`|${a}]]`).replace(/^\[[^\]].+]\(/,`[${a}](`),[i]}default:return await ZE(t,n)}}var Ze={Item:"item",Lane:"lane",Board:"board",MetadataSetting:"metadata-setting"},$o={accepts:[Ze.Item],type:Ze.Item,children:[]},pr={accepts:[Ze.Lane],type:Ze.Lane},Uo={accepts:[],type:Ze.Board},jo={accepts:[Ze.MetadataSetting],type:Ze.MetadataSetting,children:[]};function oc(t,n,e,r){let i="htmldnd",a=We(),o=t-75,s=t+75,u=n-25,l=n+25;return{scopeId:i,entityId:`${i}-${a}`,initial:[o,u,s,l],getParentScrollState(){return tn},getParentScrollShift(){return Nn},recalcInitial(){},getHitbox(){return this.initial},getPath(){return[]},getData(){return{viewId:r,type:Ze.Item,id:a,content:e,accepts:[]}}}}var lc=class{constructor(n,e,r){this.isHTMLDragging=!1;this.dragOverTimeout=0;this.hitboxEntities=e,this.scrollEntities=r,this.emitter=n}getDragEventData(){return{dragEntity:this.dragEntity,dragEntityId:this.dragEntityId,dragEntityMargin:this.dragEntityMargin,dragOrigin:this.dragOrigin,dragOriginHitbox:this.dragOriginHitbox,dragPosition:this.dragPosition,primaryIntersection:this.primaryIntersection,scrollIntersection:this.scrollIntersection}}dragStart(n,e){var a;let r=(e==null?void 0:e.dataset.hitboxid)||n.currentTarget.dataset.hitboxid;if(!r)return;let i=getComputedStyle(e||n.currentTarget);this.dragEntityId=r,this.dragOrigin={x:n.pageX,y:n.pageY},this.dragPosition={x:n.pageX,y:n.pageY},this.dragEntity=this.hitboxEntities.get(r),this.dragOriginHitbox=(a=this.dragEntity)==null?void 0:a.getHitbox(),this.dragEntityMargin=[parseFloat(i.marginLeft)||0,parseFloat(i.marginTop)||0,parseFloat(i.marginRight)||0,parseFloat(i.marginBottom)||0],this.emitter.emit("dragStart",this.getDragEventData())}dragStartHTML(n,e){this.isHTMLDragging=!0;let r=oc(n.pageX,n.pageY,[],e);this.dragEntityId=r.entityId,this.dragOrigin={x:n.pageX,y:n.pageY},this.dragPosition={x:n.pageX,y:n.pageY},this.dragEntity=r,this.dragOriginHitbox=r.getHitbox(),this.dragEntityMargin=[0,0,0,0],this.emitter.emit("dragStart",this.getDragEventData())}dragMove(n){this.dragPosition={x:n.pageX,y:n.pageY},this.emitter.emit("dragMove",this.getDragEventData()),this.calculateDragIntersect()}dragMoveHTML(n){this.dragPosition={x:n.pageX,y:n.pageY},this.emitter.emit("dragMove",this.getDragEventData()),this.calculateDragIntersect()}dragEnd(n){this.emitter.emit("dragEnd",this.getDragEventData()),this.dragEntityMargin=void 0,this.dragEntity=void 0,this.dragEntityId=void 0,this.dragOrigin=void 0,this.dragOriginHitbox=void 0,this.dragPosition=void 0,this.scrollIntersection=void 0,this.primaryIntersection=void 0}dragEndHTML(n,e,r,i){this.isHTMLDragging=!1,i||(this.dragEntity=oc(n.pageX,n.pageY,r,e),this.emitter.emit("dragEnd",this.getDragEventData())),this.dragEntityMargin=void 0,this.dragEntity=void 0,this.dragEntityId=void 0,this.dragOrigin=void 0,this.dragOriginHitbox=void 0,this.dragPosition=void 0,this.scrollIntersection=void 0,this.primaryIntersection=void 0,i&&this.emitter.emit("dragEnd",this.getDragEventData())}onHTMLDragLeave(n){clearTimeout(this.dragOverTimeout),this.dragOverTimeout=window.setTimeout(n,351)}calculateDragIntersect(){if(!this.dragEntity||!this.dragPosition||!this.dragOrigin||!this.dragOriginHitbox)return;let{type:n}=this.dragEntity.getData(),e=[],r=[],i=[],a=[];this.hitboxEntities.forEach(u=>{u.getData().accepts.includes(n)&&(e.push(u),r.push(u.getHitbox()))}),this.scrollEntities.forEach(u=>{u.getData().accepts.includes(n)&&(i.push(u),a.push(u.getHitbox()))});let o=nf(this.dragOriginHitbox,this.dragOrigin,this.dragPosition);this.handleScrollIntersect(o,this.dragEntity.entityId,a,i)||this.handleHitboxIntersect(o,this.dragEntity.entityId,r,e)}handleScrollIntersect(n,e,r,i){let a=(0,sc.default)([n],r).map(s=>i[s[1]]),o=ef(a,n,e);if(this.scrollIntersection&&(!o||o[0]!==this.scrollIntersection[0])){let[s,u]=this.scrollIntersection,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("endDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=void 0}if(o&&(!this.scrollIntersection||this.scrollIntersection[0]!==o[0])){let[s,u]=o,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("beginDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=o}else if(o&&this.scrollIntersection&&o[0]===this.scrollIntersection[0]){let[s,u]=o,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("updateDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=o}return!!o}handleHitboxIntersect(n,e,r,i){let a=(0,sc.default)([n],r).map(s=>i[s[1]]),o=Tl(a,n,e);this.primaryIntersection&&this.primaryIntersection!==o&&(this.emitter.emit("dragLeave",this.getDragEventData(),this.primaryIntersection.entityId),this.primaryIntersection=void 0),o&&this.primaryIntersection!==o&&(this.emitter.emit("dragEnter",{...this.getDragEventData(),primaryIntersection:o},o.entityId),this.primaryIntersection=o)}},yi=t=>{t.preventDefault(),t.stopPropagation()};function bi(t,n){let e=v.useContext(wt);v.useEffect(()=>{let r=t.current,i=n.current;if(!e||!r||!i)return;let a=s=>{if(s.defaultPrevented||s.target.dataset.ignoreDrag||s.button!==0&&s.buttons!==1)return;let u=bp.Platform.isMobile;u||(s.stopPropagation(),s.preventDefault());let l=s,c={x:s.pageX,y:s.pageY},d=!1,f=0;u&&(window.addEventListener("contextmenu",yi,!0),f=window.setTimeout(()=>{e.dragManager.dragStart(l,r),d=!0,window.addEventListener("touchmove",yi,{passive:!1})},500));let h=So(g=>{u?d?e.dragManager.dragMove(g):ni(c,{x:g.pageX,y:g.pageY})>5&&(clearTimeout(f),window.removeEventListener("touchmove",yi),window.removeEventListener("contextmenu",yi,!0),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p)):d?e.dragManager.dragMove(g):ni(c,{x:g.pageX,y:g.pageY})>5&&(e.dragManager.dragStart(l,r),d=!0)}),p=g=>{clearTimeout(f),d=!1,e.dragManager.dragEnd(g),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p),u&&(window.removeEventListener("contextmenu",yi,!0),window.removeEventListener("touchmove",yi))};window.addEventListener("pointermove",h),window.addEventListener("pointerup",p),window.addEventListener("pointercancel",p)},o=s=>{s.stopPropagation()};return i.addEventListener("pointerdown",a),i.addEventListener("touchstart",o),()=>{i.removeEventListener("pointerdown",a),i.removeEventListener("touchstart",o)}},[t,n,e])}function wp(t){let n=v.useContext(wt),e=v.useCallback(i=>{n.dragManager.isHTMLDragging?(i.preventDefault(),n.dragManager.dragMoveHTML(i.nativeEvent)):n.dragManager.dragStartHTML(i.nativeEvent,t.getAView().id),n.dragManager.onHTMLDragLeave(()=>{n.dragManager.dragEndHTML(i.nativeEvent,t.getAView().id,[],!0)})},[n,t]),r=v.useCallback(async i=>{n.dragManager.dragEndHTML(i.nativeEvent,t.getAView().id,await Ko(t,i.nativeEvent),!1)},[n,t]);return{onDragOver:e,onDrop:r}}var Sp=ge(Ot());var Ep=ge(require("obsidian"));function Qt({name:t,className:n}){return v.createElement("span",{"data-icon":t,className:`${$("icon")} ${n||""}`,ref:e=>{e&&(0,Ep.setIcon)(e,t)}})}var xp=v.memo(function({shouldMarkItemsComplete:n,path:e,item:r,stateManager:i,boardModifiers:a}){let o=i.useSetting("show-checkboxes"),[s,u]=v.useState(!1),[l,c]=v.useState(!1);return v.useEffect(()=>{if(l){let d=f=>{f.metaKey||f.ctrlKey?u(!0):u(!1)};return window.addEventListener("keydown",d),window.addEventListener("keyup",d),()=>{window.removeEventListener("keydown",d),window.removeEventListener("keyup",d)}}},[l]),n||o?v.createElement("div",{onMouseEnter:d=>{c(!0),(d.ctrlKey||d.metaKey)&&u(!0)},onMouseLeave:()=>{c(!1),s&&u(!1)},className:$("item-prefix-button-wrapper")},o&&!s&&v.createElement("input",{onChange:()=>{a.updateItem(e,(0,Sp.default)(r,{data:{$toggle:["isComplete"]}}))},type:"checkbox",className:"task-list-item-checkbox",checked:!!r.data.isComplete}),(s||!o&&n)&&v.createElement("button",{onClick:()=>{a.archiveItem(e)},className:$("item-prefix-button"),"aria-label":s?void 0:"Archive card"},v.createElement(Qt,{name:"sheets-in-box"}))):null});var cc;function kp(t){if(t.nodeName!=="TEXTAREA")return!1;if(typeof cc=="undefined"){var n=document.createElement("textarea");n.value=1,cc=!!n.firstChild}return cc}function eS(t,n){if(t.focus(),document.selection){var e=document.selection.createRange();e.text=n,e.collapse(!1),e.select();return}var r=document.execCommand("insertText",!1,n);if(!r){var i=t.selectionStart,a=t.selectionEnd;if(typeof t.setRangeText=="function")t.setRangeText(n);else{var o=document.createRange(),s=document.createTextNode(n);if(kp(t)){var u=t.firstChild;if(!u)t.appendChild(s);else{for(var l=0,c=null,d=null;u&&(c===null||d===null);){var f=u.nodeValue.length;i>=l&&i<=l+f&&o.setStart(c=u,i-l),a>=l&&a<=l+f&&o.setEnd(d=u,a-l),l+=f,u=u.nextSibling}i!==a&&o.deleteContents()}}if(kp(t)&&o.commonAncestorContainer.nodeName==="#text")o.insertNode(s);else{var h=t.value;t.value=h.slice(0,i)+n+h.slice(a)}}t.setSelectionRange(i+n.length,i+n.length);var p=document.createEvent("UIEvent");p.initEvent("input",!0,!1),t.dispatchEvent(p)}}var pa=eS;var _p=ge(require("obsidian"));var uc=t=>t.charCodeAt(0)===10,Tp=t=>t===" "||uc(t);function tS(t,n,e){if(!t)throw Error("Argument 'text' should be truthy");let r=0,i=t.length;for(let a=n;a-1>-1;a--)if(uc(t[a-1])){r=a;break}for(let a=e===void 0?n:e;a-1;a--)if(Tp(t[a-1])){r=a;break}for(let a=e===void 0?n:e;a0&&t.value[a.selection.start-1]!==" ")return!1;if(a.selection.end===a.selection.start){let s=Tt(t,`${e}`);return Rt(t,{start:s.selection.end-1-a.selectedText.length,end:s.selection.end-1}),!1}let o=Tt(t,`${n}${a.selectedText}${e}`);return Rt(t,{start:o.selection.end-1-a.selectedText.length,end:o.selection.end-1}),!0}function zo(t,n,e,r){let i=Hn(t),a=wi({text:i.text,selection:i.selection}),o=Rt(t,a),s=n.test(o.selectedText)?r(o.selectedText):e(o.selectedText),u=Tt(t,s);Rt(t,{start:o.selection.start,end:u.selection.end})}function Vo(t,n){var e;if(n.types.includes("text/uri-list")||["file","files","link","folder"].includes((e=t.app.dragManager.draggable)==null?void 0:e.type))return"link";if(n.types.includes("text/html")||n.types.includes("text/plain"))return"copy"}async function qo(t,n){let e=t.clipboardData.getData("text/html"),r=t.clipboardData.types.includes("Files"),i=_p.Platform.isDesktopApp?ac():null,a=e||r||(i==null?void 0:i.length)>0;a&&t.preventDefault();try{let o=await Ko(n,t.nativeEvent);if(a){let s=t.target,u=o.join(` -`);Tt(s,u)}}catch(o){console.error(o),n.setError(o)}}var xm=ge(gc()),km=ge(Jp());function Xn(t){return Array.isArray?Array.isArray(t):Xp(t)==="[object Array]"}var LS=1/0;function PS(t){if(typeof t=="string")return t;let n=t+"";return n=="0"&&1/t==-LS?"-0":n}function OS(t){return t==null?"":PS(t)}function Zn(t){return typeof t=="string"}function Gp(t){return typeof t=="number"}function NS(t){return t===!0||t===!1||FS(t)&&Xp(t)=="[object Boolean]"}function Qp(t){return typeof t=="object"}function FS(t){return Qp(t)&&t!==null}function on(t){return t!=null}function yc(t){return!t.trim().length}function Xp(t){return t==null?t===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}var RS="Incorrect 'index' type",HS=t=>`Invalid value for key ${t}`,BS=t=>`Pattern length exceeds max of ${t}.`,KS=t=>`Missing ${t} property in key`,$S=t=>`Property 'weight' in key '${t}' must be a positive integer`,Zp=Object.prototype.hasOwnProperty,em=class{constructor(n){this._keys=[],this._keyMap={};let e=0;n.forEach(r=>{let i=tm(r);e+=i.weight,this._keys.push(i),this._keyMap[i.id]=i,e+=i.weight}),this._keys.forEach(r=>{r.weight/=e})}get(n){return this._keyMap[n]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function tm(t){let n=null,e=null,r=null,i=1;if(Zn(t)||Xn(t))r=t,n=nm(t),e=bc(t);else{if(!Zp.call(t,"name"))throw new Error(KS("name"));let a=t.name;if(r=a,Zp.call(t,"weight")&&(i=t.weight,i<=0))throw new Error($S(a));n=nm(a),e=bc(a)}return{path:n,id:e,weight:i,src:r}}function nm(t){return Xn(t)?t:t.split(".")}function bc(t){return Xn(t)?t.join("."):t}function US(t,n){let e=[],r=!1,i=(a,o,s)=>{if(!!on(a))if(!o[s])e.push(a);else{let u=o[s],l=a[u];if(!on(l))return;if(s===o.length-1&&(Zn(l)||Gp(l)||NS(l)))e.push(OS(l));else if(Xn(l)){r=!0;for(let c=0,d=l.length;ct.score===n.score?t.idx{this._keysMap[e.id]=r})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,Zn(this.docs[0])?this.docs.forEach((n,e)=>{this._addString(n,e)}):this.docs.forEach((n,e)=>{this._addObject(n,e)}),this.norm.clear())}add(n){let e=this.size();Zn(n)?this._addString(n,e):this._addObject(n,e)}removeAt(n){this.records.splice(n,1);for(let e=n,r=this.size();e{let o=this.getFn(n,i.path);if(!!on(o)){if(Xn(o)){let s=[],u=[{nestedArrIndex:-1,value:o}];for(;u.length;){let{nestedArrIndex:l,value:c}=u.pop();if(!!on(c))if(Zn(c)&&!yc(c)){let d={v:c,i:l,n:this.norm.get(c)};s.push(d)}else Xn(c)&&c.forEach((d,f)=>{u.push({nestedArrIndex:f,value:d})})}r.$[a]=s}else if(!yc(o)){let s={v:o,n:this.norm.get(o)};r.$[a]=s}}}),this.records.push(r)}toJSON(){return{keys:this.keys,records:this.records}}};function rm(t,n,{getFn:e=ke.getFn,fieldNormWeight:r=ke.fieldNormWeight}={}){let i=new ss({getFn:e,fieldNormWeight:r});return i.setKeys(t.map(tm)),i.setSources(n),i.create(),i}function JS(t,{getFn:n=ke.getFn,fieldNormWeight:e=ke.fieldNormWeight}={}){let{keys:r,records:i}=t,a=new ss({getFn:n,fieldNormWeight:e});return a.setKeys(r),a.setIndexRecords(i),a}function ls(t,{errors:n=0,currentLocation:e=0,expectedLocation:r=0,distance:i=ke.distance,ignoreLocation:a=ke.ignoreLocation}={}){let o=n/t.length;if(a)return o;let s=Math.abs(r-e);return i?o+s/i:s?1:o}function GS(t=[],n=ke.minMatchCharLength){let e=[],r=-1,i=-1,a=0;for(let o=t.length;a=n&&e.push([r,i]),r=-1)}return t[a-1]&&a-r>=n&&e.push([r,a-1]),e}var Or=32;function QS(t,n,e,{location:r=ke.location,distance:i=ke.distance,threshold:a=ke.threshold,findAllMatches:o=ke.findAllMatches,minMatchCharLength:s=ke.minMatchCharLength,includeMatches:u=ke.includeMatches,ignoreLocation:l=ke.ignoreLocation}={}){if(n.length>Or)throw new Error(BS(Or));let c=n.length,d=t.length,f=Math.max(0,Math.min(r,d)),h=a,p=f,g=s>1||u,w=g?Array(d):[],S;for(;(S=t.indexOf(n,p))>-1;){let N=ls(n,{currentLocation:S,expectedLocation:f,distance:i,ignoreLocation:l});if(h=Math.min(N,h),p=S+c,g){let K=0;for(;K=X;J-=1){let ne=J-1,le=e[t.charAt(ne)];if(g&&(w[ne]=+!!le),ie[J]=(ie[J+1]<<1|1)&le,N&&(ie[J]|=(_[J+1]|_[J])<<1|1|_[J+1]),ie[J]&I&&(k=ls(n,{errors:N,currentLocation:ne,expectedLocation:f,distance:i,ignoreLocation:l}),k<=h)){if(h=k,p=ne,p<=f)break;X=Math.max(1,2*f-p)}}if(ls(n,{errors:N+1,currentLocation:f,expectedLocation:f,distance:i,ignoreLocation:l})>h)break;_=ie}let D={isMatch:p>=0,score:Math.max(.001,k)};if(g){let N=GS(w,s);N.length?u&&(D.indices=N):D.isMatch=!1}return D}function XS(t){let n={};for(let e=0,r=t.length;e{this.chunks.push({pattern:f,alphabet:XS(f),startIndex:h})},d=this.pattern.length;if(d>Or){let f=0,h=d%Or,p=d-h;for(;f{let{isMatch:S,score:_,indices:k}=QS(n,p,g,{location:i+w,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:u,includeMatches:r,ignoreLocation:l});S&&(f=!0),d+=_,S&&k&&(c=[...c,...k])});let h={isMatch:f,score:f?d/this.chunks.length:1};return f&&r&&(h.indices=c),h}},er=class{constructor(n){this.pattern=n}static isMultiMatch(n){return im(n,this.multiRegex)}static isSingleMatch(n){return im(n,this.singleRegex)}search(){}};function im(t,n){let e=t.match(n);return e?e[1]:null}var am=class extends er{constructor(n){super(n)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(n){let e=n===this.pattern;return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},om=class extends er{constructor(n){super(n)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(n){let r=n.indexOf(this.pattern)===-1;return{isMatch:r,score:r?0:1,indices:[0,n.length-1]}}},sm=class extends er{constructor(n){super(n)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(n){let e=n.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},lm=class extends er{constructor(n){super(n)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(n){let e=!n.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,n.length-1]}}},cm=class extends er{constructor(n){super(n)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(n){let e=n.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[n.length-this.pattern.length,n.length-1]}}},um=class extends er{constructor(n){super(n)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(n){let e=!n.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,n.length-1]}}},Ec=class extends er{constructor(n,{location:e=ke.location,threshold:r=ke.threshold,distance:i=ke.distance,includeMatches:a=ke.includeMatches,findAllMatches:o=ke.findAllMatches,minMatchCharLength:s=ke.minMatchCharLength,isCaseSensitive:u=ke.isCaseSensitive,ignoreLocation:l=ke.ignoreLocation}={}){super(n);this._bitapSearch=new wc(n,{location:e,threshold:r,distance:i,includeMatches:a,findAllMatches:o,minMatchCharLength:s,isCaseSensitive:u,ignoreLocation:l})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(n){return this._bitapSearch.searchIn(n)}},Sc=class extends er{constructor(n){super(n)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(n){let e=0,r,i=[],a=this.pattern.length;for(;(r=n.indexOf(this.pattern,e))>-1;)e=r+a,i.push([r,e-1]);let o=!!i.length;return{isMatch:o,score:o?0:1,indices:i}}},xc=[am,Sc,sm,lm,um,cm,om,Ec],dm=xc.length,ZS=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/,ex="|";function tx(t,n={}){return t.split(ex).map(e=>{let r=e.trim().split(ZS).filter(a=>a&&!!a.trim()),i=[];for(let a=0,o=r.length;a!!(t[cs.AND]||t[cs.OR]),ix=t=>!!t[Tc.PATH],ax=t=>!Xn(t)&&Qp(t)&&!Mc(t),hm=t=>({[cs.AND]:Object.keys(t).map(n=>({[n]:t[n]}))});function pm(t,n,{auto:e=!0}={}){let r=i=>{let a=Object.keys(i),o=ix(i);if(!o&&a.length>1&&!Mc(i))return r(hm(i));if(ax(i)){let u=o?i[Tc.PATH]:a[0],l=o?i[Tc.PATTERN]:i[u];if(!Zn(l))throw new Error(HS(u));let c={keyId:bc(u),pattern:l};return e&&(c.searcher=_c(l,n)),c}let s={children:[],operator:a[0]};return a.forEach(u=>{let l=i[u];Xn(l)&&l.forEach(c=>{s.children.push(r(c))})}),s};return Mc(t)||(t=hm(t)),r(t)}function ox(t,{ignoreFieldNorm:n=ke.ignoreFieldNorm}){t.forEach(e=>{let r=1;e.matches.forEach(({key:i,norm:a,score:o})=>{let s=i?i.weight:null;r*=Math.pow(o===0&&s?Number.EPSILON:o,(s||1)*(n?1:a))}),e.score=r})}function sx(t,n){let e=t.matches;n.matches=[],!!on(e)&&e.forEach(r=>{if(!on(r.indices)||!r.indices.length)return;let{indices:i,value:a}=r,o={indices:i,value:a};r.key&&(o.key=r.key.src),r.idx>-1&&(o.refIndex=r.idx),n.matches.push(o)})}function lx(t,n){n.score=t.score}function cx(t,n,{includeMatches:e=ke.includeMatches,includeScore:r=ke.includeScore}={}){let i=[];return e&&i.push(sx),r&&i.push(lx),t.map(a=>{let{idx:o}=a,s={item:n[o],refIndex:o};return i.length&&i.forEach(u=>{u(a,s)}),s})}var gn=class{constructor(n,e={},r){this.options={...ke,...e},this.options.useExtendedSearch,this._keyStore=new em(this.options.keys),this.setCollection(n,r)}setCollection(n,e){if(this._docs=n,e&&!(e instanceof ss))throw new Error(RS);this._myIndex=e||rm(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(n){!on(n)||(this._docs.push(n),this._myIndex.add(n))}remove(n=()=>!1){let e=[];for(let r=0,i=this._docs.length;r-1&&(u=u.slice(0,e)),cx(u,this._docs,{includeMatches:r,includeScore:i})}_searchStringList(n){let e=_c(n,this.options),{records:r}=this._myIndex,i=[];return r.forEach(({v:a,i:o,n:s})=>{if(!on(a))return;let{isMatch:u,score:l,indices:c}=e.searchIn(a);u&&i.push({item:a,idx:o,matches:[{score:l,value:a,norm:s,indices:c}]})}),i}_searchLogical(n){let e=pm(n,this.options),r=(s,u,l)=>{if(!s.children){let{keyId:d,searcher:f}=s,h=this._findMatches({key:this._keyStore.get(d),value:this._myIndex.getValueForItemAtKeyId(u,d),searcher:f});return h&&h.length?[{idx:l,item:u,matches:h}]:[]}let c=[];for(let d=0,f=s.children.length;d{if(on(s)){let l=r(e,s,u);l.length&&(a[u]||(a[u]={idx:u,item:s,matches:[]},o.push(a[u])),l.forEach(({matches:c})=>{a[u].matches.push(...c)}))}}),o}_searchObjectList(n){let e=_c(n,this.options),{keys:r,records:i}=this._myIndex,a=[];return i.forEach(({$:o,i:s})=>{if(!on(o))return;let u=[];r.forEach((l,c)=>{u.push(...this._findMatches({key:l,value:o[c],searcher:e}))}),u.length&&a.push({idx:s,item:o,matches:u})}),a}_findMatches({key:n,value:e,searcher:r}){if(!on(e))return[];let i=[];if(Xn(e))e.forEach(({v:a,i:o,n:s})=>{if(!on(a))return;let{isMatch:u,score:l,indices:c}=r.searchIn(a);u&&i.push({score:l,key:n,value:a,idx:o,norm:s,indices:c})});else{let{v:a,n:o}=e,{isMatch:s,score:u,indices:l}=r.searchIn(a);s&&i.push({score:u,key:n,value:a,norm:o,indices:l})}return i}};gn.version="6.5.3";gn.createIndex=rm;gn.parseIndex=JS;gn.config=ke;gn.parseQuery=pm;rx(fm);var _m=ge(require("obsidian"));var mm=ge(require("obsidian"));function us(t,n,e){let r=e.getSetting("date-format"),i=e.getSetting("link-date-to-daily-note"),a=(0,mm.moment)(t).format(r),o=i?Po(e.app,a):`{${a}}`;Tt(n.current,o),n.current.focus()}function gm({div:t,inputRef:n,cb:e,stateManager:r}){t.createEl("input",{type:"text"},i=>{setTimeout(()=>e(Lo(i,{locale:No(r),inline:!0,onChange:a=>{us(a[0],n,r)}})))})}function Dc(t,n){let e=n.clientHeight,r=n.clientWidth;t.top+e>window.innerHeight&&(n.style.top=`${(t.clientTop||0)-e}px`),t.left+r>window.innerWidth&&(n.style.left=`${(t.left||0)-r}px`)}function vm(t){let n=t.getSetting("time-trigger"),e=new RegExp(`\\B${On(n)}{?([^}]*)$`),r=ic(t);return{id:"time",match:e,index:1,search:(i,a)=>{a(i?r.filter(o=>o.startsWith(i)):r)},template:i=>i,replace:i=>`${n}{${i}} `}}function ym(t){let n=t.month(),e=t.clone().startOf("month").weekday(0),r=t.diff(e,"week");t.subtract(1,"month").startOf("month").weekday(6).add(r,"week");let i=t.month();for(;n===i;)t.subtract(1,"week"),i=t.month();return t}function bm(t){let n=t.month(),e=t.clone().startOf("month").weekday(6),r=t.diff(e,"week");t.add(1,"month").startOf("month").weekday(0).add(r,"week");let i=t.month();for(;n===i;)t.add(1,"week"),i=t.month();return t}var wm=ge(require("obsidian"));var ux=/\B\[\[([^\]]*)$/,dx=/\B!\[\[([^\]]*)$/,fx=/\B\[\[([^#\]]+)#([^\]]*)$/,hx=/\B!\[\[([^#\]]+)#([^\]]*)$/,px=/\B\[\[([^#\]]+)#?\^([^\]]*)$/,mx=/\B!\[\[([^#\]]+)#?\^([^\]]*)$/;function gx(t,n,e){let r=createDiv($("file-suggestion-wrapper"));(0,wm.setIcon)(r.createDiv($("file-suggestion-icon")),"forward-arrow",12),r.createDiv({},a=>{a.createDiv({cls:$("file-suggestion-title"),text:e.item.alias}),a.createDiv({cls:$("file-suggestion-subtitle"),text:t.app.metadataCache.fileToLinktext(e.item.file,n)})});let i=r.outerHTML;return r.remove(),r=null,i}function Cc(t,n,e,r,i,a){return{id:`link-${a?"embed":"normal"}`,match:a?dx:ux,index:1,template:o=>o.item.alias?gx(r,e,o):r.app.metadataCache.fileToLinktext(o.item.file,e),search:(o,s)=>{s(o?n.search(o):t.slice(0,10).map((u,l)=>({item:u,refIndex:l})))},replace:o=>{let s=[];a&&o.item.file.extension==="md"&&s.push("!"),s.push(r.app.fileManager.generateMarkdownLink(o.item.file,r.file.path,void 0,o.item.alias));let u=!!r.app.vault.getConfig("useMarkdownLinks");return i&&!u?s[s.length-1]=s[s.length-1].slice(0,-2):!i&&!u&&s.push("]] "),s.join("")}}}function vx(t,n,e,r){var u;if(!e)return[];let i=e.split("|"),a=t.metadataCache.getFirstLinkpathDest(i[0],n);if(!a)return[];let o=t.metadataCache.getFileCache(a);if(!o||!((u=o.headings)==null?void 0:u.length))return[];let s=o.headings.map(l=>({file:a,heading:l.heading,alias:i[1]||""}));return r?new gn(s,{keys:["heading"]}).search(r):s.map((l,c)=>({item:l,refIndex:c}))}function Ic(t,n,e,r){return{id:`heading-${r?"embed":"normal"}`,match:r?hx:fx,index:1,template:i=>i.item.heading,search:(i,a,o)=>{a(vx(n.app,t,o[1],o[2]))},replace:i=>{let a=[];r&&i.item.file.extension==="md"&&a.push("!"),a.push(n.app.fileManager.generateMarkdownLink(i.item.file,n.file.path,"#"+i.item.heading,i.item.alias));let o=!!n.app.vault.getConfig("useMarkdownLinks");return e&&!o?a[a.length-1]=a[a.length-1].slice(0,-2):!e&&!o&&a.push("]] "),a.join("")}}}var Em=class{constructor(){this.running=!1;this.cancelled=!1}start(){this.running=!0}stop(){this.running=!1}cancel(){this.stop(),this.cancelled=!0}isRunning(){return this.running}isCancelled(){return this.cancelled}};async function yx(t,n,e,r,i){var u;if(!e)return i([]);let a=e.split("|"),o=t.metadataCache.getFirstLinkpathDest(a[0],n);if(!o)return i([]);let s=t.metadataCache.getFileCache(o);if(!s||!((u=s.sections)==null?void 0:u.length))return i([]);try{let l=await t.metadataCache.blockCache.getForFile(new Em,o);if(!(l==null?void 0:l.blocks))return i([]);let c=l.blocks.map(d=>d.node.type==="heading"?null:{file:o,searchString:d.display,blockId:d.node.id,block:{type:d.node.type,start:d.node.position.start.offset,end:d.node.position.end.offset},alias:a[1]||""}).filter(d=>d);i(r?new gn(c,{keys:["searchString","blockId"]}).search(r):c.map((d,f)=>({item:d,refIndex:f})))}catch(l){i([])}}function bx(t){return["blockquote","code","table","comment","footnoteDefinition"].includes(t)}function Ac(t,n,e,r){return{id:`block-${r?"embed":"normal"}`,match:r?mx:px,index:1,template:i=>i.item.blockId?`
${i.item.searchString}
${i.item.blockId}
`:i.item.searchString,search:(i,a,o)=>{yx(n.app,t,o[1],o[2],a)},replace:i=>{let a=[];r&&i.item.file.extension==="md"&&a.push("!");let o="#^";if(i.item.blockId)o+=i.item.blockId;else{let u=We(),l=bx(i.item.block.type)?` + `}}function De(){e.calendarContainer.classList.add("hasWeeks");var x=Ve("div","flatpickr-weekwrapper");x.appendChild(Ve("span","flatpickr-weekday",e.l10n.weekAbbreviation));var _=Ve("div","flatpickr-weeks");return x.appendChild(_),{weekWrapper:x,weekNumbers:_}}function A(x,_){_===void 0&&(_=!0);var R=_?x:x-e.currentMonth;R<0&&e._hidePrevMonthArrow===!0||R>0&&e._hideNextMonthArrow===!0||(e.currentMonth+=R,(e.currentMonth<0||e.currentMonth>11)&&(e.currentYear+=e.currentMonth>11?1:-1,e.currentMonth=(e.currentMonth+12)%12,Se("onYearChange"),q()),ie(),Se("onMonthChange"),qt())}function I(x,_){if(x===void 0&&(x=!0),_===void 0&&(_=!0),e.input.value="",e.altInput!==void 0&&(e.altInput.value=""),e.mobileInput!==void 0&&(e.mobileInput.value=""),e.selectedDates=[],e.latestSelectedDateObj=void 0,_===!0&&(e.currentYear=e._initialDate.getFullYear(),e.currentMonth=e._initialDate.getMonth()),e.config.enableTime===!0){var R=Lo(e.config),W=R.hours,re=R.minutes,ae=R.seconds;h(W,re,ae)}e.redraw(),x&&Se("onChange")}function et(){e.isOpen=!1,e.isMobile||(e.calendarContainer!==void 0&&e.calendarContainer.classList.remove("open"),e._input!==void 0&&e._input.classList.remove("active")),Se("onClose")}function qe(){e.config!==void 0&&Se("onDestroy");for(var x=e._handlers.length;x--;)e._handlers[x].remove();if(e._handlers=[],e.mobileInput)e.mobileInput.parentNode&&e.mobileInput.parentNode.removeChild(e.mobileInput),e.mobileInput=void 0;else if(e.calendarContainer&&e.calendarContainer.parentNode)if(e.config.static&&e.calendarContainer.parentNode){var _=e.calendarContainer.parentNode;if(_.lastChild&&_.removeChild(_.lastChild),_.parentNode){for(;_.firstChild;)_.parentNode.insertBefore(_.firstChild,_);_.parentNode.removeChild(_)}}else e.calendarContainer.parentNode.removeChild(e.calendarContainer);e.altInput&&(e.input.type="text",e.altInput.parentNode&&e.altInput.parentNode.removeChild(e.altInput),delete e.altInput),e.input&&(e.input.type=e.input._type,e.input.classList.remove("flatpickr-input"),e.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(R){try{delete e[R]}catch(W){}})}function K(x){return e.calendarContainer.contains(x)}function V(x){if(e.isOpen&&!e.config.inline){var _=Xt(x),R=K(_),W=_===e.input||_===e.altInput||e.element.contains(_)||x.path&&x.path.indexOf&&(~x.path.indexOf(e.input)||~x.path.indexOf(e.altInput)),re=!W&&!R&&!K(x.relatedTarget),ae=!e.config.ignoredFocusElements.some(function(xe){return xe.contains(_)});re&&ae&&(e.config.allowInput&&e.setDate(e._input.value,!1,e.config.altInput?e.config.altFormat:e.config.dateFormat),e.timeContainer!==void 0&&e.minuteElement!==void 0&&e.hourElement!==void 0&&e.input.value!==""&&e.input.value!==void 0&&u(),e.close(),e.config&&e.config.mode==="range"&&e.selectedDates.length===1&&e.clear(!1))}}function U(x){if(!(!x||e.config.minDate&&xe.config.maxDate.getFullYear())){var _=x,R=e.currentYear!==_;e.currentYear=_||e.currentYear,e.config.maxDate&&e.currentYear===e.config.maxDate.getFullYear()?e.currentMonth=Math.min(e.config.maxDate.getMonth(),e.currentMonth):e.config.minDate&&e.currentYear===e.config.minDate.getFullYear()&&(e.currentMonth=Math.max(e.config.minDate.getMonth(),e.currentMonth)),R&&(e.redraw(),Se("onYearChange"),q())}}function G(x,_){var R;_===void 0&&(_=!0);var W=e.parseDate(x,void 0,_);if(e.config.minDate&&W&&Zt(W,e.config.minDate,_!==void 0?_:!e.minDateHasTime)<0||e.config.maxDate&&W&&Zt(W,e.config.maxDate,_!==void 0?_:!e.maxDateHasTime)>0)return!1;if(!e.config.enable&&e.config.disable.length===0)return!0;if(W===void 0)return!1;for(var re=!!e.config.enable,ae=(R=e.config.enable)!==null&&R!==void 0?R:e.config.disable,xe=0,ue=void 0;xe=ue.from.getTime()&&W.getTime()<=ue.to.getTime())return re}return!re}function ye(x){return e.daysContainer!==void 0?x.className.indexOf("hidden")===-1&&x.className.indexOf("flatpickr-disabled")===-1&&e.daysContainer.contains(x):!1}function Ee(x){var _=x.target===e._input;_&&(e.selectedDates.length>0||e._input.value.length>0)&&!(x.relatedTarget&&K(x.relatedTarget))&&e.setDate(e._input.value,!0,x.target===e.altInput?e.config.altFormat:e.config.dateFormat)}function Fe(x){var _=Xt(x),R=e.config.wrap?t.contains(_):_===e._input,W=e.config.allowInput,re=e.isOpen&&(!W||!R),ae=e.config.inline&&R&&!W;if(x.keyCode===13&&R){if(W)return e.setDate(e._input.value,!0,_===e.altInput?e.config.altFormat:e.config.dateFormat),e.close(),_.blur();e.open()}else if(K(_)||re||ae){var xe=!!e.timeContainer&&e.timeContainer.contains(_);switch(x.keyCode){case 13:xe?(x.preventDefault(),u(),Mn()):Cn(x);break;case 27:x.preventDefault(),Mn();break;case 8:case 46:R&&!e.config.allowInput&&(x.preventDefault(),e.clear());break;case 37:case 39:if(!xe&&!R){x.preventDefault();var ue=a();if(e.daysContainer!==void 0&&(W===!1||ue&&ye(ue))){var _e=x.keyCode===39?1:-1;x.ctrlKey?(x.stopPropagation(),A(_e),Q(B(1),0)):Q(void 0,_e)}}else e.hourElement&&e.hourElement.focus();break;case 38:case 40:x.preventDefault();var le=x.keyCode===40?1:-1;e.daysContainer&&_.$i!==void 0||_===e.input||_===e.altInput?x.ctrlKey?(x.stopPropagation(),U(e.currentYear-le),Q(B(1),0)):xe||Q(void 0,le*7):_===e.currentYearElement?U(e.currentYear-le):e.config.enableTime&&(!xe&&e.hourElement&&e.hourElement.focus(),u(x),e._debouncedChange());break;case 9:if(xe){var we=[e.hourElement,e.minuteElement,e.secondElement,e.amPM].concat(e.pluginElements).filter(function(mt){return mt}),ze=we.indexOf(_);if(ze!==-1){var At=we[ze+(x.shiftKey?-1:1)];x.preventDefault(),(At||e._input).focus()}}else!e.config.noCalendar&&e.daysContainer&&e.daysContainer.contains(_)&&x.shiftKey&&(x.preventDefault(),e._input.focus());break;default:break}}if(e.amPM!==void 0&&_===e.amPM)switch(x.key){case e.l10n.amPM[0].charAt(0):case e.l10n.amPM[0].charAt(0).toLowerCase():e.amPM.textContent=e.l10n.amPM[0],d(),Yt();break;case e.l10n.amPM[1].charAt(0):case e.l10n.amPM[1].charAt(0).toLowerCase():e.amPM.textContent=e.l10n.amPM[1],d(),Yt();break}(R||K(_))&&Se("onKeyDown",x)}function Ge(x,_){if(_===void 0&&(_="flatpickr-day"),!(e.selectedDates.length!==1||x&&(!x.classList.contains(_)||x.classList.contains("flatpickr-disabled")))){for(var R=x?x.dateObj.getTime():e.days.firstElementChild.dateObj.getTime(),W=e.parseDate(e.selectedDates[0],void 0,!0).getTime(),re=Math.min(R,e.selectedDates[0].getTime()),ae=Math.max(R,e.selectedDates[0].getTime()),xe=!1,ue=0,_e=0,le=re;lere&&leue)?ue=le:le>W&&(!_e||le<_e)&&(_e=le));var we=Array.from(e.rContainer.querySelectorAll("*:nth-child(-n+"+e.config.showMonths+") > ."+_));we.forEach(function(ze){var At=ze.dateObj,mt=At.getTime(),Dn=ue>0&&mt0&&mt>_e;if(Dn){ze.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(function(bn){ze.classList.remove(bn)});return}else if(xe&&!Dn)return;["startRange","inRange","endRange","notAllowed"].forEach(function(bn){ze.classList.remove(bn)}),x!==void 0&&(x.classList.add(R<=e.selectedDates[0].getTime()?"startRange":"endRange"),WR&&mt===W&&ze.classList.add("endRange"),mt>=ue&&(_e===0||mt<=_e)&&Oh(mt,W,R)&&ze.classList.add("inRange"))})}}function ht(){e.isOpen&&!e.config.static&&!e.config.inline&&Ct()}function pt(x,_){if(_===void 0&&(_=e._positionElement),e.isMobile===!0){if(x){x.preventDefault();var R=Xt(x);R&&R.blur()}e.mobileInput!==void 0&&(e.mobileInput.focus(),e.mobileInput.click()),Se("onOpen");return}else if(e._input.disabled||e.config.inline)return;var W=e.isOpen;e.isOpen=!0,W||(e.calendarContainer.classList.add("open"),e._input.classList.add("active"),Se("onOpen"),Ct(_)),e.config.enableTime===!0&&e.config.noCalendar===!0&&e.config.allowInput===!1&&(x===void 0||!e.timeContainer.contains(x.relatedTarget))&&setTimeout(function(){return e.hourElement.select()},50)}function tn(x){return function(_){var R=e.config["_"+x+"Date"]=e.parseDate(_,e.config.dateFormat),W=e.config["_"+(x==="min"?"max":"min")+"Date"];R!==void 0&&(e[x==="min"?"minDateHasTime":"maxDateHasTime"]=R.getHours()>0||R.getMinutes()>0||R.getSeconds()>0),e.selectedDates&&(e.selectedDates=e.selectedDates.filter(function(re){return G(re)}),!e.selectedDates.length&&x==="min"&&f(R),Yt()),e.daysContainer&&(Tn(),R!==void 0?e.currentYearElement[x]=R.getFullYear().toString():e.currentYearElement.removeAttribute(x),e.currentYearElement.disabled=!!W&&R!==void 0&&W.getFullYear()===R.getFullYear())}}function yn(){var x=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],_=Ot(Ot({},JSON.parse(JSON.stringify(t.dataset||{}))),n),R={};e.config.parseDate=_.parseDate,e.config.formatDate=_.formatDate,Object.defineProperty(e.config,"enable",{get:function(){return e.config._enable},set:function(we){e.config._enable=ne(we)}}),Object.defineProperty(e.config,"disable",{get:function(){return e.config._disable},set:function(we){e.config._disable=ne(we)}});var W=_.mode==="time";if(!_.dateFormat&&(_.enableTime||W)){var re=ft.defaultConfig.dateFormat||pr.dateFormat;R.dateFormat=_.noCalendar||W?"H:i"+(_.enableSeconds?":S":""):re+" H:i"+(_.enableSeconds?":S":"")}if(_.altInput&&(_.enableTime||W)&&!_.altFormat){var ae=ft.defaultConfig.altFormat||pr.altFormat;R.altFormat=_.noCalendar||W?"h:i"+(_.enableSeconds?":S K":" K"):ae+(" h:i"+(_.enableSeconds?":S":"")+" K")}Object.defineProperty(e.config,"minDate",{get:function(){return e.config._minDate},set:tn("min")}),Object.defineProperty(e.config,"maxDate",{get:function(){return e.config._maxDate},set:tn("max")});var xe=function(we){return function(ze){e.config[we==="min"?"_minTime":"_maxTime"]=e.parseDate(ze,"H:i:S")}};Object.defineProperty(e.config,"minTime",{get:function(){return e.config._minTime},set:xe("min")}),Object.defineProperty(e.config,"maxTime",{get:function(){return e.config._maxTime},set:xe("max")}),_.mode==="time"&&(e.config.noCalendar=!0,e.config.enableTime=!0),Object.assign(e.config,R,_);for(var ue=0;ue-1?e.config[le]=Do(_e[le]).map(o).concat(e.config[le]):typeof _[le]=="undefined"&&(e.config[le]=_e[le])}_.altInputClass||(e.config.altInputClass=nn().className+" "+e.config.altInputClass),Se("onParseConfig")}function nn(){return e.config.wrap?t.querySelector("[data-input]"):t}function Wt(){typeof e.config.locale!="object"&&typeof ft.l10ns[e.config.locale]=="undefined"&&e.config.errorHandler(new Error("flatpickr: invalid locale "+e.config.locale)),e.l10n=Ot(Ot({},ft.l10ns.default),typeof e.config.locale=="object"?e.config.locale:e.config.locale!=="default"?ft.l10ns[e.config.locale]:void 0),Qn.D="("+e.l10n.weekdays.shorthand.join("|")+")",Qn.l="("+e.l10n.weekdays.longhand.join("|")+")",Qn.M="("+e.l10n.months.shorthand.join("|")+")",Qn.F="("+e.l10n.months.longhand.join("|")+")",Qn.K="("+e.l10n.amPM[0]+"|"+e.l10n.amPM[1]+"|"+e.l10n.amPM[0].toLowerCase()+"|"+e.l10n.amPM[1].toLowerCase()+")";var x=Ot(Ot({},n),JSON.parse(JSON.stringify(t.dataset||{})));x.time_24hr===void 0&&ft.defaultConfig.time_24hr===void 0&&(e.config.time_24hr=e.l10n.time_24hr),e.formatDate=Vl(e),e.parseDate=Ao({config:e.config,l10n:e.l10n})}function Ct(x){if(typeof e.config.position=="function")return void e.config.position(e,x);if(e.calendarContainer!==void 0){Se("onPreCalendarPosition");var _=x||e._positionElement,R=Array.prototype.reduce.call(e.calendarContainer.children,function(y,b){return y+b.offsetHeight},0),W=e.calendarContainer.offsetWidth,re=e.config.position.split(" "),ae=re[0],xe=re.length>1?re[1]:null,ue=_.getBoundingClientRect(),_e=window.innerHeight-ue.bottom,le=ae==="above"||ae!=="below"&&_eR,we=window.pageYOffset+ue.top+(le?-R-2:_.offsetHeight+2);if(Pt(e.calendarContainer,"arrowTop",!le),Pt(e.calendarContainer,"arrowBottom",le),!e.config.inline){var ze=window.pageXOffset+ue.left,At=!1,mt=!1;xe==="center"?(ze-=(W-ue.width)/2,At=!0):xe==="right"&&(ze-=W-ue.width,mt=!0),Pt(e.calendarContainer,"arrowLeft",!At&&!mt),Pt(e.calendarContainer,"arrowCenter",At),Pt(e.calendarContainer,"arrowRight",mt);var Dn=window.document.body.offsetWidth-(window.pageXOffset+ue.right),bn=ze+W>window.document.body.offsetWidth,Sr=Dn+W>window.document.body.offsetWidth;if(Pt(e.calendarContainer,"rightMost",bn),!e.config.static)if(e.calendarContainer.style.top=we+"px",!bn)e.calendarContainer.style.left=ze+"px",e.calendarContainer.style.right="auto";else if(!Sr)e.calendarContainer.style.left="auto",e.calendarContainer.style.right=Dn+"px";else{var Vn=Un();if(Vn===void 0)return;var Ur=window.document.body.offsetWidth,zr=Math.max(0,Ur/2-W/2),Vr=".flatpickr-calendar.centerMost:before",jr=".flatpickr-calendar.centerMost:after",Pi=Vn.cssRules.length,L="{left:"+ue.left+"px;right:auto;}";Pt(e.calendarContainer,"rightMost",!1),Pt(e.calendarContainer,"centerMost",!0),Vn.insertRule(Vr+","+jr+L,Pi),e.calendarContainer.style.left=zr+"px",e.calendarContainer.style.right="auto"}}}}function Un(){for(var x=null,_=0;_e.currentMonth+e.config.showMonths-1)&&e.config.mode!=="range";if(e.selectedDateElem=W,e.config.mode==="single")e.selectedDates=[re];else if(e.config.mode==="multiple"){var xe=Kt(re);xe?e.selectedDates.splice(parseInt(xe),1):e.selectedDates.push(re)}else e.config.mode==="range"&&(e.selectedDates.length===2&&e.clear(!1,!1),e.latestSelectedDateObj=re,e.selectedDates.push(re),Zt(re,e.selectedDates[0],!0)!==0&&e.selectedDates.sort(function(we,ze){return we.getTime()-ze.getTime()}));if(d(),ae){var ue=e.currentYear!==re.getFullYear();e.currentYear=re.getFullYear(),e.currentMonth=re.getMonth(),ue&&(Se("onYearChange"),q()),Se("onMonthChange")}if(qt(),ie(),Yt(),!ae&&e.config.mode!=="range"&&e.config.showMonths===1?O(W):e.selectedDateElem!==void 0&&e.hourElement===void 0&&e.selectedDateElem&&e.selectedDateElem.focus(),e.hourElement!==void 0&&e.hourElement!==void 0&&e.hourElement.focus(),e.config.closeOnSelect){var _e=e.config.mode==="single"&&!e.config.enableTime,le=e.config.mode==="range"&&e.selectedDates.length===2&&!e.config.enableTime;(_e||le)&&Mn()}w()}}var lt={locale:[Wt,he],showMonths:[te,s,fe],minDate:[T],maxDate:[T],positionElement:[ct],clickOpens:[function(){e.config.clickOpens===!0?(g(e._input,"focus",e.open),g(e._input,"click",e.open)):(e._input.removeEventListener("focus",e.open),e._input.removeEventListener("click",e.open))}]};function Bt(x,_){if(x!==null&&typeof x=="object"){Object.assign(e.config,x);for(var R in x)lt[R]!==void 0&<[R].forEach(function(W){return W()})}else e.config[x]=_,lt[x]!==void 0?lt[x].forEach(function(W){return W()}):To.indexOf(x)>-1&&(e.config[x]=Do(_));e.redraw(),Yt(!0)}function tt(x,_){var R=[];if(x instanceof Array)R=x.map(function(W){return e.parseDate(W,_)});else if(x instanceof Date||typeof x=="number")R=[e.parseDate(x,_)];else if(typeof x=="string")switch(e.config.mode){case"single":case"time":R=[e.parseDate(x,_)];break;case"multiple":R=x.split(e.config.conjunction).map(function(W){return e.parseDate(W,_)});break;case"range":R=x.split(e.l10n.rangeSeparator).map(function(W){return e.parseDate(W,_)});break;default:break}else e.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(x)));e.selectedDates=e.config.allowInvalidPreload?R:R.filter(function(W){return W instanceof Date&&G(W,!1)}),e.config.mode==="range"&&e.selectedDates.sort(function(W,re){return W.getTime()-re.getTime()})}function j(x,_,R){if(_===void 0&&(_=!1),R===void 0&&(R=e.config.dateFormat),x!==0&&!x||x instanceof Array&&x.length===0)return e.clear(_);tt(x,R),e.latestSelectedDateObj=e.selectedDates[e.selectedDates.length-1],e.redraw(),T(void 0,_),f(),e.selectedDates.length===0&&e.clear(!1),Yt(_),_&&Se("onChange")}function ne(x){return x.slice().map(function(_){return typeof _=="string"||typeof _=="number"||_ instanceof Date?e.parseDate(_,void 0,!0):_&&typeof _=="object"&&_.from&&_.to?{from:e.parseDate(_.from,void 0),to:e.parseDate(_.to,void 0)}:_}).filter(function(_){return _})}function be(){e.selectedDates=[],e.now=e.parseDate(e.config.now)||new Date;var x=e.config.defaultDate||((e.input.nodeName==="INPUT"||e.input.nodeName==="TEXTAREA")&&e.input.placeholder&&e.input.value===e.input.placeholder?null:e.input.value);x&&tt(x,e.config.dateFormat),e._initialDate=e.selectedDates.length>0?e.selectedDates[0]:e.config.minDate&&e.config.minDate.getTime()>e.now.getTime()?e.config.minDate:e.config.maxDate&&e.config.maxDate.getTime()0&&(e.latestSelectedDateObj=e.selectedDates[0]),e.config.minTime!==void 0&&(e.config.minTime=e.parseDate(e.config.minTime,"H:i")),e.config.maxTime!==void 0&&(e.config.maxTime=e.parseDate(e.config.maxTime,"H:i")),e.minDateHasTime=!!e.config.minDate&&(e.config.minDate.getHours()>0||e.config.minDate.getMinutes()>0||e.config.minDate.getSeconds()>0),e.maxDateHasTime=!!e.config.maxDate&&(e.config.maxDate.getHours()>0||e.config.maxDate.getMinutes()>0||e.config.maxDate.getSeconds()>0)}function Be(){if(e.input=nn(),!e.input){e.config.errorHandler(new Error("Invalid input element specified"));return}e.input._type=e.input.type,e.input.type="text",e.input.classList.add("flatpickr-input"),e._input=e.input,e.config.altInput&&(e.altInput=Ve(e.input.nodeName,e.config.altInputClass),e._input=e.altInput,e.altInput.placeholder=e.input.placeholder,e.altInput.disabled=e.input.disabled,e.altInput.required=e.input.required,e.altInput.tabIndex=e.input.tabIndex,e.altInput.type="text",e.input.setAttribute("type","hidden"),!e.config.static&&e.input.parentNode&&e.input.parentNode.insertBefore(e.altInput,e.input.nextSibling)),e.config.allowInput||e._input.setAttribute("readonly","readonly"),ct()}function ct(){e._positionElement=e.config.positionElement||e._input}function rn(){var x=e.config.enableTime?e.config.noCalendar?"time":"datetime-local":"date";e.mobileInput=Ve("input",e.input.className+" flatpickr-mobile"),e.mobileInput.tabIndex=1,e.mobileInput.type=x,e.mobileInput.disabled=e.input.disabled,e.mobileInput.required=e.input.required,e.mobileInput.placeholder=e.input.placeholder,e.mobileFormatStr=x==="datetime-local"?"Y-m-d\\TH:i:S":x==="date"?"Y-m-d":"H:i:S",e.selectedDates.length>0&&(e.mobileInput.defaultValue=e.mobileInput.value=e.formatDate(e.selectedDates[0],e.mobileFormatStr)),e.config.minDate&&(e.mobileInput.min=e.formatDate(e.config.minDate,"Y-m-d")),e.config.maxDate&&(e.mobileInput.max=e.formatDate(e.config.maxDate,"Y-m-d")),e.input.getAttribute("step")&&(e.mobileInput.step=String(e.input.getAttribute("step"))),e.input.type="hidden",e.altInput!==void 0&&(e.altInput.type="hidden");try{e.input.parentNode&&e.input.parentNode.insertBefore(e.mobileInput,e.input.nextSibling)}catch(_){}g(e.mobileInput,"change",function(_){e.setDate(Xt(_).value,!1,e.mobileFormatStr),Se("onChange"),Se("onClose")})}function Ue(x){if(e.isOpen===!0)return e.close();e.open(x)}function Se(x,_){if(e.config!==void 0){var R=e.config[x];if(R!==void 0&&R.length>0)for(var W=0;R[W]&&W=0&&Zt(x,e.selectedDates[1])<=0}function qt(){e.config.noCalendar||e.isMobile||!e.monthNav||(e.yearElements.forEach(function(x,_){var R=new Date(e.currentYear,e.currentMonth,1);R.setMonth(e.currentMonth+_),e.config.showMonths>1||e.config.monthSelectorType==="static"?e.monthElements[_].textContent=ra(R.getMonth(),e.config.shorthandCurrentMonth,e.l10n)+" ":e.monthsDropdownContainer.value=R.getMonth().toString(),x.value=R.getFullYear().toString()}),e._hidePrevMonthArrow=e.config.minDate!==void 0&&(e.currentYear===e.config.minDate.getFullYear()?e.currentMonth<=e.config.minDate.getMonth():e.currentYeare.config.maxDate.getMonth():e.currentYear>e.config.maxDate.getFullYear()))}function yt(x){return e.selectedDates.map(function(_){return e.formatDate(_,x)}).filter(function(_,R,W){return e.config.mode!=="range"||e.config.enableTime||W.indexOf(_)===R}).join(e.config.mode!=="range"?e.config.conjunction:e.l10n.rangeSeparator)}function Yt(x){x===void 0&&(x=!0),e.mobileInput!==void 0&&e.mobileFormatStr&&(e.mobileInput.value=e.latestSelectedDateObj!==void 0?e.formatDate(e.latestSelectedDateObj,e.mobileFormatStr):""),e.input.value=yt(e.config.dateFormat),e.altInput!==void 0&&(e.altInput.value=yt(e.config.altFormat)),x!==!1&&Se("onValueUpdate")}function $r(x){var _=Xt(x),R=e.prevMonthNav.contains(_),W=e.nextMonthNav.contains(_);R||W?A(R?-1:1):e.yearElements.indexOf(_)>=0?_.select():_.classList.contains("arrowUp")?e.changeYear(e.currentYear+1):_.classList.contains("arrowDown")&&e.changeYear(e.currentYear-1)}function Li(x){x.preventDefault();var _=x.type==="keydown",R=Xt(x),W=R;e.amPM!==void 0&&R===e.amPM&&(e.amPM.textContent=e.l10n.amPM[Qt(e.amPM.textContent===e.l10n.amPM[0])]);var re=parseFloat(W.getAttribute("min")),ae=parseFloat(W.getAttribute("max")),xe=parseFloat(W.getAttribute("step")),ue=parseInt(W.value,10),_e=x.delta||(_?x.which===38?1:-1:0),le=ue+xe*_e;if(typeof W.value!="undefined"&&W.value.length===2){var we=W===e.hourElement,ze=W===e.minuteElement;leae&&(le=W===e.hourElement?le-ae-Qt(!e.amPM):re,ze&&D(void 0,1,e.hourElement)),e.amPM&&we&&(xe===1?le+ue===23:Math.abs(le-ue)>xe)&&(e.amPM.textContent=e.l10n.amPM[Qt(e.amPM.textContent===e.l10n.amPM[0])]),W.value=Lt(le)}}return i(),e}function fi(t,n){for(var e=Array.prototype.slice.call(t).filter(function(o){return o instanceof HTMLElement}),r=[],i=0;i{i.style.left=`${n.x||0}px`,i.style.top=`${n.y||0}px`,i.createEl("input",{type:"text"},a=>{setTimeout(()=>{let o=null,s=c=>{c.target instanceof HTMLElement&&c.target.closest(`.${$("date-picker")}`)===null&&l()},u=c=>{c.key==="Escape"&&l()},l=()=>{o.destroy(),i.remove(),document.body.removeEventListener("click",s),document.removeEventListener("keydown",u)};o=Po(a,{locale:Fo(t),defaultDate:r,inline:!0,onChange:c=>{e(c),l()}}),setTimeout(()=>{let c=i.clientHeight,d=i.clientWidth;n.y+c>window.innerHeight&&(i.style.top=`${(n.y||0)-c}px`),n.x+d>window.innerWidth&&(i.style.left=`${(n.x||0)-d}px`)}),document.body.addEventListener("click",s),document.addEventListener("keydown",u)})})})}function Ho({stateManager:t,boardModifiers:n,item:e,hasDate:r,path:i}){let a=t.getSetting("date-format"),o=t.getSetting("link-date-to-daily-note"),s=t.getSetting("date-trigger"),u=o?"(?:\\[[^\\]]+\\]\\([^)]+\\)|\\[\\[[^\\]]+\\]\\])":"{[^}]+}",l=new RegExp(`(^|\\s)${Fn(s)}${u}`);return c=>{let d=c[0],f=(0,at.moment)(d).format(a),h=o?Oo(t.app,f):`{${f}}`,p=e.data.titleRaw;r?p=e.data.titleRaw.replace(l,`$1${s}${h}`):p=`${e.data.titleRaw} ${s}${h}`,t.updateItemContent(e,p).then(g=>{n.updateItem(i,g)}).catch(g=>{t.setError(g),console.error(g)})}}function Yl(t){let n=t.getSetting("time-format"),e=[];for(let r=0;r<24;r++)e.push((0,at.moment)({hour:r}).format(n)),e.push((0,at.moment)({hour:r,minute:15}).format(n)),e.push((0,at.moment)({hour:r,minute:30}).format(n)),e.push((0,at.moment)({hour:r,minute:45}).format(n));return e}function Bo(t,n,e,r){let i=$("time-picker"),a=t.getSetting("time-format"),o=r==null?void 0:r.format(a);document.body.createDiv({cls:`${i} ${$("ignore-click-outside")}`},s=>{let u=Yl(t),l=g=>{g.target instanceof HTMLElement&&g.target.hasClass($("time-picker-item"))&&g.target.dataset.value&&(e(g.target.dataset.value),f())},c=g=>{g.target instanceof HTMLElement&&g.target.closest(`.${i}`)===null&&f()},d=g=>{g.key==="Escape"&&f()},f=()=>{s.remove(),s.removeEventListener("click",l),document.body.removeEventListener("click",c),document.removeEventListener("keydown",d)};s.style.left=`${n.x||0}px`,s.style.top=`${n.y||0}px`;let h=null,p=null;u.forEach((g,w)=>{let S=g===o;s.createDiv({cls:`${$("time-picker-item")} ${S?"is-selected":""}`,text:g},T=>{T.createEl("span",{cls:$("time-picker-check"),prepend:!0},k=>{(0,at.setIcon)(k,"checkmark")}),w%4==0&&T.addClass("is-hour"),T.dataset.value=g,S&&(h=T),w===Math.floor(u.length/2)&&(p=T)})}),setTimeout(()=>{var S;let g=s.clientHeight,w=s.clientWidth;n.y+g>window.innerHeight&&(s.style.top=`${(n.y||0)-g}px`),n.x+w>window.innerWidth&&(s.style.left=`${(n.x||0)-w}px`),(S=h||p)==null||S.scrollIntoView({block:"center",inline:"nearest"}),s.addEventListener("click",l),document.body.addEventListener("click",c),document.addEventListener("keydown",d)})})}function Ko({stateManager:t,boardModifiers:n,item:e,hasTime:r,path:i}){let a=t.getSetting("time-trigger"),o=new RegExp(`(^|\\s)${Fn(a)}{([^}]+)}`);return s=>{let u=e.data.titleRaw;r?u=e.data.titleRaw.replace(o,`$1${a}{${s}}`):u=`${e.data.titleRaw} ${a}{${s}}`,t.updateItemContent(e,u).then(l=>{n.updateItem(i,l)}).catch(l=>{t.setError(l),console.error(l)})}}function cp(t){let n=t.data.metadata.date,e=[];n&&(n.isSame(new Date,"day")&&e.push("is-today"),n.isAfter(new Date,"day")&&e.push("is-future"),n.isBefore(new Date,"day")&&e.push("is-past")),t.data.isComplete&&e.push("is-complete");for(let r of t.data.metadata.tags)e.push(`has-tag-${r.slice(1)}`);return e}function Ir(t,n,e,r){return t.app.fileManager.generateMarkdownLink(n,e,r)}function AE(t,n,e){return at.htmlToMarkdown?(0,at.htmlToMarkdown)(e):at.MarkdownSourceView.prototype.handleDataTransfer.call({app:t.app},n)}function IE(t){return t.replace(/^\[(.*)\]\(app:\/\/obsidian.md\/(.*)\)$/,"[$1]($2)")}function Jl(){var n;let t=window.require("electron").remote.clipboard;if(process.platform==="darwin"){if(t.has("NSFilenamesPboardType"))return((n=t.read("NSFilenamesPboardType").match(/.*<\/string>/g))==null?void 0:n.map(e=>e.replace(/|<\/string>/g,"")))||[];{let e=t.readImage("clipboard");return e.isEmpty()?[t.read("public.file-url").replace("file://","")].filter(r=>r):[{buffer:e.toPNG(),mimeType:"image/png",originalName:`Pasted image ${(0,at.moment)().format("YYYYMMDDHHmmss")}.png`}]}}else if(t.has("CF_HDROP")){let e=t.read("CF_HDROP")||"",r=[...e].filter((a,o)=>e.charCodeAt(o)!==0).join("").replace(/\\/g,"\\"),i=r.match(/[a-zA-Z]:\\/);if(i){let a=r.indexOf(i[0]);return a!==0&&(r=r.slice(a)),r.split(i[0]).filter(o=>o).map(o=>i+o)}}else{let e=t.readImage("clipboard");return e.isEmpty()?[t.readBuffer("FileNameW").toString("ucs2").replace(RegExp(String.fromCharCode(0),"g"),"")].filter(r=>r):[{buffer:e.toPNG(),mimeType:"image/png",originalName:`Pasted image ${(0,at.moment)().format("YYYYMMDDHHmmss")}.png`}]}return null}function LE(t){return t.split("\\").pop().split("/").pop()}async function PE(t,n,e,r){let i=await t.app.vault.getAvailablePathForAttachments(n,e,t.file),a=await t.app.vault.createBinary(i,r);return Ir(t,a,t.file.path)}async function OE(t){let n=Jl();if(!n||n.length===0)return null;let e=window.require("fs/promises"),r=window.require("path");return(await Promise.all(n.map(async i=>{if(typeof i=="string"){let o=LE(i).split("."),s=o.pop(),u=o.join("."),l=await t.app.vault.getAvailablePathForAttachments(u,s,t.file),c=t.app.vault.adapter.basePath;await e.copyFile(i,r.join(c,l)),await new Promise(f=>setTimeout(f,50));let d=t.app.vault.getAbstractFileByPath(l);return Ir(t,d,t.file.path)}else{let a=i.originalName.split("."),o=a.pop(),s=a.join(".");return await PE(t,s,o,i.buffer)}}))).filter(i=>i)}function up(t,n,e){return Promise.all(n.map(r=>{let i=r.name.split("."),a=i.pop(),o=i.join(".");if(e){switch(r.type){case"text/jpg":a="jpg";break;case"text/jpeg":a="jpeg";break;case"text/png":a="png";break}o="Pasted image "+(0,at.moment)().format("YYYYMMDDHHmmss")}return new Promise((s,u)=>{let l=new FileReader;l.onload=async c=>{try{let d=await t.app.vault.getAvailablePathForAttachments(o,a,t.file),f=await t.app.vault.createBinary(d,c.target.result);s(Ir(t,f,t.file.path))}catch(d){console.error(d),u(d)}},l.readAsArrayBuffer(r)})}))}async function NE(t,n){let e=n instanceof ClipboardEvent,r=e?t.getAView().isShiftPressed:!1,i=e?n.clipboardData:n.dataTransfer,a=e&&at.Platform.isDesktopApp?window.require("electron").remote.clipboard:null,o=a?a.availableFormats():[];if(e){if(e&&!r&&!o.includes("text/rtf")){if(at.Platform.isDesktopApp){let h=await OE(t);if(h==null?void 0:h.length)return h}let d=[],f=n.clipboardData.items;for(let h in f){let p=f[h];p.kind==="file"&&d.push(p.getAsFile())}if(d.length)return await up(t,d,!0)}}else{let d=await Bl(n);if(d.length)return await up(t,d)}let s=i.getData("text/html"),u=i.getData("text/plain"),l=i.getData("text/uri-list"),c=r?u||s:AE(t,i,s);return[IE(c||l||u||s||"").trim()]}async function $o(t,n){let e=t.app.dragManager.draggable,r=n instanceof DragEvent?n.dataTransfer:n.clipboardData;switch(e==null?void 0:e.type){case"file":return[Ir(t,e.file,t.file.path)];case"files":return e.files.map(i=>Ir(t,i,t.file.path));case"folder":return e.file.children.map(i=>i instanceof at.TFolder?null:Ir(t,i,t.file.path)).filter(i=>i);case"link":{let i=e.file?Ir(t,e.file,(0,at.parseLinktext)(e.linktext).subpath):`[[${e.linktext}]]`,a=new DOMParser().parseFromString(r.getData("text/html"),"text/html").documentElement.textContent;return i=i.replace(/]]$/,`|${a}]]`).replace(/^\[[^\]].+]\(/,`[${a}](`),[i]}default:return await NE(t,n)}}var Xe={Item:"item",Lane:"lane",Board:"board",MetadataSetting:"metadata-setting"},Uo={accepts:[Xe.Item],type:Xe.Item,children:[]},mr={accepts:[Xe.Lane],type:Xe.Lane},zo={accepts:[],type:Xe.Board},Vo={accepts:[Xe.MetadataSetting],type:Xe.MetadataSetting,children:[]};function Gl(t,n,e,r){let i="htmldnd",a=Ke(),o=t-75,s=t+75,u=n-25,l=n+25;return{scopeId:i,entityId:`${i}-${a}`,initial:[o,u,s,l],getParentScrollState(){return on},getParentScrollShift(){return Rn},recalcInitial(){},getHitbox(){return this.initial},getPath(){return[]},getData(){return{viewId:r,type:Xe.Item,id:a,content:e,accepts:[]}}}}var Xl=class{constructor(n,e,r){this.isHTMLDragging=!1;this.dragOverTimeout=0;this.hitboxEntities=e,this.scrollEntities=r,this.emitter=n}getDragEventData(){return{dragEntity:this.dragEntity,dragEntityId:this.dragEntityId,dragEntityMargin:this.dragEntityMargin,dragOrigin:this.dragOrigin,dragOriginHitbox:this.dragOriginHitbox,dragPosition:this.dragPosition,primaryIntersection:this.primaryIntersection,scrollIntersection:this.scrollIntersection}}dragStart(n,e){var a;let r=(e==null?void 0:e.dataset.hitboxid)||n.currentTarget.dataset.hitboxid;if(!r)return;let i=getComputedStyle(e||n.currentTarget);this.dragEntityId=r,this.dragOrigin={x:n.pageX,y:n.pageY},this.dragPosition={x:n.pageX,y:n.pageY},this.dragEntity=this.hitboxEntities.get(r),this.dragOriginHitbox=(a=this.dragEntity)==null?void 0:a.getHitbox(),this.dragEntityMargin=[parseFloat(i.marginLeft)||0,parseFloat(i.marginTop)||0,parseFloat(i.marginRight)||0,parseFloat(i.marginBottom)||0],this.emitter.emit("dragStart",this.getDragEventData())}dragStartHTML(n,e){this.isHTMLDragging=!0;let r=Gl(n.pageX,n.pageY,[],e);this.dragEntityId=r.entityId,this.dragOrigin={x:n.pageX,y:n.pageY},this.dragPosition={x:n.pageX,y:n.pageY},this.dragEntity=r,this.dragOriginHitbox=r.getHitbox(),this.dragEntityMargin=[0,0,0,0],this.emitter.emit("dragStart",this.getDragEventData())}dragMove(n){this.dragPosition={x:n.pageX,y:n.pageY},this.emitter.emit("dragMove",this.getDragEventData()),this.calculateDragIntersect()}dragMoveHTML(n){this.dragPosition={x:n.pageX,y:n.pageY},this.emitter.emit("dragMove",this.getDragEventData()),this.calculateDragIntersect()}dragEnd(n){this.emitter.emit("dragEnd",this.getDragEventData()),this.dragEntityMargin=void 0,this.dragEntity=void 0,this.dragEntityId=void 0,this.dragOrigin=void 0,this.dragOriginHitbox=void 0,this.dragPosition=void 0,this.scrollIntersection=void 0,this.primaryIntersection=void 0}dragEndHTML(n,e,r,i){this.isHTMLDragging=!1,i||(this.dragEntity=Gl(n.pageX,n.pageY,r,e),this.emitter.emit("dragEnd",this.getDragEventData())),this.dragEntityMargin=void 0,this.dragEntity=void 0,this.dragEntityId=void 0,this.dragOrigin=void 0,this.dragOriginHitbox=void 0,this.dragPosition=void 0,this.scrollIntersection=void 0,this.primaryIntersection=void 0,i&&this.emitter.emit("dragEnd",this.getDragEventData())}onHTMLDragLeave(n){clearTimeout(this.dragOverTimeout),this.dragOverTimeout=window.setTimeout(n,351)}calculateDragIntersect(){if(!this.dragEntity||!this.dragPosition||!this.dragOrigin||!this.dragOriginHitbox)return;let{type:n}=this.dragEntity.getData(),e=[],r=[],i=[],a=[];this.hitboxEntities.forEach(u=>{u.getData().accepts.includes(n)&&(e.push(u),r.push(u.getHitbox()))}),this.scrollEntities.forEach(u=>{u.getData().accepts.includes(n)&&(i.push(u),a.push(u.getHitbox()))});let o=Wd(this.dragOriginHitbox,this.dragOrigin,this.dragPosition);this.handleScrollIntersect(o,this.dragEntity.entityId,a,i)||this.handleHitboxIntersect(o,this.dragEntity.entityId,r,e)}handleScrollIntersect(n,e,r,i){let a=(0,Ql.default)([n],r).map(s=>i[s[1]]),o=Vd(a,n,e);if(this.scrollIntersection&&(!o||o[0]!==this.scrollIntersection[0])){let[s,u]=this.scrollIntersection,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("endDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=void 0}if(o&&(!this.scrollIntersection||this.scrollIntersection[0]!==o[0])){let[s,u]=o,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("beginDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=o}else if(o&&this.scrollIntersection&&o[0]===this.scrollIntersection[0]){let[s,u]=o,l=s.getData(),c=s.entityId,d=l.side;this.emitter.emit("updateDragScroll",{...this.getDragEventData(),scrollEntity:s,scrollEntityId:c,scrollEntitySide:d,scrollStrength:u},c),this.scrollIntersection=o}return!!o}handleHitboxIntersect(n,e,r,i){let a=(0,Ql.default)([n],r).map(s=>i[s[1]]),o=gl(a,n,e);this.primaryIntersection&&this.primaryIntersection!==o&&(this.emitter.emit("dragLeave",this.getDragEventData(),this.primaryIntersection.entityId),this.primaryIntersection=void 0),o&&this.primaryIntersection!==o&&(this.emitter.emit("dragEnter",{...this.getDragEventData(),primaryIntersection:o},o.entityId),this.primaryIntersection=o)}},mi=t=>{t.preventDefault(),t.stopPropagation()};function gi(t,n){let e=v.useContext(Et);v.useEffect(()=>{let r=t.current,i=n.current;if(!e||!r||!i)return;let a=s=>{if(s.defaultPrevented||s.target.dataset.ignoreDrag||s.button!==0&&s.buttons!==1)return;let u=dp.Platform.isMobile;u||(s.stopPropagation(),s.preventDefault());let l=s,c={x:s.pageX,y:s.pageY},d=!1,f=0;u&&(window.addEventListener("contextmenu",mi,!0),f=window.setTimeout(()=>{e.dragManager.dragStart(l,r),d=!0,window.addEventListener("touchmove",mi,{passive:!1})},500));let h=So(g=>{u?d?e.dragManager.dragMove(g):Zr(c,{x:g.pageX,y:g.pageY})>5&&(clearTimeout(f),window.removeEventListener("touchmove",mi),window.removeEventListener("contextmenu",mi,!0),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p)):d?e.dragManager.dragMove(g):Zr(c,{x:g.pageX,y:g.pageY})>5&&(e.dragManager.dragStart(l,r),d=!0)}),p=g=>{clearTimeout(f),d=!1,e.dragManager.dragEnd(g),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p),u&&(window.removeEventListener("contextmenu",mi,!0),window.removeEventListener("touchmove",mi))};window.addEventListener("pointermove",h),window.addEventListener("pointerup",p),window.addEventListener("pointercancel",p)},o=s=>{s.stopPropagation()};return i.addEventListener("pointerdown",a),i.addEventListener("touchstart",o),()=>{i.removeEventListener("pointerdown",a),i.removeEventListener("touchstart",o)}},[t,n,e])}function fp(t){let n=v.useContext(Et),e=v.useCallback(i=>{n.dragManager.isHTMLDragging?(i.preventDefault(),n.dragManager.dragMoveHTML(i.nativeEvent)):n.dragManager.dragStartHTML(i.nativeEvent,t.getAView().id),n.dragManager.onHTMLDragLeave(()=>{n.dragManager.dragEndHTML(i.nativeEvent,t.getAView().id,[],!0)})},[n,t]),r=v.useCallback(async i=>{n.dragManager.dragEndHTML(i.nativeEvent,t.getAView().id,await $o(t,i.nativeEvent),!1)},[n,t]);return{onDragOver:e,onDrop:r}}var pp=me(It());var hp=me(require("obsidian"));function en({name:t,className:n}){return v.createElement("span",{"data-icon":t,className:`${$("icon")} ${n||""}`,ref:e=>{e&&(0,hp.setIcon)(e,t)}})}var mp=v.memo(function({shouldMarkItemsComplete:n,path:e,item:r,stateManager:i,boardModifiers:a}){let o=i.useSetting("show-checkboxes"),[s,u]=v.useState(!1),[l,c]=v.useState(!1);return v.useEffect(()=>{if(l){let d=f=>{f.metaKey||f.ctrlKey?u(!0):u(!1)};return window.addEventListener("keydown",d),window.addEventListener("keyup",d),()=>{window.removeEventListener("keydown",d),window.removeEventListener("keyup",d)}}},[l]),n||o?v.createElement("div",{onMouseEnter:d=>{c(!0),(d.ctrlKey||d.metaKey)&&u(!0)},onMouseLeave:()=>{c(!1),s&&u(!1)},className:$("item-prefix-button-wrapper")},o&&!s&&v.createElement("input",{onChange:()=>{a.updateItem(e,(0,pp.default)(r,{data:{$toggle:["isComplete"]}}))},type:"checkbox",className:"task-list-item-checkbox",checked:!!r.data.isComplete}),(s||!o&&n)&&v.createElement("button",{onClick:()=>{a.archiveItem(e)},className:$("item-prefix-button"),"aria-label":s?void 0:"Archive card"},v.createElement(en,{name:"sheets-in-box"}))):null});var Zl;function gp(t){if(t.nodeName!=="TEXTAREA")return!1;if(typeof Zl=="undefined"){var n=document.createElement("textarea");n.value=1,Zl=!!n.firstChild}return Zl}function FE(t,n){if(t.focus(),document.selection){var e=document.selection.createRange();e.text=n,e.collapse(!1),e.select();return}var r=document.execCommand("insertText",!1,n);if(!r){var i=t.selectionStart,a=t.selectionEnd;if(typeof t.setRangeText=="function")t.setRangeText(n);else{var o=document.createRange(),s=document.createTextNode(n);if(gp(t)){var u=t.firstChild;if(!u)t.appendChild(s);else{for(var l=0,c=null,d=null;u&&(c===null||d===null);){var f=u.nodeValue.length;i>=l&&i<=l+f&&o.setStart(c=u,i-l),a>=l&&a<=l+f&&o.setEnd(d=u,a-l),l+=f,u=u.nextSibling}i!==a&&o.deleteContents()}}if(gp(t)&&o.commonAncestorContainer.nodeName==="#text")o.insertNode(s);else{var h=t.value;t.value=h.slice(0,i)+n+h.slice(a)}}t.setSelectionRange(i+n.length,i+n.length);var p=document.createEvent("UIEvent");p.initEvent("input",!0,!1),t.dispatchEvent(p)}}var fa=FE;var vp=me(require("obsidian"));var ec=t=>t.charCodeAt(0)===10,yp=t=>t===" "||ec(t);function RE(t,n,e){if(!t)throw Error("Argument 'text' should be truthy");let r=0,i=t.length;for(let a=n;a-1>-1;a--)if(ec(t[a-1])){r=a;break}for(let a=e===void 0?n:e;a-1;a--)if(yp(t[a-1])){r=a;break}for(let a=e===void 0?n:e;a0&&t.value[a.selection.start-1]!==" ")return!1;if(a.selection.end===a.selection.start){let s=_t(t,`${e}`);return Nt(t,{start:s.selection.end-1-a.selectedText.length,end:s.selection.end-1}),!1}let o=_t(t,`${n}${a.selectedText}${e}`);return Nt(t,{start:o.selection.end-1-a.selectedText.length,end:o.selection.end-1}),!0}function jo(t,n,e,r){let i=Kn(t),a=vi({text:i.text,selection:i.selection}),o=Nt(t,a),s=n.test(o.selectedText)?r(o.selectedText):e(o.selectedText),u=_t(t,s);Nt(t,{start:o.selection.start,end:u.selection.end})}function Wo(t,n){var e;if(n.types.includes("text/uri-list")||["file","files","link","folder"].includes((e=t.app.dragManager.draggable)==null?void 0:e.type))return"link";if(n.types.includes("text/html")||n.types.includes("text/plain"))return"copy"}async function qo(t,n){let e=t.clipboardData.getData("text/html"),r=t.clipboardData.types.includes("Files"),i=vp.Platform.isDesktopApp?Jl():null,a=e||r||(i==null?void 0:i.length)>0;a&&t.preventDefault();try{let o=await $o(n,t.nativeEvent);if(a){let s=t.target,u=o.join(` +`);_t(s,u)}}catch(o){console.error(o),n.setError(o)}}var Dc=me(require("obsidian"));function Xn(t){return Array.isArray?Array.isArray(t):Ep(t)==="[object Array]"}var KE=1/0;function $E(t){if(typeof t=="string")return t;let n=t+"";return n=="0"&&1/t==-KE?"-0":n}function UE(t){return t==null?"":$E(t)}function Zn(t){return typeof t=="string"}function bp(t){return typeof t=="number"}function zE(t){return t===!0||t===!1||VE(t)&&Ep(t)=="[object Boolean]"}function wp(t){return typeof t=="object"}function VE(t){return wp(t)&&t!==null}function cn(t){return t!=null}function tc(t){return!t.trim().length}function Ep(t){return t==null?t===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}var jE="Incorrect 'index' type",WE=t=>`Invalid value for key ${t}`,qE=t=>`Pattern length exceeds max of ${t}.`,YE=t=>`Missing ${t} property in key`,JE=t=>`Property 'weight' in key '${t}' must be a positive integer`,Sp=Object.prototype.hasOwnProperty,xp=class{constructor(n){this._keys=[],this._keyMap={};let e=0;n.forEach(r=>{let i=kp(r);e+=i.weight,this._keys.push(i),this._keyMap[i.id]=i,e+=i.weight}),this._keys.forEach(r=>{r.weight/=e})}get(n){return this._keyMap[n]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function kp(t){let n=null,e=null,r=null,i=1;if(Zn(t)||Xn(t))r=t,n=_p(t),e=nc(t);else{if(!Sp.call(t,"name"))throw new Error(YE("name"));let a=t.name;if(r=a,Sp.call(t,"weight")&&(i=t.weight,i<=0))throw new Error(JE(a));n=_p(a),e=nc(a)}return{path:n,id:e,weight:i,src:r}}function _p(t){return Xn(t)?t:t.split(".")}function nc(t){return Xn(t)?t.join("."):t}function GE(t,n){let e=[],r=!1,i=(a,o,s)=>{if(!!cn(a))if(!o[s])e.push(a);else{let u=o[s],l=a[u];if(!cn(l))return;if(s===o.length-1&&(Zn(l)||bp(l)||zE(l)))e.push(UE(l));else if(Xn(l)){r=!0;for(let c=0,d=l.length;ct.score===n.score?t.idx{this._keysMap[e.id]=r})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,Zn(this.docs[0])?this.docs.forEach((n,e)=>{this._addString(n,e)}):this.docs.forEach((n,e)=>{this._addObject(n,e)}),this.norm.clear())}add(n){let e=this.size();Zn(n)?this._addString(n,e):this._addObject(n,e)}removeAt(n){this.records.splice(n,1);for(let e=n,r=this.size();e{let o=this.getFn(n,i.path);if(!!cn(o)){if(Xn(o)){let s=[],u=[{nestedArrIndex:-1,value:o}];for(;u.length;){let{nestedArrIndex:l,value:c}=u.pop();if(!!cn(c))if(Zn(c)&&!tc(c)){let d={v:c,i:l,n:this.norm.get(c)};s.push(d)}else Xn(c)&&c.forEach((d,f)=>{u.push({nestedArrIndex:f,value:d})})}r.$[a]=s}else if(!tc(o)){let s={v:o,n:this.norm.get(o)};r.$[a]=s}}}),this.records.push(r)}toJSON(){return{keys:this.keys,records:this.records}}};function Tp(t,n,{getFn:e=Me.getFn,fieldNormWeight:r=Me.fieldNormWeight}={}){let i=new Yo({getFn:e,fieldNormWeight:r});return i.setKeys(t.map(kp)),i.setSources(n),i.create(),i}function rS(t,{getFn:n=Me.getFn,fieldNormWeight:e=Me.fieldNormWeight}={}){let{keys:r,records:i}=t,a=new Yo({getFn:n,fieldNormWeight:e});return a.setKeys(r),a.setIndexRecords(i),a}function Jo(t,{errors:n=0,currentLocation:e=0,expectedLocation:r=0,distance:i=Me.distance,ignoreLocation:a=Me.ignoreLocation}={}){let o=n/t.length;if(a)return o;let s=Math.abs(r-e);return i?o+s/i:s?1:o}function iS(t=[],n=Me.minMatchCharLength){let e=[],r=-1,i=-1,a=0;for(let o=t.length;a=n&&e.push([r,i]),r=-1)}return t[a-1]&&a-r>=n&&e.push([r,a-1]),e}var Lr=32;function aS(t,n,e,{location:r=Me.location,distance:i=Me.distance,threshold:a=Me.threshold,findAllMatches:o=Me.findAllMatches,minMatchCharLength:s=Me.minMatchCharLength,includeMatches:u=Me.includeMatches,ignoreLocation:l=Me.ignoreLocation}={}){if(n.length>Lr)throw new Error(qE(Lr));let c=n.length,d=t.length,f=Math.max(0,Math.min(r,d)),h=a,p=f,g=s>1||u,w=g?Array(d):[],S;for(;(S=t.indexOf(n,p))>-1;){let O=Jo(n,{currentLocation:S,expectedLocation:f,distance:i,ignoreLocation:l});if(h=Math.min(O,h),p=S+c,g){let B=0;for(;B=Q;J-=1){let te=J-1,ce=e[t.charAt(te)];if(g&&(w[te]=+!!ce),ie[J]=(ie[J+1]<<1|1)&ce,O&&(ie[J]|=(T[J+1]|T[J])<<1|1|T[J+1]),ie[J]&N&&(k=Jo(n,{errors:O,currentLocation:te,expectedLocation:f,distance:i,ignoreLocation:l}),k<=h)){if(h=k,p=te,p<=f)break;Q=Math.max(1,2*f-p)}}if(Jo(n,{errors:O+1,currentLocation:f,expectedLocation:f,distance:i,ignoreLocation:l})>h)break;T=ie}let C={isMatch:p>=0,score:Math.max(.001,k)};if(g){let O=iS(w,s);O.length?u&&(C.indices=O):C.isMatch=!1}return C}function oS(t){let n={};for(let e=0,r=t.length;e{this.chunks.push({pattern:f,alphabet:oS(f),startIndex:h})},d=this.pattern.length;if(d>Lr){let f=0,h=d%Lr,p=d-h;for(;f{let{isMatch:S,score:T,indices:k}=aS(n,p,g,{location:i+w,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:u,includeMatches:r,ignoreLocation:l});S&&(f=!0),d+=T,S&&k&&(c=[...c,...k])});let h={isMatch:f,score:f?d/this.chunks.length:1};return f&&r&&(h.indices=c),h}},er=class{constructor(n){this.pattern=n}static isMultiMatch(n){return Mp(n,this.multiRegex)}static isSingleMatch(n){return Mp(n,this.singleRegex)}search(){}};function Mp(t,n){let e=t.match(n);return e?e[1]:null}var Cp=class extends er{constructor(n){super(n)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(n){let e=n===this.pattern;return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},Dp=class extends er{constructor(n){super(n)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(n){let r=n.indexOf(this.pattern)===-1;return{isMatch:r,score:r?0:1,indices:[0,n.length-1]}}},Ap=class extends er{constructor(n){super(n)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(n){let e=n.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},Ip=class extends er{constructor(n){super(n)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(n){let e=!n.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,n.length-1]}}},Lp=class extends er{constructor(n){super(n)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(n){let e=n.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[n.length-this.pattern.length,n.length-1]}}},Pp=class extends er{constructor(n){super(n)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(n){let e=!n.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,n.length-1]}}},ic=class extends er{constructor(n,{location:e=Me.location,threshold:r=Me.threshold,distance:i=Me.distance,includeMatches:a=Me.includeMatches,findAllMatches:o=Me.findAllMatches,minMatchCharLength:s=Me.minMatchCharLength,isCaseSensitive:u=Me.isCaseSensitive,ignoreLocation:l=Me.ignoreLocation}={}){super(n);this._bitapSearch=new rc(n,{location:e,threshold:r,distance:i,includeMatches:a,findAllMatches:o,minMatchCharLength:s,isCaseSensitive:u,ignoreLocation:l})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(n){return this._bitapSearch.searchIn(n)}},ac=class extends er{constructor(n){super(n)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(n){let e=0,r,i=[],a=this.pattern.length;for(;(r=n.indexOf(this.pattern,e))>-1;)e=r+a,i.push([r,e-1]);let o=!!i.length;return{isMatch:o,score:o?0:1,indices:i}}},oc=[Cp,ac,Ap,Ip,Pp,Lp,Dp,ic],Op=oc.length,sS=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/,lS="|";function cS(t,n={}){return t.split(lS).map(e=>{let r=e.trim().split(sS).filter(a=>a&&!!a.trim()),i=[];for(let a=0,o=r.length;a!!(t[Go.AND]||t[Go.OR]),fS=t=>!!t[cc.PATH],hS=t=>!Xn(t)&&wp(t)&&!uc(t),Fp=t=>({[Go.AND]:Object.keys(t).map(n=>({[n]:t[n]}))});function Rp(t,n,{auto:e=!0}={}){let r=i=>{let a=Object.keys(i),o=fS(i);if(!o&&a.length>1&&!uc(i))return r(Fp(i));if(hS(i)){let u=o?i[cc.PATH]:a[0],l=o?i[cc.PATTERN]:i[u];if(!Zn(l))throw new Error(WE(u));let c={keyId:nc(u),pattern:l};return e&&(c.searcher=lc(l,n)),c}let s={children:[],operator:a[0]};return a.forEach(u=>{let l=i[u];Xn(l)&&l.forEach(c=>{s.children.push(r(c))})}),s};return uc(t)||(t=Fp(t)),r(t)}function pS(t,{ignoreFieldNorm:n=Me.ignoreFieldNorm}){t.forEach(e=>{let r=1;e.matches.forEach(({key:i,norm:a,score:o})=>{let s=i?i.weight:null;r*=Math.pow(o===0&&s?Number.EPSILON:o,(s||1)*(n?1:a))}),e.score=r})}function mS(t,n){let e=t.matches;n.matches=[],!!cn(e)&&e.forEach(r=>{if(!cn(r.indices)||!r.indices.length)return;let{indices:i,value:a}=r,o={indices:i,value:a};r.key&&(o.key=r.key.src),r.idx>-1&&(o.refIndex=r.idx),n.matches.push(o)})}function gS(t,n){n.score=t.score}function vS(t,n,{includeMatches:e=Me.includeMatches,includeScore:r=Me.includeScore}={}){let i=[];return e&&i.push(mS),r&&i.push(gS),t.map(a=>{let{idx:o}=a,s={item:n[o],refIndex:o};return i.length&&i.forEach(u=>{u(a,s)}),s})}var gn=class{constructor(n,e={},r){this.options={...Me,...e},this.options.useExtendedSearch,this._keyStore=new xp(this.options.keys),this.setCollection(n,r)}setCollection(n,e){if(this._docs=n,e&&!(e instanceof Yo))throw new Error(jE);this._myIndex=e||Tp(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(n){!cn(n)||(this._docs.push(n),this._myIndex.add(n))}remove(n=()=>!1){let e=[];for(let r=0,i=this._docs.length;r-1&&(u=u.slice(0,e)),vS(u,this._docs,{includeMatches:r,includeScore:i})}_searchStringList(n){let e=lc(n,this.options),{records:r}=this._myIndex,i=[];return r.forEach(({v:a,i:o,n:s})=>{if(!cn(a))return;let{isMatch:u,score:l,indices:c}=e.searchIn(a);u&&i.push({item:a,idx:o,matches:[{score:l,value:a,norm:s,indices:c}]})}),i}_searchLogical(n){let e=Rp(n,this.options),r=(s,u,l)=>{if(!s.children){let{keyId:d,searcher:f}=s,h=this._findMatches({key:this._keyStore.get(d),value:this._myIndex.getValueForItemAtKeyId(u,d),searcher:f});return h&&h.length?[{idx:l,item:u,matches:h}]:[]}let c=[];for(let d=0,f=s.children.length;d{if(cn(s)){let l=r(e,s,u);l.length&&(a[u]||(a[u]={idx:u,item:s,matches:[]},o.push(a[u])),l.forEach(({matches:c})=>{a[u].matches.push(...c)}))}}),o}_searchObjectList(n){let e=lc(n,this.options),{keys:r,records:i}=this._myIndex,a=[];return i.forEach(({$:o,i:s})=>{if(!cn(o))return;let u=[];r.forEach((l,c)=>{u.push(...this._findMatches({key:l,value:o[c],searcher:e}))}),u.length&&a.push({idx:s,item:o,matches:u})}),a}_findMatches({key:n,value:e,searcher:r}){if(!cn(e))return[];let i=[];if(Xn(e))e.forEach(({v:a,i:o,n:s})=>{if(!cn(a))return;let{isMatch:u,score:l,indices:c}=r.searchIn(a);u&&i.push({score:l,key:n,value:a,idx:o,norm:s,indices:c})});else{let{v:a,n:o}=e,{isMatch:s,score:u,indices:l}=r.searchIn(a);s&&i.push({score:u,key:n,value:a,norm:o,indices:l})}return i}};gn.version="6.5.3";gn.createIndex=Tp;gn.parseIndex=rS;gn.config=Me;gn.parseQuery=Rp;dS(Np);var am=me(require("obsidian"));var Hp=me(require("obsidian"));function Qo(t,n,e){let r=e.getSetting("date-format"),i=e.getSetting("link-date-to-daily-note"),a=(0,Hp.moment)(t).format(r),o=i?Oo(e.app,a):`{${a}}`;_t(n.current,o),n.current.focus()}function Bp({div:t,inputRef:n,cb:e,stateManager:r}){t.createEl("input",{type:"text"},i=>{setTimeout(()=>e(Po(i,{now:new Date,locale:Fo(r),inline:!0,onChange:a=>{Qo(a[0],n,r)}})))})}function dc(t,n){let e=n.clientHeight,r=n.clientWidth;t.top+e>window.innerHeight&&(n.style.top=`${(t.clientTop||0)-e}px`),t.left+r>window.innerWidth&&(n.style.left=`${(t.left||0)-r}px`)}function Kp(t){let n=t.getSetting("time-trigger"),e=new RegExp(`\\B${Fn(n)}{?([^}]*)$`),r=Yl(t);return{id:"time",match:e,index:1,search:(i,a)=>{a(i?r.filter(o=>o.startsWith(i)):r)},template:i=>i,replace:i=>`${n}{${i}} `}}function $p(t){let n=t.month(),e=t.clone().startOf("month").weekday(0),r=t.diff(e,"week");t.subtract(1,"month").startOf("month").weekday(6).add(r,"week");let i=t.month();for(;n===i;)t.subtract(1,"week"),i=t.month();return t}function Up(t){let n=t.month(),e=t.clone().startOf("month").weekday(6),r=t.diff(e,"week");t.add(1,"month").startOf("month").weekday(0).add(r,"week");let i=t.month();for(;n===i;)t.add(1,"week"),i=t.month();return t}var zp=me(require("obsidian"));var yS=/\B\[\[([^\]]*)$/,bS=/\B!\[\[([^\]]*)$/,wS=/\B\[\[([^#\]]+)#([^\]]*)$/,ES=/\B!\[\[([^#\]]+)#([^\]]*)$/,SS=/\B\[\[([^#\]]+)#?\^([^\]]*)$/,xS=/\B!\[\[([^#\]]+)#?\^([^\]]*)$/;function kS(t,n,e){let r=createDiv($("file-suggestion-wrapper"));(0,zp.setIcon)(r.createDiv($("file-suggestion-icon")),"forward-arrow",12),r.createDiv({},a=>{a.createDiv({cls:$("file-suggestion-title"),text:e.item.alias}),a.createDiv({cls:$("file-suggestion-subtitle"),text:t.app.metadataCache.fileToLinktext(e.item.file,n)})});let i=r.outerHTML;return r.remove(),r=null,i}function fc(t,n,e,r,i,a){return{id:`link-${a?"embed":"normal"}`,match:a?bS:yS,index:1,template:o=>o.item.alias?kS(r,e,o):r.app.metadataCache.fileToLinktext(o.item.file,e),search:(o,s)=>{s(o?n.search(o):t.slice(0,10).map((u,l)=>({item:u,refIndex:l})))},replace:o=>{let s=[];a&&o.item.file.extension==="md"&&s.push("!"),s.push(r.app.fileManager.generateMarkdownLink(o.item.file,r.file.path,void 0,o.item.alias));let u=!!r.app.vault.getConfig("useMarkdownLinks");return i&&!u?s[s.length-1]=s[s.length-1].slice(0,-2):!i&&!u&&s.push("]] "),s.join("")}}}function _S(t,n,e,r){var u;if(!e)return[];let i=e.split("|"),a=t.metadataCache.getFirstLinkpathDest(i[0],n);if(!a)return[];let o=t.metadataCache.getFileCache(a);if(!o||!((u=o.headings)==null?void 0:u.length))return[];let s=o.headings.map(l=>({file:a,heading:l.heading,alias:i[1]||""}));return r?new gn(s,{keys:["heading"]}).search(r):s.map((l,c)=>({item:l,refIndex:c}))}function hc(t,n,e,r){return{id:`heading-${r?"embed":"normal"}`,match:r?ES:wS,index:1,template:i=>i.item.heading,search:(i,a,o)=>{a(_S(n.app,t,o[1],o[2]))},replace:i=>{let a=[];r&&i.item.file.extension==="md"&&a.push("!"),a.push(n.app.fileManager.generateMarkdownLink(i.item.file,n.file.path,"#"+i.item.heading,i.item.alias));let o=!!n.app.vault.getConfig("useMarkdownLinks");return e&&!o?a[a.length-1]=a[a.length-1].slice(0,-2):!e&&!o&&a.push("]] "),a.join("")}}}var Vp=class{constructor(){this.running=!1;this.cancelled=!1}start(){this.running=!0}stop(){this.running=!1}cancel(){this.stop(),this.cancelled=!0}isRunning(){return this.running}isCancelled(){return this.cancelled}};async function TS(t,n,e,r,i){var u;if(!e)return i([]);let a=e.split("|"),o=t.metadataCache.getFirstLinkpathDest(a[0],n);if(!o)return i([]);let s=t.metadataCache.getFileCache(o);if(!s||!((u=s.sections)==null?void 0:u.length))return i([]);try{let l=await t.metadataCache.blockCache.getForFile(new Vp,o);if(!(l==null?void 0:l.blocks))return i([]);let c=l.blocks.map(d=>d.node.type==="heading"?null:{file:o,searchString:d.display,blockId:d.node.id,block:{type:d.node.type,start:d.node.position.start.offset,end:d.node.position.end.offset},alias:a[1]||""}).filter(d=>d);i(r?new gn(c,{keys:["searchString","blockId"]}).search(r):c.map((d,f)=>({item:d,refIndex:f})))}catch(l){i([])}}function MS(t){return["blockquote","code","table","comment","footnoteDefinition"].includes(t)}function pc(t,n,e,r){return{id:`block-${r?"embed":"normal"}`,match:r?xS:SS,index:1,template:i=>i.item.blockId?`
${i.item.searchString}
${i.item.blockId}
`:i.item.searchString,search:(i,a,o)=>{TS(n.app,t,o[1],o[2],a)},replace:i=>{let a=[];r&&i.item.file.extension==="md"&&a.push("!");let o="#^";if(i.item.blockId)o+=i.item.blockId;else{let u=Ke(),l=MS(i.item.block.type)?` -`:" ";n.app.vault.cachedRead(i.item.file).then(c=>{let d=`${c.substring(0,i.item.block.end)}${l}^${u}${c.substring(i.item.block.end)}`;n.app.vault.modify(i.item.file,d)}).catch(c=>{n.setError(c),console.error(c)}),o+=u}a.push(n.app.fileManager.generateMarkdownLink(i.item.file,n.file.path,o,i.item.alias));let s=!!n.app.vault.getConfig("useMarkdownLinks");return e&&!s?a[a.length-1]=a[a.length-1].slice(0,-2):!e&&!s&&a.push("]] "),a.join("")}}}var wx=/\B#([^\s]*)?$/;function Sm(t,n){return{id:"tag",match:wx,index:1,search:(e,r)=>{r(e?n.search(e,{limit:50}):t.slice(0,50).map((i,a)=>({item:i,refIndex:a})))},template:e=>e.item,replace:e=>`${e.item} `}}function Ex({inputRef:t,isAutocompleteVisibleRef:n,obsidianContext:e,excludeDatePicker:r}){let{stateManager:i,filePath:a,view:o}=e,s=null,u=null,l=i.getSetting("date-trigger"),c=new RegExp(`(?:^|\\s)${On(l)}$`),d=Object.keys(i.app.metadataCache.getTags()).sort(),f=new gn(d),h=i.app.metadataCache.getLinkSuggestions().filter(I=>!!I.file),p=new gn(h,{keys:["file.basename","alias"]}),g=o.app.vault.getConfig("autoPairBrackets"),w=[Sm(d,f),Ac(a,i,g,!0),Ac(a,i,g,!1),Ic(a,i,g,!0),Ic(a,i,g,!1),Cc(h,p,a,i,g,!0),Cc(h,p,a,i,g,!1)];r||w.push(vm(i));let S=new km.TextareaEditor(t.current),_=new xm.Textcomplete(S,w,{dropdown:{maxCount:96,className:`${$("autocomplete")} ${$("ignore-click-outside")}`,rotate:!0,item:{className:`${$("autocomplete-item")} ${$("ignore-click-outside")}`,activeClassName:`${$("autocomplete-item-active")} ${$("ignore-click-outside")}`}}}),k=()=>{_.isShown()||(n.current=!1),u.destroy(),s.remove(),setTimeout(()=>s=null)};_.on("show",()=>{n.current=!0}),_.on("hidden",()=>{n.current=!1});let P;return r||(P=I=>{if(_.isShown&&["#","^"].contains(I.key)){let N=_.dropdown.getActiveItem(),K=N==null?void 0:N.searchResult;if(K&&K.strategy.props.id.startsWith("link")){I.preventDefault(),S.applySearchResult(K),Tt(t.current,I.key==="^"?"#^":"#");return}}if(!s)return;if(I.key==="Enter"){I.preventDefault();let N=u.selectedDates;return N.length?us(N[0],t,i):us(new Date,t,i),k()}if(I.key==="Escape")return I.preventDefault(),k();let D=(0,_m.moment)(u.selectedDates[0]||new Date);if(I.key==="ArrowRight"){I.preventDefault(),D.weekday()===6?u.setDate(bm(D).toDate(),!1):u.setDate(D.add(1,"day").toDate(),!1);return}if(I.key==="ArrowLeft"){I.preventDefault(),D.weekday()===0?u.setDate(ym(D).toDate(),!1):u.setDate(D.subtract(1,"day").toDate(),!1);return}if(I.key==="ArrowUp"){I.preventDefault(),u.setDate(D.subtract(1,"week").toDate(),!1);return}if(I.key==="ArrowDown"){I.preventDefault(),u.setDate(D.add(1,"week").toDate(),!1);return}},t.current.addEventListener("keydown",P),S.on("change",I=>{let D=I.detail.beforeCursor;if(D&&c.test(D)){let N=S.getCursorOffset();s?(s.style.left=`${N.left||0}px`,s.style.top=`${N.top||0}px`,Dc(N,s)):s=document.body.createDiv({cls:`${$("date-picker")} ${$("ignore-click-outside")}`},K=>{K.style.left=`${N.left||0}px`,K.style.top=`${N.top||0}px`,gm({div:K,inputRef:t,stateManager:i,cb:j=>{u=j,n.current=!0,Dc(N,s)}})})}else s&&k()})),()=>{!r&&t.current&&t.current.removeEventListener("keydown",P),s&&k(),_.destroy(),S.destroy()}}function Tm({isInputVisible:t,onEnter:n,onEscape:e,onKeyDown:r,excludeDatePicker:i}){let a=v.useContext(qe),o=v.useRef(!1),s=v.useRef(),{oncompositionstart:u,oncompositionend:l,getShouldIMEBlockAction:c}=Ga();return v.useEffect(()=>{let d=s.current;if(t&&d)return d.focus(),d.selectionStart=d.selectionEnd=d.value.length,Ex({inputRef:s,isAutocompleteVisibleRef:o,obsidianContext:a,excludeDatePicker:i})},[t]),{ref:s,oncompositionstart:u,oncompositionend:l,onKeyDownCapture:d=>{c()||o.current||r(d)||(d.key==="Enter"?n&&n(d):d.key==="Escape"&&e&&e(d))}}}var Mm=/^[*_]{2}(.+)[*_]{2}$/;function Sx(t){return t.replace(Mm,"$1")}var Dm=/^[*_]{1}(.+)[*_]{1}$/;function xx(t){return t.replace(Dm,"$1")}var Cm=/^`{1}(.+)`{1}$/;function kx(t){return t.replace(Cm,"$1")}var Im=/^={2}(.+)={2}$/;function _x(t){return t.replace(Im,"$1")}var Am=/^~{2}(.+)~{2}$/;function Tx(t){return t.replace(Am,"$1")}var Mx=/^(?:>.+?(?:[\r\n]|$))+$/;function Dx(t){return t.split(` +`:" ";n.app.vault.cachedRead(i.item.file).then(c=>{let d=`${c.slice(0,i.item.block.end)}${l}^${u}${c.slice(i.item.block.end)}`;n.app.vault.modify(i.item.file,d)}).catch(c=>{n.setError(c),console.error(c)}),o+=u}a.push(n.app.fileManager.generateMarkdownLink(i.item.file,n.file.path,o,i.item.alias));let s=!!n.app.vault.getConfig("useMarkdownLinks");return e&&!s?a[a.length-1]=a[a.length-1].slice(0,-2):!e&&!s&&a.push("]] "),a.join("")}}}var CS=/\B#([^\s]*)?$/;function jp(t,n){return{id:"tag",match:CS,index:1,search:(e,r)=>{r(e?n.search(e,{limit:50}):t.slice(0,50).map((i,a)=>({item:i,refIndex:a})))},template:e=>e.item,replace:e=>`${e.item} `}}var qp=me(pa());var IS=/\$&/g,LS=/\$(\d)/g,gc=class{constructor(n,e,r){this.data=n;this.term=e;this.strategy=r}getReplacementData(n){let e=this.strategy.replace(this.data);if(e==null)return null;let r="";Array.isArray(e)&&(r=e[1],e=e[0]);let i=this.strategy.match(n);if(i==null||i.index==null)return null;let a=e.replace(IS,i[0]).replace(LS,(o,s)=>i[parseInt(s)]);return{start:i.index,end:i.index+i[0].length,beforeCursor:a,afterCursor:r}}replace(n,e){let r=this.getReplacementData(n);if(r!==null)return e=r.afterCursor+e,[[n.slice(0,r.start),r.beforeCursor,n.slice(r.end)].join(""),e]}render(){return this.strategy.renderTemplate(this.data,this.term)}getStrategyId(){return this.strategy.getId()}};var PS=1,vc=class{constructor(n){this.props=n;this.cache={}}destroy(){return this.cache={},this}replace(n){return this.props.replace(n)}execute(n,e){var a;let r=this.matchWithContext(n);if(!r)return!1;let i=r[(a=this.props.index)!=null?a:PS];return this.search(i,o=>{e(o.map(s=>new gc(s,i,this)))},r),!0}renderTemplate(n,e){if(this.props.template)return this.props.template(n,e);if(typeof n=="string")return n;throw new Error(`Unexpected render data type: ${typeof n}. Please implement template parameter by yourself`)}getId(){return this.props.id||null}match(n){return typeof this.props.match=="function"?this.props.match(n):n.match(this.props.match)}search(n,e,r){this.props.cache?this.searchWithCach(n,e,r):this.props.search(n,e,r)}matchWithContext(n){let e=this.context(n);return e===!1?null:this.match(e===!0?n:e)}context(n){return this.props.context?this.props.context(n):!0}searchWithCach(n,e,r){this.cache[n]!=null?e(this.cache[n]):this.props.search(n,i=>{this.cache[n]=i,e(i)},r)}};var yc=class extends qp.EventEmitter{constructor(n){super();this.handleQueryResult=n=>{this.emit("hit",{searchResults:n})};this.strategies=n.map(e=>new vc(e))}destroy(){return this.strategies.forEach(n=>n.destroy()),this}run(n){for(let e of this.strategies)if(e.execute(n,this.handleQueryResult))return;this.handleQueryResult([])}};var Yp=me(pa());var OS=typeof window!="undefined"&&!!window.CustomEvent,Rt=(t,n)=>{if(OS)return new CustomEvent(t,n);let e=document.createEvent("CustomEvent");return e.initCustomEvent(t,!1,(n==null?void 0:n.cancelable)||!1,(n==null?void 0:n.detail)||void 0),e};var NS=10,FS="auto",RS="dropdown-menu textcomplete-dropdown",Jp="textcomplete-item",HS=`${Jp} active`,ma=class extends Yp.EventEmitter{constructor(n,e){super();this.el=n;this.option=e;this.shown=!1;this.items=[];this.activeIndex=null}static create(n){let e=document.createElement("ul");e.className=n.className||RS,Object.assign(e.style,{display:"none",position:"absolute",zIndex:"1000"},n.style);let r=n.parent||document.body;return r==null||r.appendChild(e),new ma(e,n)}render(n,e){let r=Rt("render",{cancelable:!0});return this.emit("render",r),r.defaultPrevented?this:(this.clear(),n.length===0?this.hide():(this.items=n.slice(0,this.option.maxCount||NS).map((i,a)=>{var o;return new Gp(this,a,i,((o=this.option)==null?void 0:o.item)||{})}),this.setStrategyId(n[0]).renderEdge(n,"header").renderItems().renderEdge(n,"footer").show().setOffset(e).activate(0),this.emit("rendered",Rt("rendered")),this))}destroy(){var n;return this.clear(),(n=this.el.parentNode)==null||n.removeChild(this.el),this}select(n){let e={searchResult:n.searchResult},r=Rt("select",{cancelable:!0,detail:e});return this.emit("select",r),r.defaultPrevented?this:(this.hide(),this.emit("selected",Rt("selected",{detail:e})),this)}show(){if(!this.shown){let n=Rt("show",{cancelable:!0});if(this.emit("show",n),n.defaultPrevented)return this;this.el.style.display="block",this.shown=!0,this.emit("shown",Rt("shown"))}return this}hide(){if(this.shown){let n=Rt("hide",{cancelable:!0});if(this.emit("hide",n),n.defaultPrevented)return this;this.el.style.display="none",this.shown=!1,this.clear(),this.emit("hidden",Rt("hidden"))}return this}clear(){return this.items.forEach(n=>n.destroy()),this.items=[],this.el.innerHTML="",this.activeIndex=null,this}up(n){return this.shown?this.moveActiveItem("prev",n):this}down(n){return this.shown?this.moveActiveItem("next",n):this}moveActiveItem(n,e){if(this.activeIndex!=null){let r=n==="next"?this.getNextActiveIndex():this.getPrevActiveIndex();r!=null&&(this.activate(r),e.preventDefault())}return this}activate(n){return this.activeIndex!==n&&(this.activeIndex!=null&&this.items[this.activeIndex].deactivate(),this.activeIndex=n,this.items[n].activate()),this}isShown(){return this.shown}getActiveItem(){return this.activeIndex!=null?this.items[this.activeIndex]:null}setOffset(n){let e=document.documentElement;if(e){let r=this.el.offsetWidth;if(n.left){let o=this.option.dynamicWidth?e.scrollWidth:e.clientWidth;n.left+r>o&&(n.left=o-r),this.el.style.left=`${n.left}px`}else n.right&&(n.right-r<0&&(n.right=0),this.el.style.right=`${n.right}px`);let i=!1,a=this.option.placement||FS;if(a==="auto"){let o=this.el.clientHeight;i=n.clientTop!=null&&n.clientTop+o>e.clientHeight}a==="top"||i?(this.el.style.bottom=`${e.clientHeight-n.top+n.lineHeight}px`,this.el.style.top="auto"):(this.el.style.top=`${n.top}px`,this.el.style.bottom="auto")}return this}getNextActiveIndex(){if(this.activeIndex==null)throw new Error;return this.activeIndexa.data)):r||"",this.el.appendChild(i),this}},Gp=class{constructor(n,e,r,i){this.dropdown=n;this.index=e;this.searchResult=r;this.props=i;this.active=!1;this.onClick=n=>{n.preventDefault(),this.dropdown.select(this)};this.className=this.props.className||Jp,this.activeClassName=this.props.activeClassName||HS;let a=document.createElement("li");a.className=this.active?this.activeClassName:this.className;let o=document.createElement("span");o.tabIndex=-1,o.innerHTML=this.searchResult.render(),a.appendChild(o),a.addEventListener("mousedown",this.onClick),a.addEventListener("touchstart",this.onClick),this.el=a}destroy(){var e;let n=this.el;return(e=n.parentNode)==null||e.removeChild(n),n.removeEventListener("mousedown",this.onClick,!1),n.removeEventListener("touchstart",this.onClick,!1),this}activate(){return this.active||(this.active=!0,this.el.className=this.activeClassName,this.dropdown.el.scrollTop=this.el.offsetTop),this}deactivate(){return this.active&&(this.active=!1,this.el.className=this.className),this}};var Qp=me(pa());var bc=class extends Qp.EventEmitter{destroy(){return this}applySearchResult(n){throw new Error("Not implemented.")}getCursorOffset(){throw new Error("Not implemented.")}getBeforeCursor(){throw new Error("Not implemented.")}emitMoveEvent(n){let e=Rt("move",{cancelable:!0,detail:{code:n}});return this.emit("move",e),e}emitEnterEvent(){let n=Rt("enter",{cancelable:!0});return this.emit("enter",n),n}emitChangeEvent(){let n=Rt("change",{detail:{beforeCursor:this.getBeforeCursor()}});return this.emit("change",n),n}emitEscEvent(){let n=Rt("esc",{cancelable:!0});return this.emit("esc",n),n}getCode(n){return n.keyCode===9||n.keyCode===13?"ENTER":n.keyCode===27?"ESC":n.keyCode===38?"UP":n.keyCode===40||n.keyCode===78&&n.ctrlKey?"DOWN":n.keyCode===80&&n.ctrlKey?"UP":"OTHER"}};var Xp=me(pa());var BS=["show","shown","render","rendered","selected","hidden","hide"],wc=class extends Xp.EventEmitter{constructor(n,e,r){super();this.editor=n;this.isQueryInFlight=!1;this.nextPendingQuery=null;this.handleHit=({searchResults:n})=>{n.length?this.dropdown.render(n,this.editor.getCursorOffset()):this.dropdown.hide(),this.isQueryInFlight=!1,this.nextPendingQuery!==null&&this.trigger(this.nextPendingQuery)};this.handleMove=n=>{n.detail.code==="UP"?this.dropdown.up(n):this.dropdown.down(n)};this.handleEnter=n=>{let e=this.dropdown.getActiveItem();e?(this.dropdown.select(e),n.preventDefault()):this.dropdown.hide()};this.handleEsc=n=>{this.dropdown.isShown()&&(this.dropdown.hide(),n.preventDefault())};this.handleChange=n=>{n.detail.beforeCursor!=null?this.trigger(n.detail.beforeCursor):this.dropdown.hide()};this.handleSelect=n=>{this.emit("select",n),n.defaultPrevented||this.editor.applySearchResult(n.detail.searchResult)};this.handleResize=()=>{this.dropdown.isShown()&&this.dropdown.setOffset(this.editor.getCursorOffset())};this.completer=new yc(e),this.dropdown=ma.create((r==null?void 0:r.dropdown)||{}),this.startListening()}destroy(n=!0){return this.completer.destroy(),this.dropdown.destroy(),n&&this.editor.destroy(),this.stopListening(),this}isShown(){return this.dropdown.isShown()}hide(){return this.dropdown.hide(),this}trigger(n){return this.isQueryInFlight?this.nextPendingQuery=n:(this.isQueryInFlight=!0,this.nextPendingQuery=null,this.completer.run(n)),this}startListening(){var n;this.editor.on("move",this.handleMove).on("enter",this.handleEnter).on("esc",this.handleEsc).on("change",this.handleChange),this.dropdown.on("select",this.handleSelect);for(let e of BS)this.dropdown.on(e,r=>this.emit(e,r));this.completer.on("hit",this.handleHit),(n=this.dropdown.el.ownerDocument.defaultView)==null||n.addEventListener("resize",this.handleResize)}stopListening(){var n;(n=this.dropdown.el.ownerDocument.defaultView)==null||n.removeEventListener("resize",this.handleResize),this.completer.removeAllListeners(),this.dropdown.removeAllListeners(),this.editor.removeListener("move",this.handleMove).removeListener("enter",this.handleEnter).removeListener("esc",this.handleEsc).removeListener("change",this.handleChange)}};var im=me(Zp());function em(t,n,e){let r=t.value,i=n+(e||""),a=document.activeElement,o=0,s=0;for(;o=0&&i.length-s-1>=0&&r[r.length-s-1]===i[i.length-s-1];)s++;o=Math.min(o,Math.min(r.length,i.length)-s),t.setSelectionRange(o,r.length-s);let u=i.substring(o,i.length-s);if(t.focus(),!document.execCommand("insertText",!1,u)){t.value=i;let l=document.createEvent("Event");l.initEvent("input",!0,!0),t.dispatchEvent(l)}return t.setSelectionRange(n.length,n.length),a.focus(),t}var tm=t=>{let n=t.getBoundingClientRect(),e=t.ownerDocument;if(e==null)throw new Error("Given element does not belong to document");let{defaultView:r,documentElement:i}=e;if(r==null)throw new Error("Given element does not belong to window");let a={top:n.top+r.pageYOffset,left:n.left+r.pageXOffset};return i&&(a.top-=i.clientTop,a.left-=i.clientLeft),a};var KS="0".charCodeAt(0),$S="9".charCodeAt(0),nm=t=>KS<=t&&t<=$S,rm=t=>{let n=getComputedStyle(t),e=n.lineHeight;if(nm(e.charCodeAt(0))){let r=parseFloat(e);return nm(e.charCodeAt(e.length-1))?r*parseFloat(n.fontSize):r}return US(t.nodeName,n)},US=(t,n)=>{let e=document.body;if(!e)return 0;let r=document.createElement(t);r.innerHTML=" ",Object.assign(r.style,{fontSize:n.fontSize,fontFamily:n.fontFamily,padding:"0"}),e.appendChild(r),r instanceof HTMLTextAreaElement&&(r.rows=1);let i=r.offsetHeight;return e.removeChild(r),i};var es=class extends bc{constructor(n){super();this.el=n;this.onInput=()=>{this.emitChangeEvent()};this.onKeydown=n=>{let e=this.getCode(n),r;e==="UP"||e==="DOWN"?r=this.emitMoveEvent(e):e==="ENTER"?r=this.emitEnterEvent():e==="ESC"&&(r=this.emitEscEvent()),r&&r.defaultPrevented&&n.preventDefault()};this.startListening()}destroy(){return super.destroy(),this.stopListening(),this}applySearchResult(n){let e=this.getBeforeCursor();if(e!=null){let r=n.replace(e,this.getAfterCursor());this.el.focus(),Array.isArray(r)&&(em(this.el,r[0],r[1]),this.el&&this.el.dispatchEvent(Rt("input")))}}getCursorOffset(){let n=tm(this.el),e=this.getElScroll(),r=this.getCursorPosition(),i=rm(this.el),a=n.top-e.top+r.top+i,o=n.left-e.left+r.left,s=this.el.getBoundingClientRect().top;if(this.el.dir!=="rtl")return{top:a,left:o,lineHeight:i,clientTop:s};{let u=document.documentElement?document.documentElement.clientWidth-o:0;return{top:a,right:u,lineHeight:i,clientTop:s}}}getBeforeCursor(){return this.el.selectionStart!==this.el.selectionEnd?null:this.el.value.slice(0,this.el.selectionEnd)}getAfterCursor(){return this.el.value.slice(this.el.selectionEnd)}getElScroll(){return{top:this.el.scrollTop,left:this.el.scrollLeft}}getCursorPosition(){return(0,im.default)(this.el,this.el.selectionEnd)}startListening(){this.el.addEventListener("input",this.onInput),this.el.addEventListener("keydown",this.onKeydown)}stopListening(){this.el.removeEventListener("input",this.onInput),this.el.removeEventListener("keydown",this.onKeydown)}};function zS({inputRef:t,isAutocompleteVisibleRef:n,obsidianContext:e,excludeDatePicker:r}){let{stateManager:i,filePath:a,view:o}=e,s=null,u=null,l=i.getSetting("date-trigger"),c=new RegExp(`(?:^|\\s)${Fn(l)}$`),d=Object.keys(i.app.metadataCache.getTags()).sort(),f=new gn(d),h=i.app.metadataCache.getLinkSuggestions().filter(N=>!!N.file),p=new gn(h,{keys:["file.basename","alias"]}),g=o.app.vault.getConfig("autoPairBrackets"),w=[jp(d,f),pc(a,i,g,!0),pc(a,i,g,!1),hc(a,i,g,!0),hc(a,i,g,!1),fc(h,p,a,i,g,!0),fc(h,p,a,i,g,!1)];r||w.push(Kp(i));let S=new es(t.current),T=new wc(S,w,{dropdown:{maxCount:96,className:`${$("autocomplete")} ${$("ignore-click-outside")}`,rotate:!0,item:{className:`${$("autocomplete-item")} ${$("ignore-click-outside")}`,activeClassName:`${$("autocomplete-item-active")} ${$("ignore-click-outside")}`}}}),k=()=>{T.isShown()||(n.current=!1),u.destroy(),s.remove(),setTimeout(()=>s=null)};T.on("show",()=>{n.current=!0}),T.on("hidden",()=>{n.current=!1});let D;return r||(D=N=>{if(T.isShown&&["#","^"].contains(N.key)){let O=T.dropdown.getActiveItem(),B=O==null?void 0:O.searchResult;if(B&&B.strategy.props.id.startsWith("link")){N.preventDefault(),S.applySearchResult(B),_t(t.current,N.key==="^"?"#^":"#");return}}if(!s)return;if(N.key==="Enter"){N.preventDefault();let O=u.selectedDates;return O.length?Qo(O[0],t,i):Qo(new Date,t,i),k()}if(N.key==="Escape")return N.preventDefault(),k();let C=(0,am.moment)(u.selectedDates[0]||new Date);if(N.key==="ArrowRight"){N.preventDefault(),C.weekday()===6?u.setDate(Up(C).toDate(),!1):u.setDate(C.add(1,"day").toDate(),!1);return}if(N.key==="ArrowLeft"){N.preventDefault(),C.weekday()===0?u.setDate($p(C).toDate(),!1):u.setDate(C.subtract(1,"day").toDate(),!1);return}if(N.key==="ArrowUp"){N.preventDefault(),u.setDate(C.subtract(1,"week").toDate(),!1);return}if(N.key==="ArrowDown"){N.preventDefault(),u.setDate(C.add(1,"week").toDate(),!1);return}},t.current.addEventListener("keydown",D),S.on("change",N=>{let C=N.detail.beforeCursor;if(C&&c.test(C)){let O=S.getCursorOffset();s?(s.style.left=`${O.left||0}px`,s.style.top=`${O.top||0}px`,dc(O,s)):s=document.body.createDiv({cls:`${$("date-picker")} ${$("ignore-click-outside")}`},B=>{B.style.left=`${O.left||0}px`,B.style.top=`${O.top||0}px`,Bp({div:B,inputRef:t,stateManager:i,cb:z=>{u=z,n.current=!0,dc(O,s)}})})}else s&&k()})),()=>{!r&&t.current&&t.current.removeEventListener("keydown",D),s&&k(),T.destroy(),S.destroy()}}function om({isInputVisible:t,onEnter:n,onEscape:e,onKeyDown:r,excludeDatePicker:i}){let a=v.useContext(We),o=v.useRef(!1),s=v.useRef(),{oncompositionstart:u,oncompositionend:l,getShouldIMEBlockAction:c}=Ga();return v.useEffect(()=>{let d=s.current;if(t&&d)return d.focus(),d.selectionStart=d.selectionEnd=d.value.length,zS({inputRef:s,isAutocompleteVisibleRef:o,obsidianContext:a,excludeDatePicker:i})},[t]),{ref:s,oncompositionstart:u,oncompositionend:l,onKeyDownCapture:d=>{c()||o.current||r(d)||(d.key==="Enter"?n&&n(d):d.key==="Escape"&&e&&e(d))}}}var sm=/^[*_]{2}(.+)[*_]{2}$/;function VS(t){return t.replace(sm,"$1")}var lm=/^[*_]{1}(.+)[*_]{1}$/;function jS(t){return t.replace(lm,"$1")}var cm=/^`{1}(.+)`{1}$/;function WS(t){return t.replace(cm,"$1")}var um=/^={2}(.+)={2}$/;function qS(t){return t.replace(um,"$1")}var dm=/^~{2}(.+)~{2}$/;function YS(t){return t.replace(dm,"$1")}var JS=/^(?:>.+?(?:[\r\n]|$))+$/;function GS(t){return t.split(` `).map(e=>e[0]===">"?e:`> ${e}`).join(` -`)}function Cx(t){return t.split(` +`)}function QS(t){return t.split(` `).map(e=>e[0]!==">"?e:e.replace(/^>+\s*/,"")).join(` -`)}var va=/^(?:\s*\d+[.)]\s+.+?(?:[\r\n]|$))+$/,Lc=/^(?:\s*\d+[.)]\s+\[\s+\]+.+?(?:[\r\n]|$))+$/,Pc=/^(?:\s*\d+[.)]\s+\[[^\]\s]+\]+.+?(?:[\r\n]|$))+$/;function Ix(t){return t.match(/^\s*/)[0].length}function Ax(t){return parseInt(t.match(/^\s*(\d+)/)[1],10)}function Lx(t){let n=[0],e=0;return t.split(` -`).map(r=>{let i=Ix(r);if(i>e?n.push(0):iva.test(n)?n.replace(/^(\s*)\d+[.)]\s+/,"$1"):n).join(` -`)}var ya=/^(?:\s*[-*+]\s+.+?(?:[\r\n]|$))+$/,Oc=/^(?:\s*[-*+]\s+\[\s+\]+.+?(?:[\r\n]|$))+$/,Nc=/^(?:\s*[-*+]\s+\[[^\]\s]+\]+.+?(?:[\r\n]|$))+$/;function Lm(t){return t.split(` -`).map(e=>ya.test(e)?e:e.replace(/^(\s*)/,"$1- ")).join(` -`)}function Ox(t){return t.split(` -`).map(n=>Oc.test(n)||Nc.test(n)?n:n.replace(/^(\s*[-*+]\s+)/,"$1[ ] ")).join(` -`)}function Nx(t){return t.split(` -`).map(n=>Lc.test(n)||Pc.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)/,"$1[ ] ")).join(` -`)}function Fx(t){return t.split(` -`).map(n=>Oc.test(n)?n:n.replace(/^(\s*[-*+]\s+)\[[^\]]\]/,"$1[ ]")).join(` -`)}function Rx(t){return t.split(` -`).map(n=>Lc.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)\[[^\]]{1}\]/,"$1[ ]")).join(` -`)}function Hx(t){return t.split(` -`).map(n=>Nc.test(n)?n:n.replace(/^(\s*[-*+]\s+)\[\s\]/,"$1[x]")).join(` -`)}function Bx(t){return t.split(` -`).map(n=>Pc.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)\[\s\]/,"$1[x]")).join(` -`)}function Kx(t){return t.split(` -`).map(e=>ya.test(e)?e.replace(/^(\s*)[-+*]\s+/,"$1"):e).join(` -`)}var Pm={"editor:toggle-bold":t=>{Ei(t,Mm,Sx,"**")},"editor:toggle-code":t=>{Ei(t,Cm,kx,"`")},"editor:toggle-italics":t=>{Ei(t,Dm,xx,"*")},"editor:toggle-highlight":t=>{Ei(t,Im,_x,"==")},"editor:toggle-strikethrough":t=>{Ei(t,Am,Tx,"~~")},"editor:toggle-blockquote":t=>{zo(t,Mx,Dx,Cx)},"editor:toggle-bullet-list":t=>{zo(t,ya,Lm,Kx)},"editor:toggle-numbered-list":t=>{zo(t,va,Lx,Px)},"editor:toggle-checklist-status":t=>{let n=Hn(t),e=wi({text:n.text,selection:n.selection}),r=Rt(t,e),i=r.selectedText,a=ya.test(i),o=va.test(i);!a&&!o?i=Lm(i):a?Oc.test(i)?i=Hx(i):Nc.test(i)?i=Fx(i):i=Ox(i):Lc.test(i)?i=Bx(i):Pc.test(i)?i=Rx(i):i=Nx(i);let s=Tt(t,i);Rt(t,{start:r.selection.start,end:s.selection.end})}},Fc={"(":t=>rn(t,"(",")",!1),"[":t=>rn(t,"[","]",!1,!0),"{":t=>rn(t,"{","}",!1),"'":t=>rn(t,"'","'",!1),'"':t=>rn(t,'"','"',!1)},Rc={"*":t=>rn(t,"*","*",!1),_:t=>rn(t,"_","_",!1),"`":t=>rn(t,"`","`",!1),"=":t=>rn(t,"=","=",!0),"~":t=>rn(t,"~","~",!0),$:t=>rn(t,"$","$",!0),"%":t=>rn(t,"%","%",!0)},$x={"(":")","[":"]","{":"}","'":"'",'"':'"',"*":"*",_:"_","`":"`","=":"=","~":"~",$:"$","%":"%"};function Om(t,n){let e=Hn(t);if(e.selection.end!==e.selection.start||e.selection.end===e.text.length)return!1;let r=e.text[e.selection.end-1],i=e.text[e.selection.end];if(n[r]&&i===$x[r])return Rt(t,{start:e.selection.end,end:e.selection.end+1}),Tt(t,""),!0}function Nm(t){return Om(t,Fc)}function Fm(t){return Om(t,Rc)}function Ux(t,n,e){let r=n?" ":" ".repeat(e);return t.split(` +`)}var ga=/^(?:\s*\d+[.)]\s+.+?(?:[\r\n]|$))+$/,Ec=/^(?:\s*\d+[.)]\s+\[\s+\]+.+?(?:[\r\n]|$))+$/,Sc=/^(?:\s*\d+[.)]\s+\[[^\]\s]+\]+.+?(?:[\r\n]|$))+$/;function XS(t){return t.match(/^\s*/)[0].length}function ZS(t){return parseInt(t.match(/^\s*(\d+)/)[1],10)}function ex(t){let n=[0],e=0;return t.split(` +`).map(r=>{let i=XS(r);if(i>e?n.push(0):iga.test(n)?n.replace(/^(\s*)\d+[.)]\s+/,"$1"):n).join(` +`)}var va=/^(?:\s*[-*+]\s+.+?(?:[\r\n]|$))+$/,xc=/^(?:\s*[-*+]\s+\[\s+\]+.+?(?:[\r\n]|$))+$/,kc=/^(?:\s*[-*+]\s+\[[^\]\s]+\]+.+?(?:[\r\n]|$))+$/;function fm(t){return t.split(` +`).map(e=>va.test(e)?e:e.replace(/^(\s*)/,"$1- ")).join(` +`)}function nx(t){return t.split(` +`).map(n=>xc.test(n)||kc.test(n)?n:n.replace(/^(\s*[-*+]\s+)/,"$1[ ] ")).join(` +`)}function rx(t){return t.split(` +`).map(n=>Ec.test(n)||Sc.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)/,"$1[ ] ")).join(` +`)}function ix(t){return t.split(` +`).map(n=>xc.test(n)?n:n.replace(/^(\s*[-*+]\s+)\[[^\]]\]/,"$1[ ]")).join(` +`)}function ax(t){return t.split(` +`).map(n=>Ec.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)\[[^\]]{1}\]/,"$1[ ]")).join(` +`)}function ox(t){return t.split(` +`).map(n=>kc.test(n)?n:n.replace(/^(\s*[-*+]\s+)\[\s\]/,"$1[x]")).join(` +`)}function sx(t){return t.split(` +`).map(n=>Sc.test(n)?n:n.replace(/^(\s*\d+[.)]\s+)\[\s\]/,"$1[x]")).join(` +`)}function lx(t){return t.split(` +`).map(e=>va.test(e)?e.replace(/^(\s*)[-+*]\s+/,"$1"):e).join(` +`)}var hm={"editor:toggle-bold":t=>{yi(t,sm,VS,"**")},"editor:toggle-code":t=>{yi(t,cm,WS,"`")},"editor:toggle-italics":t=>{yi(t,lm,jS,"*")},"editor:toggle-highlight":t=>{yi(t,um,qS,"==")},"editor:toggle-strikethrough":t=>{yi(t,dm,YS,"~~")},"editor:toggle-blockquote":t=>{jo(t,JS,GS,QS)},"editor:toggle-bullet-list":t=>{jo(t,va,fm,lx)},"editor:toggle-numbered-list":t=>{jo(t,ga,ex,tx)},"editor:toggle-checklist-status":t=>{let n=Kn(t),e=vi({text:n.text,selection:n.selection}),r=Nt(t,e),i=r.selectedText,a=va.test(i),o=ga.test(i);!a&&!o?i=fm(i):a?xc.test(i)?i=ox(i):kc.test(i)?i=ix(i):i=nx(i):Ec.test(i)?i=sx(i):Sc.test(i)?i=ax(i):i=rx(i);let s=_t(t,i);Nt(t,{start:r.selection.start,end:s.selection.end})}},_c={"(":t=>ln(t,"(",")",!1),"[":t=>ln(t,"[","]",!1,!0),"{":t=>ln(t,"{","}",!1),"'":t=>ln(t,"'","'",!1),'"':t=>ln(t,'"','"',!1)},Tc={"*":t=>ln(t,"*","*",!1),_:t=>ln(t,"_","_",!1),"`":t=>ln(t,"`","`",!1),"=":t=>ln(t,"=","=",!0),"~":t=>ln(t,"~","~",!0),$:t=>ln(t,"$","$",!0),"%":t=>ln(t,"%","%",!0)},cx={"(":")","[":"]","{":"}","'":"'",'"':'"',"*":"*",_:"_","`":"`","=":"=","~":"~",$:"$","%":"%"};function pm(t,n){let e=Kn(t);if(e.selection.end!==e.selection.start||e.selection.end===e.text.length)return!1;let r=e.text[e.selection.end-1],i=e.text[e.selection.end];if(n[r]&&i===cx[r])return Nt(t,{start:e.selection.end,end:e.selection.end+1}),_t(t,""),!0}function mm(t){return pm(t,_c)}function gm(t){return pm(t,Tc)}function ux(t,n,e){let r=n?" ":" ".repeat(e);return t.split(` `).map(i=>r+i).join(` -`)}function jx(t,n,e){let r=n?"\\t":" ".repeat(e),i=new RegExp(`^${r}`);return t.split(` +`)}function dx(t,n,e){let r=n?"\\t":" ".repeat(e),i=new RegExp(`^${r}`);return t.split(` `).map(a=>i.test(a)?a.replace(i,""):a).join(` -`)}function Rm(t,n,e,r){let i=Hn(t);if(n){let l=wi(i),c=Rt(t,l);if(Tt(t,jx(c.selectedText,e,r)),i.selection.start===i.selection.end){let d=e?1:r;Rt(t,{start:i.selection.start-d,end:i.selection.end-d})}return!0}let a=wi(i),o=Rt(t,a),u=Ux(o.selectedText,e,r).replace(/^(\s*)(\d+)([.)]\s)/,(l,c,d,f)=>`${c}1${f}`);return Tt(t,u),!0}function Hm(t){let n=Hn(t);if(n.selection.start!==n.selection.end)return!1;let e=wi(n),r=t.value.slice(e.start,n.selection.end),i=t.value.slice(e.start,e.end);if(/^(\s*[-*+]\s+(?:\[[^\]]\]\s*)?)$/.test(i))return Rt(t,{start:e.start-1,end:e.end}),Tt(t,` -`),!0;if(/^(\s*\d[.)]\s+(?:\[[^\]]\]\s*)?)$/.test(i))return Rt(t,{start:e.start-1,end:e.end}),Tt(t,` -`),!0;if(ya.test(r)){let a=r.match(/^(\s*[-*+]\s+(?:\[[^\]]\]\s*)?)/)[1];return pa(t,` -${a.replace(/^(\s*[-*+]\s+)\[[^\]]\]/,"$1[ ]")}`),!0}if(va.test(r)){let s=r.match(/^(\s*\d+[.)]\s+(?:\[[^\]]\]\s*)?)/)[1].replace(/^(\s*\d+[.)]\s+)\[[^\]]\]/,"$1[ ]").replace(/^(\s*)(\d+)/,(u,l,c)=>`${l}${parseInt(c)+1}`);return pa(t,` -${s}`),!0}return!1}function tr(t,n){return n.getSetting("new-line-trigger")==="enter"?t.key==="Enter"&&!(t.shiftKey||t.metaKey||t.ctrlKey):t.key==="Enter"&&t.shiftKey}var gr=v.forwardRef(function({onEnter:n,onEscape:e,...r},i){let{view:a,stateManager:o}=v.useContext(qe),s=v.useMemo(()=>a.app.vault.getConfig("autoPairMarkdown"),[a]),u=v.useMemo(()=>a.app.vault.getConfig("autoPairBrackets"),[a]),l=v.useMemo(()=>a.app.vault.getConfig("useTab"),[a]),c=v.useMemo(()=>a.app.vault.getConfig("tabSize"),[a]),d=!!a.app.vault.getConfig("useMarkdownLinks"),f=Tm({isInputVisible:!0,onEnter:n,onEscape:e,onKeyDown:h=>{if(h.key==="Backspace"){let p=Nm(h.target);return p||Fm(h.target)}if(tr(h,o)){let p=Hm(h.target);if(p)return h.preventDefault(),p}if(h.key==="Tab")return h.preventDefault(),Rm(h.target,h.shiftKey,l,c);if(s){let p=Rc[h.key];if(p&&p(h.target))return h.preventDefault(),!0}if(u){if(d&&h.key==="[")return!1;let p=Fc[h.key];if(p&&p(h.target))return h.preventDefault(),!0}return!1}});return v.useEffect(()=>{let h=p=>{let g=Pm[p];g&&g(f.ref.current)};return a.emitter.on("hotkey",h),()=>{a.emitter.off("hotkey",h)}},[a]),v.createElement("div",{"data-replicated-value":r.value,className:$("grow-wrap")},v.createElement("textarea",{"data-ignore-drag":!0,rows:1,className:$("item-input"),...r,...f,ref:h=>{f.ref.current=h,i&&typeof i=="function"?i(h):i&&(i.current=h)}}))});var Uc=ge(Bm());var vr=ge(require("obsidian"));var Km={};var $m={};var Um={};var jm={"Open as kanban board":"\xD6ffne als Kanban-Board","Create new board":"Erstelle ein neues Board","Archive completed cards in active board":"Archiviere fertiggestellte Karten im aktiven Board","Error: current file is not a Kanban board":"Fehler: Momentan ge\xF6ffnete Datei ist kein Kanban-Board","Convert empty note to Kanban":"Konvertiere leere Notiz in ein Kanban-Board","Error: cannot create Kanban, the current note is not empty":"Fehler: Kanban konnte nicht erstellt werden, momentan ge\xF6ffnete Datei ist nicht leer","New kanban board":"Neues Kanban-Board","Untitled Kanban":"Unbenanntes Kanban","Toggle between Kanban and markdown mode":"Wechsle zwischen Kanban und Markdown Modus","Open as markdown":"\xD6ffne als Markdown","Open board settings":"\xD6ffne Board-Einstellungen","Archive completed cards":"Archiviere fertiggestellte Karten","Something went wrong":"Etwas ist schief gelaufen","You may wish to open as markdown and inspect or edit the file.":"Du kannst die Datei im Markdown Modus \xF6ffnen und \xFCberpr\xFCfen oder bearbeiten.","Are you sure you want to archive all completed cards on this board?":"Bist du dir sicher, dass du alle fertiggestellten Karten des Boards archivieren m\xF6chtest?",Complete:"Fertiggestellt",Archive:"Archiv","Invalid Kanban file: problems parsing frontmatter":"Fehlerhafte Kanban Datei: Probleme beim Parsen des Frontmatters","I don't know how to interpret this line:":"Ich wei\xDF nicht, wie ich diese Zeile interpretieren soll:",Untitled:"Unbenannt","Note: No template plugins are currently enabled.":"Beachte: Keine Template-Plugins sind derzeit aktiviert.",default:"Standard","Search...":"Suche...","These settings will take precedence over the default Kanban board settings.":"Diese Einstellung wird Vorrang vor der standard Kanban-Board Einstellung haben. ","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Stelle standard Kanban-Board Einstellungen ein. Einstellungen k\xF6nnen auf einer Board-f\xFCr-Board Basis \xFCberschrieben werden.","Note template":"Notiz Vorlage","This template will be used when creating new notes from Kanban cards.":"Diese Vorlage wird beim Erstellen neuer Notizen aus Kanban-Karten verwendet.","No template":"Keine Vorlage","Note folder":"Notiz Ordner","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Notizen, welche aus einer Kanban-Karte erstellt wurden, werden in diesem Ordner platziert. Falls leer, werden die Einstellungen des Vaults verwendet.","Default folder":"Standard Ordner","Lane width":"Schienen Breite","Enter a number to set the lane width in pixels.":"Gebe ein Zahl ein, um die Schienen Breite in Pixeln einzustellen.","Maximum number of archived cards":"Maximale Anzahl archivierter Karten.","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Archivierte Karten k\xF6nnen im Markdown-Modus betrachtet werden. Diese Einstellung wird alte Karten l\xF6schen, sobald das Limit erreicht wird. Eine Einstellung von -1 setzt das Archiv auf eine unendliche Gr\xF6\xDFe.","Display card checkbox":"Zeige Karten Checkbox","When toggled, a checkbox will be displayed with each card":"Wenn aktiviert, wird eine Checkbox mit jeder Karte angezeigt.","Reset to default":"Zur\xFCcksetzen","Date & Time":"Datum & Uhrzeit","Date trigger":"Datums Ausl\xF6ser","When this is typed, it will trigger the date selector":"Wenn dies eingegeben wird, dann wird die Datumsauswahl angezeigt","Time trigger":"Uhrzeit Ausl\xF6ser","When this is typed, it will trigger the time selector":"Wenn dies eingegeben wird, dann wird die Uhrzeitsauswahl angezeigt","Date format":"Format des Datums","This format will be used when saving dates in markdown.":"Dieses Format wird verwendet, wenn ein Datum in Markdown gespeichert wird.","For more syntax, refer to":"F\xFCr mehr Syntax Informationen siehe","format reference":"Formatvorlage","Your current syntax looks like this":"Dein momentanes Format sieht so aus","Time format":"Format der Uhrzeit","Date display format":"Format der Datums Anzeige","This format will be used when displaying dates in Kanban cards.":"Dieses Format wird verwendet, wenn ein Datum in einer Kanban-Karte angezeigt wird.","Show relative date":"Zeige relatives Datum","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Wenn aktiviert, wird die Zeitspanne zwischen Heute und dem Datum angezeigt. Zum Beispiel: 'In 3 Tagen', 'Vor einem Monat'","Hide card display dates":"Verstecke Karten Datum","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Wenn aktiviert, werden formatierte Daten nicht auf der Karte angezeigt. Relative Daten werden dennoch angezeigt, solange sie aktiviert sind.","Hide dates in card titles":"Verstecke Daten im Titel der Karte","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Wenn aktiviert, werden Daten nicht im Titel der Karte angezeigt. Dies verhindert, dass Daten im Titel neu erstellter Notizen vorhanden sind.","Link dates to daily notes":"Verbinde Daten zu Daily Notes","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Wenn aktiviert, werden Daten mit Daily Notes verbunden. Zum Beispiel [[26.4.2021]]","Add date and time to archived cards":"F\xFCge Datum und Uhrzeit zu archivierten Notizen hinzu","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Wenn aktiviert, wird das momentane Datum und die momentane Zeit am Anfang einer Karte hinzugef\xFCgt, wenn sie archiviert wird. Zum Beispiel: - [ ] 14.05.2021 10:00 Mein Karten Titel","Archive date/time separator":"Datum/Uhrzeit Trenner f\xFCr das Archiv","This will be used to separate the archived date/time from the title":"Dies wird verwendet, um das Datum und die Uhrzeit archivierter Karten vom Titel zu trennen","Archive date/time format":"Format des Datums und der Uhrzeit f\xFCr das Archiv","Kanban Plugin":"Kanban Erweiterung","New line trigger":"Taste f\xFCr neue Zeile","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"W\xE4hle aus ob Enter oder Umschalttaste+Enter eine neue Zeile erstellen soll. Das Gegenteil kannst du verwenden um die Karte zu erstellen oder das bearbeiten der Karte oder Schiene zu beenden.","Shift + Enter":"Umschalttaste + Enter",Enter:"Enter","Prepend / append new cards":"Neue Karten voranf\xFCgen / anh\xE4ngen","This setting controls whether new cards are added to the beginning or end of the list.":"Diese Einstellung gibt an ob neue Karten am Anfang oder am Ende einer Liste hinzugef\xFCgt werden.",Prepend:"Voranf\xFCgen",Append:"Anh\xE4ngen","Hide tags in card titles":"Ausblenden von Tags in Kartentiteln","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"Ist diese Einstellung an, so werden Tags im Kartentitel nicht angezeigt. Dadurch wird verhindert, dass Tags beim Erstellen neuer Notizen in den Titel aufgenommen werden.","Hide card display tags":"Ausblenden von Kartenanzeige-Tags","When toggled, tags will not be displayed below the card title.":"Ist diese Einstellung an, werden Tags nicht unter dem Kartentitel angezeigt.","Linked Page Metadata":"Metadaten f\xFCr verkn\xFCpfte (verlinkte) Notizen","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Zeigen Sie Metadaten f\xFCr die erste Notiz an, die innerhalb einer Karte verkn\xFCpft ist. Geben Sie an, welche Metadatenschl\xFCssel unten angezeigt werden sollen. Ein optionales Label kann hinzugef\xFCgt werden, es kann aber auch vollst\xE4ndig ausgeblendet werden.","Metadata key":"Metadatenschl\xFCssel","Display label":"Anzeigelabel","Hide label":"Label ausblenden","Drag to rearrange":"Zum Neuanordnen ziehen",Delete:"L\xF6schen","Add key":"Schl\xFCssel hinzuf\xFCgen","Field contains markdown":"Feld beinhaltet Markdown","More options":"Mehr optionen",Cancel:"Abbrechen",today:"heute",yesterday:"gestern",tomorrow:"morgen","Change date":"Ver\xE4ndere Datum","Change time":"Ver\xE4ndere Uhrzeit","Card title...":"Karten Titel...","Add card":"Karte hinzuf\xFCgen","Add a card":"F\xFCge eine Karte hinzu","Edit card":"Karte editieren","New note from card":"Neue Notiz aus Karte erstellen","Archive card":"Karte archivieren","Delete card":"Karte l\xF6schen","Edit date":"Datum editieren","Add date":"Datum hinzuf\xFCgen","Remove date":"Datum entfernen","Edit time":"Karte editieren","Add time":"Uhrzeit hinzuf\xFCgen","Remove time":"Uhrzeit entfernen","Duplicate card":"Karte duplizieren","Enter list title...":"Listen Titel eingeben..","Mark cards in this list as complete":"Markiere Karten in dieser Liste als fertiggestellt","Add list":"Liste hinzuf\xFCgen","Add a list":"F\xFCge eine Liste hinzu","Move list":"Liste verschieben",Close:"Schlie\xDFen","Are you sure you want to delete this list and all its cards?":"Bist du dir sicher, dass du diese Liste und alle ihre Karten l\xF6schen m\xF6chtest?","Yes, delete list":"Ja, l\xF6sche diese Liste","Are you sure you want to archive this list and all its cards?":"Bist du dir sicher, dass du diese Liste und alle ihre Karten archivieren m\xF6chtest?","Yes, archive list":"Ja, archiviere diese Liste","Are you sure you want to archive all cards in this list?":"Bist du dir sicher, dass du alle Karten in dieser Liste archivieren m\xF6chtest?","Yes, archive cards":"Ja, archiviere Karten","Edit list":"Editiere Liste","Archive cards":"Archiviere Karten","Archive list":"Archiviere List","Delete list":"L\xF6sche Liste"};var Kc={"Open as kanban board":"Open as kanban board","Create new board":"Create new board","Archive completed cards in active board":"Archive completed cards in active board","Error: current file is not a Kanban board":"Error: current file is not a Kanban board","Convert empty note to Kanban":"Convert empty note to Kanban","Error: cannot create Kanban, the current note is not empty":"Error: cannot create Kanban, the current note is not empty","New kanban board":"New kanban board","Untitled Kanban":"Untitled Kanban","Toggle between Kanban and markdown mode":"Toggle between Kanban and markdown mode","Open as markdown":"Open as markdown","Open board settings":"Open board settings","Archive completed cards":"Archive completed cards","Something went wrong":"Something went wrong","You may wish to open as markdown and inspect or edit the file.":"You may wish to open as markdown and inspect or edit the file.","Are you sure you want to archive all completed cards on this board?":"Are you sure you want to archive all completed cards on this board?",Complete:"Complete",Archive:"Archive","Invalid Kanban file: problems parsing frontmatter":"Invalid Kanban file: problems parsing frontmatter","I don't know how to interpret this line:":"I don't know how to interpret this line:",Untitled:"Untitled","Note: No template plugins are currently enabled.":"Note: No template plugins are currently enabled.",default:"default","Search...":"Search...","New line trigger":"New line trigger","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.","Shift + Enter":"Shift + Enter",Enter:"Enter","Prepend / append new cards":"Prepend / append new cards","This setting controls whether new cards are added to the beginning or end of the list.":"This setting controls whether new cards are added to the beginning or end of the list.",Prepend:"Prepend","Prepend (compact)":"Prepend (compact)",Append:"Append","These settings will take precedence over the default Kanban board settings.":"These settings will take precedence over the default Kanban board settings.","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.","Note template":"Note template","This template will be used when creating new notes from Kanban cards.":"This template will be used when creating new notes from Kanban cards.","No template":"No template","Note folder":"Note folder","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.","Default folder":"Default folder","Lane width":"Lane width","Enter a number to set the lane width in pixels.":"Enter a number to set the lane width in pixels.","Maximum number of archived cards":"Maximum number of archived cards","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.","Display card checkbox":"Display card checkbox","When toggled, a checkbox will be displayed with each card":"When toggled, a checkbox will be displayed with each card","Reset to default":"Reset to default","Date & Time":"Date & Time","Date trigger":"Date trigger","When this is typed, it will trigger the date selector":"When this is typed, it will trigger the date selector","Time trigger":"Time trigger","When this is typed, it will trigger the time selector":"When this is typed, it will trigger the time selector","Date format":"Date format","This format will be used when saving dates in markdown.":"This format will be used when saving dates in markdown.","For more syntax, refer to":"For more syntax, refer to","format reference":"format reference","Your current syntax looks like this":"Your current syntax looks like this","Time format":"Time format","Date display format":"Date display format","This format will be used when displaying dates in Kanban cards.":"This format will be used when displaying dates in Kanban cards.","Show relative date":"Show relative date","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'","Hide card display dates":"Hide card display dates","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.","Hide dates in card titles":"Hide dates in card titles","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.","Link dates to daily notes":"Link dates to daily notes","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"When toggled, dates will link to daily notes. Eg. [[2021-04-26]]","Add date and time to archived cards":"Add date and time to archived cards","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title","Archive date/time separator":"Archive date/time separator","This will be used to separate the archived date/time from the title":"This will be used to separate the archived date/time from the title","Archive date/time format":"Archive date/time format","Kanban Plugin":"Kanban Plugin","Hide tags in card titles":"Hide tags in card titles","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.","Hide card display tags":"Hide card display tags","When toggled, tags will not be displayed below the card title.":"When toggled, tags will not be displayed below the card title.","Linked Page Metadata":"Linked Page Metadata","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.","Board Header Buttons":"Board Header Buttons","Calendar: first day of week":"Calendar: first day of week","Override which day is used as the start of the week":"Override which day is used as the start of the week",Sunday:"Sunday",Monday:"Monday",Tuesday:"Tuesday",Wednesday:"Wednesday",Thursday:"Thursday",Friday:"Friday",Saturday:"Saturday","Metadata key":"Metadata key","Display label":"Display label","Hide label":"Hide label","Drag to rearrange":"Drag to rearrange",Delete:"Delete","Add key":"Add key","Field contains markdown":"Field contains markdown","More options":"More options",Cancel:"Cancel",today:"today",yesterday:"yesterday",tomorrow:"tomorrow","Change date":"Change date","Change time":"Change time","Card title...":"Card title...","Add card":"Add card","Add a card":"Add a card","Edit card":"Edit card","New note from card":"New note from card","Archive card":"Archive card","Delete card":"Delete card","Edit date":"Edit date","Add date":"Add date","Remove date":"Remove date","Edit time":"Edit time","Add time":"Add time","Remove time":"Remove time","Duplicate card":"Duplicate card","Split card":"Split card","Copy link to card":"Copy link to card","Insert card before":"Insert card before","Insert card after":"Insert card after","Enter list title...":"Enter list title...","Mark cards in this list as complete":"Mark cards in this list as complete","Add list":"Add list","Add a list":"Add a list","Move list":"Move list",Close:"Close","Are you sure you want to delete this list and all its cards?":"Are you sure you want to delete this list and all its cards?","Yes, delete list":"Yes, delete list","Are you sure you want to archive this list and all its cards?":"Are you sure you want to archive this list and all its cards?","Yes, archive list":"Yes, archive list","Are you sure you want to archive all cards in this list?":"Are you sure you want to archive all cards in this list?","Yes, archive cards":"Yes, archive cards","Edit list":"Edit list","Archive cards":"Archive cards","Archive list":"Archive list","Delete list":"Delete list","Insert list before":"Insert list before","Insert list after":"Insert list after","Unable to find":"Unable to find","Open in default app":"Open in default app"};var zm={};var Vm={};var qm={};var Wm={};var Ym={"Open as kanban board":"Apri come bacheca Kanban","Create new board":"Crea nuova bacheca","Archive completed cards in active board":"Archivia schede completate nella bacheca attiva","Error: current file is not a Kanban board":"Errore: il file corrente non \xE8 una bacheca Kanban","Convert empty note to Kanban":"Converti nota vuota in Kanban","Error: cannot create Kanban, the current note is not empty":"Errore: Impossibile creare Kanban, la nota corrente non \xE8 vuota","New kanban board":"Nuova bacheca Kanban","Untitled Kanban":"Kanban senza titolo","Open as markdown":"Apri come markdown","Open board settings":"Apri impostazioni bacheca","Archive completed cards":"Archivia schede completate",Complete:"Completato",Archive:"Archivio","Note: No template plugins are currently enabled.":"Nota: Nessun plugin dei modelli attualmente abilitato.",default:"predefinito","Search...":"Ricerca...","These settings will take precedence over the default Kanban board settings.":"Queste impostazioni avranno la precedenza sulle impostazioni predefinite della bacheca Kanban.","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Impostazioni predefinite della bacheca Kanban. Le impostazioni possono essere sovrascritte per ogni bacheca.","Note template":"Nota modello","This template will be used when creating new notes from Kanban cards.":"Questo modello verr\xE0 utilizzato durante la creazione di nuove note dalle schede Kanban.","No template":"Nessun modello","Note folder":"Cartella delle note","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Le note create dalle schede Kanban verranno inserite in questa cartella. Se vuota, verranno inserite nella posizione predefinita del vault.","Default folder":"Cartella predefinita","Lane width":"Larghezza colonna","Enter a number to set the lane width in pixels.":"Inserire un numero per impostare la larghezza della colonna in pixel.","Maximum number of archived cards":"Numero massimo di schede archiviate","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Le schede archiviate possono essere visualizzate in modalit\xE0 Markdown. Le vecchie schede verranno rimosse una volta raggiunto il limite. Impostando il valore -1 il numero di schede archiviate sar\xE0 illimitato.","Display card checkbox":"Mostra casella di controllo","When toggled, a checkbox will be displayed with each card":"Se attiva, verr\xE0 visualizzata una casella di controllo per ogni scheda","Reset to default":"Ripristina predefiniti","Date & Time":"Data e ora","Date trigger":"Selettore data","When this is typed, it will trigger the date selector":"Digitando questo, verr\xE0 attivato il selettore della data","Time trigger":"Selettore ora","When this is typed, it will trigger the time selector":"Digitando questo, verr\xE0 attivato il selettore dell'ora","Date format":"Formato data","This format will be used when saving dates in markdown.":"Formato utilizzato per il salvataggio delle date in Markdown.","For more syntax, refer to":"Per maggiori informazioni, vedere","format reference":"formato di riferimento","Your current syntax looks like this":"Formato corrente","Time format":"Formato ora","Date display format":"Formato visualizzazione data","This format will be used when displaying dates in Kanban cards.":"Formato utilizzato per visualizzare le date nelle schede Kanban.","Show relative date":"Mostra data relativa","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Se attiva, le schede indicheranno la distanza tra la data odierna e la data della scheda. eg. 'Tra 3 giorni', 'Un mese fa'","Hide card display dates":"Hide card display dates","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Se attiva, la data non verr\xE0 mostrata sulla scheda. Le date relative verranno comunque mostrate se sono state abilitate.","Hide dates in card titles":"Nascondi date nei titoli delle schede","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Se attiva, la data non verr\xE0 mostrata nei titoli delle schede. Questo impedisce alle date di essere incluse quando vengono create nuove note.","Link dates to daily notes":"Collega date alle Note del giorno","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Se attiva, le date verranno collegate alle Note del giorno. Eg. [[2021-04-26]]","Add date and time to archived cards":"Aggiungi data e ora alle schede archiviate","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Se attiva, la data e l'ora corrente verranno aggiunte all'inizio della scheda quando viene archiviata. Eg. - [ ] 2021-05-14 10:00am Mia scheda","Archive date/time separator":"Separatore data/ora dell'archivio","This will be used to separate the archived date/time from the title":"Verr\xE0 usato per separare data e ora dell'archiviazione dal titolo","Archive date/time format":"Formato data/ora dell'archivio","Kanban Plugin":"Plugin Kanban","More options":"Altre opzioni",Cancel:"Annulla",today:"oggi",yesterday:"ieri",tomorrow:"domani","Change date":"Modifica data","Change time":"Modifica ora","Card title...":"Titolo elemento...","Add card":"Aggiungi elemento","Add a card":"Aggiungi un'altra scheda","Edit card":"Modifica scheda","New note from card":"Nuova nota da scheda","Archive card":"Archivia scheda","Delete card":"Elimina scheda","Edit date":"Modifica data","Add date":"Aggiungi data","Remove date":"Rimuovi data","Edit time":"Modifica ora","Add time":"Aggiungi ora","Remove time":"Rimuovi ora","Enter list title...":"Inserisci titolo lista...","Mark cards in this list as complete":"Segna elementi della lista come completati","Add list":"Aggiungi lista","Add a list":"Aggiungi un'altra lista","Move list":"Sposta lista",Close:"Chiudi","Are you sure you want to delete this list and all its cards?":"Cancellare questa lista e tutte le sue schede?","Yes, delete list":"Cancella lista","Are you sure you want to archive this list and all its cards?":"Archiviare questa lista e tutte le sue schede?","Yes, archive list":"Archivia lista","Are you sure you want to archive all cards in this list?":"Archiviare tutte le schede in questa lista?","Yes, archive cards":"Archivia schede","Edit list":"Modifica lista","Archive cards":"Archivia schede","Archive list":"Archivia lista","Delete list":"Cancella lista"};var Jm={"Open as kanban board":"\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3068\u3057\u3066\u958B\u304F","Create new board":"\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3092\u65B0\u898F\u4F5C\u6210","Archive completed cards in active board":"\u30A2\u30AF\u30C6\u30A3\u30D6\u30DC\u30FC\u30C9\u306E\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Error: current file is not a Kanban board":"\u30A8\u30E9\u30FC: \u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093","Convert empty note to Kanban":"\u7A7A\u306E\u30CE\u30FC\u30C8\u3092\u30AB\u30F3\u30D0\u30F3\u306B\u5909\u63DB","Error: cannot create Kanban, the current note is not empty":"\u30A8\u30E9\u30FC: \u73FE\u5728\u958B\u3044\u3066\u3044\u308B\u30CE\u30FC\u30C8\u306F\u7A7A\u3067\u3042\u308A\u3001\u30AB\u30F3\u30D0\u30F3\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093","New kanban board":"\u65B0\u898F\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9","Untitled Kanban":"\u7121\u984C\u306E\u30AB\u30F3\u30D0\u30F3","Toggle between Kanban and markdown mode":"\u30AB\u30F3\u30D0\u30F3\u3068\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u306E\u30E2\u30FC\u30C9\u3092\u5207\u308A\u66FF\u3048\u308B","Open as markdown":"\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3068\u3057\u3066\u958B\u304F","Open board settings":"\u30DC\u30FC\u30C9\u8A2D\u5B9A\u3092\u958B\u304F","Archive completed cards":"\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Something went wrong":"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","You may wish to open as markdown and inspect or edit the file.":"\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3068\u3057\u3066\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3044\u3066\u8ABF\u67FB\u3059\u308B\u304B\u7DE8\u96C6\u3059\u308B\u3053\u3068\u3092\u304A\u3059\u3059\u3081\u3057\u307E\u3059\u3002","Are you sure you want to archive all completed cards on this board?":"\u3053\u306E\u30DC\u30FC\u30C9\u306B\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F",Complete:"\u5B8C\u4E86",Archive:"\u30A2\u30FC\u30AB\u30A4\u30D6","Invalid Kanban file: problems parsing frontmatter":"\u7121\u52B9\u306A\u30AB\u30F3\u30D0\u30F3\u30D5\u30A1\u30A4\u30EB: \u30D5\u30ED\u30F3\u30C8\u30DE\u30BF\u30FC\u306E\u30D1\u30FC\u30B9\u306B\u554F\u984C\u304C\u3042\u308A\u307E\u3059","I don't know how to interpret this line:":"\u3053\u306E\u884C\u3092\u3069\u3046\u89E3\u91C8\u3059\u308C\u3070\u3088\u3044\u304B\u5206\u304B\u308A\u307E\u305B\u3093",Untitled:"\u7121\u984C","Note: No template plugins are currently enabled.":"\u30CE\u30FC\u30C8: \u73FE\u5728\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30D7\u30E9\u30B0\u30A4\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059",default:"\u30C7\u30D5\u30A9\u30EB\u30C8","Search...":"\u691C\u7D22\u2026","New line trigger":"\u6539\u884C\u30C8\u30EA\u30AC\u30FC","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"\u6539\u884C\u306B\u4F7F\u3046\u30AD\u30FC\u3068\u3057\u3066Enter\u304BShift+Enter\u306E\u3069\u3061\u3089\u3092\u4F7F\u3046\u304B\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u9078\u629E\u3057\u306A\u304B\u3063\u305F\u65B9\u306E\u30AD\u30FC\u306F\u30AB\u30FC\u30C9\u3068\u30EC\u30FC\u30F3\u306E\u4F5C\u6210\u3068\u7DE8\u96C6\u5B8C\u4E86\u306E\u30C8\u30EA\u30AC\u30FC\u3068\u306A\u308A\u307E\u3059\u3002","Shift + Enter":"Shift + Enter",Enter:"Enter","Prepend / append new cards":"\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306B\u65B0\u898F\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0\u3059\u308B","This setting controls whether new cards are added to the beginning or end of the list.":"\u3053\u306E\u8A2D\u5B9A\u306B\u3088\u3063\u3066\u65B0\u898F\u30AB\u30FC\u30C9\u3092\u30EA\u30B9\u30C8\u306E\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306B\u8FFD\u52A0\u3059\u308B\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002",Prepend:"\u5148\u982D\u306B\u8FFD\u52A0","Prepend (compact)":"\u5148\u982D\u306B\u8FFD\u52A0(\u30B3\u30F3\u30D1\u30AF\u30C8)",Append:"\u672B\u5C3E\u306B\u8FFD\u52A0","These settings will take precedence over the default Kanban board settings.":"\u3053\u308C\u3089\u306E\u8A2D\u5B9A\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30AB\u30F3\u30D0\u30F3\u8A2D\u5B9A\u3088\u308A\u512A\u5148\u3055\u308C\u307E\u3059\u3002","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u8A2D\u5B9A\u3092\u30BB\u30C3\u30C8\u3057\u307E\u3059\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u30DC\u30FC\u30C9\u6BCE\u306B\u4E0A\u66F8\u304D\u3067\u304D\u307E\u3059\u3002","Note template":"\u30CE\u30FC\u30C8\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8","This template will be used when creating new notes from Kanban cards.":"\u3053\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u304B\u3089\u30CE\u30FC\u30C8\u3092\u65B0\u898F\u4F5C\u6210\u3057\u305F\u969B\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","No template":"\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u304C\u3042\u308A\u307E\u305B\u3093","Note folder":"\u30CE\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u304B\u3089\u4F5C\u6210\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306F\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u5185\u306B\u7F6E\u304B\u308C\u307E\u3059\u3002\u30D6\u30E9\u30F3\u30AF\u306E\u5834\u5408\u306B\u306F\u3001\u3053\u306E\u4FDD\u7BA1\u5EAB\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u7F6E\u304B\u308C\u307E\u3059\u3002","Default folder":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30D5\u30A9\u30EB\u30C0","Lane width":"\u30EC\u30FC\u30F3\u306E\u5E45","Enter a number to set the lane width in pixels.":"\u30EC\u30FC\u30F3\u306E\u5E45\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","Maximum number of archived cards":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306E\u6700\u5927\u6570","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306F\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u30E2\u30FC\u30C9\u3067\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002\u3053\u306E\u8A2D\u5B9A\u306B\u3088\u308A\u6307\u5B9A\u3055\u308C\u305F\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u9650\u754C\u6570\u307E\u3067\u9054\u3057\u305F\u969B\u306B\u306F\u53E4\u3044\u30AB\u30FC\u30C9\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3053\u306E\u5024\u3092-1\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u30DC\u30FC\u30C9\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u9650\u754C\u3092\u7121\u9650\u306B\u3057\u307E\u3059\u3002","Display card checkbox":"\u30AB\u30FC\u30C9\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u3092\u8868\u793A","When toggled, a checkbox will be displayed with each card":"\u6709\u52B9\u5316\u3059\u308B\u3068\u5404\u30AB\u30FC\u30C9\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","Reset to default":"\u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u30EA\u30BB\u30C3\u30C8","Date & Time":"\u65E5\u4ED8\u3068\u6642\u9593","Date trigger":"\u65E5\u4ED8\u30C8\u30EA\u30AC\u30FC","When this is typed, it will trigger the date selector":"\u3053\u306E\u8A2D\u5B9A\u306B\u5165\u529B\u3055\u308C\u305F\u6587\u5B57\u5217\u3067\u65E5\u4ED8\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u30C8\u30EA\u30AC\u30FC\u3057\u307E\u3059\u3002","Time trigger":"\u6642\u9593\u30C8\u30EA\u30AC\u30FC","When this is typed, it will trigger the time selector":"\u3053\u306E\u8A2D\u5B9A\u306B\u5165\u529B\u3055\u308C\u305F\u6587\u5B57\u5217\u3067\u6642\u9593\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u30C8\u30EA\u30AC\u30FC\u3057\u307E\u3059\u3002","Date format":"\u65E5\u4ED8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","This format will be used when saving dates in markdown.":"\u3053\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306F\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3067\u65E5\u4ED8\u304C\u4FDD\u5B58\u3055\u308C\u308B\u969B\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","For more syntax, refer to":"\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u306B\u3064\u3044\u3066\u306F\u3053\u3061\u3089\u3092\u53C2\u7167:","format reference":"\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30EA\u30D5\u30A1\u30EC\u30F3\u30B9","Your current syntax looks like this":"\u73FE\u5728\u306E\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u306F\u6B21\u306E\u3088\u3046\u306B\u898B\u3048\u307E\u3059","Time format":"\u6642\u9593\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","Date display format":"\u65E5\u4ED8\u8868\u793A\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","This format will be used when displaying dates in Kanban cards.":"\u3053\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306F\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u5185\u306B\u3066\u65E5\u4ED8\u306E\u8868\u793A\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","Show relative date":"\u76F8\u5BFE\u65E5\u4ED8\u3092\u8868\u793A","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u306E\u65E5\u4ED8\u3068\u4ECA\u65E5\u306E\u9593\u306E\u65E5\u6570\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4F8B: '3\u65E5\u5F8C', '1\u30F6\u6708\u524D'","Hide card display dates":"\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3055\u308C\u308B\u65E5\u4ED8\u3092\u96A0\u3059","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u4E0A\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3055\u308C\u305F\u65E5\u4ED8\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u6709\u52B9\u5316\u3055\u308C\u305F\u5834\u5408\u306B\u306F\u76F8\u5BFE\u65E5\u4ED8\u306F\u8868\u793A\u3055\u308C\u307E\u307E\u3068\u306A\u308A\u307E\u3059\u3002","Hide dates in card titles":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u65E5\u4ED8\u3092\u96A0\u3059","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u65E5\u4ED8\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u308C\u306F\u65B0\u898F\u30CE\u30FC\u30C8\u3092\u4F5C\u6210\u3057\u305F\u969B\u306B\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306B\u65E5\u4ED8\u304C\u542B\u307E\u308C\u308B\u306E\u3092\u9632\u304E\u307E\u3059\u3002","Link dates to daily notes":"\u30C7\u30A4\u30EA\u30FC\u30CE\u30FC\u30C8\u306B\u65E5\u4ED8\u3092\u30EA\u30F3\u30AF","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"\u6709\u52B9\u5316\u3059\u308B\u3068\u65E5\u4ED8\u304C\u30C7\u30A4\u30EA\u30FC\u30CE\u30FC\u30C8\u306B\u30EA\u30F3\u30AF\u3055\u308C\u307E\u3059\u3002 \u4F8B: [[2021-04-26]]","Add date and time to archived cards":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306B\u65E5\u4ED8\u3068\u6642\u9593\u3092\u8FFD\u52A0","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u304C\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u969B\u306B\u73FE\u5728\u306E\u65E5\u4ED8\u3068\u6642\u9593\u304C\u30AB\u30FC\u30C9\u306E\u6700\u521D\u306B\u8FFD\u8A18\u3055\u308C\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059\u3002\u4F8B: - [ ] 2021-05-14 10:00am \u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB","Archive date/time separator":"\u65E5\u4ED8\u30FB\u6642\u9593\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","This will be used to separate the archived date/time from the title":"\u3053\u308C\u306F\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u65E5\u4ED8\u30FB\u6642\u9593\u3092\u30BF\u30A4\u30C8\u30EB\u304B\u3089\u5206\u96E2\u3059\u308B\u306E\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","Archive date/time format":"\u65E5\u4ED8\u30FB\u6642\u9593\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Kanban Plugin":"\u30AB\u30F3\u30D0\u30F3\u30D7\u30E9\u30B0\u30A4\u30F3","Hide tags in card titles":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u5185\u306E\u30BF\u30B0\u3092\u96A0\u3059","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u5185\u306E\u30BF\u30B0\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u308C\u306F\u65B0\u898F\u30CE\u30FC\u30C8\u3092\u4F5C\u6210\u3057\u305F\u969B\u306B\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306B\u30BF\u30B0\u304C\u542B\u307E\u308C\u308B\u306E\u3092\u9632\u304E\u307E\u3059\u3002","Hide card display tags":"\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3055\u308C\u308B\u30BF\u30B0\u3092\u96A0\u3059","When toggled, tags will not be displayed below the card title.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u4E0B\u306E\u30BF\u30B0\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","Linked Page Metadata":"\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30DA\u30FC\u30B8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"\u30AB\u30FC\u30C9\u5185\u3067\u30EA\u30F3\u30AF\u3055\u308C\u3066\u3044\u308B\u6700\u521D\u306E\u30CE\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u4E0B\u306B\u8868\u793A\u3059\u308B\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u30AD\u30FC\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30AA\u30D7\u30B7\u30E7\u30F3\u3068\u3057\u3066\u30E9\u30D9\u30EB\u306E\u4ED8\u4E0E\u304C\u53EF\u80FD\u3067\u3042\u308A\u3001\u30E9\u30D9\u30EB\u306F\u5B8C\u5168\u306B\u975E\u8868\u793A\u306B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","Board Header Buttons":"\u30DC\u30FC\u30C9\u306E\u30D8\u30C3\u30C0\u30FC\u30DC\u30BF\u30F3","Calendar: first day of week":"\u30AB\u30EC\u30F3\u30C0\u30FC: \u9031\u306E\u59CB\u307E\u308A","Override which day is used as the start of the week":"\u9031\u306E\u59CB\u307E\u308A\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u66DC\u65E5\u3092\u5909\u66F4\u3057\u307E\u3059\u3002",Sunday:"\u65E5\u66DC\u65E5",Monday:"\u6708\u66DC\u65E5",Tuesday:"\u706B\u66DC\u65E5",Wednesday:"\u6C34\u66DC\u65E5",Thursday:"\u6728\u66DC\u65E5",Friday:"\u91D1\u66DC\u65E5",Saturday:"\u571F\u66DC\u65E5","Metadata key":"\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u30AD\u30FC","Display label":"\u30E9\u30D9\u30EB\u3092\u8868\u793A","Hide label":"\u30E9\u30D9\u30EB\u3092\u96A0\u3059","Drag to rearrange":"\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E26\u3079\u66FF\u3048\u308B",Delete:"\u524A\u9664","Add key":"\u30AD\u30FC\u3092\u8FFD\u52A0","Field contains markdown":"\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3092\u542B\u307F\u307E\u3059","More options":"\u4ED6\u306E\u30AA\u30D7\u30B7\u30E7\u30F3",Cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",today:"\u4ECA\u65E5",yesterday:"\u6628\u65E5",tomorrow:"\u660E\u65E5","Change date":"\u65E5\u4ED8\u3092\u5909\u66F4","Change time":"\u6642\u9593\u3092\u5909\u66F4","Card title...":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u2026","Add card":"\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0","Add a card":"\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0","Edit card":"\u30AB\u30FC\u30C9\u3092\u7DE8\u96C6","New note from card":"\u30AB\u30FC\u30C9\u304B\u3089\u30CE\u30FC\u30C8\u3092\u65B0\u898F\u4F5C\u6210","Archive card":"\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Delete card":"\u30AB\u30FC\u30C9\u3092\u524A\u9664","Edit date":"\u65E5\u4ED8\u3092\u7DE8\u96C6","Add date":"\u65E5\u4ED8\u3092\u8FFD\u52A0","Remove date":"\u65E5\u4ED8\u3092\u524A\u9664","Edit time":"\u6642\u9593\u3092\u7DE8\u96C6","Add time":"\u6642\u9593\u3092\u8FFD\u52A0","Remove time":"\u6642\u9593\u3092\u524A\u9664","Duplicate card":"\u30AB\u30FC\u30C9\u3092\u8907\u88FD","Split card":"\u30AB\u30FC\u30C9\u3092\u5206\u5272","Copy link to card":"\u30AB\u30FC\u30C9\u3078\u306E\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","Enter list title...":"\u30EA\u30B9\u30C8\u30BF\u30A4\u30C8\u30EB\u3092\u7DE8\u96C6\u2026","Mark cards in this list as complete":"\u3053\u306E\u30EA\u30B9\u30C8\u306B\u542B\u307E\u308C\u308B\u30AB\u30FC\u30C9\u3092\u5B8C\u4E86\u3068\u3057\u3066\u30DE\u30FC\u30AF\u3059\u308B","Add list":"\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0","Add a list":"\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0","Move list":"\u30EA\u30B9\u30C8\u3092\u79FB\u52D5",Close:"\u9589\u3058\u308B","Are you sure you want to delete this list and all its cards?":"\u3053\u306E\u30EA\u30B9\u30C8\u3068\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u524A\u9664\u3057\u307E\u3059\u304B\b\uFF1F","Yes, delete list":"\u306F\u3044\u3001\u30EA\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059","Are you sure you want to archive this list and all its cards?":"\u3053\u306E\u30EA\u30B9\u30C8\u3068\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F","Yes, archive list":"\u306F\u3044\u3001\u30EA\u30B9\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059","Are you sure you want to archive all cards in this list?":"\u3053\u306E\u30EA\u30B9\u30C8\u306B\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F","Yes, archive cards":"\u306F\u3044\u3001\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059","Edit list":"\u30EA\u30B9\u30C8\u3092\u7DE8\u96C6","Archive cards":"\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Archive list":"\u30EA\u30B9\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Delete list":"\u30EA\u30B9\u30C8\u3092\u524A\u9664","Unable to find":"\u898B\u3064\u304B\u308A\u307E\u305B\u3093","Open in default app":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30A2\u30D7\u30EA\u3067\u958B\u304F"};var Gm={};var Qm={};var Xm={};var Zm={};var eg={};var tg={"Open as Kanban board":"Abrir como quadro Kanban","Create new board":"Criar um novo quadro","Archive completed cards in active board":"Arquivar cart\xF5es conclu\xEDdos no quadro ativo","Error: current file is not a Kanban board":"Erro: o arquivo atual n\xE3o \xE9 um quadro Kanban","Convert empty note to Kanban":"Converter nota vazia em Kanban","Error: cannot create Kanban, the current note is not empty":"Erro: n\xE3o \xE9 poss\xEDvel criar o quadro Kanban, a nota atual n\xE3o est\xE1 vazia","New Kanban board":"Novo quadro Kanban","Untitled Kanban":"Kanban sem t\xEDtulo","Toggle between Kanban and markdown mode":"Alternar entre os modos Kanban e Markdown","Open as markdown":"Abrir como markdown","Open board settings":"Abrir configura\xE7\xF5es do quadro Kanban","Archive completed cards":"Arquivar cart\xF5es conclu\xEDdos",Complete:"Conclu\xEDdo",Archive:"Arquivado","Note: No template plugins are currently enabled.":"Nota: N\xE3o h\xE1 plug-ins de modelo habilitados no momento.",default:"padr\xE3o","Search...":"Pesquisar...","These settings will take precedence over the default Kanban board settings.":"Essas configura\xE7\xF5es sobrescrever\xE3o as configura\xE7\xF5es padr\xE3o do quadro Kanban","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Defina as configura\xE7\xF5es padr\xE3o do quadro Kanban. Cada quadro Kanban pode ter sua pr\xF3pria configura\xE7\xE3o.","Note template":"Modelo de nota","This template will be used when creating new notes from Kanban cards.":"Este modelo ser\xE1 usado quando uma nova nota Kanban for criada.","No template":"Sem modelo","Note folder":"Pasta de notas","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"As notas criadas pelos links dos cart\xF5es Kanban ser\xE3o colocadas nesta pasta. Se estiver em branco, ser\xE3o colocadas no local configurado como padr\xE3o deste cofre.","Default folder":"Pasta padr\xE3o","Lane width":"Largura das listas","Enter a number to set the lane width in pixels.":"Insira um n\xFAmero para definir a largura das listas em pixels.","Maximum number of archived cards":"Quantidade m\xE1xima de cart\xF5es arquivados","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Os cart\xF5es arquivados podem ser vistos no modo Markdown. Esta configura\xE7\xE3o excluir\xE1 os cart\xF5es antigos assim que o limite for atingido. Inserir o valor -1 retira o limite para cart\xF5es arquivados.","Display card checkbox":"Exibe uma caixa de sele\xE7\xE3o do cart\xE3o","When toggled, a checkbox will be displayed with each card":"Quando ativada, uma caixa de sele\xE7\xE3o ser\xE1 exibida em cada cart\xE3o.","Reset to default":"Redefinir configura\xE7\xF5es padr\xE3o","Date & Time":"Data e Hora","Date trigger":"Gatilho de data","When this is typed, it will trigger the date selector":"Quando este caractere \xE9 digitado, o seletor de data \xE9 exibido.","Time trigger":"Gatilho de hora","When this is typed, it will trigger the time selector":"Quando este caractere \xE9 digitado, o seletor de hora \xE9 exibido.","Date format":"Formado da data","This format will be used when saving dates in markdown.":"Este formato ser\xE1 usado quando datas forem armazenadas no Markdown.","For more syntax, refer to":"Para mais informa\xE7\xF5es sobre esta sintaxe, consulte os","format reference":"modelos de formato.","Your current syntax looks like this":"Sua atual sintaxe est\xE1 assim","Time format":"Formato da hora","Date display format":"Formato de exibi\xE7\xE3o da data","This format will be used when displaying dates in Kanban cards.":"Este ser\xE1 o formato das datas exibido nos cart\xF5es do Kanban.","Show relative date":"Exibir datas relativas","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Ao ativar, os cart\xF5es exibir\xE3o o intervalo de tempo entre hoje e a data do cart\xE3o: Ex.: 'Em 3 dias', 'Um m\xEAs atr\xE1s'","Hide card display dates":"Ocultar datas dos cart\xF5es","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Ao ativar, as datas formatadas n\xE3o ser\xE3o exibidas no cart\xE3o. As datas relativas ainda ser\xE3o exibidas se estiverem ativadas.","Hide dates in card titles":"Ocultar datas dos t\xEDtulos dos cart\xF5es","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Ao ativar, as datas ser\xE3o t\xEDtulos de cart\xF5es ocultos. Evita que datas sejam inclu\xEDdas no t\xEDtulo ao criar novas notas.","Link dates to daily notes":"Vincular datas a notas di\xE1rias","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Ao ativar, as datas ser\xE3o vinculadas \xE0s notas di\xE1rias. Ex.: [[2021-04-26]]","Add date and time to archived cards":"Adicionar data e hora aos cart\xF5es arquivados","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Quando ativada, a data e a hora atuais ser\xE3o adicionadas ao in\xEDcio de um cart\xE3o quando ele for arquivado. Ex.: - [] 2021-05-14 10:00 T\xEDtulo do meu cart\xE3o","Archive date/time separator":"Separador de data/hora do arquivo","This will be used to separate the archived date/time from the title":"Isso ser\xE1 usado para separar a data/hora arquivada do t\xEDtulo.","Archive date/time format":"Formato de data/hora do arquivo","Kanban Plugin":"Plugin Kanban","Hide tags in card titles":"Ocultar \u2018tags\u2019 nos t\xEDtulos dos cart\xF5es","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"Quando ativada, as \u2018tags\u2019 n\xE3o ser\xE3o exibidas nos t\xEDtulos de cartas. Isso impedir\xE1 que as \u2018tags\u2019 sejam inclu\xEDdas no t\xEDtulo ao criar novas notas.","Hide card display tags":"Ocultar \u2018tags\u2019 de exibi\xE7\xE3o de cart\xE3o","When toggled, tags will not be displayed below the card title.":"Quando ativada, as \u2018tags\u2019 n\xE3o ser\xE3o exibidas abaixo do t\xEDtulo do cart\xE3o.","Linked Page Metadata":"Metadados de p\xE1ginas 'lincadas'","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Exibe metadados para a primeira nota 'lincada' em um cart\xE3o. Especifique abaixo quais metadados ser\xE3o exibidos. Um r\xF3tulo opcional pode ser fornecido e os r\xF3tulos podem ser ocultados completamente.","Metadata key":"Metadado","Display label":"Descri\xE7\xE3o personalizada","Hide label":"Ocultar","Drag to rearrange":"Arraste para reorganizar",Delete:"Excluir","Add key":"Adicionar metadado","More options":"Mais op\xE7\xF5es",Cancel:"Cancelar",today:"hoje",yesterday:"ontem",tomorrow:"amanh\xE3","Change date":"Alterar data","Change time":"Mudar hora","Card title...":"T\xEDtulo do item...","Add card":"Adicionar Item","Add a card":"Adicione um cart\xE3o","Edit card":"Editar cart\xE3o","New note from card":"Nova nota do cart\xE3o","Archive card":"Arquivar cart\xE3o","Delete card":"Excluir cart\xE3o","Edit date":"Editar data","Add date":"Adicionar data","Remove date":"Remover data","Edit time":"Editar hora","Add time":"Adicionar hora","Remove time":"Remover hora","Duplicate card":"Duplicate card","Enter list title...":"Insira o t\xEDtulo da lista...","Mark cards in this list as complete":"Marcar os itens nesta lista como conclu\xEDdos","Add list":"Adicionar lista","Add a list":"Adicionar uma lista","Move list":"Mover lista",Close:"Fechar","Are you sure you want to delete this list and all its cards?":"Tem certeza de que deseja excluir esta lista e todos os seus cart\xF5es?","Yes, delete list":"Sim, excluir esta lista","Are you sure you want to archive this list and all its cards?":"Tem certeza de que deseja arquivar esta lista e todos os seus cart\xF5es?","Yes, archive list":"Sim, arquivar esta lista","Are you sure you want to archive all cards in this list?":"Tem certeza de que deseja arquivar todos os cart\xF5es desta lista?","Yes, archive cards":"Sim, arquivar cart\xF5es","Edit list":"Editar lista","Archive cards":"Arquivar cart\xF5es","Archive list":"Arquivar lista","Delete list":"Excluir lista"};var ng={};var rg={};var ig={};var ds={};var ag={"Open as kanban board":"\u6253\u5F00\u4E3A\u770B\u677F","Create new board":"\u521B\u5EFA\u65B0\u770B\u677F","Archive completed cards in active board":"\u5728\u5F53\u524D\u770B\u677F\u4E2D\u5F52\u6863\u5DF2\u5B8C\u6210\u5361\u7247","Error: current file is not a Kanban board":"\u9519\u8BEF\uFF1A\u5F53\u524D\u6587\u4EF6\u4E0D\u662F\u770B\u677F\u6587\u4EF6","Convert empty note to Kanban":"\u8F6C\u6362\u7A7A\u767D\u6587\u6863\u4E3A\u770B\u677F","Error: cannot create Kanban, the current note is not empty":"\u9519\u8BEF\uFF1A\u65E0\u6CD5\u8F6C\u6362\u5F53\u524D\u6587\u4EF6\uFF0C\u5F53\u524D\u6587\u4EF6\u4E0D\u662F\u7A7A\u767D\u6587\u6863","New kanban board":"\u65B0\u770B\u677F","Untitled Kanban":"\u672A\u547D\u540D\u770B\u677F","Toggle between Kanban and markdown mode":"\u5728\u770B\u677F\u548C Markdown \u6A21\u5F0F\u4E4B\u95F4\u8FDB\u884C\u5207\u6362","Open as markdown":"\u6253\u5F00\u4E3A Markdown \u6587\u4EF6","Open board settings":"\u6253\u5F00\u770B\u677F\u8BBE\u7F6E","Archive completed cards":"\u5F52\u6863\u5DF2\u5B8C\u6210\u5361\u7247","Something went wrong":"\u51FA\u4E86\u70B9\u95EE\u9898 `(*>\uFE4F<*)\u2032 ","You may wish to open as markdown and inspect or edit the file.":"\u4F60\u53EF\u80FD\u5E0C\u671B\u4EE5 Markdown \u65B9\u5F0F\u6253\u5F00\uFF0C\u5E76\u68C0\u67E5\u6216\u7F16\u8F91\u8BE5\u6587\u4EF6\u3002","Are you sure you want to archive all completed cards on this board?":"\u4F60\u786E\u5B9A\u8981\u5C06\u8FD9\u4E2A\u677F\u5757\u4E0A\u6240\u6709\u5DF2\u5B8C\u6210\u7684\u5361\u7247\u5F52\u6863\u5417\uFF1F",Complete:"\u5B8C\u6210",Archive:"\u5F52\u6863","Invalid Kanban file: problems parsing frontmatter":"\u65E0\u6548\u7684\u770B\u677F\u6587\u4EF6\uFF1A\u89E3\u6790\u524D\u7AEF\u5185\u5BB9\u65F6\u51FA\u73B0\u95EE\u9898","I don't know how to interpret this line:":"\u6211\u4E0D\u77E5\u9053\u5982\u4F55\u89E3\u8BFB\u8FD9\u53E5\u8BDD: ",Untitled:"\u672A\u547D\u540D","Note: No template plugins are currently enabled.":"\u6CE8\u610F\uFF1A\u5F53\u524D\u6A21\u677F\u63D2\u4EF6\u6CA1\u6709\u8FD0\u884C",default:"\u9ED8\u8BA4","Search...":"\u641C\u7D22...","New line trigger":"\u6362\u884C\u89E6\u53D1\u5668","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"\u9009\u62E9 Enter \u6216\u662F Shift+Enter \u6765\u521B\u5EFA\u65B0\u884C, \u4F60\u6CA1\u6709\u9009\u62E9\u7684\u5C06\u7528\u6765\u521B\u5EFA\u548C\u5B8C\u6210\u5361\u7247","Prepend / append new cards":"\u8FFD\u52A0\u65B0\u5361","This setting controls whether new cards are added to the beginning or end of the list.":"\u8BBE\u7F6E\u65B0\u5361\u7247\u6DFB\u52A0\u5230\u5217\u8868\u5934\u90E8\u6216\u5C3E\u90E8\u3002",Prepend:"\u5934\u90E8","Prepend (compact)":"\u5934\u90E8 (\u7D27\u51D1)",Append:"\u5C3E\u90E8","These settings will take precedence over the default Kanban board settings.":"\u5F53\u524D\u770B\u677F\u8BBE\u7F6E\u5C06\u4F1A\u8986\u76D6\u9ED8\u8BA4\u7684\u770B\u677F\u8BBE\u7F6E","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"\u8BBE\u7F6E\u770B\u677F\u7684\u9ED8\u8BA4\u8BBE\u7F6E\u3002\u8BBE\u7F6E\u53EF\u4EE5\u6BCF\u4E2A\u770B\u677F\u5355\u72EC\u8BBE\u7F6E\u3002","Note template":"\u7B14\u8BB0\u6A21\u677F","This template will be used when creating new notes from Kanban cards.":"\u521B\u5EFA\u65B0\u770B\u677F\u5361\u7247\u65F6\u4F1A\u4F7F\u7528\u8BE5\u6A21\u677F","No template":"\u6CA1\u6709\u6A21\u677F","Note folder":"\u7B14\u8BB0\u5B58\u653E\u4F4D\u7F6E","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"\u4ECE\u770B\u677F\u5361\u7247\u521B\u5EFA\u7684\u7B14\u8BB0\u4F1A\u653E\u7F6E\u5230\u8BE5\u6587\u4EF6\u5939\u4E2D\uFF0C\u5982\u679C\u8FD9\u91CC\u4E3A\u7A7A\uFF0C\u5728\u770B\u677F\u521B\u5EFA\u7684\u7B14\u8BB0\u4F1A\u653E\u7F6E\u5230 Obsidian \u7684\u9ED8\u8BA4\u6587\u4EF6\u5B58\u653E\u4F4D\u7F6E\u3002","Default folder":"\u9ED8\u8BA4\u6587\u4EF6\u5939","Lane width":"\u5361\u7247\u5BBD\u5EA6","Enter a number to set the lane width in pixels.":"\u8F93\u5165\u4E00\u4E2A\u6570\u5B57\u6765\u8BBE\u7F6E\u770B\u677F\u7684\u5361\u7247\u5BBD\u5EA6","Maximum number of archived cards":"\u5355\u4E2A\u770B\u677F\u7684\u5F52\u6863\u5361\u7247\u7684\u6700\u5927\u6570\u91CF","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"\u5DF2\u5F52\u6863\u7684\u5361\u7247\u53EF\u4EE5\u5728 Markdown \u6A21\u5F0F\u4E0B\u67E5\u770B\u3002\u8FD9\u4E2A\u8BBE\u7F6E\u4F1A\u5BFC\u81F4\u63D2\u4EF6\u5728\u5DF2\u5F52\u6863\u7684\u5361\u7247\u6570\u91CF\u62B5\u8FBE\u9650\u5236\u503C\u65F6\u5F00\u59CB\u5220\u9664\u5361\u7247\u3002\u5F53\u524D\u503C\u8BBE\u7F6E\u4E3A -1 \u7684\u8BDD\u53EF\u4EE5\u6C38\u4E45\u4FDD\u7559\u6240\u6709\u5F52\u6863\u5361\u7247\u3002","Display card checkbox":"\u5C55\u793A\u5361\u7247\u590D\u9009\u6846","When toggled, a checkbox will be displayed with each card":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u590D\u9009\u6846\u4F1A\u51FA\u73B0\u5728\u6BCF\u4E2A\u5361\u7247\u4E0A","Reset to default":"\u8FD8\u539F\u521D\u59CB\u8BBE\u7F6E","Date & Time":"\u65E5\u671F\u548C\u65F6\u95F4","Date trigger":"\u65E5\u671F\u89E6\u53D1\u6307\u4EE4","When this is typed, it will trigger the date selector":"\u5F53\u5728\u770B\u677F\u5361\u7247\u4E2D\u8F93\u5165\u8FD9\u4E2A\u65F6\uFF0C\u4F1A\u89E6\u53D1\u4E00\u4E2A\u65E5\u671F\u9009\u62E9\u5668","Time trigger":"\u65F6\u95F4\u89E6\u53D1\u6307\u4EE4","When this is typed, it will trigger the time selector":"\u5F53\u5728\u770B\u677F\u5361\u7247\u4E2D\u8F93\u5165\u8FD9\u4E2A\u65F6\uFF0C\u4F1A\u89E6\u53D1\u4E00\u4E2A\u65F6\u95F4\u9009\u62E9\u5668","Date format":"\u65E5\u671F\u683C\u5F0F","This format will be used when saving dates in markdown.":"\u8FD9\u4E2A\u683C\u5F0F\u4F1A\u5728\u65E5\u671F\u4FDD\u5B58\u5230 Markdown \u683C\u5F0F\u65F6\u4F7F\u7528\u3002","For more syntax, refer to":"\u66F4\u591A\u683C\u5F0F\uFF0C\u8BF7\u67E5\u770B","format reference":"\u683C\u5F0F\u53C2\u8003","Your current syntax looks like this":"\u4F60\u5F53\u524D\u8BBE\u7F6E\u7684\u683C\u5F0F\u4F1A\u662F","Time format":"\u65F6\u95F4\u683C\u5F0F","Date display format":"\u65E5\u671F\u5C55\u793A\u683C\u5F0F","This format will be used when displaying dates in Kanban cards.":"\u5728\u770B\u677F\u5361\u7247\u4E2D\uFF0C\u4F1A\u57FA\u4E8E\u8BE5\u683C\u5F0F\u5C55\u793A\u65E5\u671F","Show relative date":"\u5C55\u793A\u76F8\u5BF9\u65E5\u671F","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u4F1A\u5C55\u793A\u5176\u8BBE\u7F6E\u7684\u65E5\u671F\u4E0E\u4ECA\u5929\u7684\u65E5\u671F\u7684\u5DEE\u503C\uFF0C\u4F8B\u5982\u4E09\u5929\u5185\u3001\u4E00\u4E2A\u6708\u5185\u7B49\u3002","Hide card display dates":"\u9690\u85CF\u5361\u7247\u65E5\u671F","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u683C\u5F0F\u5316\u7684\u65E5\u671F\u4E0D\u4F1A\u5C55\u793A\uFF0C\u4F46\u662F\u5982\u679C\u4F60\u5F00\u542F\u4E86\u76F8\u5BF9\u65E5\u671F\u7684\u529F\u80FD\uFF0C\u76F8\u5BF9\u65E5\u671F\u8FD8\u662F\u4F1A\u7EE7\u7EED\u5C55\u793A\u3002","Hide dates in card titles":"\u5728\u5361\u7247\u6807\u9898\u4E2D\u9690\u85CF\u65E5\u671F","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E2D\u7684\u65E5\u671F\u4F1A\u9690\u85CF\uFF0C\u5F53\u57FA\u4E8E\u5361\u7247\u521B\u5EFA\u65B0\u7B14\u8BB0\u7684\u65F6\u5019\u53EF\u4EE5\u907F\u514D\u65E5\u671F\u6DF7\u6742\u5176\u4E2D\u3002","Link dates to daily notes":"\u94FE\u63A5\u65E5\u671F\u5230\u65E5\u8BB0","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u65E5\u671F\u4F1A\u81EA\u52A8\u94FE\u63A5\u5230\u65E5\u8BB0\u9875\u9762\uFF0C\u4F8B\u5982 [[2021-04-26]]","Add date and time to archived cards":"\u6DFB\u52A0\u65E5\u671F\u548C\u65F6\u95F4\u5230\u5F52\u6863\u5361\u7247","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5F53\u524D\u7684\u65E5\u671F\u548C\u65F6\u95F4\u4F1A\u88AB\u6DFB\u52A0\u5230\u5F52\u6863\u7684\u5361\u7247\u7684\u524D\u7AEF\u4E0A\uFF0C\u4F8B\u5982\u201C- [ ] 2021-05-14 10:00am \u6211\u7684\u5361\u7247\u6807\u9898\u201D","Archive date/time separator":"\u65E5\u671F\u6216\u65F6\u95F4\u5206\u9694\u7B26","This will be used to separate the archived date/time from the title":"\u7528\u4E8E\u4ECE\u5206\u9694\u5F52\u6863\u5361\u7247\u7684\u65E5\u671F\u6216\u65F6\u95F4","Archive date/time format":"\u5F52\u6863\u65E5\u671F\u6216\u65F6\u95F4\u683C\u5F0F","Kanban Plugin":"\u770B\u677F\u63D2\u4EF6","Hide tags in card titles":"\u9690\u85CF\u5361\u7247\u6807\u9898\u4E2D\u7684\u6807\u7B7E","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E2D\u7684\u6807\u7B7E\u5C06\u4F1A\u88AB\u9690\u85CF\uFF0C\u6765\u907F\u514D\u751F\u6210\u5361\u7247\u7B14\u8BB0\u7684\u65F6\u5019\u9644\u5E26\u4E0A\u6807\u7B7E","Hide card display tags":"\u9690\u85CF\u5361\u7247\u4E0A\u7684\u6807\u7B7E","When toggled, tags will not be displayed below the card title.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E0B\u65B9\u7684\u6807\u7B7E\u5C06\u4E0D\u4F1A\u5C55\u793A","Linked Page Metadata":"\u8FDE\u63A5\u7684\u9875\u9762\u5143\u6570\u636E","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"\u5C55\u793A\u5361\u7247\u4E2D\u7B2C\u4E00\u4E2A\u8FDE\u63A5\u6240\u5BF9\u5E94\u7684\u7B14\u8BB0\u5143\u6570\u636E\uFF0C\u8BF7\u5728\u4E0B\u65B9\u6307\u5B9A\u54EA\u4E9B\u5143\u6570\u636E\u53EF\u4EE5\u5C55\u793A\u3002\u4F60\u53EF\u4EE5\u9009\u62E9\u5C55\u793A\u6807\u5FD7\uFF0C\u6807\u5FD7\u53EF\u4EE5\u90FD\u88AB\u9690\u85CF\u3002","Board Header Buttons":"\u677F\u5934\u6309\u94AE","Calendar: first day of week":"\u65E5\u5386\uFF1A\u4E00\u5468\u7684\u7B2C\u4E00\u5929","Override which day is used as the start of the week":"\u54EA\u4E00\u5929\u4F5C\u4E3A\u4E00\u5468\u7684\u5F00\u59CB",Sunday:"\u5468\u65E5",Monday:"\u5468\u4E00",Tuesday:"\u5468\u4E8C",Wednesday:"\u5468\u4E09",Thursday:"\u5468\u56DB",Friday:"\u5468\u4E94",Saturday:"\u5468\u516D","Metadata key":"\u5143\u6570\u636E\u53C2\u6570\u540D","Display label":"\u5C55\u793A\u6807\u5FD7","Hide label":"\u9690\u85CF\u6807\u5FD7","Drag to rearrange":"\u62D6\u52A8\u6765\u91CD\u6392\u987A\u5E8F",Delete:"\u5220\u9664","Add key":"\u6DFB\u52A0\u53C2\u6570\u540D","Field contains markdown":"\u5B57\u6BB5\u5305\u542B Markdown","More options":"\u66F4\u591A\u9009\u9879",Cancel:"\u53D6\u6D88",today:"\u4ECA\u5929",yesterday:"\u6628\u5929",tomorrow:"\u660E\u5929","Change date":"\u66F4\u6539\u65E5\u671F","Change time":"\u66F4\u6539\u65F6\u95F4","Card title...":"\u5361\u7247\u6807\u9898","Add card":"\u6DFB\u52A0","Add a card":"\u6DFB\u52A0\u5361\u7247","Edit card":"\u7F16\u8F91\u5361\u7247","New note from card":"\u4ECE\u5361\u7247\u65B0\u5EFA\u7B14\u8BB0","Archive card":"\u5F52\u6863\u5361\u7247","Delete card":"\u5220\u9664\u5361\u7247","Edit date":"\u7F16\u8F91\u65E5\u671F","Add date":"\u6DFB\u52A0\u65E5\u671F","Remove date":"\u79FB\u9664\u65E5\u671F","Edit time":"\u7F16\u8F91\u65F6\u95F4","Add time":"\u6DFB\u52A0\u65F6\u95F4","Remove time":"\u79FB\u9664\u65F6\u95F4","Duplicate card":"\u590D\u5236\u5361\u7247","Split card":"\u5206\u79BB\u5361\u7247","Copy link to card":"\u590D\u5236\u94FE\u63A5\u81F3\u5361\u7247","Enter list title...":"\u8F93\u5165\u65B0\u7684\u5217\u6807\u9898","Mark cards in this list as complete":"\u5C06\u8BE5\u5217\u8BBE\u7F6E\u4E3A\u5B8C\u6210\u5217","Add list":"\u6DFB\u52A0","Add a list":"\u6DFB\u52A0\u5217","Move list":"\u79FB\u52A8\u5217",Close:"\u5173\u95ED","Are you sure you want to delete this list and all its cards?":"\u4F60\u786E\u5B9A\u4F60\u8981\u5220\u9664\u6574\u5217\u4EE5\u53CA\u8BE5\u5217\u4E0B\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, delete list":"\u662F\uFF0C\u5220\u9664\u5217","Are you sure you want to archive this list and all its cards?":"\u4F60\u786E\u5B9A\u4F60\u8981\u5F52\u6863\u6574\u5217\u4EE5\u53CA\u8BE5\u5217\u4E0B\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, archive list":"\u662F, \u5F52\u6863\u5217","Are you sure you want to archive all cards in this list?":"\u4F60\u786E\u8BA4\u4F60\u8981\u5F52\u6863\u5F53\u524D\u5217\u7684\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, archive cards":"\u662F\uFF0C\u5F52\u6863\u6240\u6709\u5361\u7247","Edit list":"\u7F16\u8F91\u5217","Archive cards":"\u5F52\u6863\u5361\u7247","Archive list":"\u5F52\u6863\u5217","Delete list":"\u5220\u9664\u5217","Unable to find":"\u65E0\u6CD5\u627E\u5230","Open in default app":"\u5728\u9ED8\u8BA4\u5E94\u7528\u4E2D\u6253\u5F00"};var og={};var zx={ar:Km,cz:$m,da:Um,de:jm,en:Kc,es:zm,fr:Vm,hi:qm,id:Wm,it:Ym,ja:Jm,ko:Gm,nl:Qm,no:Xm,pl:Zm,"pt-BR":tg,pt:eg,ro:ng,ru:rg,sq:ig,tr:ds,uk:ds,"zh-TW":og,zh:ag},sg=window.localStorage.getItem("language"),$c=zx[sg||"en"];function F(t){return $c||console.error("Error: kanban locale not found",sg),$c&&$c[t]||Kc[t]}var Vx=["bmp","png","jpg","jpeg","gif","svg"],qx=["mp3","wav","m4a","3gp","flac","ogg","oga"],Wx=["mp4","webm","ogv"],Yx=/\u00A0/g,Jx=/[!"#$%&()*+,.:;<=>?@^`{|}~/[\]\\]/g;function lg(t){return t.replace(Jx," ").replace(/\s+/g," ").trim()}function Nr(t){let e=t.replace(Yx," ").normalize("NFC").split(/\|(.*)/),r=e[0].split(/#(.*)/);return{root:r[0],subpath:r[1]?"#"+r[1]:"",alias:e[1]||""}}function Gx(t,n){if(!t||!n)return null;let e=n.split("#").filter(l=>!!l);if(!e||e.length===0)return null;if(e.length===1){let l=e[0];if(l.startsWith("^")){let c=l.substr(1).toLowerCase(),d=t.blocks;if(d&&d[c]){let f=d[c];return{type:"block",block:f,start:f.position.start.offset,end:f.position.end.offset}}else return null}}let r=t.headings;if(!r||r.length===0)return null;let i=0,a=0,o=0,s=null,u=null;for(;ao&&lg(l.heading).toLowerCase()===lg(e[i]).toLowerCase()&&(i++,o=l.level,i===e.length&&(s=l))}return s?{type:"heading",current:s,next:u,start:s.position.start.offset,end:u?u.position.start.offset:null}:null}function Qx(t){t.querySelectorAll(".task-list-item-checkbox").forEach((e,r)=>{e.dataset.checkboxIndex=r.toString()})}function Xx(t,n){t.querySelectorAll(".internal-link").forEach(r=>{let i=Nr(r.getAttr("href"));n.app.metadataCache.getFirstLinkpathDest(i.root,n.file.path)||r.addClass("is-unresolved")})}function Zx(t,n,e){t.empty(),t.createEl("img",{attr:{src:e.app.vault.getResourcePath(n)}},r=>{t.hasAttribute("width")&&r.setAttribute("width",t.getAttribute("width")),t.hasAttribute("height")&&r.setAttribute("height",t.getAttribute("height")),t.hasAttribute("alt")&&r.setAttribute("alt",t.getAttribute("alt"))}),t.addClasses(["image-embed","is-loaded"])}function cg(t,n,e){t.empty(),t.createEl("audio",{attr:{controls:"",src:e.app.vault.getResourcePath(n)}}),t.addClasses(["media-embed","is-loaded"])}function ek(t,n,e){t.empty(),t.createEl("video",{attr:{controls:"",src:e.app.vault.getResourcePath(n)}},r=>{let i=()=>{r.removeEventListener("loadedmetadata",i),r.videoWidth===0&&r.videoHeight===0&&(t.empty(),cg(t,n,e))};r.addEventListener("loadedmetadata",i)}),t.addClasses(["media-embed","is-loaded"])}async function ug(t,n,e){let r=e.app.metadataCache.getFileCache(t);if(!r)return null;let i=await e.app.vault.cachedRead(t);if(!n.subpath)return i;let a=Gx(r,n.subpath);if(a)return i.substring(a.start,a.end===null?void 0:a.end);if(n.subpath)return`${F("Unable to find")} ${n.root}${n.subpath}`}function dg(t,n,e,r){setTimeout(async()=>{if(e.plugin.viewMap.has(e.id)){let i=await ug(t,n,e);if(!i)return;i.startsWith(F("Unable to find"))?r>0&&dg(t,n,e,--r):e.plugin.stateManagers.forEach(a=>{a.onFileMetadataChange()})}},2e3)}async function tk(t,n,e,r,i){let a=await ug(n,e,r);if(!a)return;t.empty();let o=t.createDiv();o.addClasses(["markdown-preview-view",$("markdown-preview-view")]),o.createDiv($("embed-link-wrapper"),s=>{s.createEl("a",{href:n.basename,cls:`internal-link ${$("embed-link")}`},u=>{(0,vr.setIcon)(u,"link"),u.setAttr("aria-label",n.basename)})}),await vr.MarkdownRenderer.renderMarkdown(a,o.createDiv(),n.path,r),t.addClass("is-loaded"),a.startsWith(F("Unable to find"))&&e.subpath&&e.subpath!=="#"&&dg(n,e,r,4),i>0&&await fg(o,r,--i)}function nk(t,n){t.addClass("is-loaded"),t.empty(),t.createEl("a",{cls:"file-link",href:t.getAttribute("src"),text:n.name},e=>{e.setAttribute("aria-label",F("Open in default app")),e.createSpan({},r=>(0,vr.setIcon)(r,"open-elsewhere-glyph"))})}function fg(t,n,e){return Promise.all(t.findAll(".internal-embed").map(async r=>{let i=r.getAttribute("src"),a=Nr(i),o=typeof i=="string"&&n.app.metadataCache.getFirstLinkpathDest(a.root,n.file.path);if(o instanceof vr.TFile)return Vx.contains(o.extension)?Zx(r,o,n):qx.contains(o.extension)?cg(r,o,n):Wx.contains(o.extension)?ek(r,o,n):o.extension==="md"?await tk(r,o,a,n,e):nk(r,o)}))}async function ba(t,n){let e=createDiv();try{await vr.MarkdownRenderer.renderMarkdown(n,e,t.file.path,t),await fg(e,t,5),Qx(e),Xx(e,t)}catch(r){console.error(r)}return e}function jc(t,n){!n||!t||(t&&!t.firstChild?t.appendChild(n):t.firstChild&&t.firstChild!==n&&t.replaceChild(n,t.firstChild))}var wa=v.memo(function({className:n,markdownString:e,searchQuery:r,...i}){let{stateManager:a}=v.useContext(qe),o=v.useRef(),s=v.useRef(),u=v.useRef();return v.useEffect(()=>{ba(a.getAView(),e).then(l=>{s.current=l,u.current=new Uc.default(l),o.current&&jc(o.current,l)}).catch(l=>{a.setError(l),console.error(l)})},[a,e]),v.useEffect(()=>{var l,c;(l=u.current)==null||l.unmark(),r&&r.trim()&&((c=u.current)==null||c.mark(r))},[r]),v.createElement("div",{ref:l=>{o.current=l,jc(l,s.current)},className:bt(["markdown-preview-view",$("markdown-preview-view"),n]),...i})}),hg=v.memo(function({dom:n,className:e,searchQuery:r,...i}){let{stateManager:a}=v.useContext(qe),o=v.useMemo(()=>n.cloneNode(!0),[n,a]),s=v.useMemo(()=>new Uc.default(o),[o]);return v.useEffect(()=>{s.unmark(),r&&r.trim()&&s.mark(r)},[s,r]),v.createElement("div",{ref:u=>{jc(u,o)},className:bt(["markdown-preview-view",$("markdown-preview-view"),e]),...i})});var Ea=ge(require("obsidian"));function rk(t,n){if(n)return n.from((0,Ea.moment)());let e=(0,Ea.moment)().startOf("day");if(e.isSame(t,"day"))return F("today");let r=t.diff(e,"day");return r===-1?F("yesterday"):r===1?F("tomorrow"):t.from(e)}function pg({item:t,stateManager:n}){if(!n.useSetting("show-relative-date")||!t.data.metadata.date)return null;let r=rk(t.data.metadata.date,t.data.metadata.time);return v.createElement("span",{className:$("item-metadata-date-relative")},r)}function mg({item:t,stateManager:n,filePath:e,onEditDate:r,onEditTime:i}){let a=n.useSetting("hide-date-display"),o=n.useSetting("date-format"),s=n.useSetting("time-format"),u=n.useSetting("date-display-format"),l=n.useSetting("link-date-to-daily-note");if(a||!t.data.metadata.date)return null;let c=t.data.metadata.date.format(o);if(!c)return null;let d=!!t.data.metadata.time,f=t.data.metadata.date.format(u),h=d?t.data.metadata.time.format(s):null,p=c?(0,Ea.getLinkpath)(c):null,g=c?n.app.metadataCache.getFirstLinkpathDest(p,e):null,w=p&&l?v.createElement("a",{href:p,"data-href":p,className:`internal-link ${g?"":"is-unresolved"}`,target:"blank",rel:"noopener"},f):f,S={};return l||(S["aria-label"]=F("Change date"),S.onClick=r),v.createElement("span",{className:$("item-metadata-date-wrapper")},v.createElement("span",{...S,className:`${$("item-metadata-date")} ${l?"":"is-button"}`},w)," ",d&&v.createElement("span",{onClick:i,className:`${$("item-metadata-time")} is-button`,"aria-label":F("Change time")},h))}function ik(t){let{stateManager:n,boardModifiers:e}=v.useContext(qe),r=qn();return v.useMemo(()=>({onEditDate:o=>{var s;Fo(n,{x:o.clientX,y:o.clientY},Ro({stateManager:n,boardModifiers:e,item:t,hasDate:!0,path:r}),(s=t.data.metadata.date)==null?void 0:s.toDate())},onEditTime:o=>{Ho(n,{x:o.clientX,y:o.clientY},Bo({stateManager:n,boardModifiers:e,item:t,hasTime:!0,path:r}),t.data.metadata.time)}}),[e,r,t,n])}function ak(t,n){let e=0;return t.replace(/^(\s*[-+*]\s+?\[)([^\]])(\]\s+)/gm,(r,i,a,o)=>{let s=r;return e===n&&(a===" "?s=`${i}x${o}`:s=`${i} ${o}`),e++,s})}var gg=v.memo(function({item:n,isEditing:e,setIsEditing:r,searchQuery:i}){var S;let[a,o]=v.useState(n.data.titleRaw),{stateManager:s,filePath:u,boardModifiers:l}=v.useContext(qe),c=s.useSetting("hide-tags-display"),d=qn(),{onEditDate:f,onEditTime:h}=ik(n);v.useEffect(()=>{e&&o(n.data.titleRaw)},[e]);let p=v.useCallback(_=>{if(!tr(_,s))return _.preventDefault(),s.updateItemContent(n,a).then(k=>{l.updateItem(d,k)}).catch(k=>{s.setError(k),console.error(k)}),r(!1),!0},[s,a,n,d]),g=v.useCallback(()=>(r(!1),o(n.data.titleRaw),!0),[n]),w=v.useCallback(_=>{let k=_.target;if(k.hasClass("task-list-item-checkbox")){let P=parseInt(k.dataset.checkboxIndex,10);s.updateItemContent(n,ak(n.data.titleRaw,P)).then(I=>{l.updateItem(d,I)}).catch(I=>{s.setError(I),console.error(I)})}},[d,l,s,n]);return e?v.createElement(gr,{className:$("item-input"),onChange:_=>o(_.target.value),onEnter:p,onEscape:g,value:a,onPaste:_=>{qo(_,s)}}):v.createElement("div",{className:$("item-title")},v.createElement(hg,{className:$("item-markdown"),dom:n.data.dom,searchQuery:i,onClick:w}),v.createElement("div",{className:$("item-metadata")},v.createElement(pg,{item:n,stateManager:s}),v.createElement(mg,{item:n,stateManager:s,filePath:u,onEditDate:f,onEditTime:h}),!c&&!!((S=n.data.metadata.tags)==null?void 0:S.length)&&v.createElement("div",{className:$("item-tags")},n.data.metadata.tags.map((_,k)=>v.createElement("a",{href:_,key:k,className:`tag ${$("item-tag")} ${_.toLocaleLowerCase().contains(i)?"is-search-match":""}`},v.createElement("span",null,_[0]),_.slice(1))))))});var fs=ge(require("obsidian"));var ok=/[\\/:"*?<>|]+/g;function vg({setIsEditing:t,item:n,path:e,boardModifiers:r,stateManager:i}){return v.useCallback((a,o)=>{if(o)i.app.workspace.onLinkContextMenu(a,(0,fs.getLinkpath)(o),i.file.path);else{let s={x:a.clientX,y:a.clientY},u=!!n.data.metadata.date,l=!!n.data.metadata.time,c=new fs.Menu(i.app).addItem(d=>{d.setIcon("pencil").setTitle(F("Edit card")).onClick(()=>t(!0))});c.addItem(d=>{d.setIcon("create-new").setTitle(F("New note from card")).onClick(async()=>{let f=n.data.title.split(` -`)[0].trim(),h=f.replace(ok," ").trim(),p=/^!\[/.test(f);if(p){let I=h.replace(/!\[+([^\]]+).+$/,"$1").split(".");I.pop(),h=I.join(".").trim()}let g=i.getSetting("new-note-folder"),w=i.getSetting("new-note-template"),S=g?i.app.vault.getAbstractFileByPath(g):i.app.fileManager.getNewFileParent(i.file.path),_=await i.app.fileManager.createNewMarkdownFile(S,h),k=i.app.workspace.splitActiveLeaf();await k.openFile(_),i.app.workspace.setActiveLeaf(k,!1,!0),await Gd(i,w);let P=n.data.titleRaw.replace(f,p?`[${f}](${encodeURIComponent(_.path)})`:i.app.fileManager.generateMarkdownLink(_,i.file.path));i.updateItemContent(n,P).then(I=>{r.updateItem(e,I)}).catch(I=>{i.setError(I),console.error(I)})})}).addItem(d=>{d.setIcon("links-coming-in").setTitle(F("Copy link to card")).onClick(()=>{if(n.data.blockId)navigator.clipboard.writeText(`${this.app.fileManager.generateMarkdownLink(i.file,"","#^"+n.data.blockId)}`);else{let f=Math.random().toString(36).substr(2,6);navigator.clipboard.writeText(`${this.app.fileManager.generateMarkdownLink(i.file,"","#^"+f)}`),i.updateItemContent(n,`${n.data.titleRaw} ^${f}`).then(h=>{r.updateItem(e,h)}).catch(h=>{i.setError(h),console.error(h)})}})}).addSeparator(),/\n/.test(n.data.titleRaw)&&c.addItem(d=>{d.setIcon("split").setTitle(F("Split card")).onClick(async()=>{let f=n.data.titleRaw.split(/[\r\n]+/g).map(p=>p.trim()),h=await Promise.all(f.map(p=>i.getNewItem(p)));r.splitItem(e,h)})}),c.addItem(d=>{d.setIcon("documents").setTitle(F("Duplicate card")).onClick(()=>r.duplicateEntity(e))}).addItem(d=>{d.setIcon("plus-with-circle").setTitle(F("Insert card before")).onClick(async()=>r.insertItems(e,[await i.getNewItem("",!1,!0)]))}).addItem(d=>{d.setIcon("plus-with-circle").setTitle(F("Insert card after")).onClick(async()=>{let f=[...e];f[f.length-1]=f[f.length-1]+1,r.insertItems(f,[await i.getNewItem("",!1,!0)])})}).addItem(d=>{d.setIcon("sheets-in-box").setTitle(F("Archive card")).onClick(()=>r.archiveItem(e))}).addItem(d=>{d.setIcon("trash").setTitle(F("Delete card")).onClick(()=>r.deleteEntity(e))}).addSeparator().addItem(d=>{d.setIcon("calendar-with-checkmark").setTitle(u?F("Edit date"):F("Add date")).onClick(()=>{var f;Fo(i,s,Ro({stateManager:i,boardModifiers:r,item:n,hasDate:u,path:e}),(f=n.data.metadata.date)==null?void 0:f.toDate())})}),u&&(c.addItem(d=>{d.setIcon("cross").setTitle(F("Remove date")).onClick(()=>{let f=i.getSetting("link-date-to-daily-note"),h=i.getSetting("date-trigger"),p=f?"(?:\\[[^\\]]+\\]\\([^\\)]+\\)|\\[\\[[^\\]]+\\]\\])":"{[^}]+}",g=new RegExp(`(^|\\s)${On(h)}${p}`),w=n.data.titleRaw.replace(g,"").trim();i.updateItemContent(n,w).then(S=>{r.updateItem(e,S)}).catch(S=>{i.setError(S),console.error(S)})})}),c.addItem(d=>{d.setIcon("clock").setTitle(l?F("Edit time"):F("Add time")).onClick(()=>{Ho(i,s,Bo({stateManager:i,boardModifiers:r,item:n,hasTime:l,path:e}),n.data.metadata.time)})}),l&&c.addItem(d=>{d.setIcon("cross").setTitle(F("Remove time")).onClick(()=>{let f=i.getSetting("time-trigger"),h=new RegExp(`(^|\\s)${On(f)}{([^}]+)}`),p=n.data.titleRaw.replace(h,"").trim();i.updateItemContent(n,p).then(g=>{r.updateItem(e,g)}).catch(g=>{i.setError(g),console.error(g)})})})),c.showAtPosition(s)}},[t,n,e,r,i])}var yg=v.memo(function({isEditing:n,setIsEditing:e,showMenu:r}){let i=v.useMemo(()=>n?{"data-ignore-drag":!0}:{},[n]);return v.createElement("div",{...i,className:$("item-postfix-button-wrapper")},n?v.createElement("button",{"data-ignore-drag":!0,onPointerDown:a=>{a.preventDefault()},onClick:()=>{e(!1)},className:`${$("item-postfix-button")} is-enabled`,"aria-label":F("Cancel")},v.createElement(Qt,{name:"cross"})):v.createElement("button",{"data-ignore-drag":!0,onPointerDown:a=>a.preventDefault(),onClick:r,className:$("item-postfix-button"),"aria-label":F("More options")},v.createElement(Qt,{name:"vertical-three-dots"})))});function bg({item:t,isSettingsVisible:n,searchQuery:e}){return n||!t.data.metadata.fileMetadata?null:v.createElement("div",{className:$("item-metadata-wrapper")},v.createElement(lk,{metadata:t.data.metadata.fileMetadata,order:t.data.metadata.fileMetadataOrder,searchQuery:e}))}function wg(t){return`${t.embed?"!":""}[[${t.path}${t.display?`|${t.display}`:""}]]`}function sk({data:t,searchQuery:n}){if(Array.isArray(t.value))return v.createElement("span",{className:$("meta-value")},t.value.map((a,o,s)=>{let u=`${a}`,l=typeof a=="object"&&wg(a),c=u.toLocaleLowerCase().contains(n);return v.createElement(v.Fragment,null,l||t.containsMarkdown?v.createElement(wa,{className:"inline",markdownString:l||u,searchQuery:n}):c?v.createElement("span",{className:"is-search-match"},u):u,o{let a=n[i];return v.createElement("tr",{key:i,className:$("meta-row")},!a.shouldHideLabel&&v.createElement("td",{className:`${$("meta-key")} ${(a.label||i).toLocaleLowerCase().contains(r)?"is-search-match":""}`,"data-key":i},v.createElement("span",null,a.label||i)),v.createElement("td",{colSpan:a.shouldHideLabel?2:1,className:$("meta-value-wrapper"),"data-value":Array.isArray(a.value)?a.value.join(", "):`${a.value}`},i==="tags"?a.value.map((o,s)=>v.createElement("a",{href:o,key:s,className:`tag ${$("item-tag")} ${o.toLocaleLowerCase().contains(r)?"is-search-match":""}`},v.createElement("span",null,o[0]),o.slice(1))):v.createElement(sk,{data:a,searchQuery:r})))})))});var Eg=v.memo(function({item:n,shouldMarkItemsComplete:e,isMatch:r,searchQuery:i}){let{stateManager:a,boardModifiers:o}=v.useContext(qe),[s,u]=v.useState(!1),l=v.useContext(wt);v.useEffect(()=>{let g=()=>{s&&u(!1)};return l.dragManager.emitter.on("dragStart",g),()=>{l.dragManager.emitter.off("dragStart",g)}},[l,s]),v.useEffect(()=>{n.data.forceEditMode&&u(!0)},[n.data.forceEditMode]);let c=qn(),d=vg({boardModifiers:o,item:n,setIsEditing:u,stateManager:a,path:c}),f=v.useCallback(g=>{if(g.target instanceof HTMLTextAreaElement)return;g.preventDefault(),g.stopPropagation();let w=g.target instanceof HTMLAnchorElement&&g.target.hasClass("internal-link")?g.target.dataset.href:void 0;d(g.nativeEvent,w)},[d]),h=v.useCallback(()=>{u(!0)},[u]),p=v.useMemo(()=>s?{"data-ignore-drag":!0}:{},[s]);return v.createElement("div",{onContextMenu:f,onDoubleClick:h,className:$("item-content-wrapper"),...p},v.createElement("div",{className:$("item-title-wrapper"),...p},v.createElement(xp,{boardModifiers:o,item:n,path:c,shouldMarkItemsComplete:e,stateManager:a}),v.createElement(gg,{isEditing:s,item:n,searchQuery:r?i:void 0,setIsEditing:u}),v.createElement(yg,{isEditing:s,setIsEditing:u,showMenu:d})),v.createElement(bg,{searchQuery:r?i:void 0,isSettingsVisible:s,item:n}))}),zc=v.memo(function(n){let e=v.useRef(null),r=v.useRef(null),i=v.useContext(Ya),{itemIndex:a,...o}=n;bi(r,r);let s=i?o.item.data.titleSearch.contains(i):!1,u=vp(o.item);return i&&(s?u.push("is-search-hit"):u.push("is-search-miss")),v.createElement("div",{ref:r,className:$("item-wrapper")},v.createElement("div",{ref:e,className:bt([$("item"),...u])},n.isStatic?v.createElement(Eg,{...o,isMatch:s,searchQuery:i}):v.createElement(cr,{elementRef:e,measureRef:r,id:n.item.id,index:a,data:n.item},v.createElement(Eg,{...o,isMatch:s,searchQuery:i}))))}),Sg=v.memo(function({isStatic:n,items:e,shouldMarkItemsComplete:r}){return v.createElement(v.Fragment,null,e.map((i,a)=>v.createElement(zc,{key:i.id,item:i,itemIndex:a,shouldMarkItemsComplete:r,isStatic:n})))});var Vg=ge(Vc());var qg=ge(Ot());var mk="scroll-container",ms=8,gs=["top","right","bottom","left"],qc=class{constructor(n,e,r,i,a){this.scrollFrame=0;this.onScroll=()=>{this.activeScroll.size===0&&(this.scrollState=Ml(this.scrollEl),this.handleEntityRegistration())};this.onDragEnd=()=>{this.activeScroll.clear()};this.handleBeginDragScroll=({scrollEntitySide:n,scrollStrength:e})=>{this.isDoneScrolling(n)||(this.activeScroll.set(n,e),this.handleDragScroll())};this.handleUpdateDragScroll=({scrollEntitySide:n,scrollStrength:e})=>{this.isDoneScrolling(n)||this.activeScroll.set(n,e)};this.handleEndDragScroll=({scrollEntitySide:n})=>{this.activeScroll.delete(n)};this.dndManager=n,this.instanceId=We(),this.scopeId=e,this.triggerTypes=r,this.scrollState=tn,this.parent=i,this.activeScroll=new Map,this.pollForNodes(a)}pollForNodes(n){n()?this.initNodes(n()):requestAnimationFrame(()=>this.pollForNodes(n))}initNodes(n){this.scrollEl=n,this.scrollEl.dataset.hitboxid=this.instanceId,this.scrollEl.dataset.scrollid=this.instanceId,this.top=this.createScrollEntity("top"),this.right=this.createScrollEntity("right"),this.bottom=this.createScrollEntity("bottom"),this.left=this.createScrollEntity("left"),this.bindScrollHandlers(),this.observerHandlers=new Map,this.observer=new IntersectionObserver(e=>{e.forEach(r=>{if(r.target instanceof HTMLElement){let i=r.target.dataset.hitboxid;if(i&&this.observerHandlers.has(i)){let a=this.observerHandlers.get(i);a&&a(r)}}})},{root:n,threshold:.1}),this.scrollEl.addEventListener("scroll",this.onScroll,{passive:!0,capture:!1}),this.dndManager.emitter.on("scrollResize",this.onScroll),setTimeout(()=>{this.onScroll()}),this.dndManager.observeResize(this.scrollEl),this.parent?this.parent.registerObserverHandler(this.instanceId,this.scrollEl,e=>{e.isIntersecting?this.handleEntityRegistration():this.handleEntityUnregistration()}):this.handleEntityRegistration()}destroy(){var n;this.handleEntityUnregistration(),this.observer.disconnect(),this.unbindScrollHandlers(),this.scrollEl.removeEventListener("scroll",this.onScroll),this.dndManager.emitter.off("scrollResize",this.onScroll),(n=this.parent)==null||n.unregisterObserverHandler(this.instanceId,this.scrollEl),this.dndManager.unobserveResize(this.scrollEl)}handleEntityRegistration(){gs.forEach(n=>{let e=this.getId(n),r=this.dndManager.scrollEntities.has(e),i=this.isDoneScrolling(n);!i&&!r?this.dndManager.registerScrollEntity(e,this[n]):i&&r&&this.dndManager.unregisterScrollEntity(e)})}handleEntityUnregistration(){gs.forEach(n=>{let e=this.getId(n);this.dndManager.unregisterScrollEntity(e)})}registerObserverHandler(n,e,r){this.observerHandlers.set(n,r),this.observer.observe(e)}unregisterObserverHandler(n,e){this.observerHandlers.delete(n),this.observer.unobserve(e)}bindScrollHandlers(){gs.forEach(n=>{let e=this.getId(n);this.dndManager.dragManager.emitter.on("beginDragScroll",this.handleBeginDragScroll,e),this.dndManager.dragManager.emitter.on("updateDragScroll",this.handleUpdateDragScroll,e),this.dndManager.dragManager.emitter.on("endDragScroll",this.handleEndDragScroll,e),this.dndManager.dragManager.emitter.on("dragEnd",this.onDragEnd)})}unbindScrollHandlers(){gs.forEach(n=>{let e=this.getId(n);this.dndManager.dragManager.emitter.off("beginDragScroll",this.handleBeginDragScroll,e),this.dndManager.dragManager.emitter.off("updateDragScroll",this.handleUpdateDragScroll,e),this.dndManager.dragManager.emitter.off("endDragScroll",this.handleEndDragScroll,e),this.dndManager.dragManager.emitter.off("dragEnd",this.onDragEnd)})}isDoneScrolling(n){switch(n){case"top":return this.scrollState.y===0;case"right":return this.scrollState.x===this.scrollState.maxX;case"bottom":return this.scrollState.y===this.scrollState.maxY;case"left":return this.scrollState.x===0}}handleDragScroll(){this.activeScroll.size!==0&&requestAnimationFrame(()=>{let n={left:0,top:0};this.activeScroll.forEach((e,r)=>{if(this.isDoneScrolling(r))return this.activeScroll.delete(r);let i=["left","right"].includes(r)?"left":"top",a=["right","bottom"].includes(r);n[i]=a?Math.max(ms-ms*e/35,0):Math.min(-ms+ms*e/35,0)}),this.scrollEl.scrollBy(n),this.scrollState=Ml(this.scrollEl),this.handleEntityRegistration(),this.handleDragScroll()})}getId(n){return`${this.instanceId}-${n}`}getPath(n){var e,r,i,a;switch(n){case"right":return[...((e=this.parent)==null?void 0:e.getPath())||[],1];case"bottom":return[...((r=this.parent)==null?void 0:r.getPath())||[],2];case"left":return[...((i=this.parent)==null?void 0:i.getPath())||[],3]}return[...((a=this.parent)==null?void 0:a.getPath())||[],0]}getScrollShift(){var e,r,i;let n=(e=this.parent)==null?void 0:e.getScrollShift();return{x:Xe((r=this.parent)==null?void 0:r.scrollState.x)+Xe(n==null?void 0:n.x),y:Xe((i=this.parent)==null?void 0:i.scrollState.y)+Xe(n==null?void 0:n.y)}}createScrollEntity(n){var r,i;let e=this;return{scopeId:this.scopeId,entityId:e.getId(n),initial:_l(this.scrollEl.getBoundingClientRect(),((r=this.parent)==null?void 0:r.scrollState)||tn,((i=this.parent)==null?void 0:i.getScrollShift())||Nn,n),getParentScrollState(){var a;return((a=e.parent)==null?void 0:a.scrollState)||tn},getParentScrollShift(){var a;return((a=e.parent)==null?void 0:a.getScrollShift())||Nn},recalcInitial(){var a,o;this.initial=_l(e.scrollEl.getBoundingClientRect(),((a=e.parent)==null?void 0:a.scrollState)||tn,((o=e.parent)==null?void 0:o.getScrollShift())||Nn,n)},getHitbox(){return eo(this.initial[0],this.initial[1],this.initial[2],this.initial[3],this.getParentScrollState(),this.getParentScrollShift())},getPath(){return e.getPath(n)},getData(){return{id:e.getId(n),type:mk,side:n,accepts:e.triggerTypes||[],scrollContainer:e.scrollEl}}}}};function kg({scrollRef:t,triggerTypes:n,children:e}){let r=v.useContext(wt),i=v.useContext(lr),a=v.useContext(Wi),o=v.useRef(),s=v.useMemo(()=>{if(r){o.current&&o.current.destroy();let u=new qc(r,i,n||[],a,()=>t.current);return o.current=u,u}return null},[r,i,t,n,a]);return v.useEffect(()=>()=>{var u;return(u=o.current)==null?void 0:u.destroy()},[]),s?v.createElement(Wi.Provider,{value:s},e):null}function _g({children:t}){let n=v.useMemo(()=>new qi,[]);return v.createElement(Yi.Provider,{value:n},t)}function Tg(t,n){let e=v.useContext(lr),r=v.useRef(null),i=v.useContext(Yi),a=o=>{r.current=o,r.current&&requestAnimationFrame(()=>{let s=i.getScrollState(t);s&&(s.x!==0||s.y!==0)&&(r.current.scrollLeft=s.x,r.current.scrollTop=s.y)})};return v.useEffect(()=>{let o=r.current;if(!o)return;let s=So(u=>{let l=u.target;i.setScrollState(e,t,{x:l.scrollLeft,y:l.scrollTop})});return o.addEventListener("scroll",s),()=>{o.removeEventListener("scroll",s)}},[i,t,n]),{setRef:a,scrollRef:r}}function vs({className:t,children:n,triggerTypes:e,isStatic:r,id:i,index:a}){let{setRef:o,scrollRef:s}=Tg(i,a);return v.createElement("div",{ref:o,className:bt([t,$("scroll-container")])},r?n:v.createElement(kg,{scrollRef:s,triggerTypes:e},n))}var Mg={outOfTheWay:"cubic-bezier(0.2, 0, 0, 1)",drop:"cubic-bezier(.2,1,.1,1)"};var xi={outOfTheWay:200,minDropTime:330,maxDropTime:550},yr=`${xi.outOfTheWay}ms ${Mg.outOfTheWay}`;var sn={none:"none",fluid:`opacity ${yr}`,snap:`transform ${yr}, opacity ${yr}`,drop:t=>{let n=`${t}ms ${Mg.drop}`;return`transform ${n}, opacity ${n}`},outOfTheWay:`transform ${yr}`,placeholder:`height ${yr}, width ${yr}, margin ${yr}, border-color ${yr}`},gk=(t,n)=>t.x===n.x&&t.y===n.y,vk={x:0,y:0},Dg=t=>gk(t,vk)?void 0:`translate(${t.x}px, ${t.y}px)`,Cg={moveTo:Dg,drop:t=>Dg(t)},yk=xi.maxDropTime-xi.minDropTime,Ig=1500,bk=.6;function ki({position:t,destination:n,isCancel:e}){let r=ni(t,n);if(r<=0)return xi.minDropTime;if(r>=Ig)return xi.maxDropTime;let i=r/Ig,a=xi.minDropTime+yk*i,o=e?a*bk:a;return Math.round(o)}function _n(t,n,e){t.style.getPropertyValue(n)!==e&&t.style.setProperty(n,e)}function ys(t,n){t.style.getPropertyValue(n)&&t.style.removeProperty(n)}var Wc={width:0,height:0},wk=100,Yc=class{constructor(n,e,r){this.hitboxDimensions=Wc;this.handleDragStart=({dragEntity:n,dragEntityMargin:e,dragOriginHitbox:r})=>{let i=n==null?void 0:n.entityId,a=i?this.sortables.has(i):null;!n||!a||!r||(this.setSortState(!0),this.hitboxDimensions=Dl(r,e),this.activatePlaceholder(this.hitboxDimensions,sn.none),this.sortables.forEach(([o,s,u])=>{let l=ji(n.getPath(),o.getPath()),c=o.entityId;if(l===en.Self)return this.hidden.add(c),this.hideDraggingEntity(u);l===en.After&&(this.shifted.has(c)||this.shifted.add(c),this.shiftEl(s,sn.none,this.hitboxDimensions))}))};this.dragEndTimeout=0;this.handleDragEnd=({primaryIntersection:n,dragPosition:e,dragOriginHitbox:r,dragEntity:i})=>{if(!this.isSorting||!e||!r||!i){if(!n&&i&&this.sortables.has(i.entityId))return this.resetSelf({maintainHidden:!1});if(n&&i){let s=(n==null?void 0:n.getHitbox())||r,u=ki({position:e,destination:{x:s[0],y:s[1]}});return window.setTimeout(()=>{this.resetSelf({maintainHidden:!1})},u)}return this.resetSelf({maintainHidden:!0})}clearTimeout(this.dragEnterTimeout),clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEndTimeout);let a=(n==null?void 0:n.getHitbox())||r,o=i.scopeId==="htmldnd"?0:ki({position:e,destination:{x:a[0],y:a[1]}});this.dragEndTimeout=window.setTimeout(()=>{let s=i.entityId.split(":::").pop(),u=n==null?void 0:n.entityId.split(":::").pop();n&&this.sortables.has(n.entityId)&&u!==s&&this.dndManager.onDrop(i,n),this.resetSelf({maintainHidden:!1,shiftTransition:sn.none,placeholderTransition:sn.none})},o),this.hitboxDimensions=Wc};this.dragEnterTimeout=0;this.handleDragEnter=({dragEntity:n,dragEntityMargin:e,dragOriginHitbox:r,primaryIntersection:i})=>{let a=i==null?void 0:i.entityId,o=a?this.sortables.has(a):null;if(!n||!i||!o||!r){!o&&this.isSorting&&this.resetSelf({maintainHidden:!0,maintainPlaceholder:!0});return}n.entityId!==i.entityId&&(clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEnterTimeout),this.dragEnterTimeout=window.setTimeout(()=>{this.setSortState(!0),this.hitboxDimensions=Dl(r,e),this.activatePlaceholder(this.hitboxDimensions,sn.placeholder),this.sortables.forEach(([s,u])=>{let l=ji(i.getPath(),s.getPath()),c=s.entityId;!this.hidden.has(c)&&(l===en.Self||l===en.After)?this.shifted.has(c)||(this.shifted.add(c),this.shiftEl(u,sn.outOfTheWay,this.hitboxDimensions)):this.shifted.has(c)&&(this.shifted.delete(c),this.resetEl(u))})},10))};this.dragLeaveTimeout=0;this.handleDragLeave=()=>{!this.isSorting||(clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEnterTimeout),this.dragLeaveTimeout=window.setTimeout(()=>{this.resetSelf({maintainHidden:!0,maintainPlaceholder:!0})},wk),this.hitboxDimensions=Wc)};this.instanceId=We(),this.dndManager=n,this.sortables=new Map,this.shifted=new Set,this.hidden=new Set,this.isSorting=!1,this.axis=e,this.placeholder=null,this.sortListeners=r?[r]:[],n.dragManager.emitter.on("dragStart",this.handleDragStart),n.dragManager.emitter.on("dragEnd",this.handleDragEnd),n.dragManager.emitter.on("dragEnter",this.handleDragEnter),n.dragManager.emitter.on("dragLeave",this.handleDragLeave)}destroy(){clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEndTimeout),this.dndManager.dragManager.emitter.off("dragStart",this.handleDragStart),this.dndManager.dragManager.emitter.off("dragEnd",this.handleDragEnd),this.dndManager.dragManager.emitter.off("dragEnter",this.handleDragEnter),this.dndManager.dragManager.emitter.off("dragLeave",this.handleDragLeave)}registerSortable(n,e,r,i){let a=e.getData().type==="placeholder";this.sortables.set(n,[e,r,i]),a?(this.placeholder=[e,r,i],i.dataset.axis=this.axis,_n(i,"transition",sn.none)):_n(r,"transition",sn.none)}unregisterSortable(n){this.sortables.delete(n)}resetSelf({maintainHidden:n,maintainPlaceholder:e,shiftTransition:r,placeholderTransition:i}){this.isSorting&&this.setSortState(!1),this.isPlaceholderActive&&!e&&this.deactivatePlaceholder(i),this.shifted.size>0&&(this.shifted.forEach(a=>{if(this.sortables.has(a)){let[,o]=this.sortables.get(a);this.resetEl(o,r)}}),this.shifted.clear()),!n&&this.hidden.size>0&&(this.hidden.forEach(a=>{if(this.sortables.has(a)){let[,,o]=this.sortables.get(a);this.resetEl(o,r)}}),this.hidden.clear())}activatePlaceholder(n,e){if(this.placeholder){let r=this.axis==="horizontal",[,,i]=this.placeholder;_n(i,"transition",e),_n(i,r?"width":"height",`${r?n.width:n.height}px`),this.isPlaceholderActive=!0}}deactivatePlaceholder(n=sn.placeholder){if(this.placeholder){let[,,e]=this.placeholder;_n(e,"transition",n),ys(e,"width"),ys(e,"height"),this.isPlaceholderActive=!1}}hideDraggingEntity(n){_n(n,"display","none")}shiftEl(n,e,r){let i=this.axis==="horizontal"?`translate3d(${r.width}px, 0, 0)`:`translate3d(0, ${r.height}px, 0)`;_n(n,"transition",e),_n(n,"transform",i)}resetEl(n,e=sn.outOfTheWay){_n(n,"transition",e),_n(n,"transform","translate3d(0, 0, 0)"),ys(n,"display")}addSortNotifier(n){this.sortListeners.push(n)}removeSortNotifier(n){this.sortListeners=this.sortListeners.filter(e=>e!==n)}setSortState(n){this.isSorting!==n&&(this.isSorting=n,this.sortListeners.forEach(e=>e(n)))}};function _i({axis:t,children:n,onSortChange:e}){let r=v.useContext(wt),i=v.useRef(),a=v.useMemo(()=>{if(r){i.current&&i.current.destroy();let o=new Yc(r,t,e);return i.current=o,o}return null},[r,t,e]);return v.useEffect(()=>()=>{var o;return(o=i.current)==null?void 0:o.destroy()},[]),a?v.createElement(Qa.Provider,{value:a},n):null}function Ti({index:t,accepts:n,className:e,isStatic:r}){let i=v.useRef(null),a=v.useRef(null),o=v.useMemo(()=>({id:We(),type:"placeholder",accepts:n}),n);return v.createElement("div",{ref:a,className:bt([e,$("placeholder")])},v.createElement("div",{ref:i},!r&&v.createElement(cr,{elementRef:i,measureRef:a,id:o.id,index:t,data:o})))}var Ek=function(){if(typeof window=="undefined"||typeof window.addEventListener!="function")return!1;var t=!1,n=Object.defineProperty({},"passive",{get:function(){t=!0}}),e=function(){return null};return window.addEventListener("test",e,n),window.removeEventListener("test",e,n),t},Sk="ignore-onclickoutside",Ag=function(n,e){var r;return(r=n.classList)==null?void 0:r.contains(e)},Lg=function(n,e){for(var r=n.target||n;r;){if(Array.isArray(e)){if(e.some(function(i){return Ag(r,i)}))return!0}else if(Ag(r,e))return!0;r=r.parentElement}return!1},xk=function(n){return document.documentElement.clientWidth<=n.clientX||document.documentElement.clientHeight<=n.clientY},Pg=function(n){return n.includes("touch")&&Ek()?{passive:!0}:!1},kk=function(n,e){var r=e===void 0?{}:e,i=r.refs,a=r.disabled,o=r.eventTypes,s=o===void 0?["mousedown","touchstart"]:o,u=r.excludeScrollbar,l=r.ignoreClass,c=l===void 0?Sk:l,d=r.detectIFrame,f=d===void 0?!0:d,h=Ka([]),p=h[0],g=h[1],w=Ua(n);w.current=n;var S=za(function(_){return g(function(k){return[].concat(k,[{current:_}])})},[]);return $a(function(){if(!(!(i!=null&&i.length)&&!p.length)){var _=function(){var N=[];return(i||p).forEach(function(K){var j=K.current;return j&&N.push(j)}),N},k=function(N){!Lg(N,c)&&!(u&&xk(N))&&_().every(function(K){return!K.contains(N.target)})&&w.current(N)},P=function(N){return setTimeout(function(){var K=document,j=K.activeElement;(j==null?void 0:j.tagName)==="IFRAME"&&!Lg(j,c)&&!_().includes(j)&&w.current(N)},0)},I=function(){s.forEach(function(N){return document.removeEventListener(N,k,Pg(N))}),f&&window.removeEventListener("blur",P)};if(a){I();return}return s.forEach(function(D){return document.addEventListener(D,k,Pg(D))}),f&&window.addEventListener("blur",P),function(){return I()}}},[p,c,u,a,f,JSON.stringify(s)]),S},bs=kk;function Jc({addItems:t,isInputVisible:n,setIsInputVisible:e,hideButton:r}){let[i,a]=v.useState(""),{stateManager:o}=v.useContext(qe),s=v.useRef(),u=bs(()=>{e(!1)},{ignoreClass:$("ignore-click-outside")}),l=v.useCallback(()=>{a(""),e(!1)},[]),c=async f=>{try{t(await Promise.all(f.map(h=>o.getNewItem(h))))}catch(h){o.setError(h)}},d=f=>{if(!tr(f,o)){f.preventDefault();let h=i.trim();h&&(c([h]),a(""))}};return n?v.createElement("div",{className:$("item-form"),ref:u},v.createElement("div",{className:$("item-input-wrapper")},v.createElement(gr,{ref:s,className:$("item-input"),placeholder:F("Card title..."),onEnter:d,onEscape:l,value:i,onChange:f=>{a(f.target.value)},onPaste:f=>{qo(f,o)}}))):r?null:v.createElement("div",{className:$("item-button-wrapper")},v.createElement("button",{className:$("new-item-button"),onClick:()=>e(!0),onDragOver:f=>{Vo(o,f.dataTransfer)&&e(!0)}},v.createElement("span",{className:$("item-button-plus")},"+")," ",F("Add a card")))}var jg=ge(Ot());function Og(t){return v.createElement("svg",{...t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},v.createElement("path",{fill:"currentColor",d:"M5 3h2v2H5zm0 4h2v2H5zm0 4h2v2H5zm4-8h2v2H9zm0 4h2v2H9zm0 4h2v2H9z"}))}var Ng=ge(require("obsidian"));var Fg={delete:{description:F("Are you sure you want to delete this list and all its cards?"),confirm:F("Yes, delete list")},archive:{description:F("Are you sure you want to archive this list and all its cards?"),confirm:F("Yes, archive list")},"archive-items":{description:F("Are you sure you want to archive all cards in this list?"),confirm:F("Yes, archive cards")}};function Rg({action:t,cancel:n,onAction:e,lane:r}){return v.useEffect(()=>{t&&r.children.length===0&&e()},[t,r.children.length]),!t||t&&r.children.length===0?null:v.createElement("div",{className:$("action-confirm-wrapper")},v.createElement("div",{className:$("action-confirm-text")},Fg[t].description),v.createElement("div",null,v.createElement("button",{onClick:e,className:$("confirm-action-button")},Fg[t].confirm),v.createElement("button",{onClick:n,className:$("cancel-action-button")},"Cancel")))}function Hg({setIsEditing:t,path:n}){let{stateManager:e,boardModifiers:r}=v.useContext(qe),[i,a]=v.useState(null);return{settingsMenu:v.useMemo(()=>new Ng.Menu(e.app).addItem(s=>{s.setIcon("pencil").setTitle(F("Edit list")).onClick(()=>t(!0))}).addItem(s=>{s.setIcon("documents").setTitle(F("Archive cards")).onClick(()=>a("archive-items"))}).addSeparator().addItem(s=>{s.setIcon("plus-with-circle").setTitle(F("Insert list before")).onClick(()=>r.insertLane(n,{...pr,id:We(),children:[],data:{title:"",shouldMarkItemsComplete:!1,forceEditMode:!0}}))}).addItem(s=>{s.setIcon("plus-with-circle").setTitle(F("Insert list after")).onClick(()=>{let u=[...n];u[u.length-1]=u[u.length-1]+1,r.insertLane(u,{...pr,id:We(),children:[],data:{title:"",shouldMarkItemsComplete:!1,forceEditMode:!0}})})}).addSeparator().addItem(s=>{s.setIcon("sheets-in-box").setTitle(F("Archive list")).onClick(()=>a("archive"))}).addItem(s=>{s.setIcon("trash").setTitle(F("Delete list")).onClick(()=>a("delete"))}),[e,a,n]),confirmAction:i,setConfirmAction:a}}var Bg=ge(Ot());function Kg({lane:t,lanePath:n}){let{boardModifiers:e}=v.useContext(qe);return v.createElement("div",{className:$("lane-setting-wrapper")},v.createElement("div",{className:$("checkbox-wrapper")},v.createElement("div",{className:$("checkbox-label")},F("Mark cards in this list as complete")),v.createElement("div",{onClick:()=>e.updateLane(n,(0,Bg.default)(t,{data:{$toggle:["shouldMarkItemsComplete"]}})),className:`checkbox-container ${t.data.shouldMarkItemsComplete?"is-enabled":""}`})))}var $g=ge(require("obsidian"));function Ug({itemCount:t,isEditing:n,setIsEditing:e,title:r,onChange:i}){let{stateManager:a}=v.useContext(qe),o=v.useRef(),s=l=>{tr(l,a)||(l.preventDefault(),n&&e(!1))},u=()=>{n&&e(!1)};return v.useEffect(()=>{if(n&&o.current){let l=o.current;o.current.focus(),l.selectionStart=l.selectionEnd=l.value.length}},[n]),v.createElement("div",{className:$("lane-title")},n?v.createElement(gr,{ref:o,className:$("lane-input"),onChange:i,onEnter:s,onEscape:u,value:r}):v.createElement(v.Fragment,null,v.createElement("div",{className:$("lane-title-text"),onContextMenu:l=>{l.preventDefault(),l.stopPropagation();let c=l.target instanceof HTMLAnchorElement&&l.target.hasClass("internal-link")?l.target.dataset.href:void 0;c&&a.app.workspace.onLinkContextMenu(l,(0,$g.getLinkpath)(c),a.file.path)}},v.createElement(wa,{markdownString:r})),v.createElement("div",{className:$("lane-title-count")},t)))}var zg=v.memo(function({lane:n,laneIndex:e,dragHandleRef:r,setIsItemInputVisible:i}){let{boardModifiers:a,stateManager:o}=v.useContext(qe),[s,u]=v.useState(!1),l=qn(e),{settingsMenu:c,confirmAction:d,setConfirmAction:f}=Hg({setIsEditing:u,path:l});return v.useEffect(()=>{n.data.forceEditMode&&u(!0)},[n.data.forceEditMode]),v.createElement(v.Fragment,null,v.createElement("div",{onDoubleClick:()=>u(!0),className:$("lane-header-wrapper")},v.createElement("div",{className:$("lane-grip"),ref:r},v.createElement(Og,null)),v.createElement(Ug,{isEditing:s,setIsEditing:u,itemCount:n.children.length,title:n.data.title,onChange:h=>{a.updateLane(l,(0,jg.default)(n,{data:{title:{$set:h.target.value}}}))}}),v.createElement("div",{className:$("lane-settings-button-wrapper")},s?v.createElement("button",{onClick:()=>{u(!1)},"aria-label":"Close",className:`${$("lane-settings-button")} is-enabled`},v.createElement(Qt,{name:"cross"})):v.createElement(v.Fragment,null,i&&v.createElement("button",{"aria-label":F("Add a card"),className:$("lane-settings-button"),onClick:()=>{i(!0)},onDragOver:h=>{Vo(o,h.dataTransfer)&&i(!0)}},v.createElement(Qt,{name:"plus-with-circle"})),v.createElement("button",{"aria-label":F("More options"),className:$("lane-settings-button"),onClick:h=>{c.showAtPosition({x:h.clientX,y:h.clientY})}},v.createElement(Qt,{name:"vertical-three-dots"}))))),s&&v.createElement(Kg,{lane:n,lanePath:l}),d&&v.createElement(Rg,{lane:n,action:d,onAction:()=>{switch(d){case"archive":a.archiveLane(l);break;case"archive-items":a.archiveLaneItems(l);break;case"delete":a.deleteEntity(l);break}f(null)},cancel:()=>f(null)}))});var Wg=[Ze.Item],Gc=v.memo(function({isStatic:n,lane:e,laneIndex:r}){let{stateManager:i,boardModifiers:a}=v.useContext(qe),[o,s]=v.useState(!1),u=qn(r),l=i.useSetting("lane-width"),c=i.useSetting("new-card-insertion-method"),d=!!e.data.shouldMarkItemsComplete,f=l?{width:`${l}px`}:void 0,h=v.useRef(null),p=v.useRef(null),g=v.useRef(null),[w,S]=v.useState(!1),_=c==="prepend-compact",k=_||c==="prepend";bi(p,g);let P=N=>{a[k?"prependItems":"appendItems"]([...u,e.children.length-1],N.map(K=>(0,qg.default)(K,{data:{isComplete:{$set:d}}}))),setTimeout(()=>{var j;let K=(j=h.current)==null?void 0:j.getElementsByClassName($("lane-items"));K.length&&(0,Vg.default)([0,k?0:K[0].scrollHeight],{elementToScroll:K[0],speed:200,minDuration:150,easing:X=>X===1?1:1-Math.pow(2,-10*X)})})},I=v.createElement(v.Fragment,null,v.createElement(Sg,{items:e.children,isStatic:n,shouldMarkItemsComplete:d}),v.createElement(Ti,{accepts:Wg,index:e.children.length,isStatic:n})),D=v.createElement(vs,{id:e.id,index:r,className:bt([$("lane-items"),$("vertical")]),triggerTypes:Wg,isStatic:n},n?I:v.createElement(_i,{onSortChange:S,axis:"vertical"},I));return v.createElement("div",{ref:p,className:bt([$("lane-wrapper"),{"is-sorting":w}]),style:f},v.createElement("div",{"data-count":e.children.length,ref:h,className:bt([$("lane"),{"will-prepend":k}])},v.createElement(zg,{dragHandleRef:g,laneIndex:r,lane:e,setIsItemInputVisible:_?s:void 0}),k&&v.createElement(Jc,{addItems:P,hideButton:_,isInputVisible:o,setIsInputVisible:s}),n?D:v.createElement(cr,{elementRef:h,measureRef:p,id:e.id,index:r,data:e},D),!k&&v.createElement(Jc,{addItems:P,isInputVisible:o,setIsInputVisible:s})))}),Yg=v.memo(function({lanes:n}){return v.createElement(v.Fragment,null,n.map((e,r)=>v.createElement(Gc,{lane:e,laneIndex:r,key:e.id})))});var Jg=ge(require("obsidian"));function ws(){return{events:{},emit(t,n,e){let r=`${t}${e||""}`,i=this.events[t],a=this.events[r];if(!i&&!a){console.warn("Event emitted with no handler",t,e);return}e&&a&&a.forEach(o=>o(n)),i&&i.forEach(o=>o(n))},on(t,n,e){let r=`${t}${e||""}`,i=this.events[r];return i||(this.events[r]=i=[]),i.push(n),()=>this.off(t,n,e)},off(t,n,e){let r=`${t}${e||""}`,i=this.events[r];i&&(i.splice(i.indexOf(n)>>>0,1),i.length===0&&delete this.events[r])}}}var Qc=class{constructor(n){this.scrollResizeDebounce=0;this.handleResize=n=>{n.forEach(e=>{e.target.dataset.scrollid&&(clearTimeout(this.scrollResizeDebounce),this.scrollResizeDebounce=window.setTimeout(()=>{this.emitter.emit("scrollResize",null)},50))}),this.hitboxEntities.forEach(e=>{e.recalcInitial()}),this.scrollEntities.forEach(e=>{e.recalcInitial()})};this.emitter=ws(),this.hitboxEntities=new Map,this.scrollEntities=new Map,this.onDrop=n,this.resizeObserver=new ResizeObserver((0,Jg.debounce)(this.handleResize,100,!0)),this.dragManager=new lc(this.emitter,this.hitboxEntities,this.scrollEntities)}destroy(){this.resizeObserver.disconnect()}observeResize(n){n instanceof Element&&this.resizeObserver.observe(n,{box:"border-box"})}unobserveResize(n){n instanceof Element&&this.resizeObserver.unobserve(n)}registerHitboxEntity(n,e){this.hitboxEntities.set(n,e)}registerScrollEntity(n,e){this.scrollEntities.set(n,e)}unregisterHitboxEntity(n){this.hitboxEntities.delete(n)}unregisterScrollEntity(n){this.scrollEntities.delete(n)}};function Es({children:t,onDrop:n}){let e=v.useRef(n);e.current=n;let r=v.useMemo(()=>new Qc((i,a)=>e.current(i,a)),[]);return v.useEffect(()=>()=>{r.destroy()},[r]),v.createElement(wt.Provider,{value:r},v.createElement(_g,null,t))}function Xc(t,n,e,r,i,a){let o=[e[0]-r[0],e[1]-r[1],e[2]+r[2],e[3]+r[3]];return{transform:a||`translate3d(${t.x-n.x+o[0]}px, ${t.y-n.y+o[1]}px, 0px)`,width:`${o[2]-o[0]}px`,height:`${o[3]-o[1]}px`,transition:i}}function Ss({children:t}){let n=v.useContext(wt),[e,r]=v.useState(),[i,a]=v.useState();return v.useEffect(()=>{if(!n)return;let o=Zd,s=({dragEntity:c,dragOrigin:d,dragPosition:f,dragEntityMargin:h})=>{!c||!f||!d||(o=c.getHitbox(),r(c),a(Xc(f,d,o,h)))},u=({dragOrigin:c,dragPosition:d,dragEntityMargin:f})=>{!d||!c||a(Xc(d,c,o,f))},l=({dragOrigin:c,primaryIntersection:d,dragPosition:f,dragEntityMargin:h})=>{if(d&&f&&c){let p=d.getHitbox(),g={x:p[0],y:p[1]},w=ki({position:f,destination:g}),S=sn.drop(w),_=Cg.drop(g);a(Xc(f,c,o,h,S,_)),setTimeout(()=>{r(void 0),a(void 0)},w)}else r(void 0),a(void 0)};return n.dragManager.emitter.on("dragStart",s),n.dragManager.emitter.on("dragMove",u),n.dragManager.emitter.on("dragEnd",l),()=>{n.dragManager.emitter.off("dragStart",s),n.dragManager.emitter.off("dragMove",u),n.dragManager.emitter.off("dragEnd",l)}},[n]),!e||!i?null:t(e,i)}function Gg(){let t=v.useContext(wt),[n,e]=v.useState(!1);return v.useEffect(()=>{let r=()=>{e(!0)},i=({primaryIntersection:a,dragPosition:o})=>{let s=(a==null?void 0:a.getHitbox())||[0,0],u={x:s[0],y:s[1]},l=ki({position:o||u,destination:u});setTimeout(()=>{e(!1)},l)};return t.dragManager.emitter.on("dragStart",r),t.dragManager.emitter.on("dragEnd",i),()=>{t.dragManager.emitter.off("dragStart",r),t.dragManager.emitter.off("dragEnd",i)}},[t]),n}var Sa=ge(Ot()),Qg=ge(require("obsidian"));function xs(t){let n=e=>{let r=t.getSetting("prepend-archive-format"),i=t.getSetting("prepend-archive-separator"),a=[(0,Qg.moment)().format(r)];i&&a.push(i),a.push(e.data.titleRaw);let o=a.join(" ");return t.updateItemContent(e,o)};return{appendItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>wl(i,e,r))},prependItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>Wd(i,e,r))},insertItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>sr(i,e,r))},splitItem:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>sr(kr(i,e),e,r))},addLane:e=>{t.app.workspace.trigger("kanban:lane-added",t.file,e),t.setState(r=>wl(r,[],[e]))},insertLane:(e,r)=>{t.app.workspace.trigger("kanban:lane-added",t.file,r),t.setState(i=>sr(i,e,[r]))},updateLane:(e,r)=>{t.app.workspace.trigger("kanban:lane-updated",t.file,r),t.setState(i=>El(i,e,{children:{[e[e.length-1]]:{$set:r}}}))},archiveLane:e=>{t.setState(async r=>{let i=vt(r,e),a=i.children;t.app.workspace.trigger("kanban:lane-archived",t.file,i);try{return(0,Sa.default)(kr(r,e),{data:{archive:{$unshift:t.getSetting("prepend-archive-date")?await Promise.all(a.map(n)):a}}})}catch(o){return t.setError(o),r}})},archiveLaneItems:e=>{t.setState(async r=>{let a=vt(r,e).children;t.app.workspace.trigger("kanban:lane-cards-archived",t.file,a);try{return(0,Sa.default)(Yd(r,e,{children:{$set:[]}}),{data:{archive:{$unshift:t.getSetting("prepend-archive-date")?await Promise.all(a.map(n)):a}}})}catch(o){return t.setError(o),r}})},deleteEntity:e=>{t.setState(r=>{let i=vt(r,e);return t.app.workspace.trigger(`kanban:${i.type}-deleted`,t.file,i),kr(r,e)})},updateItem:(e,r)=>{t.setState(i=>{let a=vt(i,e);return t.app.workspace.trigger("kanban:card-updated",t.file,a,r),El(i,e,{children:{[e[e.length-1]]:{$set:r}}})})},archiveItem:e=>{t.setState(async r=>{let i=vt(r,e);t.app.workspace.trigger("kanban:card-archived",t.file,e,i);try{return(0,Sa.default)(kr(r,e),{data:{archive:{$push:[t.getSetting("prepend-archive-date")?await n(i):i]}}})}catch(a){return t.setError(a),r}})},duplicateEntity:e=>{t.setState(r=>{let i=vt(r,e);t.app.workspace.trigger(`kanban:${i.type}-duplicated`,t.file,e,i);let a=(0,Sa.default)(i,{id:{$set:We()}});return sr(r,e,[a])})}}}function Zg(t){return v.createElement(Tk,{plugin:t})}var _k=v.memo(function({view:n}){return gl(n.getPortal(),n.contentEl)});function Tk({plugin:t}){let n=t.useViewState(),e=n.map(i=>v.createElement(_k,{key:i.id,view:i})),r=v.useCallback((i,a)=>{if(!i||!a)return;if(i.scopeId==="htmldnd"){let f=i.getData(),h=t.getStateManagerFromViewID(f.viewId),p=a.getPath(),g=vt(h.state,p.slice(0,-1));(S=>Promise.all(S.map(_=>h.getNewItem(_))))(f.content).then(S=>{let _=S.map(k=>{var P;return(0,Xg.default)(k,{data:{isComplete:{$set:!!((P=g==null?void 0:g.data)==null?void 0:P.shouldMarkItemsComplete)}}})});return h.setState(k=>sr(k,p,_))}).catch(S=>{h.setError(S),console.error(S)});return}let o=i.getPath(),s=a.getPath(),[,u]=i.scopeId.split(":::"),[,l]=a.scopeId.split(":::");if(u===l){let f=t.getStateManagerFromViewID(i.scopeId);return t.app.workspace.trigger("kanban:card-moved",f.file,o,s,i.getData()),f.setState(h=>qd(h,o,s,p=>p.type===Ze.Item?xl(h,o,h,s,p):p))}let c=t.getStateManagerFromViewID(i.scopeId),d=t.getStateManagerFromViewID(a.scopeId);c.setState(f=>{let h=vt(f,o);return d.setState(p=>{let g=h.type===Ze.Item?xl(f,o,p,s,h):h;return sr(p,s,[g])}),kr(f,o)})},[n]);if(e.length)return v.createElement(Es,{onDrop:r},e,v.createElement(Ss,null,(i,a)=>{let[o,s]=v.useMemo(()=>{if(i.scopeId==="htmldnd")return[null,null];let u=t.getKanbanView(i.scopeId),l=t.stateManagers.get(u.file),c=vt(l.state,i.getPath()),d=xs(l),f=u.file.path;return[c,{view:u,stateManager:l,boardModifiers:d,filePath:f}]},[i]);return(o==null?void 0:o.type)===Ze.Lane?v.createElement(qe.Provider,{value:s},v.createElement("div",{className:$("drag-container"),style:a},v.createElement(Gc,{lane:o,laneIndex:0,isStatic:!0}))):(o==null?void 0:o.type)===Ze.Item?v.createElement(qe.Provider,{value:s},v.createElement("div",{className:$("drag-container"),style:a},v.createElement(zc,{item:o,itemIndex:0,isStatic:!0}))):v.createElement("div",null)}))}var au=ge(Ot()),wv=ge(require("obsidian"));var sv=ge(Vc());var lv=ge(Ot()),cv=ge(require("obsidian")),_s=ge(rc());function ks({id:t,children:n}){let e=v.useContext(Yi),r=v.useMemo(()=>t||We(),[t]);return v.useEffect(()=>()=>{e.unmountScope(t)},[t]),v.createElement(lr.Provider,{value:r},n)}var ln="kanban-plugin",ev;(function(n){n[n.List=0]="List"})(ev||(ev={}));var tv=`**${F("Complete")}**`,nv="***",Zc=["---","",`${ln}: basic`,"","---","",""].join(` -`);function rv(t){return["","","%% kanban:settings","```",JSON.stringify(t),"```","%%"].join(` -`)}function iv(t,n,e){let r=t.innerText.trim();if((n==null?void 0:n.length)&&(r+=" "+n.join(" ")),e){let i=Object.keys(e).join(" "),a=Object.values(e).map(o=>Array.isArray(o.value)?o.value.join(" "):o.value.toString()).join(" ");r+=" "+i+" "+a}return r.toLocaleLowerCase()}function Mk(t,n,e){var r,i,a;if(t.plugins.enabledPlugins.has("dataview")&&((a=(i=(r=t.plugins)==null?void 0:r.plugins)==null?void 0:i.dataview)==null?void 0:a.api))return t.plugins.plugins.dataview.api.page(n.path,e.path)}function eu(t,n){let e=t.getSetting("metadata-keys");if(!e.length)return{};if(!n)return{};let r=t.app.metadataCache.getFileCache(n),i=Mk(t.app,n,t.file);if(!r&&!i)return{};let a={},o={},s={},u=[],l=!1;return e.forEach(c=>{var d;if(!s[c.metadataKey]){if(s[c.metadataKey]=!0,c.metadataKey==="tags"){let f=(r==null?void 0:r.tags)||[];if(Array.isArray((d=r==null?void 0:r.frontmatter)==null?void 0:d.tags)&&(f=[].concat(f,r.frontmatter.tags.map(h=>({tag:`#${h}`})))),(f==null?void 0:f.length)===0)return;u.push(c.metadataKey),a.tags={...c,value:f.map(h=>h.tag).filter(h=>o[h]?!1:(o[h]=!0,!0))},l=!0;return}if((r==null?void 0:r.frontmatter)&&r.frontmatter[c.metadataKey])u.push(c.metadataKey),a[c.metadataKey]={...c,value:r.frontmatter[c.metadataKey]},l=!0;else if(i&&i[c.metadataKey]){let f=i[c.metadataKey],h=f.values||f.val||f;if(h===f&&typeof h=="object")h={...f};else if(!Array.isArray(h)&&typeof h!="string"&&typeof h!="number")return;u.push(c.metadataKey),a[c.metadataKey]={...c,value:h},l=!0}}}),{fileMetadata:l?a:void 0,fileMetadataOrder:u}}function av(t,n){return!t&&n?!0:!["metadata-keys","date-trigger","time-trigger","link-date-to-daily-note","date-format","time-format","hide-date-in-title","hide-tags-in-title"].every(r=>t[r]===n[r])}function ov({onNewLane:t,closeLaneForm:n}){let{boardModifiers:e,stateManager:r}=v.useContext(qe),[i,a]=v.useState(!1),[o,s]=v.useState(""),u=v.useRef(),l=bs(()=>{n()},{ignoreClass:$("ignore-click-outside")});v.useLayoutEffect(()=>{var d;(d=u.current)==null||d.focus()},[]);let c=()=>{e.addLane({...pr,id:We(),children:[],data:{title:o,shouldMarkItemsComplete:i}}),s(""),a(!1),t()};return v.createElement("div",{ref:l,className:$("lane-form-wrapper")},v.createElement("div",{className:$("lane-input-wrapper")},v.createElement(gr,{ref:u,className:$("lane-input"),onChange:d=>s(d.target.value),onEnter:d=>{tr(d,r)||(d.preventDefault(),c())},onEscape:n,value:o})),v.createElement("div",{className:$("checkbox-wrapper")},v.createElement("div",{className:$("checkbox-label")},F("Mark cards in this list as complete")),v.createElement("div",{onClick:()=>a(!i),className:`checkbox-container ${i?"is-enabled":""}`})),v.createElement("div",{className:$("lane-input-actions")},v.createElement("button",{className:$("lane-action-add"),onClick:c},F("Add list")),v.createElement("button",{className:$("lane-action-cancel"),onClick:n},F("Cancel"))))}var Dk=[Ze.Item,Ze.Lane],Ck=[Ze.Lane],uv=({view:t,stateManager:n})=>{let e=n.useState(),r=Gg(),i=v.useRef(null),a=v.useRef(null),[o,s]=v.useState(""),[u,l]=v.useState(!1),[c,d]=v.useState(""),[f,h]=v.useState((e==null?void 0:e.children.length)===0),p=n.file.path,g=n.useSetting("max-archive-size"),w=v.useCallback(()=>{(e==null?void 0:e.children.length)>0&&h(!1)},[e==null?void 0:e.children.length]);v.useEffect(()=>{(e==null?void 0:e.children.length)===0&&h(!0)},[e==null?void 0:e.children.length]);let S=v.useCallback(()=>{setTimeout(()=>{var K;let N=(K=i.current)==null?void 0:K.getElementsByClassName($("board"));N.length&&(0,sv.default)([N[0].scrollWidth,0],{elementToScroll:N[0],speed:300,minDuration:150,easing:j=>j===1?1:1-Math.pow(2,-10*j)})})},[]);v.useEffect(()=>{let N=j=>{j==="editor:open-search"&&l(X=>!X)},K=()=>{h(!0)};return t.emitter.on("hotkey",N),t.emitter.on("showLaneForm",K),()=>{t.emitter.off("hotkey",N),t.emitter.off("showLaneForm",K)}},[t]),v.useEffect(()=>{var N;u&&((N=a.current)==null||N.focus())},[u]),v.useEffect(()=>{let N=o.trim(),K;return N?K=window.setTimeout(()=>{d(N)},250):d(""),()=>{window.clearTimeout(K)}},[o]),v.useEffect(()=>{g===void 0||g===-1||typeof g=="number"&&(e==null?void 0:e.data.archive.length)>g&&n.setState(N=>(0,lv.default)(N,{data:{archive:{$set:N.data.archive.slice(g*-1)}}}))},[e==null?void 0:e.data.archive.length,g]);let _=v.useMemo(()=>xs(n),[n]),k=v.useCallback(N=>{let K=N.target;K.tagName==="A"&&K.hasClass("internal-link")&&t.app.workspace.trigger("hover-link",{event:N.nativeEvent,source:ln,hoverParent:t,targetEl:K,linktext:K.getAttr("href"),sourcePath:t.file.path})},[t]),P=v.useCallback(async N=>{if(N.type==="auxclick"&&N.button==2)return;let K=N.target,j=K.tagName==="A"?K:K.closest("a");if(!!j){if(j.hasClass("file-link")){N.preventDefault();let X=j.getAttribute("href"),Q=Nr(X),ie=typeof X=="string"&&t.app.metadataCache.getFirstLinkpathDest(Q.root,t.file.path);if(!ie)return;n.app.openWithDefaultApp(ie.path);return}if(j.hasClass("internal-link")){N.preventDefault();let X=j.getAttr("href"),Q=N.button===1||N.ctrlKey||N.metaKey;if(j.hasClass("is-unresolved")&&(0,_s.appHasDailyNotesPluginLoaded)()){let Y=n.getSetting("date-format"),J=(0,cv.moment)(X,Y,!0);if(J.isValid()){try{let ne=await(0,_s.createDailyNote)(J);await(Q?t.app.workspace.splitActiveLeaf():t.app.workspace.getUnpinnedLeaf()).openFile(ne,{active:!0})}catch(ne){console.error(ne),n.setError(ne)}return}}n.app.workspace.openLinkText(X,p,Q);return}if(j.hasClass("tag")){N.preventDefault(),n.app.internalPlugins.getPluginById("global-search").instance.openGlobalSearch(`tag:${j.getAttr("href")}`);return}j.hasClass("external-link")&&(N.preventDefault(),window.open(j.getAttr("href"),"_blank"))}},[n,p]),I=v.useMemo(()=>({view:t,stateManager:n,boardModifiers:_,filePath:p}),[t,n,_,p]),D=wp(n);return e==null?v.createElement("div",{className:$("loading")},v.createElement("div",{className:"sk-pulse"})):e.data.errors.length>0?v.createElement("div",null,v.createElement("div",null,"Error:"),e.data.errors.map((N,K)=>v.createElement("div",{key:K},v.createElement("div",null,N.description),v.createElement("pre",null,N.stack)))):v.createElement(ks,{id:t.id},v.createElement(qe.Provider,{value:I},v.createElement(Ya.Provider,{value:c?c.toLocaleLowerCase():null},v.createElement("div",{ref:i,className:bt([Sl,{"something-is-dragging":r}]),onMouseOver:k,onClick:P,onAuxClick:P,...D},(f||e.children.length===0)&&v.createElement(ov,{onNewLane:S,closeLaneForm:w}),u&&v.createElement("div",{className:$("search-wrapper")},v.createElement("input",{ref:a,value:o,onChange:N=>{s(N.target.value)},onKeyDown:N=>{N.key==="Escape"&&(s(""),d(""),N.target.blur(),l(!1))},type:"text",className:$("filter-input"),placeholder:F("Search...")}),v.createElement("button",{className:$("search-cancel-button"),onClick:()=>{s(""),d(""),l(!1)},"aria-label":F("Cancel")},v.createElement(Qt,{name:"cross"}))),v.createElement(vs,{id:t.id,className:bt([$("board"),$("horizontal"),{"is-adding-lane":f}]),triggerTypes:Dk},v.createElement("div",null,v.createElement(_i,{axis:"horizontal"},v.createElement(Yg,{lanes:e.children}),v.createElement(Ti,{className:$("lane-placeholder"),accepts:Ck,index:e.children.length}))))))))};var vv=ge(Ot()),je=ge(require("obsidian"));var Fr=ge(Ot());function dv({isStatic:t,itemIndex:n,item:e,toggleShouldHideLabel:r,toggleContainsMarkdown:i,deleteKey:a,updateKey:o,updateLabel:s}){let u=v.useRef(null),l=v.useRef(null),c=v.useRef(null);bi(l,c);let d=v.createElement("div",{className:$("setting-controls-wrapper")},v.createElement("div",{className:$("setting-input-wrapper")},v.createElement("div",null,v.createElement("div",{className:$("setting-item-label")},F("Metadata key")),v.createElement("input",{type:"text",value:e.data.metadataKey,onChange:f=>o(f.target.value)})),v.createElement("div",null,v.createElement("div",{className:$("setting-item-label")},F("Display label")),v.createElement("input",{type:"text",value:e.data.label,onChange:f=>s(f.target.value)}))),v.createElement("div",{className:$("setting-toggle-wrapper")},v.createElement("div",null,v.createElement("div",{className:`checkbox-container ${e.data.shouldHideLabel?"is-enabled":""}`,onClick:r,"aria-label":F("Hide label")}),v.createElement("div",{className:$("setting-item-label")},F("Hide label"))),v.createElement("div",null,v.createElement("div",{className:`checkbox-container ${e.data.containsMarkdown?"is-enabled":""}`,onClick:i,"aria-label":F("Field contains markdown")}),v.createElement("div",{className:$("setting-item-label")},F("Field contains markdown")))));return v.createElement("div",{ref:l,className:$("setting-item-wrapper")},v.createElement("div",{ref:u,className:$("setting-item")},t?d:v.createElement(cr,{elementRef:u,measureRef:l,id:e.id,index:n,data:e},d),v.createElement("div",{className:$("setting-button-wrapper")},v.createElement("div",{onClick:a,"aria-label":F("Delete")},v.createElement(Qt,{name:"cross"})),v.createElement("div",{className:"mobile-option-setting-drag-icon","aria-label":F("Drag to rearrange"),ref:c},v.createElement(Qt,{name:"three-horizontal-bars"})))))}function Ik({onChange:t,inputValue:n,keys:e,setKeys:r}){let i=a=>{t(a),r(a)};return{updateKey:a=>o=>{i((0,Fr.default)(e,{[a]:{data:{metadataKey:{$set:o}}}}))},updateLabel:a=>o=>{i((0,Fr.default)(e,{[a]:{data:{label:{$set:o}}}}))},toggleShouldHideLabel:a=>()=>{i((0,Fr.default)(e,{[a]:{data:{$toggle:["shouldHideLabel"]}}}))},toggleContainsMarkdown:a=>()=>{i((0,Fr.default)(e,{[a]:{data:{$toggle:["containsMarkdown"]}}}))},deleteKey:a=>()=>{i((0,Fr.default)(e,{$splice:[[a,1]]}))},newKey:()=>{i((0,Fr.default)(e,{$push:[{...jo,id:We(),data:{metadataKey:n,label:"",shouldHideLabel:!1,containsMarkdown:!1}}]}))},moveKey:(a,o)=>{let s=a.getPath(),u=o.getPath(),l=s[s.length-1],c=u[u.length-1];if(l===c)return;let d=e.slice(),[f]=d.splice(l,1);d.splice(c,0,f),i(d)}}}var Ak=[Ze.MetadataSetting];function Lk({keys:t}){return v.createPortal(v.createElement(Ss,null,(n,e)=>{let i=n.getPath()[0],a=t[i];return v.createElement("div",{className:$("drag-container"),style:e},v.createElement(dv,{item:a,itemIndex:i,updateKey:ei,updateLabel:ei,toggleShouldHideLabel:ei,toggleContainsMarkdown:ei,deleteKey:ei,isStatic:!0}))}),document.body)}function Pk({scrollEl:t}){let n=v.useContext(wt);return v.useEffect(()=>{let e=0,r=()=>{clearTimeout(e),e=window.setTimeout(()=>{n.hitboxEntities.forEach(i=>{i.recalcInitial()})},100)};return t.addEventListener("scroll",r,{passive:!0,capture:!1}),()=>{t.removeEventListener("scroll",r)}},[t,n]),null}function Ok(t){let[n,e]=v.useState(t.dataKeys),[r,i]=v.useState(""),{getShouldIMEBlockAction:a,...o}=Ga(),{updateKey:s,updateLabel:u,toggleShouldHideLabel:l,toggleContainsMarkdown:c,deleteKey:d,newKey:f,moveKey:h}=Ik({onChange:t.onChange,inputValue:r,keys:n,setKeys:e});return v.createElement(v.Fragment,null,v.createElement(Es,{onDrop:h},v.createElement(Pk,{scrollEl:t.scrollEl}),v.createElement(ks,null,v.createElement(_i,{axis:"vertical"},n.map((p,g)=>v.createElement(dv,{key:p.id,item:p,itemIndex:g,updateKey:s(g),updateLabel:u(g),toggleShouldHideLabel:l(g),toggleContainsMarkdown:c(g),deleteKey:d(g)})),v.createElement(Ti,{accepts:Ak,index:n.length}))),v.createElement(Lk,{keys:n})),v.createElement("div",{className:$("setting-key-input-wrapper")},v.createElement("input",{placeholder:F("Metadata key"),type:"text",value:r,onChange:p=>i(p.target.value),onKeyDown:p=>{if(!a()){if(p.key==="Enter"){f(),i("");let g=p.target;setTimeout(()=>{g.scrollIntoView()});return}p.key==="Escape"&&(i(""),p.target.blur())}},...o}),v.createElement("button",{onClick:p=>{f(),i("");let g=p.target;setTimeout(()=>{g.scrollIntoView()})}},F("Add key"))))}function fv(t,n,e,r){v.render(v.createElement(Ok,{dataKeys:e,scrollEl:n,onChange:r}),t)}function hv(t){v.unmountComponentAtNode(t)}var mv=ge(pv()),Ms=ge(Ot()),br=ge(require("obsidian"));var Ds="@",Cs="@@";function Nk(t){let n=[];return br.Vault.recurseChildren(t.vault.getRoot(),e=>{e instanceof br.TFolder&&n.push({value:e.path,label:e.path,selected:!1,disabled:!1})}),n}function Fk(t,n){let e=[],r=n?t.vault.getAbstractFileByPath(n):null;return(!r||!(r instanceof br.TFolder))&&(r=t.vault.getRoot()),br.Vault.recurseChildren(r,i=>{i instanceof br.TFile&&e.push({value:i.path,label:i.basename,selected:!1,disabled:!1})}),e}function gv(t){let{templateFolder:n,templatesEnabled:e,templaterPlugin:r}=kl(t),i=Fk(t,n),a=Nk(t),o="";return!e&&!r&&(o=F("Note: No template plugins are currently enabled.")),{templateFiles:i,vaultFolders:a,templateWarning:o}}function nu({choices:t,key:n,warningText:e,local:r,placeHolderStr:i,manager:a}){return o=>{o.controlEl.createEl("select",{},s=>{setTimeout(()=>{let u=t,[l,c]=a.getSetting(n,r);if(c){let h=t.findIndex(g=>g.value===c),p=t[h];u=(0,Ms.default)(u,{$splice:[[h,1]],$unshift:[(0,Ms.default)(p,{placeholder:{$set:!0},value:{$set:""},label:{$apply:g=>`${g} (${F("default")})`}})]})}else u=(0,Ms.default)(u,{$unshift:[{placeholder:!0,value:"",label:i,selected:!1,disabled:!1}]});let d=new mv.default(s,{placeholder:!0,position:"bottom",searchPlaceholderValue:F("Search..."),searchEnabled:u.length>10,choices:u}).setChoiceByValue("");l&&typeof l=="string"&&d.setChoiceByValue(l);let f=h=>{let p=h.detail.value;p?a.applySettingsUpdate({[n]:{$set:p}}):a.applySettingsUpdate({$unset:[n]})};s.addEventListener("change",f),a.cleanupFns.push(()=>{d.destroy(),s.removeEventListener("change",f)})}),e&&o.descEl.createDiv({},u=>{u.createEl("strong",{text:e})})})}}var yv=/^\d+(?:\.\d+)?$/,bv={[ln]:!0,"date-display-format":!0,"date-format":!0,"date-picker-week-start":!0,"date-time-display-format":!0,"date-trigger":!0,"hide-date-display":!0,"hide-date-in-title":!0,"hide-tags-display":!0,"hide-tags-in-title":!0,"lane-width":!0,"link-date-to-daily-note":!0,"max-archive-size":!0,"metadata-keys":!0,"new-card-insertion-method":!0,"new-line-trigger":!0,"new-note-folder":!0,"new-note-template":!0,"prepend-archive-date":!0,"prepend-archive-format":!0,"prepend-archive-separator":!0,"show-checkboxes":!0,"show-relative-date":!0,"time-format":!0,"time-trigger":!0,"show-add-list":!0,"show-archive-all":!0,"show-view-as-markdown":!0,"show-board-settings":!0,"show-search":!0},ru=class{constructor(n,e,r){this.cleanupFns=[];this.applyDebounceTimer=0;this.app=n.app,this.plugin=n,this.config=e,this.settings=r}applySettingsUpdate(n){clearTimeout(this.applyDebounceTimer),this.applyDebounceTimer=window.setTimeout(()=>{this.settings=(0,vv.default)(this.settings,n),this.config.onSettingsChange(this.settings)},200)}getSetting(n,e){return e?[this.settings[n],this.plugin.settings[n]]:[this.settings[n],null]}constructUI(n,e,r){let{templateFiles:i,vaultFolders:a,templateWarning:o}=gv(this.app);n.createEl("h3",{text:e}),r?n.createEl("p",{text:F("These settings will take precedence over the default Kanban board settings.")}):n.createEl("p",{text:F("Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.")}),new je.Setting(n).setName(F("New line trigger")).setDesc(F("Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.")).addDropdown(s=>{s.addOption("shift-enter",F("Shift + Enter")),s.addOption("enter",F("Enter"));let[u,l]=this.getSetting("new-line-trigger",r);s.setValue(u||l||"shift-enter"),s.onChange(c=>{this.applySettingsUpdate({"new-line-trigger":{$set:c}})})}),new je.Setting(n).setName(F("Prepend / append new cards")).setDesc(F("This setting controls whether new cards are added to the beginning or end of the list.")).addDropdown(s=>{s.addOption("prepend",F("Prepend")),s.addOption("prepend-compact",F("Prepend (compact)")),s.addOption("append",F("Append"));let[u,l]=this.getSetting("new-card-insertion-method",r);s.setValue(u||l||"append"),s.onChange(c=>{this.applySettingsUpdate({"new-card-insertion-method":{$set:c}})})}),new je.Setting(n).setName(F("Note template")).setDesc(F("This template will be used when creating new notes from Kanban cards.")).then(nu({choices:i,key:"new-note-template",warningText:o,local:r,placeHolderStr:F("No template"),manager:this})),new je.Setting(n).setName(F("Note folder")).setDesc(F("Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.")).then(nu({choices:a,key:"new-note-folder",local:r,placeHolderStr:F("Default folder"),manager:this})),new je.Setting(n).setName(F("Lane width")).setDesc(F("Enter a number to set the lane width in pixels.")).addText(s=>{let[u,l]=this.getSetting("lane-width",r);s.inputEl.setAttr("type","number"),s.inputEl.placeholder=`${l||"272"} (default)`,s.inputEl.value=u?u.toString():"",s.onChange(c=>{if(c&&yv.test(c)){s.inputEl.removeClass("error"),this.applySettingsUpdate({"lane-width":{$set:parseInt(c)}});return}c&&s.inputEl.addClass("error"),this.applySettingsUpdate({$unset:["lane-width"]})})}),new je.Setting(n).setName(F("Maximum number of archived cards")).setDesc(F("Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.")).addText(s=>{let[u,l]=this.getSetting("max-archive-size",r);s.inputEl.setAttr("type","number"),s.inputEl.placeholder=`${l||"-1"} (default)`,s.inputEl.value=u?u.toString():"",s.onChange(c=>{if(c&&yv.test(c)){s.inputEl.removeClass("error"),this.applySettingsUpdate({"max-archive-size":{$set:parseInt(c)}});return}c&&s.inputEl.addClass("error"),this.applySettingsUpdate({$unset:["max-archive-size"]})})}),new je.Setting(n).setName(F("Display card checkbox")).setDesc(F("When toggled, a checkbox will be displayed with each card")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-checkboxes",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"show-checkboxes":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-checkboxes",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-checkboxes"]})})})}),new je.Setting(n).setName(F("Hide tags in card titles")).setDesc(F("When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-tags-in-title",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-tags-in-title":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-tags-in-title",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-tags-in-title"]})})})}),new je.Setting(n).setName(F("Hide card display tags")).setDesc(F("When toggled, tags will not be displayed below the card title.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-tags-display",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-tags-display":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-tags-display",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-tags-display"]})})})}),n.createEl("h4",{text:F("Board Header Buttons")}),new je.Setting(n).setName(F("Add a list")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-add-list",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-add-list":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-add-list",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-add-list"]})})})}),new je.Setting(n).setName(F("Archive completed cards")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-archive-all",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-archive-all":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-archive-all",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-archive-all"]})})})}),new je.Setting(n).setName(F("Open as markdown")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-view-as-markdown",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-view-as-markdown":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-view-as-markdown",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-view-as-markdown"]})})})}),new je.Setting(n).setName(F("Open board settings")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-board-settings",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-board-settings":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-board-settings",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-board-settings"]})})})}),new je.Setting(n).setName(F("Search...")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-search",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-search":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-search",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-search"]})})})}),n.createEl("h4",{text:F("Date & Time")}),new je.Setting(n).setName(F("Date trigger")).setDesc(F("When this is typed, it will trigger the date selector")).addText(s=>{let[u,l]=this.getSetting("date-trigger",r);(u||l)&&s.setValue(u||l),s.setPlaceholder(l||Ds),s.onChange(c=>{c?this.applySettingsUpdate({"date-trigger":{$set:c}}):this.applySettingsUpdate({$unset:["date-trigger"]})})}),new je.Setting(n).setName(F("Time trigger")).setDesc(F("When this is typed, it will trigger the time selector")).addText(s=>{let[u,l]=this.getSetting("time-trigger",r);(u||l)&&s.setValue(u||l),s.setPlaceholder(l||Cs),s.onChange(c=>{c?this.applySettingsUpdate({"time-trigger":{$set:c}}):this.applySettingsUpdate({$unset:["time-trigger"]})})}),new je.Setting(n).setName(F("Date format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("This format will be used when saving dates in markdown.")),f.createEl("br"),f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("date-format",r),d=ti(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"date-format":{$set:f}}):this.applySettingsUpdate({$unset:["date-format"]})})})}),new je.Setting(n).setName(F("Time format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("time-format",r),d=Vi(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"time-format":{$set:f}}):this.applySettingsUpdate({$unset:["time-format"]})})})}),new je.Setting(n).setName(F("Date display format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("This format will be used when displaying dates in Kanban cards.")),f.createEl("br"),f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("date-display-format",r),d=ti(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"date-display-format":{$set:f}}):this.applySettingsUpdate({$unset:["date-display-format"]})})})}),new je.Setting(n).setName(F("Show relative date")).setDesc(F("When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-relative-date",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"show-relative-date":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-relative-date",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-relative-date"]})})})}),new je.Setting(n).setName(F("Hide card display dates")).setDesc(F("When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-date-display",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-date-display":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-date-display",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-date-display"]})})})}),new je.Setting(n).setName(F("Hide dates in card titles")).setDesc(F("When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-date-in-title",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-date-in-title":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-date-in-title",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-date-in-title"]})})})}),new je.Setting(n).setName(F("Link dates to daily notes")).setDesc(F("When toggled, dates will link to daily notes. Eg. [[2021-04-26]]")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("link-date-to-daily-note",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"link-date-to-daily-note":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("link-date-to-daily-note",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["link-date-to-daily-note"]})})})}),new je.Setting(n).setName(F("Add date and time to archived cards")).setDesc(F("When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("prepend-archive-date",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"prepend-archive-date":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("prepend-archive-date",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["prepend-archive-date"]})})})}),new je.Setting(n).setName(F("Archive date/time separator")).setDesc(F("This will be used to separate the archived date/time from the title")).addText(s=>{let[u,l]=this.getSetting("prepend-archive-separator",r);s.inputEl.placeholder=l?`${l} (default)`:"",s.inputEl.value=u||"",s.onChange(c=>{if(c){this.applySettingsUpdate({"prepend-archive-separator":{$set:c}});return}this.applySettingsUpdate({$unset:["prepend-archive-separator"]})})}),new je.Setting(n).setName(F("Archive date/time format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(_=>{_.appendText(F("For more syntax, refer to")+" "),_.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},k=>{k.setAttr("target","_blank")}),_.createEl("br"),_.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(_.createEl("b",{cls:"u-pop"})),_.createEl("br")}));let[l,c]=this.getSetting("prepend-archive-format",r),[d,f]=this.getSetting("date-format",r),h=d||f||ti(this.app),[p,g]=this.getSetting("time-format",r),w=p||g||Vi(this.app),S=`${h} ${w}`;u.setPlaceholder(S),u.setDefaultFormat(S),(l||c)&&u.setValue(l||c),u.onChange(_=>{_?this.applySettingsUpdate({"prepend-archive-format":{$set:_}}):this.applySettingsUpdate({$unset:["prepend-archive-format"]})})})}),new je.Setting(n).setName(F("Calendar: first day of week")).setDesc(F("Override which day is used as the start of the week")).addDropdown(s=>{s.addOption("",F("default")),s.addOption("0",F("Sunday")),s.addOption("1",F("Monday")),s.addOption("2",F("Tuesday")),s.addOption("3",F("Wednesday")),s.addOption("4",F("Thursday")),s.addOption("5",F("Friday")),s.addOption("6",F("Saturday"));let[u,l]=this.getSetting("date-picker-week-start",r);s.setValue((u==null?void 0:u.toString())||(l==null?void 0:l.toString())||""),s.onChange(c=>{c?this.applySettingsUpdate({"date-picker-week-start":{$set:Number(c)}}):this.applySettingsUpdate({$unset:["date-picker-week-start"]})})}),n.createEl("br"),n.createEl("h4",{text:F("Linked Page Metadata")}),n.createEl("p",{cls:$("metadata-setting-desc"),text:F("Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.")}),new je.Setting(n).then(s=>{s.settingEl.addClass($("draggable-setting-container"));let[u]=this.getSetting("metadata-keys",r),l=(u||[]).map(c=>({...jo,id:We(),data:c}));fv(s.settingEl,n,l,c=>this.applySettingsUpdate({"metadata-keys":{$set:c.map(d=>d.data)}})),this.cleanupFns.push(()=>{s.settingEl&&hv(s.settingEl)})})}cleanUp(){this.cleanupFns.forEach(n=>n()),this.cleanupFns=[]}},Is=class extends je.Modal{constructor(n,e,r){super(n.app);this.view=n,this.settingsManager=new ru(n.plugin,e,r)}onOpen(){let{contentEl:n,modalEl:e}=this;e.addClass($("board-settings-modal")),this.settingsManager.constructUI(n,this.view.file.basename,!0)}onClose(){let{contentEl:n}=this;this.settingsManager.cleanUp(),n.empty()}},iu=class extends je.PluginSettingTab{constructor(n,e){super(n.app,n);this.plugin=n,this.settingsManager=new ru(n,e,n.settings)}display(){let{containerEl:n}=this;n.empty(),n.addClass($("board-settings-modal")),this.settingsManager.constructUI(n,F("Kanban Plugin"),!1)}};var Tn="kanban",As="blocks",Rr=class extends wv.TextFileView{constructor(n,e){super(n);this.actionButtons={};this.plugin=e,this.emitter=ws(),this.emitter.on("hotkey",r=>{switch(r){case"daily-notes:goto-prev":{dp(this.app,this.file);break}case"daily-notes:goto-next":{up(this.app,this.file);break}}})}get isPrimary(){var n;return((n=this.plugin.getStateManager(this.file))==null?void 0:n.getAView())===this}get id(){var n;return`${this.leaf.id}:::${(n=this.file)==null?void 0:n.path}`}setBoard(n,e=!0){this.plugin.stateManagers.get(this.file).setState(n,e)}getBoard(){return this.plugin.stateManagers.get(this.file).state}getViewType(){return Tn}getIcon(){return As}getDisplayText(){var n;return((n=this.file)==null?void 0:n.basename)||"Kanban"}async onLoadFile(n){try{return await super.onLoadFile(n)}catch(e){throw this.plugin.stateManagers.get(this.file).setError(e),e}}destroy(){this.plugin.removeView(this),Object.values(this.actionButtons).forEach(n=>n.remove()),this.actionButtons={}}async onClose(){this.destroy()}async onUnloadFile(n){return this.destroy(),await super.onUnloadFile(n)}handleRename(n,e){this.file.path===n&&this.plugin.handleViewFileRename(this,e)}requestSaveToDisk(n){this.data!==n&&this.isPrimary?(this.data=n,this.requestSave()):this.data=n}getViewData(){return this.data}setViewData(n,e){if(!fp(n)){this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.removeView(this),this.plugin.setMarkdownView(this.leaf,!1);return}this.plugin.addView(this,n,!e&&this.isPrimary)}getPortal(){let n=this.plugin.stateManagers.get(this.file);return v.createElement(uv,{stateManager:n,view:this})}onMoreOptionsMenu(n){n.addItem(e=>{e.setTitle(F("Open as markdown")).setIcon("document").onClick(()=>{this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.setMarkdownView(this.leaf)})}).addItem(e=>{e.setTitle(F("Open board settings")).setIcon("gear").onClick(()=>{let r=this.plugin.stateManagers.get(this.file),i=r.state;new Is(this,{onSettingsChange:a=>{let o=(0,au.default)(i,{data:{settings:{$set:a}}});r.setState(o)}},i.data.settings).open()})}).addItem(e=>{e.setTitle(F("Archive completed cards")).setIcon("sheets-in-box").onClick(()=>{this.plugin.stateManagers.get(this.file).archiveCompletedCards()})}).addSeparator(),super.onMoreOptionsMenu(n)}initHeaderButtons(){let n=this.plugin.getStateManager(this.file);if(!!n)if(n.getSetting("show-board-settings")&&!this.actionButtons["show-board-settings"]?this.actionButtons["show-board-settings"]=this.addAction("gear",F("Open board settings"),()=>{let e=this.plugin.stateManagers.get(this.file),r=e.state;new Is(this,{onSettingsChange:i=>{let a=(0,au.default)(r,{data:{settings:{$set:i}}});e.setState(a)}},r.data.settings).open()}):!n.getSetting("show-board-settings")&&this.actionButtons["show-board-settings"]&&(this.actionButtons["show-board-settings"].remove(),delete this.actionButtons["show-board-settings"]),n.getSetting("show-search")&&!this.actionButtons["show-search"]?this.actionButtons["show-search"]=this.addAction("search",F("Search..."),()=>{this.emitter.emit("hotkey","editor:open-search")}):!n.getSetting("show-search")&&this.actionButtons["show-search"]&&(this.actionButtons["show-search"].remove(),delete this.actionButtons["show-search"]),n.getSetting("show-view-as-markdown")&&!this.actionButtons["show-view-as-markdown"]?this.actionButtons["show-view-as-markdown"]=this.addAction("document",F("Open as markdown"),()=>{this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.setMarkdownView(this.leaf)}):!n.getSetting("show-view-as-markdown")&&this.actionButtons["show-view-as-markdown"]&&(this.actionButtons["show-view-as-markdown"].remove(),delete this.actionButtons["show-view-as-markdown"]),n.getSetting("show-archive-all")&&!this.actionButtons["show-archive-all"]?this.actionButtons["show-archive-all"]=this.addAction("sheets-in-box",F("Archive completed cards"),()=>{this.plugin.stateManagers.get(this.file).archiveCompletedCards()}):!n.getSetting("show-archive-all")&&this.actionButtons["show-archive-all"]&&(this.actionButtons["show-archive-all"].remove(),delete this.actionButtons["show-archive-all"]),n.getSetting("show-add-list")&&!this.actionButtons["show-add-list"]){let e=this.addAction("plus-with-circle",F("Add a list"),()=>{this.emitter.emit("showLaneForm",void 0)});e.addClass($("ignore-click-outside")),this.actionButtons["show-add-list"]=e}else!n.getSetting("show-add-list")&&this.actionButtons["show-add-list"]&&(this.actionButtons["show-add-list"].remove(),delete this.actionButtons["show-add-list"])}clear(){}};var Ni=ge(Ot()),Ry=ge(require("obsidian"));var ou={};Yr(ou,{JsonPatchError:()=>st,_areEquals:()=>_a,applyOperation:()=>Hr,applyPatch:()=>Rs,applyReducer:()=>$k,deepClone:()=>Bk,getValueByPointer:()=>Fs,validate:()=>Sv,validator:()=>Hs});var Rk=function(){var t=function(n,e){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var a in i)i.hasOwnProperty(a)&&(r[a]=i[a])},t(n,e)};return function(n,e){t(n,e);function r(){this.constructor=n}n.prototype=e===null?Object.create(e):(r.prototype=e.prototype,new r)}}(),Hk=Object.prototype.hasOwnProperty;function Ls(t,n){return Hk.call(t,n)}function Ps(t){if(Array.isArray(t)){for(var e=new Array(t.length),n=0;n=48&&r<=57){n++;continue}return!1}return!0}function Bn(t){return t.indexOf("/")===-1&&t.indexOf("~")===-1?t:t.replace(/~/g,"~0").replace(/\//g,"~1")}function xa(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}function Ns(t){if(t===void 0)return!0;if(t){if(Array.isArray(t)){for(var n=0,e=t.length;n=d){if(e&&n.op==="add"&&h>l.length)throw new st("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",a,n,t);var o=Kk[n.op].call(n,l,h,t);if(o.test===!1)throw new st("Test operation failed","TEST_OPERATION_FAILED",a,n,t);return o}}else if(c>=d){var o=Mi[n.op].call(n,l,h,t);if(o.test===!1)throw new st("Test operation failed","TEST_OPERATION_FAILED",a,n,t);return o}if(l=l[h],e&&c0)throw new st('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",n,t,e);if((t.op==="move"||t.op==="copy")&&typeof t.from!="string")throw new st("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",n,t,e);if((t.op==="add"||t.op==="replace"||t.op==="test")&&t.value===void 0)throw new st("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",n,t,e);if((t.op==="add"||t.op==="replace"||t.op==="test")&&Ns(t.value))throw new st("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",n,t,e);if(e){if(t.op=="add"){var i=t.path.split("/").length,a=r.split("/").length;if(i!==a+1&&i!==a)throw new st("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",n,t,e)}else if(t.op==="replace"||t.op==="remove"||t.op==="_get"){if(t.path!==r)throw new st("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",n,t,e)}else if(t.op==="move"||t.op==="copy"){var o={op:"_get",path:t.from,value:void 0},s=Sv([o],e);if(s&&s.name==="OPERATION_PATH_UNRESOLVABLE")throw new st("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",n,t,e)}}}else throw new st("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",n,t,e)}function Sv(t,n,e){try{if(!Array.isArray(t))throw new st("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(n)Rs(Mt(n),Mt(t),e||!0);else{e=e||Hs;for(var r=0;ruu,generate:()=>lu,observe:()=>Yk,unobserve:()=>Wk});var su=new WeakMap,Uk=function(){function t(n){this.observers=new Map,this.obj=n}return t}(),jk=function(){function t(n,e){this.callback=n,this.observer=e}return t}();function zk(t){return su.get(t)}function Vk(t,n){return t.observers.get(n)}function qk(t,n){t.observers.delete(n.callback)}function Wk(t,n){n.unobserve()}function Yk(t,n){var e=[],r,i=zk(t);if(!i)i=new Uk(t),su.set(t,i);else{var a=Vk(i,n);r=a&&a.observer}if(r)return r;if(r={},i.value=Mt(t),n){r.callback=n,r.next=null;var o=function(){lu(r)},s=function(){clearTimeout(r.next),r.next=setTimeout(o)};typeof window!="undefined"&&(window.addEventListener("mouseup",s),window.addEventListener("keyup",s),window.addEventListener("mousedown",s),window.addEventListener("keydown",s),window.addEventListener("change",s))}return r.patches=e,r.object=t,r.unobserve=function(){lu(r),clearTimeout(r.next),qk(i,r),typeof window!="undefined"&&(window.removeEventListener("mouseup",s),window.removeEventListener("keyup",s),window.removeEventListener("mousedown",s),window.removeEventListener("keydown",s),window.removeEventListener("change",s))},i.observers.set(n,new jk(n,r)),r}function lu(t,n){n===void 0&&(n=!1);var e=su.get(t.object);cu(e.value,t.object,t.patches,"",n),t.patches.length&&Rs(e.value,t.patches);var r=t.patches;return r.length>0&&(t.patches=[],t.callback&&t.callback(r)),r}function cu(t,n,e,r,i){if(n!==t){typeof n.toJSON=="function"&&(n=n.toJSON());for(var a=Ps(n),o=Ps(t),s=!1,u=!1,l=o.length-1;l>=0;l--){var c=o[l],d=t[c];if(Ls(n,c)&&!(n[c]===void 0&&d!==void 0&&Array.isArray(n)===!1)){var f=n[c];typeof d=="object"&&d!=null&&typeof f=="object"&&f!=null&&Array.isArray(d)===Array.isArray(f)?cu(d,f,e,r+"/"+Bn(c),i):d!==f&&(s=!0,i&&e.push({op:"test",path:r+"/"+Bn(c),value:Mt(d)}),e.push({op:"replace",path:r+"/"+Bn(c),value:Mt(f)}))}else Array.isArray(t)===Array.isArray(n)?(i&&e.push({op:"test",path:r+"/"+Bn(c),value:Mt(d)}),e.push({op:"remove",path:r+"/"+Bn(c)}),u=!0):(i&&e.push({op:"test",path:r,value:t}),e.push({op:"replace",path:r,value:n}),s=!0)}if(!(!u&&a.length==o.length))for(var l=0;l":""))+")"})),f;function f(){let h=[],p,g,w;if((!n||i(s,u,l[l.length-1]||null))&&(h=Zk(e(s,l)),h[0]===hu))return h;if(s.children&&h[0]!==Cv)for(g=(r?s.children.length:-1)+a,w=l.concat(s);g>-1&&g!0){for(let i=n+1,a=t.length;i{try{await Ov(t,e),await Promise.all(e.children.map(r=>Ma(t,r)))}catch(r){throw t.setError(r),r}}))}catch(e){throw t.setError(e),e}return n}function e0(t){return(t.op==="add"||t.op==="replace")&&["/title","/titleRaw","/dateStr","/timeStr",/\d$/,/\/fileAccessor\/.+$/].some(n=>typeof n=="string"?t.path.endsWith(n):n.test(t.path))}async function Fv(t,n,e){let r={},i=e.reduce((a,o)=>{if(!e0(o))return a;let s=o.path.split("/").reduce((l,c)=>(/\d+/.test(c)&&l.push(Number(c)),l),[]),u=s.join(",");return r[u]||(r[u]=!0,a.push(s)),a},[]);try{await Promise.all(i.map(a=>{let o=vt(n,a);if(o.type===Ze.Lane)return Ov(t,o);if(o.type===Ze.Item)return Ma(t,o)}))}catch(a){throw t.setError(a),a}return n}function $s(t,n){let e=n.end-n.start;return t.slice(0,n.start)+"\0".repeat(e)+t.slice(n.end)}function Rv(t){return t.replace(/\s*\0+\s*/g," ").trim()}function Dt(t,n,e,r){let i=t.length,a=0,o;if(n<0?n=-n>i?0:i+n:n=n>i?i:n,e=e>0?e:0,r.length<1e4)o=Array.from(r),o.unshift(n,e),[].splice.apply(t,o);else for(e&&[].splice.apply(t,[n,e]);a0?(Dt(t,t.length,0,n),t):n}var Hv={}.hasOwnProperty;function Bv(t){let n={},e=-1;for(;++eo))return;let N=n.events.length,K=N,j,X;for(;K--;)if(n.events[K][0]==="exit"&&n.events[K][1].type==="chunkFlow"){if(j){X=n.events[K][1].end;break}j=!0}for(S(r),D=N;Dk;){let I=e[P];n.containerState=I[1],I[0].exit.call(n,t)}e.length=k}function _(){i.write([null]),a=void 0,i=void 0,n.containerState._closeFlow=void 0}}function a0(t,n,e){return Se(t,t.attempt(this.parser.constructs.document,n,e),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function yu(t){if(t===null||Qe(t)||jv(t))return 1;if(zv(t))return 2}function Di(t,n,e){let r=[],i=-1;for(;++i1&&t[e][1].end.offset-t[e][1].start.offset>1?2:1;let d=Object.assign({},t[r][1].end),f=Object.assign({},t[e][1].start);Yv(d,-u),Yv(f,u),o={type:u>1?"strongSequence":"emphasisSequence",start:d,end:Object.assign({},t[r][1].end)},s={type:u>1?"strongSequence":"emphasisSequence",start:Object.assign({},t[e][1].start),end:f},a={type:u>1?"strongText":"emphasisText",start:Object.assign({},t[r][1].end),end:Object.assign({},t[e][1].start)},i={type:u>1?"strong":"emphasis",start:Object.assign({},o.start),end:Object.assign({},s.end)},t[r][1].end=Object.assign({},o.start),t[e][1].start=Object.assign({},s.end),l=[],t[r][1].end.offset-t[r][1].start.offset&&(l=jt(l,[["enter",t[r][1],n],["exit",t[r][1],n]])),l=jt(l,[["enter",i,n],["enter",o,n],["exit",o,n],["enter",a,n]]),l=jt(l,Di(n.parser.constructs.insideSpan.null,t.slice(r+1,e),n)),l=jt(l,[["exit",a,n],["enter",s,n],["exit",s,n],["exit",i,n]]),t[e][1].end.offset-t[e][1].start.offset?(c=2,l=jt(l,[["enter",t[e][1],n],["exit",t[e][1],n]])):c=0,Dt(t,r-1,e-r+3,l),e=r+l.length-c-2;break}}for(e=-1;++e",GT:">",Gamma:"\u0393",Gammad:"\u03DC",Gbreve:"\u011E",Gcedil:"\u0122",Gcirc:"\u011C",Gcy:"\u0413",Gdot:"\u0120",Gfr:"\u{1D50A}",Gg:"\u22D9",Gopf:"\u{1D53E}",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",Gt:"\u226B",HARDcy:"\u042A",Hacek:"\u02C7",Hat:"^",Hcirc:"\u0124",Hfr:"\u210C",HilbertSpace:"\u210B",Hopf:"\u210D",HorizontalLine:"\u2500",Hscr:"\u210B",Hstrok:"\u0126",HumpDownHump:"\u224E",HumpEqual:"\u224F",IEcy:"\u0415",IJlig:"\u0132",IOcy:"\u0401",Iacut:"\xCD",Iacute:"\xCD",Icir:"\xCE",Icirc:"\xCE",Icy:"\u0418",Idot:"\u0130",Ifr:"\u2111",Igrav:"\xCC",Igrave:"\xCC",Im:"\u2111",Imacr:"\u012A",ImaginaryI:"\u2148",Implies:"\u21D2",Int:"\u222C",Integral:"\u222B",Intersection:"\u22C2",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",Iogon:"\u012E",Iopf:"\u{1D540}",Iota:"\u0399",Iscr:"\u2110",Itilde:"\u0128",Iukcy:"\u0406",Ium:"\xCF",Iuml:"\xCF",Jcirc:"\u0134",Jcy:"\u0419",Jfr:"\u{1D50D}",Jopf:"\u{1D541}",Jscr:"\u{1D4A5}",Jsercy:"\u0408",Jukcy:"\u0404",KHcy:"\u0425",KJcy:"\u040C",Kappa:"\u039A",Kcedil:"\u0136",Kcy:"\u041A",Kfr:"\u{1D50E}",Kopf:"\u{1D542}",Kscr:"\u{1D4A6}",LJcy:"\u0409",L:"<",LT:"<",Lacute:"\u0139",Lambda:"\u039B",Lang:"\u27EA",Laplacetrf:"\u2112",Larr:"\u219E",Lcaron:"\u013D",Lcedil:"\u013B",Lcy:"\u041B",LeftAngleBracket:"\u27E8",LeftArrow:"\u2190",LeftArrowBar:"\u21E4",LeftArrowRightArrow:"\u21C6",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVector:"\u21C3",LeftDownVectorBar:"\u2959",LeftFloor:"\u230A",LeftRightArrow:"\u2194",LeftRightVector:"\u294E",LeftTee:"\u22A3",LeftTeeArrow:"\u21A4",LeftTeeVector:"\u295A",LeftTriangle:"\u22B2",LeftTriangleBar:"\u29CF",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVector:"\u21BF",LeftUpVectorBar:"\u2958",LeftVector:"\u21BC",LeftVectorBar:"\u2952",Leftarrow:"\u21D0",Leftrightarrow:"\u21D4",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",LessLess:"\u2AA1",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",Lfr:"\u{1D50F}",Ll:"\u22D8",Lleftarrow:"\u21DA",Lmidot:"\u013F",LongLeftArrow:"\u27F5",LongLeftRightArrow:"\u27F7",LongRightArrow:"\u27F6",Longleftarrow:"\u27F8",Longleftrightarrow:"\u27FA",Longrightarrow:"\u27F9",Lopf:"\u{1D543}",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",Lscr:"\u2112",Lsh:"\u21B0",Lstrok:"\u0141",Lt:"\u226A",Map:"\u2905",Mcy:"\u041C",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",MinusPlus:"\u2213",Mopf:"\u{1D544}",Mscr:"\u2133",Mu:"\u039C",NJcy:"\u040A",Nacute:"\u0143",Ncaron:"\u0147",Ncedil:"\u0145",Ncy:"\u041D",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:` -`,Nfr:"\u{1D511}",NoBreak:"\u2060",NonBreakingSpace:"\xA0",Nopf:"\u2115",Not:"\u2AEC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",NotLeftTriangle:"\u22EA",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangle:"\u22EB",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",Nscr:"\u{1D4A9}",Ntild:"\xD1",Ntilde:"\xD1",Nu:"\u039D",OElig:"\u0152",Oacut:"\xD3",Oacute:"\xD3",Ocir:"\xD4",Ocirc:"\xD4",Ocy:"\u041E",Odblac:"\u0150",Ofr:"\u{1D512}",Ograv:"\xD2",Ograve:"\xD2",Omacr:"\u014C",Omega:"\u03A9",Omicron:"\u039F",Oopf:"\u{1D546}",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",Or:"\u2A54",Oscr:"\u{1D4AA}",Oslas:"\xD8",Oslash:"\xD8",Otild:"\xD5",Otilde:"\xD5",Otimes:"\u2A37",Oum:"\xD6",Ouml:"\xD6",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",PartialD:"\u2202",Pcy:"\u041F",Pfr:"\u{1D513}",Phi:"\u03A6",Pi:"\u03A0",PlusMinus:"\xB1",Poincareplane:"\u210C",Popf:"\u2119",Pr:"\u2ABB",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",Prime:"\u2033",Product:"\u220F",Proportion:"\u2237",Proportional:"\u221D",Pscr:"\u{1D4AB}",Psi:"\u03A8",QUO:'"',QUOT:'"',Qfr:"\u{1D514}",Qopf:"\u211A",Qscr:"\u{1D4AC}",RBarr:"\u2910",RE:"\xAE",REG:"\xAE",Racute:"\u0154",Rang:"\u27EB",Rarr:"\u21A0",Rarrtl:"\u2916",Rcaron:"\u0158",Rcedil:"\u0156",Rcy:"\u0420",Re:"\u211C",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",Rfr:"\u211C",Rho:"\u03A1",RightAngleBracket:"\u27E9",RightArrow:"\u2192",RightArrowBar:"\u21E5",RightArrowLeftArrow:"\u21C4",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVector:"\u21C2",RightDownVectorBar:"\u2955",RightFloor:"\u230B",RightTee:"\u22A2",RightTeeArrow:"\u21A6",RightTeeVector:"\u295B",RightTriangle:"\u22B3",RightTriangleBar:"\u29D0",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVector:"\u21BE",RightUpVectorBar:"\u2954",RightVector:"\u21C0",RightVectorBar:"\u2953",Rightarrow:"\u21D2",Ropf:"\u211D",RoundImplies:"\u2970",Rrightarrow:"\u21DB",Rscr:"\u211B",Rsh:"\u21B1",RuleDelayed:"\u29F4",SHCHcy:"\u0429",SHcy:"\u0428",SOFTcy:"\u042C",Sacute:"\u015A",Sc:"\u2ABC",Scaron:"\u0160",Scedil:"\u015E",Scirc:"\u015C",Scy:"\u0421",Sfr:"\u{1D516}",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",Sigma:"\u03A3",SmallCircle:"\u2218",Sopf:"\u{1D54A}",Sqrt:"\u221A",Square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",Sscr:"\u{1D4AE}",Star:"\u22C6",Sub:"\u22D0",Subset:"\u22D0",SubsetEqual:"\u2286",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",SuchThat:"\u220B",Sum:"\u2211",Sup:"\u22D1",Superset:"\u2283",SupersetEqual:"\u2287",Supset:"\u22D1",THOR:"\xDE",THORN:"\xDE",TRADE:"\u2122",TSHcy:"\u040B",TScy:"\u0426",Tab:" ",Tau:"\u03A4",Tcaron:"\u0164",Tcedil:"\u0162",Tcy:"\u0422",Tfr:"\u{1D517}",Therefore:"\u2234",Theta:"\u0398",ThickSpace:"\u205F\u200A",ThinSpace:"\u2009",Tilde:"\u223C",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",Topf:"\u{1D54B}",TripleDot:"\u20DB",Tscr:"\u{1D4AF}",Tstrok:"\u0166",Uacut:"\xDA",Uacute:"\xDA",Uarr:"\u219F",Uarrocir:"\u2949",Ubrcy:"\u040E",Ubreve:"\u016C",Ucir:"\xDB",Ucirc:"\xDB",Ucy:"\u0423",Udblac:"\u0170",Ufr:"\u{1D518}",Ugrav:"\xD9",Ugrave:"\xD9",Umacr:"\u016A",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",Uopf:"\u{1D54C}",UpArrow:"\u2191",UpArrowBar:"\u2912",UpArrowDownArrow:"\u21C5",UpDownArrow:"\u2195",UpEquilibrium:"\u296E",UpTee:"\u22A5",UpTeeArrow:"\u21A5",Uparrow:"\u21D1",Updownarrow:"\u21D5",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",Upsi:"\u03D2",Upsilon:"\u03A5",Uring:"\u016E",Uscr:"\u{1D4B0}",Utilde:"\u0168",Uum:"\xDC",Uuml:"\xDC",VDash:"\u22AB",Vbar:"\u2AEB",Vcy:"\u0412",Vdash:"\u22A9",Vdashl:"\u2AE6",Vee:"\u22C1",Verbar:"\u2016",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",Vopf:"\u{1D54D}",Vscr:"\u{1D4B1}",Vvdash:"\u22AA",Wcirc:"\u0174",Wedge:"\u22C0",Wfr:"\u{1D51A}",Wopf:"\u{1D54E}",Wscr:"\u{1D4B2}",Xfr:"\u{1D51B}",Xi:"\u039E",Xopf:"\u{1D54F}",Xscr:"\u{1D4B3}",YAcy:"\u042F",YIcy:"\u0407",YUcy:"\u042E",Yacut:"\xDD",Yacute:"\xDD",Ycirc:"\u0176",Ycy:"\u042B",Yfr:"\u{1D51C}",Yopf:"\u{1D550}",Yscr:"\u{1D4B4}",Yuml:"\u0178",ZHcy:"\u0416",Zacute:"\u0179",Zcaron:"\u017D",Zcy:"\u0417",Zdot:"\u017B",ZeroWidthSpace:"\u200B",Zeta:"\u0396",Zfr:"\u2128",Zopf:"\u2124",Zscr:"\u{1D4B5}",aacut:"\xE1",aacute:"\xE1",abreve:"\u0103",ac:"\u223E",acE:"\u223E\u0333",acd:"\u223F",acir:"\xE2",acirc:"\xE2",acut:"\xB4",acute:"\xB4",acy:"\u0430",aeli:"\xE6",aelig:"\xE6",af:"\u2061",afr:"\u{1D51E}",agrav:"\xE0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",alpha:"\u03B1",amacr:"\u0101",amalg:"\u2A3F",am:"&",amp:"&",and:"\u2227",andand:"\u2A55",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsd:"\u2221",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",aogon:"\u0105",aopf:"\u{1D552}",ap:"\u2248",apE:"\u2A70",apacir:"\u2A6F",ape:"\u224A",apid:"\u224B",apos:"'",approx:"\u2248",approxeq:"\u224A",arin:"\xE5",aring:"\xE5",ascr:"\u{1D4B6}",ast:"*",asymp:"\u2248",asympeq:"\u224D",atild:"\xE3",atilde:"\xE3",aum:"\xE4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",bNot:"\u2AED",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",barvee:"\u22BD",barwed:"\u2305",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",beta:"\u03B2",beth:"\u2136",between:"\u226C",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bnot:"\u2310",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxDL:"\u2557",boxDR:"\u2554",boxDl:"\u2556",boxDr:"\u2553",boxH:"\u2550",boxHD:"\u2566",boxHU:"\u2569",boxHd:"\u2564",boxHu:"\u2567",boxUL:"\u255D",boxUR:"\u255A",boxUl:"\u255C",boxUr:"\u2559",boxV:"\u2551",boxVH:"\u256C",boxVL:"\u2563",boxVR:"\u2560",boxVh:"\u256B",boxVl:"\u2562",boxVr:"\u255F",boxbox:"\u29C9",boxdL:"\u2555",boxdR:"\u2552",boxdl:"\u2510",boxdr:"\u250C",boxh:"\u2500",boxhD:"\u2565",boxhU:"\u2568",boxhd:"\u252C",boxhu:"\u2534",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxuL:"\u255B",boxuR:"\u2558",boxul:"\u2518",boxur:"\u2514",boxv:"\u2502",boxvH:"\u256A",boxvL:"\u2561",boxvR:"\u255E",boxvh:"\u253C",boxvl:"\u2524",boxvr:"\u251C",bprime:"\u2035",breve:"\u02D8",brvba:"\xA6",brvbar:"\xA6",bscr:"\u{1D4B7}",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsol:"\\",bsolb:"\u29C5",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",bumpeq:"\u224F",cacute:"\u0107",cap:"\u2229",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",capcup:"\u2A47",capdot:"\u2A40",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",ccaps:"\u2A4D",ccaron:"\u010D",ccedi:"\xE7",ccedil:"\xE7",ccirc:"\u0109",ccups:"\u2A4C",ccupssm:"\u2A50",cdot:"\u010B",cedi:"\xB8",cedil:"\xB8",cemptyv:"\u29B2",cen:"\xA2",cent:"\xA2",centerdot:"\xB7",cfr:"\u{1D520}",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",chi:"\u03C7",cir:"\u25CB",cirE:"\u29C3",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledR:"\xAE",circledS:"\u24C8",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",clubs:"\u2663",clubsuit:"\u2663",colon:":",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",conint:"\u222E",copf:"\u{1D554}",coprod:"\u2210",cop:"\xA9",copy:"\xA9",copysr:"\u2117",crarr:"\u21B5",cross:"\u2717",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",cup:"\u222A",cupbrcap:"\u2A48",cupcap:"\u2A46",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curre:"\xA4",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",dArr:"\u21D3",dHar:"\u2965",dagger:"\u2020",daleth:"\u2138",darr:"\u2193",dash:"\u2010",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",dcaron:"\u010F",dcy:"\u0434",dd:"\u2146",ddagger:"\u2021",ddarr:"\u21CA",ddotseq:"\u2A77",de:"\xB0",deg:"\xB0",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",dfr:"\u{1D521}",dharl:"\u21C3",dharr:"\u21C2",diam:"\u22C4",diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divid:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",dopf:"\u{1D555}",dot:"\u02D9",doteq:"\u2250",doteqdot:"\u2251",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",downarrow:"\u2193",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",dscr:"\u{1D4B9}",dscy:"\u0455",dsol:"\u29F6",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",dzcy:"\u045F",dzigrarr:"\u27FF",eDDot:"\u2A77",eDot:"\u2251",eacut:"\xE9",eacute:"\xE9",easter:"\u2A6E",ecaron:"\u011B",ecir:"\xEA",ecirc:"\xEA",ecolon:"\u2255",ecy:"\u044D",edot:"\u0117",ee:"\u2147",efDot:"\u2252",efr:"\u{1D522}",eg:"\u2A9A",egrav:"\xE8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",emptyv:"\u2205",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",eng:"\u014B",ensp:"\u2002",eogon:"\u0119",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",equals:"=",equest:"\u225F",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erDot:"\u2253",erarr:"\u2971",escr:"\u212F",esdot:"\u2250",esim:"\u2242",eta:"\u03B7",et:"\xF0",eth:"\xF0",eum:"\xEB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",expectation:"\u2130",exponentiale:"\u2147",fallingdotseq:"\u2252",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",ffr:"\u{1D523}",filig:"\uFB01",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",fopf:"\u{1D557}",forall:"\u2200",fork:"\u22D4",forkv:"\u2AD9",fpartint:"\u2A0D",frac1:"\xBC",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac3:"\xBE",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",fscr:"\u{1D4BB}",gE:"\u2267",gEl:"\u2A8C",gacute:"\u01F5",gamma:"\u03B3",gammad:"\u03DD",gap:"\u2A86",gbreve:"\u011F",gcirc:"\u011D",gcy:"\u0433",gdot:"\u0121",ge:"\u2265",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",ges:"\u2A7E",gescc:"\u2AA9",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",gfr:"\u{1D524}",gg:"\u226B",ggg:"\u22D9",gimel:"\u2137",gjcy:"\u0453",gl:"\u2277",glE:"\u2A92",gla:"\u2AA5",glj:"\u2AA4",gnE:"\u2269",gnap:"\u2A8A",gnapprox:"\u2A8A",gne:"\u2A88",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",gopf:"\u{1D558}",grave:"`",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",g:">",gt:">",gtcc:"\u2AA7",gtcir:"\u2A7A",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",hArr:"\u21D4",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",hardcy:"\u044A",harr:"\u2194",harrcir:"\u2948",harrw:"\u21AD",hbar:"\u210F",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",hfr:"\u{1D525}",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",hopf:"\u{1D559}",horbar:"\u2015",hscr:"\u{1D4BD}",hslash:"\u210F",hstrok:"\u0127",hybull:"\u2043",hyphen:"\u2010",iacut:"\xED",iacute:"\xED",ic:"\u2063",icir:"\xEE",icirc:"\xEE",icy:"\u0438",iecy:"\u0435",iexc:"\xA1",iexcl:"\xA1",iff:"\u21D4",ifr:"\u{1D526}",igrav:"\xEC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",ijlig:"\u0133",imacr:"\u012B",image:"\u2111",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",imof:"\u22B7",imped:"\u01B5",in:"\u2208",incare:"\u2105",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",int:"\u222B",intcal:"\u22BA",integers:"\u2124",intercal:"\u22BA",intlarhk:"\u2A17",intprod:"\u2A3C",iocy:"\u0451",iogon:"\u012F",iopf:"\u{1D55A}",iota:"\u03B9",iprod:"\u2A3C",iques:"\xBF",iquest:"\xBF",iscr:"\u{1D4BE}",isin:"\u2208",isinE:"\u22F9",isindot:"\u22F5",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",itilde:"\u0129",iukcy:"\u0456",ium:"\xEF",iuml:"\xEF",jcirc:"\u0135",jcy:"\u0439",jfr:"\u{1D527}",jmath:"\u0237",jopf:"\u{1D55B}",jscr:"\u{1D4BF}",jsercy:"\u0458",jukcy:"\u0454",kappa:"\u03BA",kappav:"\u03F0",kcedil:"\u0137",kcy:"\u043A",kfr:"\u{1D528}",kgreen:"\u0138",khcy:"\u0445",kjcy:"\u045C",kopf:"\u{1D55C}",kscr:"\u{1D4C0}",lAarr:"\u21DA",lArr:"\u21D0",lAtail:"\u291B",lBarr:"\u290E",lE:"\u2266",lEg:"\u2A8B",lHar:"\u2962",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",lambda:"\u03BB",lang:"\u27E8",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",laqu:"\xAB",laquo:"\xAB",larr:"\u2190",larrb:"\u21E4",larrbfs:"\u291F",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",lat:"\u2AAB",latail:"\u2919",late:"\u2AAD",lates:"\u2AAD\uFE00",lbarr:"\u290C",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",lcaron:"\u013E",lcedil:"\u013C",lceil:"\u2308",lcub:"{",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",le:"\u2264",leftarrow:"\u2190",leftarrowtail:"\u21A2",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",leftrightarrow:"\u2194",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",leftthreetimes:"\u22CB",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",les:"\u2A7D",lescc:"\u2AA8",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",lessgtr:"\u2276",lesssim:"\u2272",lfisht:"\u297C",lfloor:"\u230A",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",ljcy:"\u0459",ll:"\u226A",llarr:"\u21C7",llcorner:"\u231E",llhard:"\u296B",lltri:"\u25FA",lmidot:"\u0140",lmoust:"\u23B0",lmoustache:"\u23B0",lnE:"\u2268",lnap:"\u2A89",lnapprox:"\u2A89",lne:"\u2A87",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",longleftarrow:"\u27F5",longleftrightarrow:"\u27F7",longmapsto:"\u27FC",longrightarrow:"\u27F6",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",lscr:"\u{1D4C1}",lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",lstrok:"\u0142",l:"<",lt:"<",ltcc:"\u2AA6",ltcir:"\u2A79",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltrPar:"\u2996",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",mDDot:"\u223A",mac:"\xAF",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",mcy:"\u043C",mdash:"\u2014",measuredangle:"\u2221",mfr:"\u{1D52A}",mho:"\u2127",micr:"\xB5",micro:"\xB5",mid:"\u2223",midast:"*",midcir:"\u2AF0",middo:"\xB7",middot:"\xB7",minus:"\u2212",minusb:"\u229F",minusd:"\u2238",minusdu:"\u2A2A",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",mopf:"\u{1D55E}",mp:"\u2213",mscr:"\u{1D4C2}",mstpos:"\u223E",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nGg:"\u22D9\u0338",nGt:"\u226B\u20D2",nGtv:"\u226B\u0338",nLeftarrow:"\u21CD",nLeftrightarrow:"\u21CE",nLl:"\u22D8\u0338",nLt:"\u226A\u20D2",nLtv:"\u226A\u0338",nRightarrow:"\u21CF",nVDash:"\u22AF",nVdash:"\u22AE",nabla:"\u2207",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natur:"\u266E",natural:"\u266E",naturals:"\u2115",nbs:"\xA0",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",ncaron:"\u0148",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",ncy:"\u043D",ndash:"\u2013",ne:"\u2260",neArr:"\u21D7",nearhk:"\u2924",nearr:"\u2197",nearrow:"\u2197",nedot:"\u2250\u0338",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",nexist:"\u2204",nexists:"\u2204",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",ngsim:"\u2275",ngt:"\u226F",ngtr:"\u226F",nhArr:"\u21CE",nharr:"\u21AE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",njcy:"\u045A",nlArr:"\u21CD",nlE:"\u2266\u0338",nlarr:"\u219A",nldr:"\u2025",nle:"\u2270",nleftarrow:"\u219A",nleftrightarrow:"\u21AE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nlsim:"\u2274",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nmid:"\u2224",nopf:"\u{1D55F}",no:"\xAC",not:"\xAC",notin:"\u2209",notinE:"\u22F9\u0338",notindot:"\u22F5\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",npar:"\u2226",nparallel:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",npre:"\u2AAF\u0338",nprec:"\u2280",npreceq:"\u2AAF\u0338",nrArr:"\u21CF",nrarr:"\u219B",nrarrc:"\u2933\u0338",nrarrw:"\u219D\u0338",nrightarrow:"\u219B",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",ntild:"\xF1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvDash:"\u22AD",nvHarr:"\u2904",nvap:"\u224D\u20D2",nvdash:"\u22AC",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwArr:"\u21D6",nwarhk:"\u2923",nwarr:"\u2196",nwarrow:"\u2196",nwnear:"\u2927",oS:"\u24C8",oacut:"\xF3",oacute:"\xF3",oast:"\u229B",ocir:"\xF4",ocirc:"\xF4",ocy:"\u043E",odash:"\u229D",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",oelig:"\u0153",ofcir:"\u29BF",ofr:"\u{1D52C}",ogon:"\u02DB",ograv:"\xF2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",omacr:"\u014D",omega:"\u03C9",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",oopf:"\u{1D560}",opar:"\u29B7",operp:"\u29B9",oplus:"\u2295",or:"\u2228",orarr:"\u21BB",ord:"\xBA",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oscr:"\u2134",oslas:"\xF8",oslash:"\xF8",osol:"\u2298",otild:"\xF5",otilde:"\xF5",otimes:"\u2297",otimesas:"\u2A36",oum:"\xF6",ouml:"\xF6",ovbar:"\u233D",par:"\xB6",para:"\xB6",parallel:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",pfr:"\u{1D52D}",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plus:"+",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",plusm:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",pointint:"\u2A15",popf:"\u{1D561}",poun:"\xA3",pound:"\xA3",pr:"\u227A",prE:"\u2AB3",prap:"\u2AB7",prcue:"\u227C",pre:"\u2AAF",prec:"\u227A",precapprox:"\u2AB7",preccurlyeq:"\u227C",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",precsim:"\u227E",prime:"\u2032",primes:"\u2119",prnE:"\u2AB5",prnap:"\u2AB9",prnsim:"\u22E8",prod:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",pscr:"\u{1D4C5}",psi:"\u03C8",puncsp:"\u2008",qfr:"\u{1D52E}",qint:"\u2A0C",qopf:"\u{1D562}",qprime:"\u2057",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",quo:'"',quot:'"',rAarr:"\u21DB",rArr:"\u21D2",rAtail:"\u291C",rBarr:"\u290F",rHar:"\u2964",race:"\u223D\u0331",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",rang:"\u27E9",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raqu:"\xBB",raquo:"\xBB",rarr:"\u2192",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",rarrtl:"\u21A3",rarrw:"\u219D",ratail:"\u291A",ratio:"\u2236",rationals:"\u211A",rbarr:"\u290D",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",rcaron:"\u0159",rcedil:"\u0157",rceil:"\u2309",rcub:"}",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",rect:"\u25AD",re:"\xAE",reg:"\xAE",rfisht:"\u297D",rfloor:"\u230B",rfr:"\u{1D52F}",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",rho:"\u03C1",rhov:"\u03F1",rightarrow:"\u2192",rightarrowtail:"\u21A3",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",rightthreetimes:"\u22CC",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoust:"\u23B1",rmoustache:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",ropf:"\u{1D563}",roplus:"\u2A2E",rotimes:"\u2A35",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",rsaquo:"\u203A",rscr:"\u{1D4C7}",rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",ruluhar:"\u2968",rx:"\u211E",sacute:"\u015B",sbquo:"\u201A",sc:"\u227B",scE:"\u2AB4",scap:"\u2AB8",scaron:"\u0161",sccue:"\u227D",sce:"\u2AB0",scedil:"\u015F",scirc:"\u015D",scnE:"\u2AB6",scnap:"\u2ABA",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",scy:"\u0441",sdot:"\u22C5",sdotb:"\u22A1",sdote:"\u2A66",seArr:"\u21D8",searhk:"\u2925",searr:"\u2198",searrow:"\u2198",sec:"\xA7",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",shchcy:"\u0449",shcy:"\u0448",shortmid:"\u2223",shortparallel:"\u2225",sh:"\xAD",shy:"\xAD",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",softcy:"\u044C",sol:"/",solb:"\u29C4",solbar:"\u233F",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",squ:"\u25A1",square:"\u25A1",squarf:"\u25AA",squf:"\u25AA",srarr:"\u2192",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",sub:"\u2282",subE:"\u2AC5",subdot:"\u2ABD",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",subset:"\u2282",subseteq:"\u2286",subseteqq:"\u2AC5",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succ:"\u227B",succapprox:"\u2AB8",succcurlyeq:"\u227D",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",sum:"\u2211",sung:"\u266A",sup:"\u2283",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",supE:"\u2AC6",supdot:"\u2ABE",supdsub:"\u2AD8",supe:"\u2287",supedot:"\u2AC4",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",supset:"\u2283",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swArr:"\u21D9",swarhk:"\u2926",swarr:"\u2199",swarrow:"\u2199",swnwar:"\u292A",szli:"\xDF",szlig:"\xDF",target:"\u2316",tau:"\u03C4",tbrk:"\u23B4",tcaron:"\u0165",tcedil:"\u0163",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",tfr:"\u{1D531}",there4:"\u2234",therefore:"\u2234",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223C",thor:"\xFE",thorn:"\xFE",tilde:"\u02DC",time:"\xD7",times:"\xD7",timesb:"\u22A0",timesbar:"\u2A31",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",top:"\u22A4",topbot:"\u2336",topcir:"\u2AF1",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",tscr:"\u{1D4C9}",tscy:"\u0446",tshcy:"\u045B",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",uArr:"\u21D1",uHar:"\u2963",uacut:"\xFA",uacute:"\xFA",uarr:"\u2191",ubrcy:"\u045E",ubreve:"\u016D",ucir:"\xFB",ucirc:"\xFB",ucy:"\u0443",udarr:"\u21C5",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",ufr:"\u{1D532}",ugrav:"\xF9",ugrave:"\xF9",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",umacr:"\u016B",um:"\xA8",uml:"\xA8",uogon:"\u0173",uopf:"\u{1D566}",uparrow:"\u2191",updownarrow:"\u2195",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",upsi:"\u03C5",upsih:"\u03D2",upsilon:"\u03C5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",uring:"\u016F",urtri:"\u25F9",uscr:"\u{1D4CA}",utdot:"\u22F0",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",uum:"\xFC",uuml:"\xFC",uwangle:"\u29A7",vArr:"\u21D5",vBar:"\u2AE8",vBarv:"\u2AE9",vDash:"\u22A8",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",varr:"\u2195",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",vcy:"\u0432",vdash:"\u22A2",vee:"\u2228",veebar:"\u22BB",veeeq:"\u225A",vellip:"\u22EE",verbar:"|",vert:"|",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",vzigzag:"\u299A",wcirc:"\u0175",wedbar:"\u2A5F",wedge:"\u2227",wedgeq:"\u2259",weierp:"\u2118",wfr:"\u{1D534}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",xfr:"\u{1D535}",xhArr:"\u27FA",xharr:"\u27F7",xi:"\u03BE",xlArr:"\u27F8",xlarr:"\u27F5",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrArr:"\u27F9",xrarr:"\u27F6",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",yacut:"\xFD",yacute:"\xFD",yacy:"\u044F",ycirc:"\u0177",ycy:"\u044B",ye:"\xA5",yen:"\xA5",yfr:"\u{1D536}",yicy:"\u0457",yopf:"\u{1D56A}",yscr:"\u{1D4CE}",yucy:"\u044E",yum:"\xFF",yuml:"\xFF",zacute:"\u017A",zcaron:"\u017E",zcy:"\u0437",zdot:"\u017C",zeetrf:"\u2128",zeta:"\u03B6",zfr:"\u{1D537}",zhcy:"\u0436",zigrarr:"\u21DD",zopf:"\u{1D56B}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"};var p0={}.hasOwnProperty;function Ci(t){return p0.call(wu,t)?wu[t]:!1}var zs={name:"characterReference",tokenize:m0};function m0(t,n,e){let r=this,i=0,a,o;return s;function s(d){return t.enter("characterReference"),t.enter("characterReferenceMarker"),t.consume(d),t.exit("characterReferenceMarker"),u}function u(d){return d===35?(t.enter("characterReferenceMarkerNumeric"),t.consume(d),t.exit("characterReferenceMarkerNumeric"),l):(t.enter("characterReferenceValue"),a=31,o=zt,c(d))}function l(d){return d===88||d===120?(t.enter("characterReferenceMarkerHexadecimal"),t.consume(d),t.exit("characterReferenceMarkerHexadecimal"),t.enter("characterReferenceValue"),a=6,o=$v,c):(t.enter("characterReferenceValue"),a=7,o=Da,c(d))}function c(d){let f;return d===59&&i?(f=t.exit("characterReferenceValue"),o===zt&&!Ci(r.sliceSerialize(f))?e(d):(t.enter("characterReferenceMarker"),t.consume(d),t.exit("characterReferenceMarker"),t.exit("characterReference"),n)):o(d)&&i++=4?o(l):e(l)}function o(l){return l===null?u(l):se(l)?t.attempt(v0,o,u)(l):(t.enter("codeFlowValue"),s(l))}function s(l){return l===null||se(l)?(t.exit("codeFlowValue"),o(l)):(t.consume(l),s)}function u(l){return t.exit("codeIndented"),n(l)}}function b0(t,n,e){let r=this;return i;function i(o){return r.parser.lazy[r.now().line]?e(o):se(o)?(t.enter("lineEnding"),t.consume(o),t.exit("lineEnding"),i):Se(t,a,"linePrefix",4+1)(o)}function a(o){let s=r.events[r.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?n(o):se(o)?i(o):e(o)}}var Eu={name:"codeText",tokenize:S0,resolve:w0,previous:E0};function w0(t){let n=t.length-4,e=3,r,i;if((t[e][1].type==="lineEnding"||t[e][1].type==="space")&&(t[n][1].type==="lineEnding"||t[n][1].type==="space")){for(r=e;++r=4?n(o):t.interrupt(r.parser.constructs.flow,e,n)(o)}}function Ws(t,n,e,r,i,a,o,s,u){let l=u||Number.POSITIVE_INFINITY,c=0;return d;function d(S){return S===60?(t.enter(r),t.enter(i),t.enter(a),t.consume(S),t.exit(a),f):S===null||S===41||Ca(S)?e(S):(t.enter(r),t.enter(o),t.enter(s),t.enter("chunkString",{contentType:"string"}),g(S))}function f(S){return S===62?(t.enter(a),t.consume(S),t.exit(a),t.exit(i),t.exit(r),n):(t.enter(s),t.enter("chunkString",{contentType:"string"}),h(S))}function h(S){return S===62?(t.exit("chunkString"),t.exit(s),f(S)):S===null||S===60||se(S)?e(S):(t.consume(S),S===92?p:h)}function p(S){return S===60||S===62||S===92?(t.consume(S),h):h(S)}function g(S){return S===40?++c>l?e(S):(t.consume(S),g):S===41?c--?(t.consume(S),g):(t.exit("chunkString"),t.exit(s),t.exit(o),t.exit(r),n(S)):S===null||Qe(S)?c?e(S):(t.exit("chunkString"),t.exit(s),t.exit(o),t.exit(r),n(S)):Ca(S)?e(S):(t.consume(S),S===92?w:g)}function w(S){return S===40||S===41||S===92?(t.consume(S),g):g(S)}}function Ys(t,n,e,r,i,a){let o=this,s=0,u;return l;function l(h){return t.enter(r),t.enter(i),t.consume(h),t.exit(i),t.enter(a),c}function c(h){return h===null||h===91||h===93&&!u||h===94&&!s&&"_hiddenFootnoteSupport"in o.parser.constructs||s>999?e(h):h===93?(t.exit(a),t.enter(i),t.consume(h),t.exit(i),t.exit(r),n):se(h)?(t.enter("lineEnding"),t.consume(h),t.exit("lineEnding"),c):(t.enter("chunkString",{contentType:"string"}),d(h))}function d(h){return h===null||h===91||h===93||se(h)||s++>999?(t.exit("chunkString"),c(h)):(t.consume(h),u=u||!He(h),h===92?f:d)}function f(h){return h===91||h===92||h===93?(t.consume(h),s++,d):d(h)}}function Js(t,n,e,r,i,a){let o;return s;function s(f){return t.enter(r),t.enter(i),t.consume(f),t.exit(i),o=f===40?41:f,u}function u(f){return f===o?(t.enter(i),t.consume(f),t.exit(i),t.exit(r),n):(t.enter(a),l(f))}function l(f){return f===o?(t.exit(a),u(o)):f===null?e(f):se(f)?(t.enter("lineEnding"),t.consume(f),t.exit("lineEnding"),Se(t,l,"linePrefix")):(t.enter("chunkString",{contentType:"string"}),c(f))}function c(f){return f===o||f===null||se(f)?(t.exit("chunkString"),l(f)):(t.consume(f),f===92?d:c)}function d(f){return f===o||f===92?(t.consume(f),c):c(f)}}function Br(t,n){let e;return r;function r(i){return se(i)?(t.enter("lineEnding"),t.consume(i),t.exit("lineEnding"),e=!0,r):He(i)?Se(t,r,e?"linePrefix":"lineSuffix")(i):n(i)}}function ir(t){return t.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}var xu={name:"definition",tokenize:C0},D0={tokenize:I0,partial:!0};function C0(t,n,e){let r=this,i;return a;function a(u){return t.enter("definition"),Ys.call(r,t,o,e,"definitionLabel","definitionLabelMarker","definitionLabelString")(u)}function o(u){return i=ir(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),u===58?(t.enter("definitionMarker"),t.consume(u),t.exit("definitionMarker"),Br(t,Ws(t,t.attempt(D0,Se(t,s,"whitespace"),Se(t,s,"whitespace")),e,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString"))):e(u)}function s(u){return u===null||se(u)?(t.exit("definition"),r.parser.defined.includes(i)||r.parser.defined.push(i),n(u)):e(u)}}function I0(t,n,e){return r;function r(o){return Qe(o)?Br(t,i)(o):e(o)}function i(o){return o===34||o===39||o===40?Js(t,Se(t,a,"whitespace"),e,"definitionTitle","definitionTitleMarker","definitionTitleString")(o):e(o)}function a(o){return o===null||se(o)?n(o):e(o)}}var ku={name:"hardBreakEscape",tokenize:A0};function A0(t,n,e){return r;function r(a){return t.enter("hardBreakEscape"),t.enter("escapeMarker"),t.consume(a),i}function i(a){return se(a)?(t.exit("escapeMarker"),t.exit("hardBreakEscape"),n(a)):e(a)}}var _u={name:"headingAtx",tokenize:P0,resolve:L0};function L0(t,n){let e=t.length-2,r=3,i,a;return t[r][1].type==="whitespace"&&(r+=2),e-2>r&&t[e][1].type==="whitespace"&&(e-=2),t[e][1].type==="atxHeadingSequence"&&(r===e-1||e-4>r&&t[e-2][1].type==="whitespace")&&(e-=r+1===e?2:4),e>r&&(i={type:"atxHeadingText",start:t[r][1].start,end:t[e][1].end},a={type:"chunkText",start:t[r][1].start,end:t[e][1].end,contentType:"text"},Dt(t,r,e-r+1,[["enter",i,n],["enter",a,n],["exit",a,n],["exit",i,n]])),t}function P0(t,n,e){let r=this,i=0;return a;function a(c){return t.enter("atxHeading"),t.enter("atxHeadingSequence"),o(c)}function o(c){return c===35&&i++<6?(t.consume(c),o):c===null||Qe(c)?(t.exit("atxHeadingSequence"),r.interrupt?n(c):s(c)):e(c)}function s(c){return c===35?(t.enter("atxHeadingSequence"),u(c)):c===null||se(c)?(t.exit("atxHeading"),n(c)):He(c)?Se(t,s,"whitespace")(c):(t.enter("atxHeadingText"),l(c))}function u(c){return c===35?(t.consume(c),u):(t.exit("atxHeadingSequence"),s(c))}function l(c){return c===null||c===35||Qe(c)?(t.exit("atxHeadingText"),s(c)):(t.consume(c),l)}}var Jv=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Tu=["pre","script","style","textarea"];var Mu={name:"htmlFlow",tokenize:F0,resolveTo:N0,concrete:!0},O0={tokenize:R0,partial:!0};function N0(t){let n=t.length;for(;n--&&!(t[n][0]==="enter"&&t[n][1].type==="htmlFlow"););return n>1&&t[n-2][1].type==="linePrefix"&&(t[n][1].start=t[n-2][1].start,t[n+1][1].start=t[n-2][1].start,t.splice(n-2,2)),t}function F0(t,n,e){let r=this,i,a,o,s,u;return l;function l(A){return t.enter("htmlFlow"),t.enter("htmlFlowData"),t.consume(A),c}function c(A){return A===33?(t.consume(A),d):A===47?(t.consume(A),p):A===63?(t.consume(A),i=3,r.interrupt?n:he):cn(A)?(t.consume(A),o=String.fromCharCode(A),a=!0,g):e(A)}function d(A){return A===45?(t.consume(A),i=2,f):A===91?(t.consume(A),i=5,o="CDATA[",s=0,h):cn(A)?(t.consume(A),i=4,r.interrupt?n:he):e(A)}function f(A){return A===45?(t.consume(A),r.interrupt?n:he):e(A)}function h(A){return A===o.charCodeAt(s++)?(t.consume(A),s===o.length?r.interrupt?n:Q:h):e(A)}function p(A){return cn(A)?(t.consume(A),o=String.fromCharCode(A),g):e(A)}function g(A){return A===null||A===47||A===62||Qe(A)?A!==47&&a&&Tu.includes(o.toLowerCase())?(i=1,r.interrupt?n(A):Q(A)):Jv.includes(o.toLowerCase())?(i=6,A===47?(t.consume(A),w):r.interrupt?n(A):Q(A)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?e(A):a?_(A):S(A)):A===45||zt(A)?(t.consume(A),o+=String.fromCharCode(A),g):e(A)}function w(A){return A===62?(t.consume(A),r.interrupt?n:Q):e(A)}function S(A){return He(A)?(t.consume(A),S):j(A)}function _(A){return A===47?(t.consume(A),j):A===58||A===95||cn(A)?(t.consume(A),k):He(A)?(t.consume(A),_):j(A)}function k(A){return A===45||A===46||A===58||A===95||zt(A)?(t.consume(A),k):P(A)}function P(A){return A===61?(t.consume(A),I):He(A)?(t.consume(A),P):_(A)}function I(A){return A===null||A===60||A===61||A===62||A===96?e(A):A===34||A===39?(t.consume(A),u=A,D):He(A)?(t.consume(A),I):(u=null,N(A))}function D(A){return A===null||se(A)?e(A):A===u?(t.consume(A),K):(t.consume(A),D)}function N(A){return A===null||A===34||A===39||A===60||A===61||A===62||A===96||Qe(A)?P(A):(t.consume(A),N)}function K(A){return A===47||A===62||He(A)?_(A):e(A)}function j(A){return A===62?(t.consume(A),X):e(A)}function X(A){return He(A)?(t.consume(A),X):A===null||se(A)?Q(A):e(A)}function Q(A){return A===45&&i===2?(t.consume(A),ne):A===60&&i===1?(t.consume(A),le):A===62&&i===4?(t.consume(A),Te):A===63&&i===3?(t.consume(A),he):A===93&&i===5?(t.consume(A),fe):se(A)&&(i===6||i===7)?t.check(O0,Te,ie)(A):A===null||se(A)?ie(A):(t.consume(A),Q)}function ie(A){return t.exit("htmlFlowData"),Y(A)}function Y(A){return A===null?C(A):se(A)?t.attempt({tokenize:J,partial:!0},Y,C)(A):(t.enter("htmlFlowData"),Q(A))}function J(A,tt,$e){return B;function B(U){return A.enter("lineEnding"),A.consume(U),A.exit("lineEnding"),z}function z(U){return r.parser.lazy[r.now().line]?$e(U):tt(U)}}function ne(A){return A===45?(t.consume(A),he):Q(A)}function le(A){return A===47?(t.consume(A),o="",de):Q(A)}function de(A){return A===62&&Tu.includes(o.toLowerCase())?(t.consume(A),Te):cn(A)&&o.length<8?(t.consume(A),o+=String.fromCharCode(A),de):Q(A)}function fe(A){return A===93?(t.consume(A),he):Q(A)}function he(A){return A===62?(t.consume(A),Te):A===45&&i===2?(t.consume(A),he):Q(A)}function Te(A){return A===null||se(A)?(t.exit("htmlFlowData"),C(A)):(t.consume(A),Te)}function C(A){return t.exit("htmlFlow"),n(A)}}function R0(t,n,e){return r;function r(i){return t.exit("htmlFlowData"),t.enter("lineEndingBlank"),t.consume(i),t.exit("lineEndingBlank"),t.attempt(Er,n,e)}}var Du={name:"htmlText",tokenize:H0};function H0(t,n,e){let r=this,i,a,o,s;return u;function u(C){return t.enter("htmlText"),t.enter("htmlTextData"),t.consume(C),l}function l(C){return C===33?(t.consume(C),c):C===47?(t.consume(C),N):C===63?(t.consume(C),I):cn(C)?(t.consume(C),X):e(C)}function c(C){return C===45?(t.consume(C),d):C===91?(t.consume(C),a="CDATA[",o=0,w):cn(C)?(t.consume(C),P):e(C)}function d(C){return C===45?(t.consume(C),f):e(C)}function f(C){return C===null||C===62?e(C):C===45?(t.consume(C),h):p(C)}function h(C){return C===null||C===62?e(C):p(C)}function p(C){return C===null?e(C):C===45?(t.consume(C),g):se(C)?(s=p,fe(C)):(t.consume(C),p)}function g(C){return C===45?(t.consume(C),Te):p(C)}function w(C){return C===a.charCodeAt(o++)?(t.consume(C),o===a.length?S:w):e(C)}function S(C){return C===null?e(C):C===93?(t.consume(C),_):se(C)?(s=S,fe(C)):(t.consume(C),S)}function _(C){return C===93?(t.consume(C),k):S(C)}function k(C){return C===62?Te(C):C===93?(t.consume(C),k):S(C)}function P(C){return C===null||C===62?Te(C):se(C)?(s=P,fe(C)):(t.consume(C),P)}function I(C){return C===null?e(C):C===63?(t.consume(C),D):se(C)?(s=I,fe(C)):(t.consume(C),I)}function D(C){return C===62?Te(C):I(C)}function N(C){return cn(C)?(t.consume(C),K):e(C)}function K(C){return C===45||zt(C)?(t.consume(C),K):j(C)}function j(C){return se(C)?(s=j,fe(C)):He(C)?(t.consume(C),j):Te(C)}function X(C){return C===45||zt(C)?(t.consume(C),X):C===47||C===62||Qe(C)?Q(C):e(C)}function Q(C){return C===47?(t.consume(C),Te):C===58||C===95||cn(C)?(t.consume(C),ie):se(C)?(s=Q,fe(C)):He(C)?(t.consume(C),Q):Te(C)}function ie(C){return C===45||C===46||C===58||C===95||zt(C)?(t.consume(C),ie):Y(C)}function Y(C){return C===61?(t.consume(C),J):se(C)?(s=Y,fe(C)):He(C)?(t.consume(C),Y):Q(C)}function J(C){return C===null||C===60||C===61||C===62||C===96?e(C):C===34||C===39?(t.consume(C),i=C,ne):se(C)?(s=J,fe(C)):He(C)?(t.consume(C),J):(t.consume(C),i=void 0,de)}function ne(C){return C===i?(t.consume(C),le):C===null?e(C):se(C)?(s=ne,fe(C)):(t.consume(C),ne)}function le(C){return C===62||C===47||Qe(C)?Q(C):e(C)}function de(C){return C===null||C===34||C===39||C===60||C===61||C===96?e(C):C===62||Qe(C)?Q(C):(t.consume(C),de)}function fe(C){return t.exit("htmlTextData"),t.enter("lineEnding"),t.consume(C),t.exit("lineEnding"),Se(t,he,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function he(C){return t.enter("htmlTextData"),s(C)}function Te(C){return C===62?(t.consume(C),t.exit("htmlTextData"),t.exit("htmlText"),n):e(C)}}var Kr={name:"labelEnd",tokenize:z0,resolveTo:j0,resolveAll:U0},B0={tokenize:V0},K0={tokenize:q0},$0={tokenize:W0};function U0(t){let n=-1,e;for(;++n-1&&(o[0]=o[0].slice(r)),a>0&&o.push(t[i].slice(0,a))),o}function u_(t,n){let e=-1,r=[],i;for(;++e`${c}1${f}`);return _t(t,u),!0}function ym(t){let n=Kn(t);if(n.selection.start!==n.selection.end)return!1;let e=vi(n),r=t.value.slice(e.start,n.selection.end),i=t.value.slice(e.start,e.end);if(/^(\s*[-*+]\s+(?:\[[^\]]\]\s*)?)$/.test(i))return Nt(t,{start:e.start-1,end:e.end}),_t(t,` +`),!0;if(/^(\s*\d[.)]\s+(?:\[[^\]]\]\s*)?)$/.test(i))return Nt(t,{start:e.start-1,end:e.end}),_t(t,` +`),!0;if(va.test(r)){let a=r.match(/^(\s*[-*+]\s+(?:\[[^\]]\]\s*)?)/)[1];return fa(t,` +${a.replace(/^(\s*[-*+]\s+)\[[^\]]\]/,"$1[ ]")}`),!0}if(ga.test(r)){let s=r.match(/^(\s*\d+[.)]\s+(?:\[[^\]]\]\s*)?)/)[1].replace(/^(\s*\d+[.)]\s+)\[[^\]]\]/,"$1[ ]").replace(/^(\s*)(\d+)/,(u,l,c)=>`${l}${parseInt(c)+1}`);return fa(t,` +${s}`),!0}return!1}var bm={};var wm={};var Em={};var Sm={"Open as kanban board":"\xD6ffne als Kanban-Board","Create new board":"Erstelle ein neues Board","Archive completed cards in active board":"Archiviere fertiggestellte Karten im aktiven Board","Error: current file is not a Kanban board":"Fehler: Momentan ge\xF6ffnete Datei ist kein Kanban-Board","Convert empty note to Kanban":"Konvertiere leere Notiz in ein Kanban-Board","Error: cannot create Kanban, the current note is not empty":"Fehler: Kanban konnte nicht erstellt werden, momentan ge\xF6ffnete Datei ist nicht leer","New kanban board":"Neues Kanban-Board","Untitled Kanban":"Unbenanntes Kanban","Toggle between Kanban and markdown mode":"Wechsle zwischen Kanban und Markdown Modus","Open as markdown":"\xD6ffne als Markdown","Open board settings":"\xD6ffne Board-Einstellungen","Archive completed cards":"Archiviere fertiggestellte Karten","Something went wrong":"Etwas ist schief gelaufen","You may wish to open as markdown and inspect or edit the file.":"Du kannst die Datei im Markdown Modus \xF6ffnen und \xFCberpr\xFCfen oder bearbeiten.","Are you sure you want to archive all completed cards on this board?":"Bist du dir sicher, dass du alle fertiggestellten Karten des Boards archivieren m\xF6chtest?",Complete:"Fertiggestellt",Archive:"Archiv","Invalid Kanban file: problems parsing frontmatter":"Fehlerhafte Kanban Datei: Probleme beim Parsen des Frontmatters","I don't know how to interpret this line:":"Ich wei\xDF nicht, wie ich diese Zeile interpretieren soll:",Untitled:"Unbenannt","Note: No template plugins are currently enabled.":"Beachte: Keine Template-Plugins sind derzeit aktiviert.",default:"Standard","Search...":"Suche...","These settings will take precedence over the default Kanban board settings.":"Diese Einstellung wird Vorrang vor der standard Kanban-Board Einstellung haben. ","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Stelle standard Kanban-Board Einstellungen ein. Einstellungen k\xF6nnen auf einer Board-f\xFCr-Board Basis \xFCberschrieben werden.","Note template":"Notiz Vorlage","This template will be used when creating new notes from Kanban cards.":"Diese Vorlage wird beim Erstellen neuer Notizen aus Kanban-Karten verwendet.","No template":"Keine Vorlage","Note folder":"Notiz Ordner","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Notizen, welche aus einer Kanban-Karte erstellt wurden, werden in diesem Ordner platziert. Falls leer, werden die Einstellungen des Vaults verwendet.","Default folder":"Standard Ordner","Lane width":"Schienen Breite","Enter a number to set the lane width in pixels.":"Gebe ein Zahl ein, um die Schienen Breite in Pixeln einzustellen.","Maximum number of archived cards":"Maximale Anzahl archivierter Karten.","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Archivierte Karten k\xF6nnen im Markdown-Modus betrachtet werden. Diese Einstellung wird alte Karten l\xF6schen, sobald das Limit erreicht wird. Eine Einstellung von -1 setzt das Archiv auf eine unendliche Gr\xF6\xDFe.","Display card checkbox":"Zeige Karten Checkbox","When toggled, a checkbox will be displayed with each card":"Wenn aktiviert, wird eine Checkbox mit jeder Karte angezeigt.","Reset to default":"Zur\xFCcksetzen","Date & Time":"Datum & Uhrzeit","Date trigger":"Datums Ausl\xF6ser","When this is typed, it will trigger the date selector":"Wenn dies eingegeben wird, dann wird die Datumsauswahl angezeigt","Time trigger":"Uhrzeit Ausl\xF6ser","When this is typed, it will trigger the time selector":"Wenn dies eingegeben wird, dann wird die Uhrzeitsauswahl angezeigt","Date format":"Format des Datums","This format will be used when saving dates in markdown.":"Dieses Format wird verwendet, wenn ein Datum in Markdown gespeichert wird.","For more syntax, refer to":"F\xFCr mehr Syntax Informationen siehe","format reference":"Formatvorlage","Your current syntax looks like this":"Dein momentanes Format sieht so aus","Time format":"Format der Uhrzeit","Date display format":"Format der Datums Anzeige","This format will be used when displaying dates in Kanban cards.":"Dieses Format wird verwendet, wenn ein Datum in einer Kanban-Karte angezeigt wird.","Show relative date":"Zeige relatives Datum","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Wenn aktiviert, wird die Zeitspanne zwischen Heute und dem Datum angezeigt. Zum Beispiel: 'In 3 Tagen', 'Vor einem Monat'","Hide card display dates":"Verstecke Karten Datum","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Wenn aktiviert, werden formatierte Daten nicht auf der Karte angezeigt. Relative Daten werden dennoch angezeigt, solange sie aktiviert sind.","Hide dates in card titles":"Verstecke Daten im Titel der Karte","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Wenn aktiviert, werden Daten nicht im Titel der Karte angezeigt. Dies verhindert, dass Daten im Titel neu erstellter Notizen vorhanden sind.","Link dates to daily notes":"Verbinde Daten zu Daily Notes","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Wenn aktiviert, werden Daten mit Daily Notes verbunden. Zum Beispiel [[26.4.2021]]","Add date and time to archived cards":"F\xFCge Datum und Uhrzeit zu archivierten Notizen hinzu","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Wenn aktiviert, wird das momentane Datum und die momentane Zeit am Anfang einer Karte hinzugef\xFCgt, wenn sie archiviert wird. Zum Beispiel: - [ ] 14.05.2021 10:00 Mein Karten Titel","Archive date/time separator":"Datum/Uhrzeit Trenner f\xFCr das Archiv","This will be used to separate the archived date/time from the title":"Dies wird verwendet, um das Datum und die Uhrzeit archivierter Karten vom Titel zu trennen","Archive date/time format":"Format des Datums und der Uhrzeit f\xFCr das Archiv","Kanban Plugin":"Kanban Erweiterung","New line trigger":"Taste f\xFCr neue Zeile","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"W\xE4hle aus ob Enter oder Umschalttaste+Enter eine neue Zeile erstellen soll. Das Gegenteil kannst du verwenden um die Karte zu erstellen oder das bearbeiten der Karte oder Schiene zu beenden.","Shift + Enter":"Umschalttaste + Enter",Enter:"Enter","Prepend / append new cards":"Neue Karten voranf\xFCgen / anh\xE4ngen","This setting controls whether new cards are added to the beginning or end of the list.":"Diese Einstellung gibt an ob neue Karten am Anfang oder am Ende einer Liste hinzugef\xFCgt werden.",Prepend:"Voranf\xFCgen",Append:"Anh\xE4ngen","Hide tags in card titles":"Ausblenden von Tags in Kartentiteln","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"Ist diese Einstellung an, so werden Tags im Kartentitel nicht angezeigt. Dadurch wird verhindert, dass Tags beim Erstellen neuer Notizen in den Titel aufgenommen werden.","Hide card display tags":"Ausblenden von Kartenanzeige-Tags","When toggled, tags will not be displayed below the card title.":"Ist diese Einstellung an, werden Tags nicht unter dem Kartentitel angezeigt.","Linked Page Metadata":"Metadaten f\xFCr verkn\xFCpfte (verlinkte) Notizen","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Zeigen Sie Metadaten f\xFCr die erste Notiz an, die innerhalb einer Karte verkn\xFCpft ist. Geben Sie an, welche Metadatenschl\xFCssel unten angezeigt werden sollen. Ein optionales Label kann hinzugef\xFCgt werden, es kann aber auch vollst\xE4ndig ausgeblendet werden.","Metadata key":"Metadatenschl\xFCssel","Display label":"Anzeigelabel","Hide label":"Label ausblenden","Drag to rearrange":"Zum Neuanordnen ziehen",Delete:"L\xF6schen","Add key":"Schl\xFCssel hinzuf\xFCgen","Field contains markdown":"Feld beinhaltet Markdown","More options":"Mehr optionen",Cancel:"Abbrechen",today:"heute",yesterday:"gestern",tomorrow:"morgen","Change date":"Ver\xE4ndere Datum","Change time":"Ver\xE4ndere Uhrzeit","Card title...":"Karten Titel...","Add card":"Karte hinzuf\xFCgen","Add a card":"F\xFCge eine Karte hinzu","Edit card":"Karte editieren","New note from card":"Neue Notiz aus Karte erstellen","Archive card":"Karte archivieren","Delete card":"Karte l\xF6schen","Edit date":"Datum editieren","Add date":"Datum hinzuf\xFCgen","Remove date":"Datum entfernen","Edit time":"Karte editieren","Add time":"Uhrzeit hinzuf\xFCgen","Remove time":"Uhrzeit entfernen","Duplicate card":"Karte duplizieren","Enter list title...":"Listen Titel eingeben..","Mark cards in this list as complete":"Markiere Karten in dieser Liste als fertiggestellt","Add list":"Liste hinzuf\xFCgen","Add a list":"F\xFCge eine Liste hinzu","Move list":"Liste verschieben",Close:"Schlie\xDFen","Are you sure you want to delete this list and all its cards?":"Bist du dir sicher, dass du diese Liste und alle ihre Karten l\xF6schen m\xF6chtest?","Yes, delete list":"Ja, l\xF6sche diese Liste","Are you sure you want to archive this list and all its cards?":"Bist du dir sicher, dass du diese Liste und alle ihre Karten archivieren m\xF6chtest?","Yes, archive list":"Ja, archiviere diese Liste","Are you sure you want to archive all cards in this list?":"Bist du dir sicher, dass du alle Karten in dieser Liste archivieren m\xF6chtest?","Yes, archive cards":"Ja, archiviere Karten","Edit list":"Editiere Liste","Archive cards":"Archiviere Karten","Archive list":"Archiviere List","Delete list":"L\xF6sche Liste"};var Mc={"Open as kanban board":"Open as kanban board","Create new board":"Create new board","Archive completed cards in active board":"Archive completed cards in active board","Error: current file is not a Kanban board":"Error: current file is not a Kanban board","Convert empty note to Kanban":"Convert empty note to Kanban","Error: cannot create Kanban, the current note is not empty":"Error: cannot create Kanban, the current note is not empty","New kanban board":"New kanban board","Untitled Kanban":"Untitled Kanban","Toggle between Kanban and markdown mode":"Toggle between Kanban and markdown mode","Open as markdown":"Open as markdown","Open board settings":"Open board settings","Archive completed cards":"Archive completed cards","Something went wrong":"Something went wrong","You may wish to open as markdown and inspect or edit the file.":"You may wish to open as markdown and inspect or edit the file.","Are you sure you want to archive all completed cards on this board?":"Are you sure you want to archive all completed cards on this board?",Complete:"Complete",Archive:"Archive","Invalid Kanban file: problems parsing frontmatter":"Invalid Kanban file: problems parsing frontmatter","I don't know how to interpret this line:":"I don't know how to interpret this line:",Untitled:"Untitled","Note: No template plugins are currently enabled.":"Note: No template plugins are currently enabled.",default:"default","Search...":"Search...","New line trigger":"New line trigger","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.","Shift + Enter":"Shift + Enter",Enter:"Enter","Prepend / append new cards":"Prepend / append new cards","This setting controls whether new cards are added to the beginning or end of the list.":"This setting controls whether new cards are added to the beginning or end of the list.",Prepend:"Prepend","Prepend (compact)":"Prepend (compact)",Append:"Append","These settings will take precedence over the default Kanban board settings.":"These settings will take precedence over the default Kanban board settings.","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.","Note template":"Note template","This template will be used when creating new notes from Kanban cards.":"This template will be used when creating new notes from Kanban cards.","No template":"No template","Note folder":"Note folder","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.","Default folder":"Default folder","Lane width":"Lane width","Enter a number to set the lane width in pixels.":"Enter a number to set the lane width in pixels.","Maximum number of archived cards":"Maximum number of archived cards","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.","Display card checkbox":"Display card checkbox","When toggled, a checkbox will be displayed with each card":"When toggled, a checkbox will be displayed with each card","Reset to default":"Reset to default","Date & Time":"Date & Time","Date trigger":"Date trigger","When this is typed, it will trigger the date selector":"When this is typed, it will trigger the date selector","Time trigger":"Time trigger","When this is typed, it will trigger the time selector":"When this is typed, it will trigger the time selector","Date format":"Date format","This format will be used when saving dates in markdown.":"This format will be used when saving dates in markdown.","For more syntax, refer to":"For more syntax, refer to","format reference":"format reference","Your current syntax looks like this":"Your current syntax looks like this","Time format":"Time format","Date display format":"Date display format","This format will be used when displaying dates in Kanban cards.":"This format will be used when displaying dates in Kanban cards.","Show relative date":"Show relative date","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'","Hide card display dates":"Hide card display dates","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.","Hide dates in card titles":"Hide dates in card titles","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.","Link dates to daily notes":"Link dates to daily notes","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"When toggled, dates will link to daily notes. Eg. [[2021-04-26]]","Add date and time to archived cards":"Add date and time to archived cards","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title","Archive date/time separator":"Archive date/time separator","This will be used to separate the archived date/time from the title":"This will be used to separate the archived date/time from the title","Archive date/time format":"Archive date/time format","Kanban Plugin":"Kanban Plugin","Hide tags in card titles":"Hide tags in card titles","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.","Hide card display tags":"Hide card display tags","When toggled, tags will not be displayed below the card title.":"When toggled, tags will not be displayed below the card title.","Linked Page Metadata":"Linked Page Metadata","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.","Board Header Buttons":"Board Header Buttons","Calendar: first day of week":"Calendar: first day of week","Override which day is used as the start of the week":"Override which day is used as the start of the week",Sunday:"Sunday",Monday:"Monday",Tuesday:"Tuesday",Wednesday:"Wednesday",Thursday:"Thursday",Friday:"Friday",Saturday:"Saturday","Metadata key":"Metadata key","Display label":"Display label","Hide label":"Hide label","Drag to rearrange":"Drag to rearrange",Delete:"Delete","Add key":"Add key","Field contains markdown":"Field contains markdown","More options":"More options",Cancel:"Cancel",today:"today",yesterday:"yesterday",tomorrow:"tomorrow","Change date":"Change date","Change time":"Change time","Card title...":"Card title...","Add card":"Add card","Add a card":"Add a card","Edit card":"Edit card","New note from card":"New note from card","Archive card":"Archive card","Delete card":"Delete card","Edit date":"Edit date","Add date":"Add date","Remove date":"Remove date","Edit time":"Edit time","Add time":"Add time","Remove time":"Remove time","Duplicate card":"Duplicate card","Split card":"Split card","Copy link to card":"Copy link to card","Insert card before":"Insert card before","Insert card after":"Insert card after","Enter list title...":"Enter list title...","Mark cards in this list as complete":"Mark cards in this list as complete","Add list":"Add list","Add a list":"Add a list","Move list":"Move list",Close:"Close","Are you sure you want to delete this list and all its cards?":"Are you sure you want to delete this list and all its cards?","Yes, delete list":"Yes, delete list","Are you sure you want to archive this list and all its cards?":"Are you sure you want to archive this list and all its cards?","Yes, archive list":"Yes, archive list","Are you sure you want to archive all cards in this list?":"Are you sure you want to archive all cards in this list?","Yes, archive cards":"Yes, archive cards","Edit list":"Edit list","Archive cards":"Archive cards","Archive list":"Archive list","Delete list":"Delete list","Insert list before":"Insert list before","Insert list after":"Insert list after","Unable to find":"Unable to find","Open in default app":"Open in default app",Submit:"Submit"};var xm={};var km={};var _m={};var Tm={};var Mm={"Open as kanban board":"Apri come bacheca Kanban","Create new board":"Crea nuova bacheca","Archive completed cards in active board":"Archivia schede completate nella bacheca attiva","Error: current file is not a Kanban board":"Errore: il file corrente non \xE8 una bacheca Kanban","Convert empty note to Kanban":"Converti nota vuota in Kanban","Error: cannot create Kanban, the current note is not empty":"Errore: Impossibile creare Kanban, la nota corrente non \xE8 vuota","New kanban board":"Nuova bacheca Kanban","Untitled Kanban":"Kanban senza titolo","Open as markdown":"Apri come markdown","Open board settings":"Apri impostazioni bacheca","Archive completed cards":"Archivia schede completate",Complete:"Completato",Archive:"Archivio","Note: No template plugins are currently enabled.":"Nota: Nessun plugin dei modelli attualmente abilitato.",default:"predefinito","Search...":"Ricerca...","These settings will take precedence over the default Kanban board settings.":"Queste impostazioni avranno la precedenza sulle impostazioni predefinite della bacheca Kanban.","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Impostazioni predefinite della bacheca Kanban. Le impostazioni possono essere sovrascritte per ogni bacheca.","Note template":"Nota modello","This template will be used when creating new notes from Kanban cards.":"Questo modello verr\xE0 utilizzato durante la creazione di nuove note dalle schede Kanban.","No template":"Nessun modello","Note folder":"Cartella delle note","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"Le note create dalle schede Kanban verranno inserite in questa cartella. Se vuota, verranno inserite nella posizione predefinita del vault.","Default folder":"Cartella predefinita","Lane width":"Larghezza colonna","Enter a number to set the lane width in pixels.":"Inserire un numero per impostare la larghezza della colonna in pixel.","Maximum number of archived cards":"Numero massimo di schede archiviate","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Le schede archiviate possono essere visualizzate in modalit\xE0 Markdown. Le vecchie schede verranno rimosse una volta raggiunto il limite. Impostando il valore -1 il numero di schede archiviate sar\xE0 illimitato.","Display card checkbox":"Mostra casella di controllo","When toggled, a checkbox will be displayed with each card":"Se attiva, verr\xE0 visualizzata una casella di controllo per ogni scheda","Reset to default":"Ripristina predefiniti","Date & Time":"Data e ora","Date trigger":"Selettore data","When this is typed, it will trigger the date selector":"Digitando questo, verr\xE0 attivato il selettore della data","Time trigger":"Selettore ora","When this is typed, it will trigger the time selector":"Digitando questo, verr\xE0 attivato il selettore dell'ora","Date format":"Formato data","This format will be used when saving dates in markdown.":"Formato utilizzato per il salvataggio delle date in Markdown.","For more syntax, refer to":"Per maggiori informazioni, vedere","format reference":"formato di riferimento","Your current syntax looks like this":"Formato corrente","Time format":"Formato ora","Date display format":"Formato visualizzazione data","This format will be used when displaying dates in Kanban cards.":"Formato utilizzato per visualizzare le date nelle schede Kanban.","Show relative date":"Mostra data relativa","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Se attiva, le schede indicheranno la distanza tra la data odierna e la data della scheda. eg. 'Tra 3 giorni', 'Un mese fa'","Hide card display dates":"Hide card display dates","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Se attiva, la data non verr\xE0 mostrata sulla scheda. Le date relative verranno comunque mostrate se sono state abilitate.","Hide dates in card titles":"Nascondi date nei titoli delle schede","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Se attiva, la data non verr\xE0 mostrata nei titoli delle schede. Questo impedisce alle date di essere incluse quando vengono create nuove note.","Link dates to daily notes":"Collega date alle Note del giorno","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Se attiva, le date verranno collegate alle Note del giorno. Eg. [[2021-04-26]]","Add date and time to archived cards":"Aggiungi data e ora alle schede archiviate","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Se attiva, la data e l'ora corrente verranno aggiunte all'inizio della scheda quando viene archiviata. Eg. - [ ] 2021-05-14 10:00am Mia scheda","Archive date/time separator":"Separatore data/ora dell'archivio","This will be used to separate the archived date/time from the title":"Verr\xE0 usato per separare data e ora dell'archiviazione dal titolo","Archive date/time format":"Formato data/ora dell'archivio","Kanban Plugin":"Plugin Kanban","More options":"Altre opzioni",Cancel:"Annulla",today:"oggi",yesterday:"ieri",tomorrow:"domani","Change date":"Modifica data","Change time":"Modifica ora","Card title...":"Titolo elemento...","Add card":"Aggiungi elemento","Add a card":"Aggiungi un'altra scheda","Edit card":"Modifica scheda","New note from card":"Nuova nota da scheda","Archive card":"Archivia scheda","Delete card":"Elimina scheda","Edit date":"Modifica data","Add date":"Aggiungi data","Remove date":"Rimuovi data","Edit time":"Modifica ora","Add time":"Aggiungi ora","Remove time":"Rimuovi ora","Enter list title...":"Inserisci titolo lista...","Mark cards in this list as complete":"Segna elementi della lista come completati","Add list":"Aggiungi lista","Add a list":"Aggiungi un'altra lista","Move list":"Sposta lista",Close:"Chiudi","Are you sure you want to delete this list and all its cards?":"Cancellare questa lista e tutte le sue schede?","Yes, delete list":"Cancella lista","Are you sure you want to archive this list and all its cards?":"Archiviare questa lista e tutte le sue schede?","Yes, archive list":"Archivia lista","Are you sure you want to archive all cards in this list?":"Archiviare tutte le schede in questa lista?","Yes, archive cards":"Archivia schede","Edit list":"Modifica lista","Archive cards":"Archivia schede","Archive list":"Archivia lista","Delete list":"Cancella lista"};var Cm={"Open as kanban board":"\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3068\u3057\u3066\u958B\u304F","Create new board":"\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3092\u65B0\u898F\u4F5C\u6210","Archive completed cards in active board":"\u30A2\u30AF\u30C6\u30A3\u30D6\u30DC\u30FC\u30C9\u306E\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Error: current file is not a Kanban board":"\u30A8\u30E9\u30FC: \u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093","Convert empty note to Kanban":"\u7A7A\u306E\u30CE\u30FC\u30C8\u3092\u30AB\u30F3\u30D0\u30F3\u306B\u5909\u63DB","Error: cannot create Kanban, the current note is not empty":"\u30A8\u30E9\u30FC: \u73FE\u5728\u958B\u3044\u3066\u3044\u308B\u30CE\u30FC\u30C8\u306F\u7A7A\u3067\u3042\u308A\u3001\u30AB\u30F3\u30D0\u30F3\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093","New kanban board":"\u65B0\u898F\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9","Untitled Kanban":"\u7121\u984C\u306E\u30AB\u30F3\u30D0\u30F3","Toggle between Kanban and markdown mode":"\u30AB\u30F3\u30D0\u30F3\u3068\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u306E\u30E2\u30FC\u30C9\u3092\u5207\u308A\u66FF\u3048\u308B","Open as markdown":"\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3068\u3057\u3066\u958B\u304F","Open board settings":"\u30DC\u30FC\u30C9\u8A2D\u5B9A\u3092\u958B\u304F","Archive completed cards":"\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Something went wrong":"\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","You may wish to open as markdown and inspect or edit the file.":"\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3068\u3057\u3066\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3044\u3066\u8ABF\u67FB\u3059\u308B\u304B\u7DE8\u96C6\u3059\u308B\u3053\u3068\u3092\u304A\u3059\u3059\u3081\u3057\u307E\u3059\u3002","Are you sure you want to archive all completed cards on this board?":"\u3053\u306E\u30DC\u30FC\u30C9\u306B\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u5B8C\u4E86\u3057\u305F\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F",Complete:"\u5B8C\u4E86",Archive:"\u30A2\u30FC\u30AB\u30A4\u30D6","Invalid Kanban file: problems parsing frontmatter":"\u7121\u52B9\u306A\u30AB\u30F3\u30D0\u30F3\u30D5\u30A1\u30A4\u30EB: \u30D5\u30ED\u30F3\u30C8\u30DE\u30BF\u30FC\u306E\u30D1\u30FC\u30B9\u306B\u554F\u984C\u304C\u3042\u308A\u307E\u3059","I don't know how to interpret this line:":"\u3053\u306E\u884C\u3092\u3069\u3046\u89E3\u91C8\u3059\u308C\u3070\u3088\u3044\u304B\u5206\u304B\u308A\u307E\u305B\u3093",Untitled:"\u7121\u984C","Note: No template plugins are currently enabled.":"\u30CE\u30FC\u30C8: \u73FE\u5728\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30D7\u30E9\u30B0\u30A4\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059",default:"\u30C7\u30D5\u30A9\u30EB\u30C8","Search...":"\u691C\u7D22\u2026","New line trigger":"\u6539\u884C\u30C8\u30EA\u30AC\u30FC","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"\u6539\u884C\u306B\u4F7F\u3046\u30AD\u30FC\u3068\u3057\u3066Enter\u304BShift+Enter\u306E\u3069\u3061\u3089\u3092\u4F7F\u3046\u304B\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u9078\u629E\u3057\u306A\u304B\u3063\u305F\u65B9\u306E\u30AD\u30FC\u306F\u30AB\u30FC\u30C9\u3068\u30EC\u30FC\u30F3\u306E\u4F5C\u6210\u3068\u7DE8\u96C6\u5B8C\u4E86\u306E\u30C8\u30EA\u30AC\u30FC\u3068\u306A\u308A\u307E\u3059\u3002","Shift + Enter":"Shift + Enter",Enter:"Enter","Prepend / append new cards":"\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306B\u65B0\u898F\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0\u3059\u308B","This setting controls whether new cards are added to the beginning or end of the list.":"\u3053\u306E\u8A2D\u5B9A\u306B\u3088\u3063\u3066\u65B0\u898F\u30AB\u30FC\u30C9\u3092\u30EA\u30B9\u30C8\u306E\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306B\u8FFD\u52A0\u3059\u308B\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002",Prepend:"\u5148\u982D\u306B\u8FFD\u52A0","Prepend (compact)":"\u5148\u982D\u306B\u8FFD\u52A0(\u30B3\u30F3\u30D1\u30AF\u30C8)",Append:"\u672B\u5C3E\u306B\u8FFD\u52A0","These settings will take precedence over the default Kanban board settings.":"\u3053\u308C\u3089\u306E\u8A2D\u5B9A\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30AB\u30F3\u30D0\u30F3\u8A2D\u5B9A\u3088\u308A\u512A\u5148\u3055\u308C\u307E\u3059\u3002","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30AB\u30F3\u30D0\u30F3\u30DC\u30FC\u30C9\u8A2D\u5B9A\u3092\u30BB\u30C3\u30C8\u3057\u307E\u3059\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u30DC\u30FC\u30C9\u6BCE\u306B\u4E0A\u66F8\u304D\u3067\u304D\u307E\u3059\u3002","Note template":"\u30CE\u30FC\u30C8\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8","This template will be used when creating new notes from Kanban cards.":"\u3053\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u304B\u3089\u30CE\u30FC\u30C8\u3092\u65B0\u898F\u4F5C\u6210\u3057\u305F\u969B\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","No template":"\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u304C\u3042\u308A\u307E\u305B\u3093","Note folder":"\u30CE\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u304B\u3089\u4F5C\u6210\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306F\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u5185\u306B\u7F6E\u304B\u308C\u307E\u3059\u3002\u30D6\u30E9\u30F3\u30AF\u306E\u5834\u5408\u306B\u306F\u3001\u3053\u306E\u4FDD\u7BA1\u5EAB\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u7F6E\u304B\u308C\u307E\u3059\u3002","Default folder":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30D5\u30A9\u30EB\u30C0","Lane width":"\u30EC\u30FC\u30F3\u306E\u5E45","Enter a number to set the lane width in pixels.":"\u30EC\u30FC\u30F3\u306E\u5E45\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","Maximum number of archived cards":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306E\u6700\u5927\u6570","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306F\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u30E2\u30FC\u30C9\u3067\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002\u3053\u306E\u8A2D\u5B9A\u306B\u3088\u308A\u6307\u5B9A\u3055\u308C\u305F\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u9650\u754C\u6570\u307E\u3067\u9054\u3057\u305F\u969B\u306B\u306F\u53E4\u3044\u30AB\u30FC\u30C9\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3053\u306E\u5024\u3092-1\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u30DC\u30FC\u30C9\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u9650\u754C\u3092\u7121\u9650\u306B\u3057\u307E\u3059\u3002","Display card checkbox":"\u30AB\u30FC\u30C9\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u3092\u8868\u793A","When toggled, a checkbox will be displayed with each card":"\u6709\u52B9\u5316\u3059\u308B\u3068\u5404\u30AB\u30FC\u30C9\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","Reset to default":"\u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u30EA\u30BB\u30C3\u30C8","Date & Time":"\u65E5\u4ED8\u3068\u6642\u9593","Date trigger":"\u65E5\u4ED8\u30C8\u30EA\u30AC\u30FC","When this is typed, it will trigger the date selector":"\u3053\u306E\u8A2D\u5B9A\u306B\u5165\u529B\u3055\u308C\u305F\u6587\u5B57\u5217\u3067\u65E5\u4ED8\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u30C8\u30EA\u30AC\u30FC\u3057\u307E\u3059\u3002","Time trigger":"\u6642\u9593\u30C8\u30EA\u30AC\u30FC","When this is typed, it will trigger the time selector":"\u3053\u306E\u8A2D\u5B9A\u306B\u5165\u529B\u3055\u308C\u305F\u6587\u5B57\u5217\u3067\u6642\u9593\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u30C8\u30EA\u30AC\u30FC\u3057\u307E\u3059\u3002","Date format":"\u65E5\u4ED8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","This format will be used when saving dates in markdown.":"\u3053\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306F\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3067\u65E5\u4ED8\u304C\u4FDD\u5B58\u3055\u308C\u308B\u969B\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","For more syntax, refer to":"\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u306B\u3064\u3044\u3066\u306F\u3053\u3061\u3089\u3092\u53C2\u7167:","format reference":"\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30EA\u30D5\u30A1\u30EC\u30F3\u30B9","Your current syntax looks like this":"\u73FE\u5728\u306E\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u306F\u6B21\u306E\u3088\u3046\u306B\u898B\u3048\u307E\u3059","Time format":"\u6642\u9593\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","Date display format":"\u65E5\u4ED8\u8868\u793A\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","This format will be used when displaying dates in Kanban cards.":"\u3053\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306F\u30AB\u30F3\u30D0\u30F3\u30AB\u30FC\u30C9\u5185\u306B\u3066\u65E5\u4ED8\u306E\u8868\u793A\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","Show relative date":"\u76F8\u5BFE\u65E5\u4ED8\u3092\u8868\u793A","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u306E\u65E5\u4ED8\u3068\u4ECA\u65E5\u306E\u9593\u306E\u65E5\u6570\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4F8B: '3\u65E5\u5F8C', '1\u30F6\u6708\u524D'","Hide card display dates":"\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3055\u308C\u308B\u65E5\u4ED8\u3092\u96A0\u3059","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u4E0A\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3055\u308C\u305F\u65E5\u4ED8\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u6709\u52B9\u5316\u3055\u308C\u305F\u5834\u5408\u306B\u306F\u76F8\u5BFE\u65E5\u4ED8\u306F\u8868\u793A\u3055\u308C\u307E\u307E\u3068\u306A\u308A\u307E\u3059\u3002","Hide dates in card titles":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u65E5\u4ED8\u3092\u96A0\u3059","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u65E5\u4ED8\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u308C\u306F\u65B0\u898F\u30CE\u30FC\u30C8\u3092\u4F5C\u6210\u3057\u305F\u969B\u306B\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306B\u65E5\u4ED8\u304C\u542B\u307E\u308C\u308B\u306E\u3092\u9632\u304E\u307E\u3059\u3002","Link dates to daily notes":"\u30C7\u30A4\u30EA\u30FC\u30CE\u30FC\u30C8\u306B\u65E5\u4ED8\u3092\u30EA\u30F3\u30AF","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"\u6709\u52B9\u5316\u3059\u308B\u3068\u65E5\u4ED8\u304C\u30C7\u30A4\u30EA\u30FC\u30CE\u30FC\u30C8\u306B\u30EA\u30F3\u30AF\u3055\u308C\u307E\u3059\u3002 \u4F8B: [[2021-04-26]]","Add date and time to archived cards":"\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30AB\u30FC\u30C9\u306B\u65E5\u4ED8\u3068\u6642\u9593\u3092\u8FFD\u52A0","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u304C\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u969B\u306B\u73FE\u5728\u306E\u65E5\u4ED8\u3068\u6642\u9593\u304C\u30AB\u30FC\u30C9\u306E\u6700\u521D\u306B\u8FFD\u8A18\u3055\u308C\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059\u3002\u4F8B: - [ ] 2021-05-14 10:00am \u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB","Archive date/time separator":"\u65E5\u4ED8\u30FB\u6642\u9593\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","This will be used to separate the archived date/time from the title":"\u3053\u308C\u306F\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u65E5\u4ED8\u30FB\u6642\u9593\u3092\u30BF\u30A4\u30C8\u30EB\u304B\u3089\u5206\u96E2\u3059\u308B\u306E\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","Archive date/time format":"\u65E5\u4ED8\u30FB\u6642\u9593\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Kanban Plugin":"\u30AB\u30F3\u30D0\u30F3\u30D7\u30E9\u30B0\u30A4\u30F3","Hide tags in card titles":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u5185\u306E\u30BF\u30B0\u3092\u96A0\u3059","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u5185\u306E\u30BF\u30B0\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u308C\u306F\u65B0\u898F\u30CE\u30FC\u30C8\u3092\u4F5C\u6210\u3057\u305F\u969B\u306B\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306B\u30BF\u30B0\u304C\u542B\u307E\u308C\u308B\u306E\u3092\u9632\u304E\u307E\u3059\u3002","Hide card display tags":"\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3055\u308C\u308B\u30BF\u30B0\u3092\u96A0\u3059","When toggled, tags will not be displayed below the card title.":"\u6709\u52B9\u5316\u3059\u308B\u3068\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u306E\u4E0B\u306E\u30BF\u30B0\u304C\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","Linked Page Metadata":"\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30DA\u30FC\u30B8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"\u30AB\u30FC\u30C9\u5185\u3067\u30EA\u30F3\u30AF\u3055\u308C\u3066\u3044\u308B\u6700\u521D\u306E\u30CE\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u4E0B\u306B\u8868\u793A\u3059\u308B\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u30AD\u30FC\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30AA\u30D7\u30B7\u30E7\u30F3\u3068\u3057\u3066\u30E9\u30D9\u30EB\u306E\u4ED8\u4E0E\u304C\u53EF\u80FD\u3067\u3042\u308A\u3001\u30E9\u30D9\u30EB\u306F\u5B8C\u5168\u306B\u975E\u8868\u793A\u306B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","Board Header Buttons":"\u30DC\u30FC\u30C9\u306E\u30D8\u30C3\u30C0\u30FC\u30DC\u30BF\u30F3","Calendar: first day of week":"\u30AB\u30EC\u30F3\u30C0\u30FC: \u9031\u306E\u59CB\u307E\u308A","Override which day is used as the start of the week":"\u9031\u306E\u59CB\u307E\u308A\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u66DC\u65E5\u3092\u5909\u66F4\u3057\u307E\u3059\u3002",Sunday:"\u65E5\u66DC\u65E5",Monday:"\u6708\u66DC\u65E5",Tuesday:"\u706B\u66DC\u65E5",Wednesday:"\u6C34\u66DC\u65E5",Thursday:"\u6728\u66DC\u65E5",Friday:"\u91D1\u66DC\u65E5",Saturday:"\u571F\u66DC\u65E5","Metadata key":"\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u30AD\u30FC","Display label":"\u30E9\u30D9\u30EB\u3092\u8868\u793A","Hide label":"\u30E9\u30D9\u30EB\u3092\u96A0\u3059","Drag to rearrange":"\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E26\u3079\u66FF\u3048\u308B",Delete:"\u524A\u9664","Add key":"\u30AD\u30FC\u3092\u8FFD\u52A0","Field contains markdown":"\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u3092\u542B\u307F\u307E\u3059","More options":"\u4ED6\u306E\u30AA\u30D7\u30B7\u30E7\u30F3",Cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",today:"\u4ECA\u65E5",yesterday:"\u6628\u65E5",tomorrow:"\u660E\u65E5","Change date":"\u65E5\u4ED8\u3092\u5909\u66F4","Change time":"\u6642\u9593\u3092\u5909\u66F4","Card title...":"\u30AB\u30FC\u30C9\u30BF\u30A4\u30C8\u30EB\u2026","Add card":"\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0","Add a card":"\u30AB\u30FC\u30C9\u3092\u8FFD\u52A0","Edit card":"\u30AB\u30FC\u30C9\u3092\u7DE8\u96C6","New note from card":"\u30AB\u30FC\u30C9\u304B\u3089\u30CE\u30FC\u30C8\u3092\u65B0\u898F\u4F5C\u6210","Archive card":"\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Delete card":"\u30AB\u30FC\u30C9\u3092\u524A\u9664","Edit date":"\u65E5\u4ED8\u3092\u7DE8\u96C6","Add date":"\u65E5\u4ED8\u3092\u8FFD\u52A0","Remove date":"\u65E5\u4ED8\u3092\u524A\u9664","Edit time":"\u6642\u9593\u3092\u7DE8\u96C6","Add time":"\u6642\u9593\u3092\u8FFD\u52A0","Remove time":"\u6642\u9593\u3092\u524A\u9664","Duplicate card":"\u30AB\u30FC\u30C9\u3092\u8907\u88FD","Split card":"\u30AB\u30FC\u30C9\u3092\u5206\u5272","Copy link to card":"\u30AB\u30FC\u30C9\u3078\u306E\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","Enter list title...":"\u30EA\u30B9\u30C8\u30BF\u30A4\u30C8\u30EB\u3092\u7DE8\u96C6\u2026","Mark cards in this list as complete":"\u3053\u306E\u30EA\u30B9\u30C8\u306B\u542B\u307E\u308C\u308B\u30AB\u30FC\u30C9\u3092\u5B8C\u4E86\u3068\u3057\u3066\u30DE\u30FC\u30AF\u3059\u308B","Add list":"\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0","Add a list":"\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0","Move list":"\u30EA\u30B9\u30C8\u3092\u79FB\u52D5",Close:"\u9589\u3058\u308B","Are you sure you want to delete this list and all its cards?":"\u3053\u306E\u30EA\u30B9\u30C8\u3068\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u524A\u9664\u3057\u307E\u3059\u304B\b\uFF1F","Yes, delete list":"\u306F\u3044\u3001\u30EA\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059","Are you sure you want to archive this list and all its cards?":"\u3053\u306E\u30EA\u30B9\u30C8\u3068\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F","Yes, archive list":"\u306F\u3044\u3001\u30EA\u30B9\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059","Are you sure you want to archive all cards in this list?":"\u3053\u306E\u30EA\u30B9\u30C8\u306B\u542B\u307E\u308C\u308B\u3059\u3079\u3066\u306E\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059\u304B\uFF1F","Yes, archive cards":"\u306F\u3044\u3001\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u3057\u307E\u3059","Edit list":"\u30EA\u30B9\u30C8\u3092\u7DE8\u96C6","Archive cards":"\u30AB\u30FC\u30C9\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Archive list":"\u30EA\u30B9\u30C8\u3092\u30A2\u30FC\u30AB\u30A4\u30D6","Delete list":"\u30EA\u30B9\u30C8\u3092\u524A\u9664","Unable to find":"\u898B\u3064\u304B\u308A\u307E\u305B\u3093","Open in default app":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30A2\u30D7\u30EA\u3067\u958B\u304F"};var Dm={};var Am={};var Im={};var Lm={};var Pm={};var Om={"Open as Kanban board":"Abrir como quadro Kanban","Create new board":"Criar um novo quadro","Archive completed cards in active board":"Arquivar cart\xF5es conclu\xEDdos no quadro ativo","Error: current file is not a Kanban board":"Erro: o arquivo atual n\xE3o \xE9 um quadro Kanban","Convert empty note to Kanban":"Converter nota vazia em Kanban","Error: cannot create Kanban, the current note is not empty":"Erro: n\xE3o \xE9 poss\xEDvel criar o quadro Kanban, a nota atual n\xE3o est\xE1 vazia","New Kanban board":"Novo quadro Kanban","Untitled Kanban":"Kanban sem t\xEDtulo","Toggle between Kanban and markdown mode":"Alternar entre os modos Kanban e Markdown","Open as markdown":"Abrir como markdown","Open board settings":"Abrir configura\xE7\xF5es do quadro Kanban","Archive completed cards":"Arquivar cart\xF5es conclu\xEDdos",Complete:"Conclu\xEDdo",Archive:"Arquivado","Note: No template plugins are currently enabled.":"Nota: N\xE3o h\xE1 plug-ins de modelo habilitados no momento.",default:"padr\xE3o","Search...":"Pesquisar...","These settings will take precedence over the default Kanban board settings.":"Essas configura\xE7\xF5es sobrescrever\xE3o as configura\xE7\xF5es padr\xE3o do quadro Kanban","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"Defina as configura\xE7\xF5es padr\xE3o do quadro Kanban. Cada quadro Kanban pode ter sua pr\xF3pria configura\xE7\xE3o.","Note template":"Modelo de nota","This template will be used when creating new notes from Kanban cards.":"Este modelo ser\xE1 usado quando uma nova nota Kanban for criada.","No template":"Sem modelo","Note folder":"Pasta de notas","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"As notas criadas pelos links dos cart\xF5es Kanban ser\xE3o colocadas nesta pasta. Se estiver em branco, ser\xE3o colocadas no local configurado como padr\xE3o deste cofre.","Default folder":"Pasta padr\xE3o","Lane width":"Largura das listas","Enter a number to set the lane width in pixels.":"Insira um n\xFAmero para definir a largura das listas em pixels.","Maximum number of archived cards":"Quantidade m\xE1xima de cart\xF5es arquivados","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"Os cart\xF5es arquivados podem ser vistos no modo Markdown. Esta configura\xE7\xE3o excluir\xE1 os cart\xF5es antigos assim que o limite for atingido. Inserir o valor -1 retira o limite para cart\xF5es arquivados.","Display card checkbox":"Exibe uma caixa de sele\xE7\xE3o do cart\xE3o","When toggled, a checkbox will be displayed with each card":"Quando ativada, uma caixa de sele\xE7\xE3o ser\xE1 exibida em cada cart\xE3o.","Reset to default":"Redefinir configura\xE7\xF5es padr\xE3o","Date & Time":"Data e Hora","Date trigger":"Gatilho de data","When this is typed, it will trigger the date selector":"Quando este caractere \xE9 digitado, o seletor de data \xE9 exibido.","Time trigger":"Gatilho de hora","When this is typed, it will trigger the time selector":"Quando este caractere \xE9 digitado, o seletor de hora \xE9 exibido.","Date format":"Formado da data","This format will be used when saving dates in markdown.":"Este formato ser\xE1 usado quando datas forem armazenadas no Markdown.","For more syntax, refer to":"Para mais informa\xE7\xF5es sobre esta sintaxe, consulte os","format reference":"modelos de formato.","Your current syntax looks like this":"Sua atual sintaxe est\xE1 assim","Time format":"Formato da hora","Date display format":"Formato de exibi\xE7\xE3o da data","This format will be used when displaying dates in Kanban cards.":"Este ser\xE1 o formato das datas exibido nos cart\xF5es do Kanban.","Show relative date":"Exibir datas relativas","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"Ao ativar, os cart\xF5es exibir\xE3o o intervalo de tempo entre hoje e a data do cart\xE3o: Ex.: 'Em 3 dias', 'Um m\xEAs atr\xE1s'","Hide card display dates":"Ocultar datas dos cart\xF5es","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"Ao ativar, as datas formatadas n\xE3o ser\xE3o exibidas no cart\xE3o. As datas relativas ainda ser\xE3o exibidas se estiverem ativadas.","Hide dates in card titles":"Ocultar datas dos t\xEDtulos dos cart\xF5es","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"Ao ativar, as datas ser\xE3o t\xEDtulos de cart\xF5es ocultos. Evita que datas sejam inclu\xEDdas no t\xEDtulo ao criar novas notas.","Link dates to daily notes":"Vincular datas a notas di\xE1rias","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"Ao ativar, as datas ser\xE3o vinculadas \xE0s notas di\xE1rias. Ex.: [[2021-04-26]]","Add date and time to archived cards":"Adicionar data e hora aos cart\xF5es arquivados","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"Quando ativada, a data e a hora atuais ser\xE3o adicionadas ao in\xEDcio de um cart\xE3o quando ele for arquivado. Ex.: - [] 2021-05-14 10:00 T\xEDtulo do meu cart\xE3o","Archive date/time separator":"Separador de data/hora do arquivo","This will be used to separate the archived date/time from the title":"Isso ser\xE1 usado para separar a data/hora arquivada do t\xEDtulo.","Archive date/time format":"Formato de data/hora do arquivo","Kanban Plugin":"Plugin Kanban","Hide tags in card titles":"Ocultar \u2018tags\u2019 nos t\xEDtulos dos cart\xF5es","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"Quando ativada, as \u2018tags\u2019 n\xE3o ser\xE3o exibidas nos t\xEDtulos de cartas. Isso impedir\xE1 que as \u2018tags\u2019 sejam inclu\xEDdas no t\xEDtulo ao criar novas notas.","Hide card display tags":"Ocultar \u2018tags\u2019 de exibi\xE7\xE3o de cart\xE3o","When toggled, tags will not be displayed below the card title.":"Quando ativada, as \u2018tags\u2019 n\xE3o ser\xE3o exibidas abaixo do t\xEDtulo do cart\xE3o.","Linked Page Metadata":"Metadados de p\xE1ginas 'lincadas'","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"Exibe metadados para a primeira nota 'lincada' em um cart\xE3o. Especifique abaixo quais metadados ser\xE3o exibidos. Um r\xF3tulo opcional pode ser fornecido e os r\xF3tulos podem ser ocultados completamente.","Metadata key":"Metadado","Display label":"Descri\xE7\xE3o personalizada","Hide label":"Ocultar","Drag to rearrange":"Arraste para reorganizar",Delete:"Excluir","Add key":"Adicionar metadado","More options":"Mais op\xE7\xF5es",Cancel:"Cancelar",today:"hoje",yesterday:"ontem",tomorrow:"amanh\xE3","Change date":"Alterar data","Change time":"Mudar hora","Card title...":"T\xEDtulo do item...","Add card":"Adicionar Item","Add a card":"Adicione um cart\xE3o","Edit card":"Editar cart\xE3o","New note from card":"Nova nota do cart\xE3o","Archive card":"Arquivar cart\xE3o","Delete card":"Excluir cart\xE3o","Edit date":"Editar data","Add date":"Adicionar data","Remove date":"Remover data","Edit time":"Editar hora","Add time":"Adicionar hora","Remove time":"Remover hora","Duplicate card":"Duplicate card","Enter list title...":"Insira o t\xEDtulo da lista...","Mark cards in this list as complete":"Marcar os itens nesta lista como conclu\xEDdos","Add list":"Adicionar lista","Add a list":"Adicionar uma lista","Move list":"Mover lista",Close:"Fechar","Are you sure you want to delete this list and all its cards?":"Tem certeza de que deseja excluir esta lista e todos os seus cart\xF5es?","Yes, delete list":"Sim, excluir esta lista","Are you sure you want to archive this list and all its cards?":"Tem certeza de que deseja arquivar esta lista e todos os seus cart\xF5es?","Yes, archive list":"Sim, arquivar esta lista","Are you sure you want to archive all cards in this list?":"Tem certeza de que deseja arquivar todos os cart\xF5es desta lista?","Yes, archive cards":"Sim, arquivar cart\xF5es","Edit list":"Editar lista","Archive cards":"Arquivar cart\xF5es","Archive list":"Arquivar lista","Delete list":"Excluir lista"};var Nm={};var Fm={};var Rm={};var ts={};var Hm={"Open as kanban board":"\u6253\u5F00\u4E3A\u770B\u677F","Create new board":"\u521B\u5EFA\u65B0\u770B\u677F","Archive completed cards in active board":"\u5728\u5F53\u524D\u770B\u677F\u4E2D\u5F52\u6863\u5DF2\u5B8C\u6210\u5361\u7247","Error: current file is not a Kanban board":"\u9519\u8BEF\uFF1A\u5F53\u524D\u6587\u4EF6\u4E0D\u662F\u770B\u677F\u6587\u4EF6","Convert empty note to Kanban":"\u8F6C\u6362\u7A7A\u767D\u6587\u6863\u4E3A\u770B\u677F","Error: cannot create Kanban, the current note is not empty":"\u9519\u8BEF\uFF1A\u65E0\u6CD5\u8F6C\u6362\u5F53\u524D\u6587\u4EF6\uFF0C\u5F53\u524D\u6587\u4EF6\u4E0D\u662F\u7A7A\u767D\u6587\u6863","New kanban board":"\u65B0\u770B\u677F","Untitled Kanban":"\u672A\u547D\u540D\u770B\u677F","Toggle between Kanban and markdown mode":"\u5728\u770B\u677F\u548C Markdown \u6A21\u5F0F\u4E4B\u95F4\u8FDB\u884C\u5207\u6362","Open as markdown":"\u6253\u5F00\u4E3A Markdown \u6587\u4EF6","Open board settings":"\u6253\u5F00\u770B\u677F\u8BBE\u7F6E","Archive completed cards":"\u5F52\u6863\u5DF2\u5B8C\u6210\u5361\u7247","Something went wrong":"\u51FA\u4E86\u70B9\u95EE\u9898 `(*>\uFE4F<*)\u2032 ","You may wish to open as markdown and inspect or edit the file.":"\u4F60\u53EF\u80FD\u5E0C\u671B\u4EE5 Markdown \u65B9\u5F0F\u6253\u5F00\uFF0C\u5E76\u68C0\u67E5\u6216\u7F16\u8F91\u8BE5\u6587\u4EF6\u3002","Are you sure you want to archive all completed cards on this board?":"\u4F60\u786E\u5B9A\u8981\u5C06\u8FD9\u4E2A\u677F\u5757\u4E0A\u6240\u6709\u5DF2\u5B8C\u6210\u7684\u5361\u7247\u5F52\u6863\u5417\uFF1F",Complete:"\u5B8C\u6210",Archive:"\u5F52\u6863","Invalid Kanban file: problems parsing frontmatter":"\u65E0\u6548\u7684\u770B\u677F\u6587\u4EF6\uFF1A\u89E3\u6790\u524D\u7AEF\u5185\u5BB9\u65F6\u51FA\u73B0\u95EE\u9898","I don't know how to interpret this line:":"\u6211\u4E0D\u77E5\u9053\u5982\u4F55\u89E3\u8BFB\u8FD9\u53E5\u8BDD: ",Untitled:"\u672A\u547D\u540D","Note: No template plugins are currently enabled.":"\u6CE8\u610F\uFF1A\u5F53\u524D\u6A21\u677F\u63D2\u4EF6\u6CA1\u6709\u8FD0\u884C",default:"\u9ED8\u8BA4","Search...":"\u641C\u7D22...","New line trigger":"\u6362\u884C\u89E6\u53D1\u5668","Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.":"\u9009\u62E9 Enter \u6216\u662F Shift+Enter \u6765\u521B\u5EFA\u65B0\u884C, \u4F60\u6CA1\u6709\u9009\u62E9\u7684\u5C06\u7528\u6765\u521B\u5EFA\u548C\u5B8C\u6210\u5361\u7247","Prepend / append new cards":"\u8FFD\u52A0\u65B0\u5361","This setting controls whether new cards are added to the beginning or end of the list.":"\u8BBE\u7F6E\u65B0\u5361\u7247\u6DFB\u52A0\u5230\u5217\u8868\u5934\u90E8\u6216\u5C3E\u90E8\u3002",Prepend:"\u5934\u90E8","Prepend (compact)":"\u5934\u90E8 (\u7D27\u51D1)",Append:"\u5C3E\u90E8","These settings will take precedence over the default Kanban board settings.":"\u5F53\u524D\u770B\u677F\u8BBE\u7F6E\u5C06\u4F1A\u8986\u76D6\u9ED8\u8BA4\u7684\u770B\u677F\u8BBE\u7F6E","Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.":"\u8BBE\u7F6E\u770B\u677F\u7684\u9ED8\u8BA4\u8BBE\u7F6E\u3002\u8BBE\u7F6E\u53EF\u4EE5\u6BCF\u4E2A\u770B\u677F\u5355\u72EC\u8BBE\u7F6E\u3002","Note template":"\u7B14\u8BB0\u6A21\u677F","This template will be used when creating new notes from Kanban cards.":"\u521B\u5EFA\u65B0\u770B\u677F\u5361\u7247\u65F6\u4F1A\u4F7F\u7528\u8BE5\u6A21\u677F","No template":"\u6CA1\u6709\u6A21\u677F","Note folder":"\u7B14\u8BB0\u5B58\u653E\u4F4D\u7F6E","Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.":"\u4ECE\u770B\u677F\u5361\u7247\u521B\u5EFA\u7684\u7B14\u8BB0\u4F1A\u653E\u7F6E\u5230\u8BE5\u6587\u4EF6\u5939\u4E2D\uFF0C\u5982\u679C\u8FD9\u91CC\u4E3A\u7A7A\uFF0C\u5728\u770B\u677F\u521B\u5EFA\u7684\u7B14\u8BB0\u4F1A\u653E\u7F6E\u5230 Obsidian \u7684\u9ED8\u8BA4\u6587\u4EF6\u5B58\u653E\u4F4D\u7F6E\u3002","Default folder":"\u9ED8\u8BA4\u6587\u4EF6\u5939","Lane width":"\u5361\u7247\u5BBD\u5EA6","Enter a number to set the lane width in pixels.":"\u8F93\u5165\u4E00\u4E2A\u6570\u5B57\u6765\u8BBE\u7F6E\u770B\u677F\u7684\u5361\u7247\u5BBD\u5EA6","Maximum number of archived cards":"\u5355\u4E2A\u770B\u677F\u7684\u5F52\u6863\u5361\u7247\u7684\u6700\u5927\u6570\u91CF","Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.":"\u5DF2\u5F52\u6863\u7684\u5361\u7247\u53EF\u4EE5\u5728 Markdown \u6A21\u5F0F\u4E0B\u67E5\u770B\u3002\u8FD9\u4E2A\u8BBE\u7F6E\u4F1A\u5BFC\u81F4\u63D2\u4EF6\u5728\u5DF2\u5F52\u6863\u7684\u5361\u7247\u6570\u91CF\u62B5\u8FBE\u9650\u5236\u503C\u65F6\u5F00\u59CB\u5220\u9664\u5361\u7247\u3002\u5F53\u524D\u503C\u8BBE\u7F6E\u4E3A -1 \u7684\u8BDD\u53EF\u4EE5\u6C38\u4E45\u4FDD\u7559\u6240\u6709\u5F52\u6863\u5361\u7247\u3002","Display card checkbox":"\u5C55\u793A\u5361\u7247\u590D\u9009\u6846","When toggled, a checkbox will be displayed with each card":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u590D\u9009\u6846\u4F1A\u51FA\u73B0\u5728\u6BCF\u4E2A\u5361\u7247\u4E0A","Reset to default":"\u8FD8\u539F\u521D\u59CB\u8BBE\u7F6E","Date & Time":"\u65E5\u671F\u548C\u65F6\u95F4","Date trigger":"\u65E5\u671F\u89E6\u53D1\u6307\u4EE4","When this is typed, it will trigger the date selector":"\u5F53\u5728\u770B\u677F\u5361\u7247\u4E2D\u8F93\u5165\u8FD9\u4E2A\u65F6\uFF0C\u4F1A\u89E6\u53D1\u4E00\u4E2A\u65E5\u671F\u9009\u62E9\u5668","Time trigger":"\u65F6\u95F4\u89E6\u53D1\u6307\u4EE4","When this is typed, it will trigger the time selector":"\u5F53\u5728\u770B\u677F\u5361\u7247\u4E2D\u8F93\u5165\u8FD9\u4E2A\u65F6\uFF0C\u4F1A\u89E6\u53D1\u4E00\u4E2A\u65F6\u95F4\u9009\u62E9\u5668","Date format":"\u65E5\u671F\u683C\u5F0F","This format will be used when saving dates in markdown.":"\u8FD9\u4E2A\u683C\u5F0F\u4F1A\u5728\u65E5\u671F\u4FDD\u5B58\u5230 Markdown \u683C\u5F0F\u65F6\u4F7F\u7528\u3002","For more syntax, refer to":"\u66F4\u591A\u683C\u5F0F\uFF0C\u8BF7\u67E5\u770B","format reference":"\u683C\u5F0F\u53C2\u8003","Your current syntax looks like this":"\u4F60\u5F53\u524D\u8BBE\u7F6E\u7684\u683C\u5F0F\u4F1A\u662F","Time format":"\u65F6\u95F4\u683C\u5F0F","Date display format":"\u65E5\u671F\u5C55\u793A\u683C\u5F0F","This format will be used when displaying dates in Kanban cards.":"\u5728\u770B\u677F\u5361\u7247\u4E2D\uFF0C\u4F1A\u57FA\u4E8E\u8BE5\u683C\u5F0F\u5C55\u793A\u65E5\u671F","Show relative date":"\u5C55\u793A\u76F8\u5BF9\u65E5\u671F","When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u4F1A\u5C55\u793A\u5176\u8BBE\u7F6E\u7684\u65E5\u671F\u4E0E\u4ECA\u5929\u7684\u65E5\u671F\u7684\u5DEE\u503C\uFF0C\u4F8B\u5982\u4E09\u5929\u5185\u3001\u4E00\u4E2A\u6708\u5185\u7B49\u3002","Hide card display dates":"\u9690\u85CF\u5361\u7247\u65E5\u671F","When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u683C\u5F0F\u5316\u7684\u65E5\u671F\u4E0D\u4F1A\u5C55\u793A\uFF0C\u4F46\u662F\u5982\u679C\u4F60\u5F00\u542F\u4E86\u76F8\u5BF9\u65E5\u671F\u7684\u529F\u80FD\uFF0C\u76F8\u5BF9\u65E5\u671F\u8FD8\u662F\u4F1A\u7EE7\u7EED\u5C55\u793A\u3002","Hide dates in card titles":"\u5728\u5361\u7247\u6807\u9898\u4E2D\u9690\u85CF\u65E5\u671F","When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E2D\u7684\u65E5\u671F\u4F1A\u9690\u85CF\uFF0C\u5F53\u57FA\u4E8E\u5361\u7247\u521B\u5EFA\u65B0\u7B14\u8BB0\u7684\u65F6\u5019\u53EF\u4EE5\u907F\u514D\u65E5\u671F\u6DF7\u6742\u5176\u4E2D\u3002","Link dates to daily notes":"\u94FE\u63A5\u65E5\u671F\u5230\u65E5\u8BB0","When toggled, dates will link to daily notes. Eg. [[2021-04-26]]":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u65E5\u671F\u4F1A\u81EA\u52A8\u94FE\u63A5\u5230\u65E5\u8BB0\u9875\u9762\uFF0C\u4F8B\u5982 [[2021-04-26]]","Add date and time to archived cards":"\u6DFB\u52A0\u65E5\u671F\u548C\u65F6\u95F4\u5230\u5F52\u6863\u5361\u7247","When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5F53\u524D\u7684\u65E5\u671F\u548C\u65F6\u95F4\u4F1A\u88AB\u6DFB\u52A0\u5230\u5F52\u6863\u7684\u5361\u7247\u7684\u524D\u7AEF\u4E0A\uFF0C\u4F8B\u5982\u201C- [ ] 2021-05-14 10:00am \u6211\u7684\u5361\u7247\u6807\u9898\u201D","Archive date/time separator":"\u65E5\u671F\u6216\u65F6\u95F4\u5206\u9694\u7B26","This will be used to separate the archived date/time from the title":"\u7528\u4E8E\u4ECE\u5206\u9694\u5F52\u6863\u5361\u7247\u7684\u65E5\u671F\u6216\u65F6\u95F4","Archive date/time format":"\u5F52\u6863\u65E5\u671F\u6216\u65F6\u95F4\u683C\u5F0F","Kanban Plugin":"\u770B\u677F\u63D2\u4EF6","Hide tags in card titles":"\u9690\u85CF\u5361\u7247\u6807\u9898\u4E2D\u7684\u6807\u7B7E","When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E2D\u7684\u6807\u7B7E\u5C06\u4F1A\u88AB\u9690\u85CF\uFF0C\u6765\u907F\u514D\u751F\u6210\u5361\u7247\u7B14\u8BB0\u7684\u65F6\u5019\u9644\u5E26\u4E0A\u6807\u7B7E","Hide card display tags":"\u9690\u85CF\u5361\u7247\u4E0A\u7684\u6807\u7B7E","When toggled, tags will not be displayed below the card title.":"\u5F53\u6253\u5F00\u8FD9\u4E2A\uFF0C\u5361\u7247\u6807\u9898\u4E0B\u65B9\u7684\u6807\u7B7E\u5C06\u4E0D\u4F1A\u5C55\u793A","Linked Page Metadata":"\u8FDE\u63A5\u7684\u9875\u9762\u5143\u6570\u636E","Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.":"\u5C55\u793A\u5361\u7247\u4E2D\u7B2C\u4E00\u4E2A\u8FDE\u63A5\u6240\u5BF9\u5E94\u7684\u7B14\u8BB0\u5143\u6570\u636E\uFF0C\u8BF7\u5728\u4E0B\u65B9\u6307\u5B9A\u54EA\u4E9B\u5143\u6570\u636E\u53EF\u4EE5\u5C55\u793A\u3002\u4F60\u53EF\u4EE5\u9009\u62E9\u5C55\u793A\u6807\u5FD7\uFF0C\u6807\u5FD7\u53EF\u4EE5\u90FD\u88AB\u9690\u85CF\u3002","Board Header Buttons":"\u677F\u5934\u6309\u94AE","Calendar: first day of week":"\u65E5\u5386\uFF1A\u4E00\u5468\u7684\u7B2C\u4E00\u5929","Override which day is used as the start of the week":"\u54EA\u4E00\u5929\u4F5C\u4E3A\u4E00\u5468\u7684\u5F00\u59CB",Sunday:"\u5468\u65E5",Monday:"\u5468\u4E00",Tuesday:"\u5468\u4E8C",Wednesday:"\u5468\u4E09",Thursday:"\u5468\u56DB",Friday:"\u5468\u4E94",Saturday:"\u5468\u516D","Metadata key":"\u5143\u6570\u636E\u53C2\u6570\u540D","Display label":"\u5C55\u793A\u6807\u5FD7","Hide label":"\u9690\u85CF\u6807\u5FD7","Drag to rearrange":"\u62D6\u52A8\u6765\u91CD\u6392\u987A\u5E8F",Delete:"\u5220\u9664","Add key":"\u6DFB\u52A0\u53C2\u6570\u540D","Field contains markdown":"\u5B57\u6BB5\u5305\u542B Markdown","More options":"\u66F4\u591A\u9009\u9879",Cancel:"\u53D6\u6D88",today:"\u4ECA\u5929",yesterday:"\u6628\u5929",tomorrow:"\u660E\u5929","Change date":"\u66F4\u6539\u65E5\u671F","Change time":"\u66F4\u6539\u65F6\u95F4","Card title...":"\u5361\u7247\u6807\u9898","Add card":"\u6DFB\u52A0","Add a card":"\u6DFB\u52A0\u5361\u7247","Edit card":"\u7F16\u8F91\u5361\u7247","New note from card":"\u4ECE\u5361\u7247\u65B0\u5EFA\u7B14\u8BB0","Archive card":"\u5F52\u6863\u5361\u7247","Delete card":"\u5220\u9664\u5361\u7247","Edit date":"\u7F16\u8F91\u65E5\u671F","Add date":"\u6DFB\u52A0\u65E5\u671F","Remove date":"\u79FB\u9664\u65E5\u671F","Edit time":"\u7F16\u8F91\u65F6\u95F4","Add time":"\u6DFB\u52A0\u65F6\u95F4","Remove time":"\u79FB\u9664\u65F6\u95F4","Duplicate card":"\u590D\u5236\u5361\u7247","Split card":"\u5206\u79BB\u5361\u7247","Copy link to card":"\u590D\u5236\u94FE\u63A5\u81F3\u5361\u7247","Enter list title...":"\u8F93\u5165\u65B0\u7684\u5217\u6807\u9898","Mark cards in this list as complete":"\u5C06\u8BE5\u5217\u8BBE\u7F6E\u4E3A\u5B8C\u6210\u5217","Add list":"\u6DFB\u52A0","Add a list":"\u6DFB\u52A0\u5217","Move list":"\u79FB\u52A8\u5217",Close:"\u5173\u95ED","Are you sure you want to delete this list and all its cards?":"\u4F60\u786E\u5B9A\u4F60\u8981\u5220\u9664\u6574\u5217\u4EE5\u53CA\u8BE5\u5217\u4E0B\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, delete list":"\u662F\uFF0C\u5220\u9664\u5217","Are you sure you want to archive this list and all its cards?":"\u4F60\u786E\u5B9A\u4F60\u8981\u5F52\u6863\u6574\u5217\u4EE5\u53CA\u8BE5\u5217\u4E0B\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, archive list":"\u662F, \u5F52\u6863\u5217","Are you sure you want to archive all cards in this list?":"\u4F60\u786E\u8BA4\u4F60\u8981\u5F52\u6863\u5F53\u524D\u5217\u7684\u6240\u6709\u5361\u7247\u5417\uFF1F","Yes, archive cards":"\u662F\uFF0C\u5F52\u6863\u6240\u6709\u5361\u7247","Edit list":"\u7F16\u8F91\u5217","Archive cards":"\u5F52\u6863\u5361\u7247","Archive list":"\u5F52\u6863\u5217","Delete list":"\u5220\u9664\u5217","Unable to find":"\u65E0\u6CD5\u627E\u5230","Open in default app":"\u5728\u9ED8\u8BA4\u5E94\u7528\u4E2D\u6253\u5F00"};var Bm={};var fx={ar:bm,cz:wm,da:Em,de:Sm,en:Mc,es:xm,fr:km,hi:_m,id:Tm,it:Mm,ja:Cm,ko:Dm,nl:Am,no:Im,pl:Lm,"pt-BR":Om,pt:Pm,ro:Nm,ru:Fm,sq:Rm,tr:ts,uk:ts,"zh-TW":Bm,zh:Hm},Km=window.localStorage.getItem("language"),Cc=fx[Km||"en"];function F(t){return Cc||console.error("Error: kanban locale not found",Km),Cc&&Cc[t]||Mc[t]}function tr(t,n){return Dc.Platform.isMobile?!0:n.getSetting("new-line-trigger")==="enter"?t.key==="Enter"&&!(t.shiftKey||t.metaKey||t.ctrlKey):t.key==="Enter"&&t.shiftKey}var gr=v.forwardRef(function({onEnter:n,onEscape:e,onSubmit:r,...i},a){let{view:o,stateManager:s}=v.useContext(We),u=v.useMemo(()=>o.app.vault.getConfig("autoPairMarkdown"),[o]),l=v.useMemo(()=>o.app.vault.getConfig("autoPairBrackets"),[o]),c=v.useMemo(()=>o.app.vault.getConfig("useTab"),[o]),d=v.useMemo(()=>o.app.vault.getConfig("tabSize"),[o]),f=!!o.app.vault.getConfig("useMarkdownLinks"),h=om({isInputVisible:!0,onEnter:n,onEscape:e,onKeyDown:p=>{if(p.key==="Backspace"){let g=mm(p.target);return g||gm(p.target)}if(tr(p,s)){let g=ym(p.target);if(g)return p.preventDefault(),g}if(p.key==="Tab")return p.preventDefault(),vm(p.target,p.shiftKey,c,d);if(u){let g=Tc[p.key];if(g&&g(p.target))return p.preventDefault(),!0}if(l){if(f&&p.key==="[")return!1;let g=_c[p.key];if(g&&g(p.target))return p.preventDefault(),!0}return!1}});return v.useEffect(()=>{let p=g=>{let w=hm[g];w&&w(h.ref.current)};return o.emitter.on("hotkey",p),()=>{o.emitter.off("hotkey",p)}},[o]),v.createElement(v.Fragment,null,v.createElement("div",{"data-replicated-value":i.value,className:$("grow-wrap")},v.createElement("textarea",{"data-ignore-drag":!0,rows:1,className:$("item-input"),...i,...h,ref:p=>{h.ref.current=p,a&&typeof a=="function"?a(p):a&&(a.current=p)}})),Dc.Platform.isMobile&&v.createElement("button",{onPointerDown:r,className:$("item-submit-button")},F("Submit")))});var Lc=me($m());var vr=me(require("obsidian"));var hx=["bmp","png","jpg","jpeg","gif","svg"],px=["mp3","wav","m4a","3gp","flac","ogg","oga"],mx=["mp4","webm","ogv"],gx=/\u00A0/g,vx=/[!"#$%&()*+,.:;<=>?@^`{|}~/[\]\\]/g;function Um(t){return t.replace(vx," ").replace(/\s+/g," ").trim()}function Pr(t){let e=t.replace(gx," ").normalize("NFC").split(/\|(.*)/),r=e[0].split(/#(.*)/);return{root:r[0],subpath:r[1]?"#"+r[1]:"",alias:e[1]||""}}function yx(t,n){if(!t||!n)return null;let e=n.split("#").filter(l=>!!l);if(!e||e.length===0)return null;if(e.length===1){let l=e[0];if(l.startsWith("^")){let c=l.slice(1).toLowerCase(),d=t.blocks;if(d&&d[c]){let f=d[c];return{type:"block",block:f,start:f.position.start.offset,end:f.position.end.offset}}else return null}}let r=t.headings;if(!r||r.length===0)return null;let i=0,a=0,o=0,s=null,u=null;for(;ao&&Um(l.heading).toLowerCase()===Um(e[i]).toLowerCase()&&(i++,o=l.level,i===e.length&&(s=l))}return s?{type:"heading",current:s,next:u,start:s.position.start.offset,end:u?u.position.start.offset:null}:null}function bx(t){t.querySelectorAll(".task-list-item-checkbox").forEach((e,r)=>{e.dataset.checkboxIndex=r.toString()})}function wx(t,n){t.querySelectorAll(".internal-link").forEach(r=>{let i=Pr(r.getAttr("href"));n.app.metadataCache.getFirstLinkpathDest(i.root,n.file.path)||r.addClass("is-unresolved")})}function Ex(t,n,e){t.empty(),t.createEl("img",{attr:{src:e.app.vault.getResourcePath(n)}},r=>{t.hasAttribute("width")&&r.setAttribute("width",t.getAttribute("width")),t.hasAttribute("height")&&r.setAttribute("height",t.getAttribute("height")),t.hasAttribute("alt")&&r.setAttribute("alt",t.getAttribute("alt"))}),t.addClasses(["image-embed","is-loaded"])}function zm(t,n,e){t.empty(),t.createEl("audio",{attr:{controls:"",src:e.app.vault.getResourcePath(n)}}),t.addClasses(["media-embed","is-loaded"])}function Sx(t,n,e){t.empty(),t.createEl("video",{attr:{controls:"",src:e.app.vault.getResourcePath(n)}},r=>{let i=()=>{r.removeEventListener("loadedmetadata",i),r.videoWidth===0&&r.videoHeight===0&&(t.empty(),zm(t,n,e))};r.addEventListener("loadedmetadata",i)}),t.addClasses(["media-embed","is-loaded"])}async function Vm(t,n,e){let r=e.app.metadataCache.getFileCache(t);if(!r)return null;let i=await e.app.vault.cachedRead(t);if(!n.subpath)return i;let a=yx(r,n.subpath);if(a)return i.substring(a.start,a.end===null?void 0:a.end);if(n.subpath)return`${F("Unable to find")} ${n.root}${n.subpath}`}function jm(t,n,e,r){setTimeout(async()=>{if(e.plugin.viewMap.has(e.id)){let i=await Vm(t,n,e);if(!i)return;i.startsWith(F("Unable to find"))?r>0&&jm(t,n,e,--r):e.plugin.stateManagers.forEach(a=>{a.onFileMetadataChange()})}},2e3)}async function xx(t,n,e,r,i){let a=await Vm(n,e,r);if(!a)return;t.empty();let o=t.createDiv();o.addClasses(["markdown-preview-view",$("markdown-preview-view")]),o.createDiv($("embed-link-wrapper"),s=>{s.createEl("a",{href:t.getAttr("src")||n.basename,cls:`internal-link ${$("embed-link")}`},u=>{(0,vr.setIcon)(u,"link"),u.setAttr("aria-label",n.basename)})}),await vr.MarkdownRenderer.renderMarkdown(a,o.createDiv(),n.path,r),t.addClass("is-loaded"),a.startsWith(F("Unable to find"))&&e.subpath&&e.subpath!=="#"&&jm(n,e,r,4),i>0&&await Wm(o,r,--i)}function kx(t,n){t.addClass("is-loaded"),t.empty(),t.createEl("a",{cls:"file-link",href:t.getAttribute("src"),text:n.name},e=>{e.setAttribute("aria-label",F("Open in default app")),e.createSpan({},r=>(0,vr.setIcon)(r,"open-elsewhere-glyph"))})}function Wm(t,n,e){return Promise.all(t.findAll(".internal-embed").map(async r=>{let i=r.getAttribute("src"),a=Pr(i),o=typeof i=="string"&&n.app.metadataCache.getFirstLinkpathDest(a.root,n.file.path);if(o instanceof vr.TFile)return hx.contains(o.extension)?Ex(r,o,n):px.contains(o.extension)?zm(r,o,n):mx.contains(o.extension)?Sx(r,o,n):o.extension==="md"?await xx(r,o,a,n,e):kx(r,o)}))}async function ya(t,n){let e=createDiv();try{await vr.MarkdownRenderer.renderMarkdown(n,e,t.file.path,t),await Wm(e,t,5),bx(e),wx(e,t)}catch(r){console.error(r)}return e}function Pc(t,n){!n||!t||(t&&!t.firstChild?t.appendChild(n):t.firstChild&&t.firstChild!==n&&t.replaceChild(n,t.firstChild))}var ba=v.memo(function({className:n,markdownString:e,searchQuery:r,...i}){let{stateManager:a}=v.useContext(We),o=v.useRef(),s=v.useRef(),u=v.useRef();return v.useEffect(()=>{ya(a.getAView(),e).then(l=>{s.current=l,u.current=new Lc.default(l),o.current&&Pc(o.current,l)}).catch(l=>{a.setError(l),console.error(l)})},[a,e]),v.useEffect(()=>{var l,c;(l=u.current)==null||l.unmark(),r&&r.trim()&&((c=u.current)==null||c.mark(r))},[r]),v.createElement("div",{ref:l=>{o.current=l,Pc(l,s.current)},className:wt(["markdown-preview-view",$("markdown-preview-view"),n]),...i})}),qm=v.memo(function({dom:n,className:e,searchQuery:r,...i}){let{stateManager:a}=v.useContext(We),o=v.useMemo(()=>n.cloneNode(!0),[n,a]),s=v.useMemo(()=>new Lc.default(o),[o]);return v.useEffect(()=>{s.unmark(),r&&r.trim()&&s.mark(r)},[s,r]),v.createElement("div",{ref:u=>{Pc(u,o)},className:wt(["markdown-preview-view",$("markdown-preview-view"),e]),...i})});var wa=me(require("obsidian"));function _x(t,n){if(n)return n.from((0,wa.moment)());let e=(0,wa.moment)().startOf("day");if(e.isSame(t,"day"))return F("today");let r=t.diff(e,"day");return r===-1?F("yesterday"):r===1?F("tomorrow"):t.from(e)}function Ym({item:t,stateManager:n}){if(!n.useSetting("show-relative-date")||!t.data.metadata.date)return null;let r=_x(t.data.metadata.date,t.data.metadata.time);return v.createElement("span",{className:$("item-metadata-date-relative")},r)}function Jm({item:t,stateManager:n,filePath:e,onEditDate:r,onEditTime:i}){let a=n.useSetting("hide-date-display"),o=n.useSetting("date-format"),s=n.useSetting("time-format"),u=n.useSetting("date-display-format"),l=n.useSetting("link-date-to-daily-note");if(a||!t.data.metadata.date)return null;let c=t.data.metadata.date.format(o);if(!c)return null;let d=!!t.data.metadata.time,f=t.data.metadata.date.format(u),h=d?t.data.metadata.time.format(s):null,p=c?(0,wa.getLinkpath)(c):null,g=c?n.app.metadataCache.getFirstLinkpathDest(p,e):null,w=p&&l?v.createElement("a",{href:p,"data-href":p,className:`internal-link ${g?"":"is-unresolved"}`,target:"blank",rel:"noopener"},f):f,S={};return l||(S["aria-label"]=F("Change date"),S.onClick=r),v.createElement("span",{className:$("item-metadata-date-wrapper")},v.createElement("span",{...S,className:`${$("item-metadata-date")} ${l?"":"is-button"}`},w)," ",d&&v.createElement("span",{onClick:i,className:`${$("item-metadata-time")} is-button`,"aria-label":F("Change time")},h))}function Tx(t){let{stateManager:n,boardModifiers:e}=v.useContext(We),r=Wn();return v.useMemo(()=>({onEditDate:o=>{var s;Ro(n,{x:o.clientX,y:o.clientY},Ho({stateManager:n,boardModifiers:e,item:t,hasDate:!0,path:r}),(s=t.data.metadata.date)==null?void 0:s.toDate())},onEditTime:o=>{Bo(n,{x:o.clientX,y:o.clientY},Ko({stateManager:n,boardModifiers:e,item:t,hasTime:!0,path:r}),t.data.metadata.time)}}),[e,r,t,n])}function Mx(t,n){let e=0;return t.replace(/^(\s*[-+*]\s+?\[)([^\]])(\]\s+)/gm,(r,i,a,o)=>{let s=r;return e===n&&(a===" "?s=`${i}x${o}`:s=`${i} ${o}`),e++,s})}var Gm=v.memo(function({item:n,isEditing:e,setIsEditing:r,searchQuery:i}){var T;let[a,o]=v.useState(n.data.titleRaw),{stateManager:s,filePath:u,boardModifiers:l}=v.useContext(We),c=s.useSetting("hide-tags-display"),d=Wn(),{onEditDate:f,onEditTime:h}=Tx(n);v.useEffect(()=>{e&&o(n.data.titleRaw)},[e]);let p=v.useCallback(k=>{if(!tr(k,s))return k.preventDefault(),s.updateItemContent(n,a).then(D=>{l.updateItem(d,D)}).catch(D=>{s.setError(D),console.error(D)}),r(!1),!0},[s,a,n,d]),g=v.useCallback(()=>{s.updateItemContent(n,a).then(k=>{l.updateItem(d,k)}).catch(k=>{s.setError(k),console.error(k)}),r(!1)},[s,a,n,d]),w=v.useCallback(()=>(r(!1),o(n.data.titleRaw),!0),[n]),S=v.useCallback(k=>{let D=k.target;if(D.hasClass("task-list-item-checkbox")){let N=parseInt(D.dataset.checkboxIndex,10);s.updateItemContent(n,Mx(n.data.titleRaw,N)).then(C=>{l.updateItem(d,C)}).catch(C=>{s.setError(C),console.error(C)})}},[d,l,s,n]);return e?v.createElement("div",{className:$("item-input-wrapper")},v.createElement(gr,{className:$("item-input"),onChange:k=>o(k.target.value),onEnter:p,onEscape:w,onSubmit:g,value:a,onPaste:k=>{qo(k,s)}})):v.createElement("div",{className:$("item-title")},v.createElement(qm,{className:$("item-markdown"),dom:n.data.dom,searchQuery:i,onClick:S}),v.createElement("div",{className:$("item-metadata")},v.createElement(Ym,{item:n,stateManager:s}),v.createElement(Jm,{item:n,stateManager:s,filePath:u,onEditDate:f,onEditTime:h}),!c&&!!((T=n.data.metadata.tags)==null?void 0:T.length)&&v.createElement("div",{className:$("item-tags")},n.data.metadata.tags.map((k,D)=>v.createElement("a",{href:k,key:D,className:`tag ${$("item-tag")} ${k.toLocaleLowerCase().contains(i)?"is-search-match":""}`},v.createElement("span",null,k[0]),k.slice(1))))))});var ns=me(require("obsidian"));var Cx=/[\\/:"*?<>|]+/g,Dx=/!?\[\[([^\]]*)\.[^\]]+\]\]/g,Ax=/!?\[\[([^\]]*)\]\]/g,Ix=/!?\[([^\]]*)\]\([^)]*\)/g;function Qm({setIsEditing:t,item:n,path:e,boardModifiers:r,stateManager:i}){return v.useCallback((a,o)=>{if(o)i.app.workspace.onLinkContextMenu(a,(0,ns.getLinkpath)(o),i.file.path);else{let s={x:a.clientX,y:a.clientY},u=!!n.data.metadata.date,l=!!n.data.metadata.time,c=new ns.Menu(i.app).addItem(d=>{d.setIcon("pencil").setTitle(F("Edit card")).onClick(()=>t(!0))});c.addItem(d=>{d.setIcon("create-new").setTitle(F("New note from card")).onClick(async()=>{let f=n.data.title.split(` +`)[0].trim(),h=f.replace(Dx,"$1").replace(Ax,"$1").replace(Ix,"$1").replace(Cx," ").trim(),p=i.getSetting("new-note-folder"),g=i.getSetting("new-note-template"),w=p?i.app.vault.getAbstractFileByPath(p):i.app.fileManager.getNewFileParent(i.file.path),S=await i.app.fileManager.createNewMarkdownFile(w,h),T=i.app.workspace.splitActiveLeaf();await T.openFile(S),i.app.workspace.setActiveLeaf(T,!1,!0),await Kd(i,g);let k=n.data.titleRaw.replace(f,i.app.fileManager.generateMarkdownLink(S,i.file.path));i.updateItemContent(n,k).then(D=>{r.updateItem(e,D)}).catch(D=>{i.setError(D),console.error(D)})})}).addItem(d=>{d.setIcon("links-coming-in").setTitle(F("Copy link to card")).onClick(()=>{if(n.data.blockId)navigator.clipboard.writeText(`${this.app.fileManager.generateMarkdownLink(i.file,"","#^"+n.data.blockId)}`);else{let f=Ke(6);navigator.clipboard.writeText(`${this.app.fileManager.generateMarkdownLink(i.file,"","#^"+f)}`),i.updateItemContent(n,`${n.data.titleRaw} ^${f}`).then(h=>{r.updateItem(e,h)}).catch(h=>{i.setError(h),console.error(h)})}})}).addSeparator(),/\n/.test(n.data.titleRaw)&&c.addItem(d=>{d.setIcon("split").setTitle(F("Split card")).onClick(async()=>{let f=n.data.titleRaw.split(/[\r\n]+/g).map(p=>p.trim()),h=await Promise.all(f.map(p=>i.getNewItem(p)));r.splitItem(e,h)})}),c.addItem(d=>{d.setIcon("documents").setTitle(F("Duplicate card")).onClick(()=>r.duplicateEntity(e))}).addItem(d=>{d.setIcon("plus-with-circle").setTitle(F("Insert card before")).onClick(async()=>r.insertItems(e,[await i.getNewItem("",!1,!0)]))}).addItem(d=>{d.setIcon("plus-with-circle").setTitle(F("Insert card after")).onClick(async()=>{let f=[...e];f[f.length-1]=f[f.length-1]+1,r.insertItems(f,[await i.getNewItem("",!1,!0)])})}).addItem(d=>{d.setIcon("sheets-in-box").setTitle(F("Archive card")).onClick(()=>r.archiveItem(e))}).addItem(d=>{d.setIcon("trash").setTitle(F("Delete card")).onClick(()=>r.deleteEntity(e))}).addSeparator().addItem(d=>{d.setIcon("calendar-with-checkmark").setTitle(u?F("Edit date"):F("Add date")).onClick(()=>{var f;Ro(i,s,Ho({stateManager:i,boardModifiers:r,item:n,hasDate:u,path:e}),(f=n.data.metadata.date)==null?void 0:f.toDate())})}),u&&(c.addItem(d=>{d.setIcon("cross").setTitle(F("Remove date")).onClick(()=>{let f=i.getSetting("link-date-to-daily-note"),h=i.getSetting("date-trigger"),p=f?"(?:\\[[^\\]]+\\]\\([^\\)]+\\)|\\[\\[[^\\]]+\\]\\])":"{[^}]+}",g=new RegExp(`(^|\\s)${Fn(h)}${p}`),w=n.data.titleRaw.replace(g,"").trim();i.updateItemContent(n,w).then(S=>{r.updateItem(e,S)}).catch(S=>{i.setError(S),console.error(S)})})}),c.addItem(d=>{d.setIcon("clock").setTitle(l?F("Edit time"):F("Add time")).onClick(()=>{Bo(i,s,Ko({stateManager:i,boardModifiers:r,item:n,hasTime:l,path:e}),n.data.metadata.time)})}),l&&c.addItem(d=>{d.setIcon("cross").setTitle(F("Remove time")).onClick(()=>{let f=i.getSetting("time-trigger"),h=new RegExp(`(^|\\s)${Fn(f)}{([^}]+)}`),p=n.data.titleRaw.replace(h,"").trim();i.updateItemContent(n,p).then(g=>{r.updateItem(e,g)}).catch(g=>{i.setError(g),console.error(g)})})})),c.showAtPosition(s)}},[t,n,e,r,i])}var Xm=v.memo(function({isEditing:n,setIsEditing:e,showMenu:r}){let i=v.useMemo(()=>n?{"data-ignore-drag":!0}:{},[n]);return v.createElement("div",{...i,className:$("item-postfix-button-wrapper")},n?v.createElement("button",{"data-ignore-drag":!0,onPointerDown:a=>{a.preventDefault()},onClick:()=>{e(!1)},className:`${$("item-postfix-button")} is-enabled`,"aria-label":F("Cancel")},v.createElement(en,{name:"cross"})):v.createElement("button",{"data-ignore-drag":!0,onPointerDown:a=>a.preventDefault(),onClick:r,className:$("item-postfix-button"),"aria-label":F("More options")},v.createElement(en,{name:"vertical-three-dots"})))});function Zm({item:t,isSettingsVisible:n,searchQuery:e}){return n||!t.data.metadata.fileMetadata?null:v.createElement("div",{className:$("item-metadata-wrapper")},v.createElement(Px,{metadata:t.data.metadata.fileMetadata,order:t.data.metadata.fileMetadataOrder,searchQuery:e}))}function eg(t){return`${t.embed?"!":""}[[${t.path}${t.display?`|${t.display}`:""}]]`}function Lx({data:t,searchQuery:n}){if(Array.isArray(t.value))return v.createElement("span",{className:$("meta-value")},t.value.map((a,o,s)=>{let u=`${a}`,l=typeof a=="object"&&eg(a),c=u.toLocaleLowerCase().contains(n);return v.createElement(v.Fragment,null,l||t.containsMarkdown?v.createElement(ba,{className:"inline",markdownString:l||u,searchQuery:n}):c?v.createElement("span",{className:"is-search-match"},u):u,o{let a=n[i];return v.createElement("tr",{key:i,className:$("meta-row")},!a.shouldHideLabel&&v.createElement("td",{className:`${$("meta-key")} ${(a.label||i).toLocaleLowerCase().contains(r)?"is-search-match":""}`,"data-key":i},v.createElement("span",null,a.label||i)),v.createElement("td",{colSpan:a.shouldHideLabel?2:1,className:$("meta-value-wrapper"),"data-value":Array.isArray(a.value)?a.value.join(", "):`${a.value}`},i==="tags"?a.value.map((o,s)=>v.createElement("a",{href:o,key:s,className:`tag ${$("item-tag")} ${o.toLocaleLowerCase().contains(r)?"is-search-match":""}`},v.createElement("span",null,o[0]),o.slice(1))):v.createElement(Lx,{data:a,searchQuery:r})))})))});var tg=v.memo(function({item:n,shouldMarkItemsComplete:e,isMatch:r,searchQuery:i}){let{stateManager:a,boardModifiers:o}=v.useContext(We),[s,u]=v.useState(!1),l=v.useContext(Et);v.useEffect(()=>{let g=()=>{s&&u(!1)};return l.dragManager.emitter.on("dragStart",g),()=>{l.dragManager.emitter.off("dragStart",g)}},[l,s]),v.useEffect(()=>{n.data.forceEditMode&&u(!0)},[n.data.forceEditMode]);let c=Wn(),d=Qm({boardModifiers:o,item:n,setIsEditing:u,stateManager:a,path:c}),f=v.useCallback(g=>{if(g.target instanceof HTMLTextAreaElement)return;g.preventDefault(),g.stopPropagation();let w=g.target instanceof HTMLAnchorElement&&g.target.hasClass("internal-link")?g.target.dataset.href:void 0;d(g.nativeEvent,w)},[d]),h=v.useCallback(()=>{u(!0)},[u]),p=v.useMemo(()=>s?{"data-ignore-drag":!0}:{},[s]);return v.createElement("div",{onContextMenu:f,onDoubleClick:h,className:$("item-content-wrapper"),...p},v.createElement("div",{className:$("item-title-wrapper"),...p},v.createElement(mp,{boardModifiers:o,item:n,path:c,shouldMarkItemsComplete:e,stateManager:a}),v.createElement(Gm,{isEditing:s,item:n,searchQuery:r?i:void 0,setIsEditing:u}),v.createElement(Xm,{isEditing:s,setIsEditing:u,showMenu:d})),v.createElement(Zm,{searchQuery:r?i:void 0,isSettingsVisible:s,item:n}))}),Oc=v.memo(function(n){let e=v.useRef(null),r=v.useRef(null),i=v.useContext(Ya),{itemIndex:a,...o}=n;gi(r,r);let s=i?o.item.data.titleSearch.contains(i):!1,u=cp(o.item);return i&&(s?u.push("is-search-hit"):u.push("is-search-miss")),v.createElement("div",{ref:r,className:$("item-wrapper")},v.createElement("div",{ref:e,className:wt([$("item"),...u])},n.isStatic?v.createElement(tg,{...o,isMatch:s,searchQuery:i}):v.createElement(ur,{elementRef:e,measureRef:r,id:n.item.id,index:a,data:n.item},v.createElement(tg,{...o,isMatch:s,searchQuery:i}))))}),ng=v.memo(function({isStatic:n,items:e,shouldMarkItemsComplete:r}){return v.createElement(v.Fragment,null,e.map((i,a)=>v.createElement(Oc,{key:i.id,item:i,itemIndex:a,shouldMarkItemsComplete:r,isStatic:n})))});var _g=me(Nc());var Tg=me(It());var Kx="scroll-container",as=8,os=["top","right","bottom","left"],Fc=class{constructor(n,e,r,i,a){this.scrollFrame=0;this.onScroll=()=>{this.activeScroll.size===0&&(this.scrollState=vl(this.scrollEl),this.handleEntityRegistration())};this.onDragEnd=()=>{this.activeScroll.clear()};this.handleBeginDragScroll=({scrollEntitySide:n,scrollStrength:e})=>{this.isDoneScrolling(n)||(this.activeScroll.set(n,e),this.handleDragScroll())};this.handleUpdateDragScroll=({scrollEntitySide:n,scrollStrength:e})=>{this.isDoneScrolling(n)||this.activeScroll.set(n,e)};this.handleEndDragScroll=({scrollEntitySide:n})=>{this.activeScroll.delete(n)};this.dndManager=n,this.instanceId=Ke(),this.scopeId=e,this.triggerTypes=r,this.scrollState=on,this.parent=i,this.activeScroll=new Map,this.pollForNodes(a)}pollForNodes(n){n()?this.initNodes(n()):requestAnimationFrame(()=>this.pollForNodes(n))}initNodes(n){this.scrollEl=n,this.scrollEl.dataset.hitboxid=this.instanceId,this.scrollEl.dataset.scrollid=this.instanceId,this.top=this.createScrollEntity("top"),this.right=this.createScrollEntity("right"),this.bottom=this.createScrollEntity("bottom"),this.left=this.createScrollEntity("left"),this.bindScrollHandlers(),this.observerHandlers=new Map,this.observer=new IntersectionObserver(e=>{e.forEach(r=>{if(r.target instanceof HTMLElement){let i=r.target.dataset.hitboxid;if(i&&this.observerHandlers.has(i)){let a=this.observerHandlers.get(i);a&&a(r)}}})},{root:n,threshold:.1}),this.scrollEl.addEventListener("scroll",this.onScroll,{passive:!0,capture:!1}),this.dndManager.emitter.on("scrollResize",this.onScroll),setTimeout(()=>{this.onScroll()}),this.dndManager.observeResize(this.scrollEl),this.parent?this.parent.registerObserverHandler(this.instanceId,this.scrollEl,e=>{e.isIntersecting?this.handleEntityRegistration():this.handleEntityUnregistration()}):this.handleEntityRegistration()}destroy(){var n;this.handleEntityUnregistration(),this.observer.disconnect(),this.unbindScrollHandlers(),this.scrollEl.removeEventListener("scroll",this.onScroll),this.dndManager.emitter.off("scrollResize",this.onScroll),(n=this.parent)==null||n.unregisterObserverHandler(this.instanceId,this.scrollEl),this.dndManager.unobserveResize(this.scrollEl)}handleEntityRegistration(){os.forEach(n=>{let e=this.getId(n),r=this.dndManager.scrollEntities.has(e),i=this.isDoneScrolling(n);!i&&!r?this.dndManager.registerScrollEntity(e,this[n]):i&&r&&this.dndManager.unregisterScrollEntity(e)})}handleEntityUnregistration(){os.forEach(n=>{let e=this.getId(n);this.dndManager.unregisterScrollEntity(e)})}registerObserverHandler(n,e,r){this.observerHandlers.set(n,r),this.observer.observe(e)}unregisterObserverHandler(n,e){this.observerHandlers.delete(n),this.observer.unobserve(e)}bindScrollHandlers(){os.forEach(n=>{let e=this.getId(n);this.dndManager.dragManager.emitter.on("beginDragScroll",this.handleBeginDragScroll,e),this.dndManager.dragManager.emitter.on("updateDragScroll",this.handleUpdateDragScroll,e),this.dndManager.dragManager.emitter.on("endDragScroll",this.handleEndDragScroll,e),this.dndManager.dragManager.emitter.on("dragEnd",this.onDragEnd)})}unbindScrollHandlers(){os.forEach(n=>{let e=this.getId(n);this.dndManager.dragManager.emitter.off("beginDragScroll",this.handleBeginDragScroll,e),this.dndManager.dragManager.emitter.off("updateDragScroll",this.handleUpdateDragScroll,e),this.dndManager.dragManager.emitter.off("endDragScroll",this.handleEndDragScroll,e),this.dndManager.dragManager.emitter.off("dragEnd",this.onDragEnd)})}isDoneScrolling(n){switch(n){case"top":return this.scrollState.y===0;case"right":return this.scrollState.x===this.scrollState.maxX;case"bottom":return this.scrollState.y===this.scrollState.maxY;case"left":return this.scrollState.x===0}}handleDragScroll(){this.activeScroll.size!==0&&requestAnimationFrame(()=>{let n={left:0,top:0};this.activeScroll.forEach((e,r)=>{if(this.isDoneScrolling(r))return this.activeScroll.delete(r);let i=["left","right"].includes(r)?"left":"top",a=["right","bottom"].includes(r);n[i]=a?Math.max(as-as*e/35,0):Math.min(-as+as*e/35,0)}),this.scrollEl.scrollBy(n),this.scrollState=vl(this.scrollEl),this.handleEntityRegistration(),this.handleDragScroll()})}getId(n){return`${this.instanceId}-${n}`}getPath(n){var e,r,i,a;switch(n){case"right":return[...((e=this.parent)==null?void 0:e.getPath())||[],1];case"bottom":return[...((r=this.parent)==null?void 0:r.getPath())||[],2];case"left":return[...((i=this.parent)==null?void 0:i.getPath())||[],3]}return[...((a=this.parent)==null?void 0:a.getPath())||[],0]}getScrollShift(){var e,r,i;let n=(e=this.parent)==null?void 0:e.getScrollShift();return{x:Qe((r=this.parent)==null?void 0:r.scrollState.x)+Qe(n==null?void 0:n.x),y:Qe((i=this.parent)==null?void 0:i.scrollState.y)+Qe(n==null?void 0:n.y)}}createScrollEntity(n){var r,i;let e=this;return{scopeId:this.scopeId,entityId:e.getId(n),initial:ml(this.scrollEl.getBoundingClientRect(),((r=this.parent)==null?void 0:r.scrollState)||on,((i=this.parent)==null?void 0:i.getScrollShift())||Rn,n),getParentScrollState(){var a;return((a=e.parent)==null?void 0:a.scrollState)||on},getParentScrollShift(){var a;return((a=e.parent)==null?void 0:a.getScrollShift())||Rn},recalcInitial(){var a,o;this.initial=ml(e.scrollEl.getBoundingClientRect(),((a=e.parent)==null?void 0:a.scrollState)||on,((o=e.parent)==null?void 0:o.getScrollShift())||Rn,n)},getHitbox(){return eo(this.initial[0],this.initial[1],this.initial[2],this.initial[3],this.getParentScrollState(),this.getParentScrollShift())},getPath(){return e.getPath(n)},getData(){return{id:e.getId(n),type:Kx,side:n,accepts:e.triggerTypes||[],scrollContainer:e.scrollEl}}}}};function ig({scrollRef:t,triggerTypes:n,children:e}){let r=v.useContext(Et),i=v.useContext(cr),a=v.useContext(Wi),o=v.useRef(),s=v.useMemo(()=>{if(r){o.current&&o.current.destroy();let u=new Fc(r,i,n||[],a,()=>t.current);return o.current=u,u}return null},[r,i,t,n,a]);return v.useEffect(()=>()=>{var u;return(u=o.current)==null?void 0:u.destroy()},[]),s?v.createElement(Wi.Provider,{value:s},e):null}function ag({children:t}){let n=v.useMemo(()=>new ji,[]);return v.createElement(qi.Provider,{value:n},t)}function og(t,n){let e=v.useContext(cr),r=v.useRef(null),i=v.useContext(qi),a=o=>{r.current=o,r.current&&requestAnimationFrame(()=>{let s=i.getScrollState(t);s&&(s.x!==0||s.y!==0)&&(r.current.scrollLeft=s.x,r.current.scrollTop=s.y)})};return v.useEffect(()=>{let o=r.current;if(!o)return;let s=So(u=>{let l=u.target;i.setScrollState(e,t,{x:l.scrollLeft,y:l.scrollTop})});return o.addEventListener("scroll",s),()=>{o.removeEventListener("scroll",s)}},[i,t,n]),{setRef:a,scrollRef:r}}function ss({className:t,children:n,triggerTypes:e,isStatic:r,id:i,index:a}){let{setRef:o,scrollRef:s}=og(i,a);return v.createElement("div",{ref:o,className:wt([t,$("scroll-container")])},r?n:v.createElement(ig,{scrollRef:s,triggerTypes:e},n))}var sg={outOfTheWay:"cubic-bezier(0.2, 0, 0, 1)",drop:"cubic-bezier(.2,1,.1,1)"};var bi={outOfTheWay:200,minDropTime:330,maxDropTime:550},yr=`${bi.outOfTheWay}ms ${sg.outOfTheWay}`;var un={none:"none",fluid:`opacity ${yr}`,snap:`transform ${yr}, opacity ${yr}`,drop:t=>{let n=`${t}ms ${sg.drop}`;return`transform ${n}, opacity ${n}`},outOfTheWay:`transform ${yr}`,placeholder:`height ${yr}, width ${yr}, margin ${yr}, border-color ${yr}`},$x=(t,n)=>t.x===n.x&&t.y===n.y,Ux={x:0,y:0},lg=t=>$x(t,Ux)?void 0:`translate(${t.x}px, ${t.y}px)`,cg={moveTo:lg,drop:t=>lg(t)},zx=bi.maxDropTime-bi.minDropTime,ug=1500,Vx=.6;function wi({position:t,destination:n,isCancel:e}){let r=Zr(t,n);if(r<=0)return bi.minDropTime;if(r>=ug)return bi.maxDropTime;let i=r/ug,a=bi.minDropTime+zx*i,o=e?a*Vx:a;return Math.round(o)}function kn(t,n,e){t.style.getPropertyValue(n)!==e&&t.style.setProperty(n,e)}function ls(t,n){t.style.getPropertyValue(n)&&t.style.removeProperty(n)}var Rc={width:0,height:0},jx=100,Hc=class{constructor(n,e,r){this.hitboxDimensions=Rc;this.handleDragStart=({dragEntity:n,dragEntityMargin:e,dragOriginHitbox:r})=>{let i=n==null?void 0:n.entityId,a=i?this.sortables.has(i):null;!n||!a||!r||(this.setSortState(!0),this.hitboxDimensions=yl(r,e),this.activatePlaceholder(this.hitboxDimensions,un.none),this.sortables.forEach(([o,s,u])=>{let l=Ui(n.getPath(),o.getPath()),c=o.entityId;if(l===an.Self)return this.hidden.add(c),this.hideDraggingEntity(u);l===an.After&&(this.shifted.has(c)||this.shifted.add(c),this.shiftEl(s,un.none,this.hitboxDimensions))}))};this.dragEndTimeout=0;this.handleDragEnd=({primaryIntersection:n,dragPosition:e,dragOriginHitbox:r,dragEntity:i})=>{if(!this.isSorting||!e||!r||!i){if(!n&&i&&this.sortables.has(i.entityId))return this.resetSelf({maintainHidden:!1});if(n&&i){let s=(n==null?void 0:n.getHitbox())||r,u=wi({position:e,destination:{x:s[0],y:s[1]}});return window.setTimeout(()=>{this.resetSelf({maintainHidden:!1})},u)}return this.resetSelf({maintainHidden:!0})}clearTimeout(this.dragEnterTimeout),clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEndTimeout);let a=(n==null?void 0:n.getHitbox())||r,o=i.scopeId==="htmldnd"?0:wi({position:e,destination:{x:a[0],y:a[1]}});this.dragEndTimeout=window.setTimeout(()=>{let s=i.entityId.split(":::").pop(),u=n==null?void 0:n.entityId.split(":::").pop();n&&this.sortables.has(n.entityId)&&u!==s&&this.dndManager.onDrop(i,n),this.resetSelf({maintainHidden:!1,shiftTransition:un.none,placeholderTransition:un.none})},o),this.hitboxDimensions=Rc};this.dragEnterTimeout=0;this.handleDragEnter=({dragEntity:n,dragEntityMargin:e,dragOriginHitbox:r,primaryIntersection:i})=>{let a=i==null?void 0:i.entityId,o=a?this.sortables.has(a):null;if(!n||!i||!o||!r){!o&&this.isSorting&&this.resetSelf({maintainHidden:!0,maintainPlaceholder:!0});return}n.entityId!==i.entityId&&(clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEnterTimeout),this.dragEnterTimeout=window.setTimeout(()=>{this.setSortState(!0),this.hitboxDimensions=yl(r,e),this.activatePlaceholder(this.hitboxDimensions,un.placeholder),this.sortables.forEach(([s,u])=>{let l=Ui(i.getPath(),s.getPath()),c=s.entityId;!this.hidden.has(c)&&(l===an.Self||l===an.After)?this.shifted.has(c)||(this.shifted.add(c),this.shiftEl(u,un.outOfTheWay,this.hitboxDimensions)):this.shifted.has(c)&&(this.shifted.delete(c),this.resetEl(u))})},10))};this.dragLeaveTimeout=0;this.handleDragLeave=()=>{!this.isSorting||(clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEnterTimeout),this.dragLeaveTimeout=window.setTimeout(()=>{this.resetSelf({maintainHidden:!0,maintainPlaceholder:!0})},jx),this.hitboxDimensions=Rc)};this.instanceId=Ke(),this.dndManager=n,this.sortables=new Map,this.shifted=new Set,this.hidden=new Set,this.isSorting=!1,this.axis=e,this.placeholder=null,this.sortListeners=r?[r]:[],n.dragManager.emitter.on("dragStart",this.handleDragStart),n.dragManager.emitter.on("dragEnd",this.handleDragEnd),n.dragManager.emitter.on("dragEnter",this.handleDragEnter),n.dragManager.emitter.on("dragLeave",this.handleDragLeave)}destroy(){clearTimeout(this.dragLeaveTimeout),clearTimeout(this.dragEndTimeout),this.dndManager.dragManager.emitter.off("dragStart",this.handleDragStart),this.dndManager.dragManager.emitter.off("dragEnd",this.handleDragEnd),this.dndManager.dragManager.emitter.off("dragEnter",this.handleDragEnter),this.dndManager.dragManager.emitter.off("dragLeave",this.handleDragLeave)}registerSortable(n,e,r,i){let a=e.getData().type==="placeholder";this.sortables.set(n,[e,r,i]),a?(this.placeholder=[e,r,i],i.dataset.axis=this.axis,kn(i,"transition",un.none)):kn(r,"transition",un.none)}unregisterSortable(n){this.sortables.delete(n)}resetSelf({maintainHidden:n,maintainPlaceholder:e,shiftTransition:r,placeholderTransition:i}){this.isSorting&&this.setSortState(!1),this.isPlaceholderActive&&!e&&this.deactivatePlaceholder(i),this.shifted.size>0&&(this.shifted.forEach(a=>{if(this.sortables.has(a)){let[,o]=this.sortables.get(a);this.resetEl(o,r)}}),this.shifted.clear()),!n&&this.hidden.size>0&&(this.hidden.forEach(a=>{if(this.sortables.has(a)){let[,,o]=this.sortables.get(a);this.resetEl(o,r)}}),this.hidden.clear())}activatePlaceholder(n,e){if(this.placeholder){let r=this.axis==="horizontal",[,,i]=this.placeholder;kn(i,"transition",e),kn(i,r?"width":"height",`${r?n.width:n.height}px`),this.isPlaceholderActive=!0}}deactivatePlaceholder(n=un.placeholder){if(this.placeholder){let[,,e]=this.placeholder;kn(e,"transition",n),ls(e,"width"),ls(e,"height"),this.isPlaceholderActive=!1}}hideDraggingEntity(n){kn(n,"display","none")}shiftEl(n,e,r){let i=this.axis==="horizontal"?`translate3d(${r.width}px, 0, 0)`:`translate3d(0, ${r.height}px, 0)`;kn(n,"transition",e),kn(n,"transform",i)}resetEl(n,e=un.outOfTheWay){kn(n,"transition",e),kn(n,"transform","translate3d(0, 0, 0)"),ls(n,"display")}addSortNotifier(n){this.sortListeners.push(n)}removeSortNotifier(n){this.sortListeners=this.sortListeners.filter(e=>e!==n)}setSortState(n){this.isSorting!==n&&(this.isSorting=n,this.sortListeners.forEach(e=>e(n)))}};function Ei({axis:t,children:n,onSortChange:e}){let r=v.useContext(Et),i=v.useRef(),a=v.useMemo(()=>{if(r){i.current&&i.current.destroy();let o=new Hc(r,t,e);return i.current=o,o}return null},[r,t,e]);return v.useEffect(()=>()=>{var o;return(o=i.current)==null?void 0:o.destroy()},[]),a?v.createElement(Qa.Provider,{value:a},n):null}function Si({index:t,accepts:n,className:e,isStatic:r}){let i=v.useRef(null),a=v.useRef(null),o=v.useMemo(()=>({id:Ke(),type:"placeholder",accepts:n}),n);return v.createElement("div",{ref:a,className:wt([e,$("placeholder")])},v.createElement("div",{ref:i},!r&&v.createElement(ur,{elementRef:i,measureRef:a,id:o.id,index:t,data:o})))}var Wx=function(){if(typeof window=="undefined"||typeof window.addEventListener!="function")return!1;var t=!1,n=Object.defineProperty({},"passive",{get:function(){t=!0}}),e=function(){return null};return window.addEventListener("test",e,n),window.removeEventListener("test",e,n),t},qx="ignore-onclickoutside",dg=function(n,e){var r;return(r=n.classList)==null?void 0:r.contains(e)},fg=function(n,e){for(var r=n.target||n;r;){if(Array.isArray(e)){if(e.some(function(i){return dg(r,i)}))return!0}else if(dg(r,e))return!0;r=r.parentElement}return!1},Yx=function(n){return document.documentElement.clientWidth<=n.clientX||document.documentElement.clientHeight<=n.clientY},hg=function(n){return n.includes("touch")&&Wx()?{passive:!0}:!1},Jx=function(n,e){var r=e===void 0?{}:e,i=r.refs,a=r.disabled,o=r.eventTypes,s=o===void 0?["mousedown","touchstart"]:o,u=r.excludeScrollbar,l=r.ignoreClass,c=l===void 0?qx:l,d=r.detectIFrame,f=d===void 0?!0:d,h=Ka([]),p=h[0],g=h[1],w=Ua(n);w.current=n;var S=Va(function(T){return g(function(k){return[].concat(k,[{current:T}])})},[]);return $a(function(){if(!(!(i!=null&&i.length)&&!p.length)){var T=function(){var O=[];return(i||p).forEach(function(B){var z=B.current;return z&&O.push(z)}),O},k=function(O){!fg(O,c)&&!(u&&Yx(O))&&T().every(function(B){return!B.contains(O.target)})&&w.current(O)},D=function(O){return setTimeout(function(){var B=document,z=B.activeElement;(z==null?void 0:z.tagName)==="IFRAME"&&!fg(z,c)&&!T().includes(z)&&w.current(O)},0)},N=function(){s.forEach(function(O){return document.removeEventListener(O,k,hg(O))}),f&&window.removeEventListener("blur",D)};if(a){N();return}return s.forEach(function(C){return document.addEventListener(C,k,hg(C))}),f&&window.addEventListener("blur",D),function(){return N()}}},[p,c,u,a,f,JSON.stringify(s)]),S},cs=Jx;function Bc({addItems:t,isInputVisible:n,setIsInputVisible:e,hideButton:r}){let[i,a]=v.useState(""),{stateManager:o}=v.useContext(We),s=v.useRef(),u=cs(()=>{e(!1)},{ignoreClass:$("ignore-click-outside")}),l=v.useCallback(()=>{a(""),e(!1)},[]),c=async h=>{try{t(await Promise.all(h.map(p=>o.getNewItem(p))))}catch(p){o.setError(p)}},d=h=>{if(!tr(h,o)){h.preventDefault();let p=i.trim();p&&(c([p]),a(""))}},f=()=>{let h=i.trim();h&&(c([h]),a(""))};return n?v.createElement("div",{className:$("item-form"),ref:u},v.createElement("div",{className:$("item-input-wrapper")},v.createElement(gr,{ref:s,className:$("item-input"),placeholder:F("Card title..."),onEnter:d,onEscape:l,onSubmit:f,value:i,onChange:h=>{a(h.target.value)},onPaste:h=>{qo(h,o)}}))):r?null:v.createElement("div",{className:$("item-button-wrapper")},v.createElement("button",{className:$("new-item-button"),onClick:()=>e(!0),onDragOver:h=>{Wo(o,h.dataTransfer)&&e(!0)}},v.createElement("span",{className:$("item-button-plus")},"+")," ",F("Add a card")))}var xg=me(It());function pg(t){return v.createElement("svg",{...t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},v.createElement("path",{fill:"currentColor",d:"M5 3h2v2H5zm0 4h2v2H5zm0 4h2v2H5zm4-8h2v2H9zm0 4h2v2H9zm0 4h2v2H9z"}))}var mg=me(require("obsidian"));var gg={delete:{description:F("Are you sure you want to delete this list and all its cards?"),confirm:F("Yes, delete list")},archive:{description:F("Are you sure you want to archive this list and all its cards?"),confirm:F("Yes, archive list")},"archive-items":{description:F("Are you sure you want to archive all cards in this list?"),confirm:F("Yes, archive cards")}};function vg({action:t,cancel:n,onAction:e,lane:r}){return v.useEffect(()=>{t&&r.children.length===0&&e()},[t,r.children.length]),!t||t&&r.children.length===0?null:v.createElement("div",{className:$("action-confirm-wrapper")},v.createElement("div",{className:$("action-confirm-text")},gg[t].description),v.createElement("div",null,v.createElement("button",{onClick:e,className:$("confirm-action-button")},gg[t].confirm),v.createElement("button",{onClick:n,className:$("cancel-action-button")},"Cancel")))}function yg({setIsEditing:t,path:n}){let{stateManager:e,boardModifiers:r}=v.useContext(We),[i,a]=v.useState(null);return{settingsMenu:v.useMemo(()=>new mg.Menu(e.app).addItem(s=>{s.setIcon("pencil").setTitle(F("Edit list")).onClick(()=>t(!0))}).addItem(s=>{s.setIcon("documents").setTitle(F("Archive cards")).onClick(()=>a("archive-items"))}).addSeparator().addItem(s=>{s.setIcon("plus-with-circle").setTitle(F("Insert list before")).onClick(()=>r.insertLane(n,{...mr,id:Ke(),children:[],data:{title:"",shouldMarkItemsComplete:!1,forceEditMode:!0}}))}).addItem(s=>{s.setIcon("plus-with-circle").setTitle(F("Insert list after")).onClick(()=>{let u=[...n];u[u.length-1]=u[u.length-1]+1,r.insertLane(u,{...mr,id:Ke(),children:[],data:{title:"",shouldMarkItemsComplete:!1,forceEditMode:!0}})})}).addSeparator().addItem(s=>{s.setIcon("sheets-in-box").setTitle(F("Archive list")).onClick(()=>a("archive"))}).addItem(s=>{s.setIcon("trash").setTitle(F("Delete list")).onClick(()=>a("delete"))}),[e,a,n]),confirmAction:i,setConfirmAction:a}}var bg=me(It());function wg({lane:t,lanePath:n}){let{boardModifiers:e}=v.useContext(We);return v.createElement("div",{className:$("lane-setting-wrapper")},v.createElement("div",{className:$("checkbox-wrapper")},v.createElement("div",{className:$("checkbox-label")},F("Mark cards in this list as complete")),v.createElement("div",{onClick:()=>e.updateLane(n,(0,bg.default)(t,{data:{$toggle:["shouldMarkItemsComplete"]}})),className:`checkbox-container ${t.data.shouldMarkItemsComplete?"is-enabled":""}`})))}var Eg=me(require("obsidian"));function Sg({itemCount:t,isEditing:n,setIsEditing:e,title:r,onChange:i}){let{stateManager:a}=v.useContext(We),o=v.useRef(),s=c=>{tr(c,a)||(c.preventDefault(),n&&e(!1))},u=()=>{n&&e(!1)},l=()=>{n&&e(!1)};return v.useEffect(()=>{if(n&&o.current){let c=o.current;o.current.focus(),c.selectionStart=c.selectionEnd=c.value.length}},[n]),v.createElement(v.Fragment,null,v.createElement("div",{className:$("lane-title")},n?v.createElement(gr,{ref:o,className:$("lane-input"),onChange:i,onEnter:s,onEscape:l,onSubmit:u,value:r}):v.createElement(v.Fragment,null,v.createElement("div",{className:$("lane-title-text"),onContextMenu:c=>{c.preventDefault(),c.stopPropagation();let d=c.target instanceof HTMLAnchorElement&&c.target.hasClass("internal-link")?c.target.dataset.href:void 0;d&&a.app.workspace.onLinkContextMenu(c,(0,Eg.getLinkpath)(d),a.file.path)}},v.createElement(ba,{markdownString:r})))),!n&&v.createElement("div",{className:$("lane-title-count")},t))}var kg=v.memo(function({lane:n,laneIndex:e,dragHandleRef:r,setIsItemInputVisible:i}){let{boardModifiers:a,stateManager:o}=v.useContext(We),[s,u]=v.useState(!1),l=Wn(e),{settingsMenu:c,confirmAction:d,setConfirmAction:f}=yg({setIsEditing:u,path:l});return v.useEffect(()=>{n.data.forceEditMode&&u(!0)},[n.data.forceEditMode]),v.createElement(v.Fragment,null,v.createElement("div",{onDoubleClick:()=>u(!0),className:$("lane-header-wrapper")},v.createElement("div",{className:$("lane-grip"),ref:r},v.createElement(pg,null)),v.createElement(Sg,{isEditing:s,setIsEditing:u,itemCount:n.children.length,title:n.data.title,onChange:h=>{a.updateLane(l,(0,xg.default)(n,{data:{title:{$set:h.target.value}}}))}}),v.createElement("div",{className:$("lane-settings-button-wrapper")},s?v.createElement("button",{onClick:()=>{u(!1)},"aria-label":"Close",className:`${$("lane-settings-button")} is-enabled`},v.createElement(en,{name:"cross"})):v.createElement(v.Fragment,null,i&&v.createElement("button",{"aria-label":F("Add a card"),className:$("lane-settings-button"),onClick:()=>{i(!0)},onDragOver:h=>{Wo(o,h.dataTransfer)&&i(!0)}},v.createElement(en,{name:"plus-with-circle"})),v.createElement("button",{"aria-label":F("More options"),className:$("lane-settings-button"),onClick:h=>{c.showAtPosition({x:h.clientX,y:h.clientY})}},v.createElement(en,{name:"vertical-three-dots"}))))),s&&v.createElement(wg,{lane:n,lanePath:l}),d&&v.createElement(vg,{lane:n,action:d,onAction:()=>{switch(d){case"archive":a.archiveLane(l);break;case"archive-items":a.archiveLaneItems(l);break;case"delete":a.deleteEntity(l);break}f(null)},cancel:()=>f(null)}))});var Mg=[Xe.Item],Kc=v.memo(function({isStatic:n,lane:e,laneIndex:r}){let{stateManager:i,boardModifiers:a}=v.useContext(We),[o,s]=v.useState(!1),u=Wn(r),l=i.useSetting("lane-width"),c=i.useSetting("new-card-insertion-method"),d=!!e.data.shouldMarkItemsComplete,f=l?{width:`${l}px`}:void 0,h=v.useRef(null),p=v.useRef(null),g=v.useRef(null),[w,S]=v.useState(!1),T=c==="prepend-compact",k=T||c==="prepend";gi(p,g);let D=O=>{a[k?"prependItems":"appendItems"]([...u,e.children.length-1],O.map(B=>(0,Tg.default)(B,{data:{isComplete:{$set:d}}}))),setTimeout(()=>{var z;let B=(z=h.current)==null?void 0:z.getElementsByClassName($("lane-items"));B.length&&(0,_g.default)([0,k?0:B[0].scrollHeight],{elementToScroll:B[0],speed:200,minDuration:150,easing:Q=>Q===1?1:1-Math.pow(2,-10*Q)})})},N=v.createElement(v.Fragment,null,v.createElement(ng,{items:e.children,isStatic:n,shouldMarkItemsComplete:d}),v.createElement(Si,{accepts:Mg,index:e.children.length,isStatic:n})),C=v.createElement(ss,{id:e.id,index:r,className:wt([$("lane-items"),$("vertical")]),triggerTypes:Mg,isStatic:n},n?N:v.createElement(Ei,{onSortChange:S,axis:"vertical"},N));return v.createElement("div",{ref:p,className:wt([$("lane-wrapper"),{"is-sorting":w}]),style:f},v.createElement("div",{"data-count":e.children.length,ref:h,className:wt([$("lane"),{"will-prepend":k}])},v.createElement(kg,{dragHandleRef:g,laneIndex:r,lane:e,setIsItemInputVisible:T?s:void 0}),k&&v.createElement(Bc,{addItems:D,hideButton:T,isInputVisible:o,setIsInputVisible:s}),n?C:v.createElement(ur,{elementRef:h,measureRef:p,id:e.id,index:r,data:e},C),!k&&v.createElement(Bc,{addItems:D,isInputVisible:o,setIsInputVisible:s})))}),Cg=v.memo(function({lanes:n}){return v.createElement(v.Fragment,null,n.map((e,r)=>v.createElement(Kc,{lane:e,laneIndex:r,key:e.id})))});var Dg=me(require("obsidian"));function us(){return{events:{},emit(t,n,e){let r=`${t}${e||""}`,i=this.events[t],a=this.events[r];if(!i&&!a){console.warn("Event emitted with no handler",t,e);return}e&&a&&a.forEach(o=>o(n)),i&&i.forEach(o=>o(n))},on(t,n,e){let r=`${t}${e||""}`,i=this.events[r];return i||(this.events[r]=i=[]),i.push(n),()=>this.off(t,n,e)},off(t,n,e){let r=`${t}${e||""}`,i=this.events[r];i&&(i.splice(i.indexOf(n)>>>0,1),i.length===0&&delete this.events[r])}}}var $c=class{constructor(n){this.scrollResizeDebounce=0;this.handleResize=n=>{n.forEach(e=>{e.target.dataset.scrollid&&(clearTimeout(this.scrollResizeDebounce),this.scrollResizeDebounce=window.setTimeout(()=>{this.emitter.emit("scrollResize",null)},50))}),this.hitboxEntities.forEach(e=>{e.recalcInitial()}),this.scrollEntities.forEach(e=>{e.recalcInitial()})};this.emitter=us(),this.hitboxEntities=new Map,this.scrollEntities=new Map,this.onDrop=n,this.resizeObserver=new ResizeObserver((0,Dg.debounce)(this.handleResize,100,!0)),this.dragManager=new Xl(this.emitter,this.hitboxEntities,this.scrollEntities)}destroy(){this.resizeObserver.disconnect()}observeResize(n){n instanceof Element&&this.resizeObserver.observe(n,{box:"border-box"})}unobserveResize(n){n instanceof Element&&this.resizeObserver.unobserve(n)}registerHitboxEntity(n,e){this.hitboxEntities.set(n,e)}registerScrollEntity(n,e){this.scrollEntities.set(n,e)}unregisterHitboxEntity(n){this.hitboxEntities.delete(n)}unregisterScrollEntity(n){this.scrollEntities.delete(n)}};function ds({children:t,onDrop:n}){let e=v.useRef(n);e.current=n;let r=v.useMemo(()=>new $c((i,a)=>e.current(i,a)),[]);return v.useEffect(()=>()=>{r.destroy()},[r]),v.createElement(Et.Provider,{value:r},v.createElement(ag,null,t))}function Uc(t,n,e,r,i,a){let o=[e[0]-r[0],e[1]-r[1],e[2]+r[2],e[3]+r[3]];return{transform:a||`translate3d(${t.x-n.x+o[0]}px, ${t.y-n.y+o[1]}px, 0px)`,width:`${o[2]-o[0]}px`,height:`${o[3]-o[1]}px`,transition:i}}function fs({children:t}){let n=v.useContext(Et),[e,r]=v.useState(),[i,a]=v.useState();return v.useEffect(()=>{if(!n)return;let o=zd,s=({dragEntity:c,dragOrigin:d,dragPosition:f,dragEntityMargin:h})=>{!c||!f||!d||(o=c.getHitbox(),r(c),a(Uc(f,d,o,h)))},u=({dragOrigin:c,dragPosition:d,dragEntityMargin:f})=>{!d||!c||a(Uc(d,c,o,f))},l=({dragOrigin:c,primaryIntersection:d,dragPosition:f,dragEntityMargin:h})=>{if(d&&f&&c){let p=d.getHitbox(),g={x:p[0],y:p[1]},w=wi({position:f,destination:g}),S=un.drop(w),T=cg.drop(g);a(Uc(f,c,o,h,S,T)),setTimeout(()=>{r(void 0),a(void 0)},w)}else r(void 0),a(void 0)};return n.dragManager.emitter.on("dragStart",s),n.dragManager.emitter.on("dragMove",u),n.dragManager.emitter.on("dragEnd",l),()=>{n.dragManager.emitter.off("dragStart",s),n.dragManager.emitter.off("dragMove",u),n.dragManager.emitter.off("dragEnd",l)}},[n]),!e||!i?null:t(e,i)}function Ag(){let t=v.useContext(Et),[n,e]=v.useState(!1);return v.useEffect(()=>{let r=()=>{e(!0)},i=({primaryIntersection:a,dragPosition:o})=>{let s=(a==null?void 0:a.getHitbox())||[0,0],u={x:s[0],y:s[1]},l=wi({position:o||u,destination:u});setTimeout(()=>{e(!1)},l)};return t.dragManager.emitter.on("dragStart",r),t.dragManager.emitter.on("dragEnd",i),()=>{t.dragManager.emitter.off("dragStart",r),t.dragManager.emitter.off("dragEnd",i)}},[t]),n}var Ea=me(It()),Ig=me(require("obsidian"));function hs(t){let n=e=>{let r=t.getSetting("prepend-archive-format"),i=t.getSetting("prepend-archive-separator"),a=[(0,Ig.moment)().format(r)];i&&a.push(i),a.push(e.data.titleRaw);let o=a.join(" ");return t.updateItemContent(e,o)};return{appendItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>ul(i,e,r))},prependItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>Rd(i,e,r))},insertItems:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>lr(i,e,r))},splitItem:(e,r)=>{r.forEach(i=>t.app.workspace.trigger("kanban:card-added",t.file,i)),t.setState(i=>lr(kr(i,e),e,r))},addLane:e=>{t.app.workspace.trigger("kanban:lane-added",t.file,e),t.setState(r=>ul(r,[],[e]))},insertLane:(e,r)=>{t.app.workspace.trigger("kanban:lane-added",t.file,r),t.setState(i=>lr(i,e,[r]))},updateLane:(e,r)=>{t.app.workspace.trigger("kanban:lane-updated",t.file,r),t.setState(i=>dl(i,e,{children:{[e[e.length-1]]:{$set:r}}}))},archiveLane:e=>{t.setState(async r=>{let i=vt(r,e),a=i.children;t.app.workspace.trigger("kanban:lane-archived",t.file,i);try{return(0,Ea.default)(kr(r,e),{data:{archive:{$unshift:t.getSetting("prepend-archive-date")?await Promise.all(a.map(n)):a}}})}catch(o){return t.setError(o),r}})},archiveLaneItems:e=>{t.setState(async r=>{let a=vt(r,e).children;t.app.workspace.trigger("kanban:lane-cards-archived",t.file,a);try{return(0,Ea.default)(Hd(r,e,{children:{$set:[]}}),{data:{archive:{$unshift:t.getSetting("prepend-archive-date")?await Promise.all(a.map(n)):a}}})}catch(o){return t.setError(o),r}})},deleteEntity:e=>{t.setState(r=>{let i=vt(r,e);return t.app.workspace.trigger(`kanban:${i.type}-deleted`,t.file,i),kr(r,e)})},updateItem:(e,r)=>{t.setState(i=>{let a=vt(i,e);return t.app.workspace.trigger("kanban:card-updated",t.file,a,r),dl(i,e,{children:{[e[e.length-1]]:{$set:r}}})})},archiveItem:e=>{t.setState(async r=>{let i=vt(r,e);t.app.workspace.trigger("kanban:card-archived",t.file,e,i);try{return(0,Ea.default)(kr(r,e),{data:{archive:{$push:[t.getSetting("prepend-archive-date")?await n(i):i]}}})}catch(a){return t.setError(a),r}})},duplicateEntity:e=>{t.setState(r=>{let i=vt(r,e);t.app.workspace.trigger(`kanban:${i.type}-duplicated`,t.file,e,i);let a=(0,Ea.default)(i,{id:{$set:Ke()}});return lr(r,e,[a])})}}}function Pg(t){return v.createElement(Qx,{plugin:t})}var Gx=v.memo(function({view:n}){return ol(n.getPortal(),n.contentEl)});function Qx({plugin:t}){let n=t.useViewState(),e=n.map(i=>v.createElement(Gx,{key:i.id,view:i})),r=v.useCallback((i,a)=>{if(!i||!a)return;if(i.scopeId==="htmldnd"){let f=i.getData(),h=t.getStateManagerFromViewID(f.viewId),p=a.getPath(),g=vt(h.state,p.slice(0,-1));(S=>Promise.all(S.map(T=>h.getNewItem(T))))(f.content).then(S=>{let T=S.map(k=>{var D;return(0,Lg.default)(k,{data:{isComplete:{$set:!!((D=g==null?void 0:g.data)==null?void 0:D.shouldMarkItemsComplete)}}})});return h.setState(k=>lr(k,p,T))}).catch(S=>{h.setError(S),console.error(S)});return}let o=i.getPath(),s=a.getPath(),[,u]=i.scopeId.split(":::"),[,l]=a.scopeId.split(":::");if(u===l){let f=t.getStateManagerFromViewID(i.scopeId);return t.app.workspace.trigger("kanban:card-moved",f.file,o,s,i.getData()),f.setState(h=>Fd(h,o,s,p=>p.type===Xe.Item?hl(h,o,h,s,p):p))}let c=t.getStateManagerFromViewID(i.scopeId),d=t.getStateManagerFromViewID(a.scopeId);c.setState(f=>{let h=vt(f,o);return d.setState(p=>{let g=h.type===Xe.Item?hl(f,o,p,s,h):h;return lr(p,s,[g])}),kr(f,o)})},[n]);if(e.length)return v.createElement(ds,{onDrop:r},e,v.createElement(fs,null,(i,a)=>{let[o,s]=v.useMemo(()=>{if(i.scopeId==="htmldnd")return[null,null];let u=t.getKanbanView(i.scopeId),l=t.stateManagers.get(u.file),c=vt(l.state,i.getPath()),d=hs(l),f=u.file.path;return[c,{view:u,stateManager:l,boardModifiers:d,filePath:f}]},[i]);return(o==null?void 0:o.type)===Xe.Lane?v.createElement(We.Provider,{value:s},v.createElement("div",{className:$("drag-container"),style:a},v.createElement(Kc,{lane:o,laneIndex:0,isStatic:!0}))):(o==null?void 0:o.type)===Xe.Item?v.createElement(We.Provider,{value:s},v.createElement("div",{className:$("drag-container"),style:a},v.createElement(Oc,{item:o,itemIndex:0,isStatic:!0}))):v.createElement("div",null)}))}var Jc=me(It()),ev=me(require("obsidian"));var $g=me(Nc());var Ug=me(It()),zg=me(require("obsidian")),ms=me(ql());function ps({id:t,children:n}){let e=v.useContext(qi),r=v.useMemo(()=>t||Ke(),[t]);return v.useEffect(()=>()=>{e.unmountScope(t)},[t]),v.createElement(cr.Provider,{value:r},n)}var dn="kanban-plugin",Og;(function(n){n[n.List=0]="List"})(Og||(Og={}));var Ng=`**${F("Complete")}**`,Fg="***",zc=["---","",`${dn}: basic`,"","---","",""].join(` +`);function Rg(t){return["","","%% kanban:settings","```",JSON.stringify(t),"```","%%"].join(` +`)}function Hg(t,n,e){let r=t.innerText.trim();if((n==null?void 0:n.length)&&(r+=" "+n.join(" ")),e){let i=Object.keys(e).join(" "),a=Object.values(e).map(o=>Array.isArray(o.value)?o.value.join(" "):o.value.toString()).join(" ");r+=" "+i+" "+a}return r.toLocaleLowerCase()}function Xx(t,n,e){var r,i,a;if(t.plugins.enabledPlugins.has("dataview")&&((a=(i=(r=t.plugins)==null?void 0:r.plugins)==null?void 0:i.dataview)==null?void 0:a.api))return t.plugins.plugins.dataview.api.page(n.path,e.path)}function Vc(t,n){let e=t.getSetting("metadata-keys");if(!e.length)return{};if(!n)return{};let r=t.app.metadataCache.getFileCache(n),i=Xx(t.app,n,t.file);if(!r&&!i)return{};let a={},o={},s={},u=[],l=!1;return e.forEach(c=>{var d;if(!s[c.metadataKey]){if(s[c.metadataKey]=!0,c.metadataKey==="tags"){let f=(r==null?void 0:r.tags)||[];if(Array.isArray((d=r==null?void 0:r.frontmatter)==null?void 0:d.tags)&&(f=[].concat(f,r.frontmatter.tags.map(h=>({tag:`#${h}`})))),(f==null?void 0:f.length)===0)return;u.push(c.metadataKey),a.tags={...c,value:f.map(h=>h.tag).filter(h=>o[h]?!1:(o[h]=!0,!0))},l=!0;return}if((r==null?void 0:r.frontmatter)&&r.frontmatter[c.metadataKey])u.push(c.metadataKey),a[c.metadataKey]={...c,value:r.frontmatter[c.metadataKey]},l=!0;else if(i&&i[c.metadataKey]){let f=i[c.metadataKey],h=f.values||f.val||f;if(h===f&&typeof h=="object")h={...f};else if(!Array.isArray(h)&&typeof h!="string"&&typeof h!="number")return;u.push(c.metadataKey),a[c.metadataKey]={...c,value:h},l=!0}}}),{fileMetadata:l?a:void 0,fileMetadataOrder:u}}function Bg(t,n){return!t&&n?!0:!["metadata-keys","date-trigger","time-trigger","link-date-to-daily-note","date-format","time-format","hide-date-in-title","hide-tags-in-title"].every(r=>t[r]===n[r])}function Kg({onNewLane:t,closeLaneForm:n}){let{boardModifiers:e,stateManager:r}=v.useContext(We),[i,a]=v.useState(!1),[o,s]=v.useState(""),u=v.useRef(),l=cs(()=>{n()},{ignoreClass:$("ignore-click-outside")});v.useLayoutEffect(()=>{var d;(d=u.current)==null||d.focus()},[]);let c=()=>{e.addLane({...mr,id:Ke(),children:[],data:{title:o,shouldMarkItemsComplete:i}}),s(""),a(!1),t()};return v.createElement("div",{ref:l,className:$("lane-form-wrapper")},v.createElement("div",{className:$("lane-input-wrapper")},v.createElement(gr,{ref:u,className:$("lane-input"),onChange:d=>s(d.target.value),onEnter:d=>{tr(d,r)||(d.preventDefault(),c())},onSubmit:()=>{c()},onEscape:n,value:o})),v.createElement("div",{className:$("checkbox-wrapper")},v.createElement("div",{className:$("checkbox-label")},F("Mark cards in this list as complete")),v.createElement("div",{onClick:()=>a(!i),className:`checkbox-container ${i?"is-enabled":""}`})),v.createElement("div",{className:$("lane-input-actions")},v.createElement("button",{className:$("lane-action-add"),onClick:c},F("Add list")),v.createElement("button",{className:$("lane-action-cancel"),onClick:n},F("Cancel"))))}var Zx=[Xe.Item,Xe.Lane],ek=[Xe.Lane],Vg=({view:t,stateManager:n})=>{let e=n.useState(),r=Ag(),i=v.useRef(null),a=v.useRef(null),[o,s]=v.useState(""),[u,l]=v.useState(!1),[c,d]=v.useState(""),[f,h]=v.useState((e==null?void 0:e.children.length)===0),p=n.file.path,g=n.useSetting("max-archive-size"),w=v.useCallback(()=>{(e==null?void 0:e.children.length)>0&&h(!1)},[e==null?void 0:e.children.length]);v.useEffect(()=>{(e==null?void 0:e.children.length)===0&&h(!0)},[e==null?void 0:e.children.length]);let S=v.useCallback(()=>{setTimeout(()=>{var B;let O=(B=i.current)==null?void 0:B.getElementsByClassName($("board"));O.length&&(0,$g.default)([O[0].scrollWidth,0],{elementToScroll:O[0],speed:300,minDuration:150,easing:z=>z===1?1:1-Math.pow(2,-10*z)})})},[]);v.useEffect(()=>{let O=z=>{z==="editor:open-search"&&l(Q=>!Q)},B=()=>{h(!0)};return t.emitter.on("hotkey",O),t.emitter.on("showLaneForm",B),()=>{t.emitter.off("hotkey",O),t.emitter.off("showLaneForm",B)}},[t]),v.useEffect(()=>{var O;u&&((O=a.current)==null||O.focus())},[u]),v.useEffect(()=>{let O=o.trim(),B;return O?B=window.setTimeout(()=>{d(O)},250):d(""),()=>{window.clearTimeout(B)}},[o]),v.useEffect(()=>{g===void 0||g===-1||typeof g=="number"&&(e==null?void 0:e.data.archive.length)>g&&n.setState(O=>(0,Ug.default)(O,{data:{archive:{$set:O.data.archive.slice(g*-1)}}}))},[e==null?void 0:e.data.archive.length,g]);let T=v.useMemo(()=>hs(n),[n]),k=v.useCallback(O=>{let B=O.target;B.tagName==="A"&&B.hasClass("internal-link")&&t.app.workspace.trigger("hover-link",{event:O.nativeEvent,source:dn,hoverParent:t,targetEl:B,linktext:B.getAttr("href"),sourcePath:t.file.path})},[t]),D=v.useCallback(async O=>{if(O.type==="auxclick"&&O.button==2)return;let B=O.target,z=B.tagName==="A"?B:B.closest("a");if(!!z){if(z.hasClass("file-link")){O.preventDefault();let Q=z.getAttribute("href"),X=Pr(Q),ie=typeof Q=="string"&&t.app.metadataCache.getFirstLinkpathDest(X.root,t.file.path);if(!ie)return;n.app.openWithDefaultApp(ie.path);return}if(z.hasClass("internal-link")){O.preventDefault();let Q=z.getAttr("href"),X=O.button===1||O.ctrlKey||O.metaKey;if(z.hasClass("is-unresolved")&&(0,ms.appHasDailyNotesPluginLoaded)()){let q=n.getSetting("date-format"),J=(0,zg.moment)(Q,q,!0);if(J.isValid()){try{let te=await(0,ms.createDailyNote)(J);await(X?t.app.workspace.splitActiveLeaf():t.app.workspace.getUnpinnedLeaf()).openFile(te,{active:!0})}catch(te){console.error(te),n.setError(te)}return}}n.app.workspace.openLinkText(Q,p,X);return}if(z.hasClass("tag")){O.preventDefault(),n.app.internalPlugins.getPluginById("global-search").instance.openGlobalSearch(`tag:${z.getAttr("href")}`);return}z.hasClass("external-link")&&(O.preventDefault(),window.open(z.getAttr("href"),"_blank"))}},[n,p]),N=v.useMemo(()=>({view:t,stateManager:n,boardModifiers:T,filePath:p}),[t,n,T,p]),C=fp(n);return e==null?v.createElement("div",{className:$("loading")},v.createElement("div",{className:"sk-pulse"})):e.data.errors.length>0?v.createElement("div",null,v.createElement("div",null,"Error:"),e.data.errors.map((O,B)=>v.createElement("div",{key:B},v.createElement("div",null,O.description),v.createElement("pre",null,O.stack)))):v.createElement(ps,{id:t.id},v.createElement(We.Provider,{value:N},v.createElement(Ya.Provider,{value:c?c.toLocaleLowerCase():null},v.createElement("div",{ref:i,className:wt([fl,{"something-is-dragging":r}]),onMouseOver:k,onClick:D,onAuxClick:D,...C},(f||e.children.length===0)&&v.createElement(Kg,{onNewLane:S,closeLaneForm:w}),u&&v.createElement("div",{className:$("search-wrapper")},v.createElement("input",{ref:a,value:o,onChange:O=>{s(O.target.value)},onKeyDown:O=>{O.key==="Escape"&&(s(""),d(""),O.target.blur(),l(!1))},type:"text",className:$("filter-input"),placeholder:F("Search...")}),v.createElement("button",{className:$("search-cancel-button"),onClick:()=>{s(""),d(""),l(!1)},"aria-label":F("Cancel")},v.createElement(en,{name:"cross"}))),v.createElement(ss,{id:t.id,className:wt([$("board"),$("horizontal"),{"is-adding-lane":f}]),triggerTypes:Zx},v.createElement("div",null,v.createElement(Ei,{axis:"horizontal"},v.createElement(Cg,{lanes:e.children}),v.createElement(Si,{className:$("lane-placeholder"),accepts:ek,index:e.children.length}))))))))};var Qg=me(It()),$e=me(require("obsidian"));var Or=me(It());function jg({isStatic:t,itemIndex:n,item:e,toggleShouldHideLabel:r,toggleContainsMarkdown:i,deleteKey:a,updateKey:o,updateLabel:s}){let u=v.useRef(null),l=v.useRef(null),c=v.useRef(null);gi(l,c);let d=v.createElement("div",{className:$("setting-controls-wrapper")},v.createElement("div",{className:$("setting-input-wrapper")},v.createElement("div",null,v.createElement("div",{className:$("setting-item-label")},F("Metadata key")),v.createElement("input",{type:"text",value:e.data.metadataKey,onChange:f=>o(f.target.value)})),v.createElement("div",null,v.createElement("div",{className:$("setting-item-label")},F("Display label")),v.createElement("input",{type:"text",value:e.data.label,onChange:f=>s(f.target.value)}))),v.createElement("div",{className:$("setting-toggle-wrapper")},v.createElement("div",null,v.createElement("div",{className:`checkbox-container ${e.data.shouldHideLabel?"is-enabled":""}`,onClick:r,"aria-label":F("Hide label")}),v.createElement("div",{className:$("setting-item-label")},F("Hide label"))),v.createElement("div",null,v.createElement("div",{className:`checkbox-container ${e.data.containsMarkdown?"is-enabled":""}`,onClick:i,"aria-label":F("Field contains markdown")}),v.createElement("div",{className:$("setting-item-label")},F("Field contains markdown")))));return v.createElement("div",{ref:l,className:$("setting-item-wrapper")},v.createElement("div",{ref:u,className:$("setting-item")},t?d:v.createElement(ur,{elementRef:u,measureRef:l,id:e.id,index:n,data:e},d),v.createElement("div",{className:$("setting-button-wrapper")},v.createElement("div",{onClick:a,"aria-label":F("Delete")},v.createElement(en,{name:"cross"})),v.createElement("div",{className:"mobile-option-setting-drag-icon","aria-label":F("Drag to rearrange"),ref:c},v.createElement(en,{name:"three-horizontal-bars"})))))}function tk({onChange:t,inputValue:n,keys:e,setKeys:r}){let i=a=>{t(a),r(a)};return{updateKey:a=>o=>{i((0,Or.default)(e,{[a]:{data:{metadataKey:{$set:o}}}}))},updateLabel:a=>o=>{i((0,Or.default)(e,{[a]:{data:{label:{$set:o}}}}))},toggleShouldHideLabel:a=>()=>{i((0,Or.default)(e,{[a]:{data:{$toggle:["shouldHideLabel"]}}}))},toggleContainsMarkdown:a=>()=>{i((0,Or.default)(e,{[a]:{data:{$toggle:["containsMarkdown"]}}}))},deleteKey:a=>()=>{i((0,Or.default)(e,{$splice:[[a,1]]}))},newKey:()=>{i((0,Or.default)(e,{$push:[{...Vo,id:Ke(),data:{metadataKey:n,label:"",shouldHideLabel:!1,containsMarkdown:!1}}]}))},moveKey:(a,o)=>{let s=a.getPath(),u=o.getPath(),l=s[s.length-1],c=u[u.length-1];if(l===c)return;let d=e.slice(),[f]=d.splice(l,1);d.splice(c,0,f),i(d)}}}var nk=[Xe.MetadataSetting];function rk({keys:t}){return v.createPortal(v.createElement(fs,null,(n,e)=>{let i=n.getPath()[0],a=t[i];return v.createElement("div",{className:$("drag-container"),style:e},v.createElement(jg,{item:a,itemIndex:i,updateKey:Qr,updateLabel:Qr,toggleShouldHideLabel:Qr,toggleContainsMarkdown:Qr,deleteKey:Qr,isStatic:!0}))}),document.body)}function ik({scrollEl:t}){let n=v.useContext(Et);return v.useEffect(()=>{let e=0,r=()=>{clearTimeout(e),e=window.setTimeout(()=>{n.hitboxEntities.forEach(i=>{i.recalcInitial()})},100)};return t.addEventListener("scroll",r,{passive:!0,capture:!1}),()=>{t.removeEventListener("scroll",r)}},[t,n]),null}function ak(t){let[n,e]=v.useState(t.dataKeys),[r,i]=v.useState(""),{getShouldIMEBlockAction:a,...o}=Ga(),{updateKey:s,updateLabel:u,toggleShouldHideLabel:l,toggleContainsMarkdown:c,deleteKey:d,newKey:f,moveKey:h}=tk({onChange:t.onChange,inputValue:r,keys:n,setKeys:e});return v.createElement(v.Fragment,null,v.createElement(ds,{onDrop:h},v.createElement(ik,{scrollEl:t.scrollEl}),v.createElement(ps,null,v.createElement(Ei,{axis:"vertical"},n.map((p,g)=>v.createElement(jg,{key:p.id,item:p,itemIndex:g,updateKey:s(g),updateLabel:u(g),toggleShouldHideLabel:l(g),toggleContainsMarkdown:c(g),deleteKey:d(g)})),v.createElement(Si,{accepts:nk,index:n.length}))),v.createElement(rk,{keys:n})),v.createElement("div",{className:$("setting-key-input-wrapper")},v.createElement("input",{placeholder:F("Metadata key"),type:"text",value:r,onChange:p=>i(p.target.value),onKeyDown:p=>{if(!a()){if(p.key==="Enter"){f(),i("");let g=p.target;setTimeout(()=>{g.scrollIntoView()});return}p.key==="Escape"&&(i(""),p.target.blur())}},...o}),v.createElement("button",{onClick:p=>{f(),i("");let g=p.target;setTimeout(()=>{g.scrollIntoView()})}},F("Add key"))))}function Wg(t,n,e,r){v.render(v.createElement(ak,{dataKeys:e,scrollEl:n,onChange:r}),t)}function qg(t){v.unmountComponentAtNode(t)}var Jg=me(Yg()),vs=me(It()),br=me(require("obsidian"));var ys="@",bs="@@";function ok(t){let n=[];return br.Vault.recurseChildren(t.vault.getRoot(),e=>{e instanceof br.TFolder&&n.push({value:e.path,label:e.path,selected:!1,disabled:!1})}),n}function sk(t,n){let e=[],r=n?t.vault.getAbstractFileByPath(n):null;return(!r||!(r instanceof br.TFolder))&&(r=t.vault.getRoot()),br.Vault.recurseChildren(r,i=>{i instanceof br.TFile&&e.push({value:i.path,label:i.basename,selected:!1,disabled:!1})}),e}function Gg(t){let{templateFolder:n,templatesEnabled:e,templaterPlugin:r}=pl(t),i=sk(t,n),a=ok(t),o="";return!e&&!r&&(o=F("Note: No template plugins are currently enabled.")),{templateFiles:i,vaultFolders:a,templateWarning:o}}function Wc({choices:t,key:n,warningText:e,local:r,placeHolderStr:i,manager:a}){return o=>{o.controlEl.createEl("select",{},s=>{setTimeout(()=>{let u=t,[l,c]=a.getSetting(n,r);if(c){let h=t.findIndex(g=>g.value===c),p=t[h];u=(0,vs.default)(u,{$splice:[[h,1]],$unshift:[(0,vs.default)(p,{placeholder:{$set:!0},value:{$set:""},label:{$apply:g=>`${g} (${F("default")})`}})]})}else u=(0,vs.default)(u,{$unshift:[{placeholder:!0,value:"",label:i,selected:!1,disabled:!1}]});let d=new Jg.default(s,{placeholder:!0,position:"bottom",searchPlaceholderValue:F("Search..."),searchEnabled:u.length>10,choices:u}).setChoiceByValue("");l&&typeof l=="string"&&d.setChoiceByValue(l);let f=h=>{let p=h.detail.value;p?a.applySettingsUpdate({[n]:{$set:p}}):a.applySettingsUpdate({$unset:[n]})};s.addEventListener("change",f),a.cleanupFns.push(()=>{d.destroy(),s.removeEventListener("change",f)})}),e&&o.descEl.createDiv({},u=>{u.createEl("strong",{text:e})})})}}var Xg=/^\d+(?:\.\d+)?$/,Zg={[dn]:!0,"date-display-format":!0,"date-format":!0,"date-picker-week-start":!0,"date-time-display-format":!0,"date-trigger":!0,"hide-date-display":!0,"hide-date-in-title":!0,"hide-tags-display":!0,"hide-tags-in-title":!0,"lane-width":!0,"link-date-to-daily-note":!0,"max-archive-size":!0,"metadata-keys":!0,"new-card-insertion-method":!0,"new-line-trigger":!0,"new-note-folder":!0,"new-note-template":!0,"prepend-archive-date":!0,"prepend-archive-format":!0,"prepend-archive-separator":!0,"show-checkboxes":!0,"show-relative-date":!0,"time-format":!0,"time-trigger":!0,"show-add-list":!0,"show-archive-all":!0,"show-view-as-markdown":!0,"show-board-settings":!0,"show-search":!0},qc=class{constructor(n,e,r){this.cleanupFns=[];this.applyDebounceTimer=0;this.app=n.app,this.plugin=n,this.config=e,this.settings=r}applySettingsUpdate(n){clearTimeout(this.applyDebounceTimer),this.applyDebounceTimer=window.setTimeout(()=>{this.settings=(0,Qg.default)(this.settings,n),this.config.onSettingsChange(this.settings)},200)}getSetting(n,e){return e?[this.settings[n],this.plugin.settings[n]]:[this.settings[n],null]}constructUI(n,e,r){let{templateFiles:i,vaultFolders:a,templateWarning:o}=Gg(this.app);n.createEl("h3",{text:e}),r?n.createEl("p",{text:F("These settings will take precedence over the default Kanban board settings.")}):n.createEl("p",{text:F("Set the default Kanban board settings. Settings can be overridden on a board-by-board basis.")}),new $e.Setting(n).setName(F("New line trigger")).setDesc(F("Select whether Enter or Shift+Enter creates a new line. The opposite of what you choose will create and complete editing of cards and lanes.")).addDropdown(s=>{s.addOption("shift-enter",F("Shift + Enter")),s.addOption("enter",F("Enter"));let[u,l]=this.getSetting("new-line-trigger",r);s.setValue(u||l||"shift-enter"),s.onChange(c=>{this.applySettingsUpdate({"new-line-trigger":{$set:c}})})}),new $e.Setting(n).setName(F("Prepend / append new cards")).setDesc(F("This setting controls whether new cards are added to the beginning or end of the list.")).addDropdown(s=>{s.addOption("prepend",F("Prepend")),s.addOption("prepend-compact",F("Prepend (compact)")),s.addOption("append",F("Append"));let[u,l]=this.getSetting("new-card-insertion-method",r);s.setValue(u||l||"append"),s.onChange(c=>{this.applySettingsUpdate({"new-card-insertion-method":{$set:c}})})}),new $e.Setting(n).setName(F("Note template")).setDesc(F("This template will be used when creating new notes from Kanban cards.")).then(Wc({choices:i,key:"new-note-template",warningText:o,local:r,placeHolderStr:F("No template"),manager:this})),new $e.Setting(n).setName(F("Note folder")).setDesc(F("Notes created from Kanban cards will be placed in this folder. If blank, they will be placed in the default location for this vault.")).then(Wc({choices:a,key:"new-note-folder",local:r,placeHolderStr:F("Default folder"),manager:this})),new $e.Setting(n).setName(F("Lane width")).setDesc(F("Enter a number to set the lane width in pixels.")).addText(s=>{let[u,l]=this.getSetting("lane-width",r);s.inputEl.setAttr("type","number"),s.inputEl.placeholder=`${l||"272"} (default)`,s.inputEl.value=u?u.toString():"",s.onChange(c=>{if(c&&Xg.test(c)){s.inputEl.removeClass("error"),this.applySettingsUpdate({"lane-width":{$set:parseInt(c)}});return}c&&s.inputEl.addClass("error"),this.applySettingsUpdate({$unset:["lane-width"]})})}),new $e.Setting(n).setName(F("Maximum number of archived cards")).setDesc(F("Archived cards can be viewed in markdown mode. This setting will begin removing old cards once the limit is reached. Setting this value to -1 will allow a board's archive to grow infinitely.")).addText(s=>{let[u,l]=this.getSetting("max-archive-size",r);s.inputEl.setAttr("type","number"),s.inputEl.placeholder=`${l||"-1"} (default)`,s.inputEl.value=u?u.toString():"",s.onChange(c=>{if(c&&Xg.test(c)){s.inputEl.removeClass("error"),this.applySettingsUpdate({"max-archive-size":{$set:parseInt(c)}});return}c&&s.inputEl.addClass("error"),this.applySettingsUpdate({$unset:["max-archive-size"]})})}),new $e.Setting(n).setName(F("Display card checkbox")).setDesc(F("When toggled, a checkbox will be displayed with each card")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-checkboxes",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"show-checkboxes":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-checkboxes",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-checkboxes"]})})})}),new $e.Setting(n).setName(F("Hide tags in card titles")).setDesc(F("When toggled, tags will be hidden card titles. This will prevent tags from being included in the title when creating new notes.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-tags-in-title",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-tags-in-title":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-tags-in-title",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-tags-in-title"]})})})}),new $e.Setting(n).setName(F("Hide card display tags")).setDesc(F("When toggled, tags will not be displayed below the card title.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-tags-display",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-tags-display":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-tags-display",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-tags-display"]})})})}),n.createEl("h4",{text:F("Board Header Buttons")}),new $e.Setting(n).setName(F("Add a list")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-add-list",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-add-list":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-add-list",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-add-list"]})})})}),new $e.Setting(n).setName(F("Archive completed cards")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-archive-all",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-archive-all":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-archive-all",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-archive-all"]})})})}),new $e.Setting(n).setName(F("Open as markdown")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-view-as-markdown",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-view-as-markdown":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-view-as-markdown",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-view-as-markdown"]})})})}),new $e.Setting(n).setName(F("Open board settings")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-board-settings",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-board-settings":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-board-settings",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-board-settings"]})})})}),new $e.Setting(n).setName(F("Search...")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-search",r);c!=null?l.setValue(c):d!=null?l.setValue(d):l.setValue(!0),l.onChange(f=>{this.applySettingsUpdate({"show-search":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-search",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-search"]})})})}),n.createEl("h4",{text:F("Date & Time")}),new $e.Setting(n).setName(F("Date trigger")).setDesc(F("When this is typed, it will trigger the date selector")).addText(s=>{let[u,l]=this.getSetting("date-trigger",r);(u||l)&&s.setValue(u||l),s.setPlaceholder(l||ys),s.onChange(c=>{c?this.applySettingsUpdate({"date-trigger":{$set:c}}):this.applySettingsUpdate({$unset:["date-trigger"]})})}),new $e.Setting(n).setName(F("Time trigger")).setDesc(F("When this is typed, it will trigger the time selector")).addText(s=>{let[u,l]=this.getSetting("time-trigger",r);(u||l)&&s.setValue(u||l),s.setPlaceholder(l||bs),s.onChange(c=>{c?this.applySettingsUpdate({"time-trigger":{$set:c}}):this.applySettingsUpdate({$unset:["time-trigger"]})})}),new $e.Setting(n).setName(F("Date format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("This format will be used when saving dates in markdown.")),f.createEl("br"),f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("date-format",r),d=Xr(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"date-format":{$set:f}}):this.applySettingsUpdate({$unset:["date-format"]})})})}),new $e.Setting(n).setName(F("Time format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("time-format",r),d=Vi(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"time-format":{$set:f}}):this.applySettingsUpdate({$unset:["time-format"]})})})}),new $e.Setting(n).setName(F("Date display format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(f=>{f.appendText(F("This format will be used when displaying dates in Kanban cards.")),f.createEl("br"),f.appendText(F("For more syntax, refer to")+" "),f.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},h=>{h.setAttr("target","_blank")}),f.createEl("br"),f.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(f.createEl("b",{cls:"u-pop"})),f.createEl("br")}));let[l,c]=this.getSetting("date-display-format",r),d=Xr(this.app);u.setPlaceholder(d),u.setDefaultFormat(d),(l||c)&&u.setValue(l||c),u.onChange(f=>{f?this.applySettingsUpdate({"date-display-format":{$set:f}}):this.applySettingsUpdate({$unset:["date-display-format"]})})})}),new $e.Setting(n).setName(F("Show relative date")).setDesc(F("When toggled, cards will display the distance between today and the card's date. eg. 'In 3 days', 'A month ago'")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("show-relative-date",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"show-relative-date":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("show-relative-date",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["show-relative-date"]})})})}),new $e.Setting(n).setName(F("Hide card display dates")).setDesc(F("When toggled, formatted dates will not be displayed on the card. Relative dates will still be displayed if they are enabled.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-date-display",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-date-display":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-date-display",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-date-display"]})})})}),new $e.Setting(n).setName(F("Hide dates in card titles")).setDesc(F("When toggled, dates will be hidden card titles. This will prevent dates from being included in the title when creating new notes.")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("hide-date-in-title",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"hide-date-in-title":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("hide-date-in-title",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["hide-date-in-title"]})})})}),new $e.Setting(n).setName(F("Link dates to daily notes")).setDesc(F("When toggled, dates will link to daily notes. Eg. [[2021-04-26]]")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("link-date-to-daily-note",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"link-date-to-daily-note":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("link-date-to-daily-note",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["link-date-to-daily-note"]})})})}),new $e.Setting(n).setName(F("Add date and time to archived cards")).setDesc(F("When toggled, the current date and time will be added to the beginning of a card when it is archived. Eg. - [ ] 2021-05-14 10:00am My card title")).then(s=>{let u;s.addToggle(l=>{u=l;let[c,d]=this.getSetting("prepend-archive-date",r);c!==void 0?l.setValue(c):d!==void 0&&l.setValue(d),l.onChange(f=>{this.applySettingsUpdate({"prepend-archive-date":{$set:f}})})}).addExtraButton(l=>{l.setIcon("reset").setTooltip(F("Reset to default")).onClick(()=>{let[,c]=this.getSetting("prepend-archive-date",r);u.setValue(!!c),this.applySettingsUpdate({$unset:["prepend-archive-date"]})})})}),new $e.Setting(n).setName(F("Archive date/time separator")).setDesc(F("This will be used to separate the archived date/time from the title")).addText(s=>{let[u,l]=this.getSetting("prepend-archive-separator",r);s.inputEl.placeholder=l?`${l} (default)`:"",s.inputEl.value=u||"",s.onChange(c=>{if(c){this.applySettingsUpdate({"prepend-archive-separator":{$set:c}});return}this.applySettingsUpdate({$unset:["prepend-archive-separator"]})})}),new $e.Setting(n).setName(F("Archive date/time format")).then(s=>{s.addMomentFormat(u=>{s.descEl.appendChild(createFragment(T=>{T.appendText(F("For more syntax, refer to")+" "),T.createEl("a",{text:F("format reference"),href:"https://momentjs.com/docs/#/displaying/format/"},k=>{k.setAttr("target","_blank")}),T.createEl("br"),T.appendText(F("Your current syntax looks like this")+": "),u.setSampleEl(T.createEl("b",{cls:"u-pop"})),T.createEl("br")}));let[l,c]=this.getSetting("prepend-archive-format",r),[d,f]=this.getSetting("date-format",r),h=d||f||Xr(this.app),[p,g]=this.getSetting("time-format",r),w=p||g||Vi(this.app),S=`${h} ${w}`;u.setPlaceholder(S),u.setDefaultFormat(S),(l||c)&&u.setValue(l||c),u.onChange(T=>{T?this.applySettingsUpdate({"prepend-archive-format":{$set:T}}):this.applySettingsUpdate({$unset:["prepend-archive-format"]})})})}),new $e.Setting(n).setName(F("Calendar: first day of week")).setDesc(F("Override which day is used as the start of the week")).addDropdown(s=>{s.addOption("",F("default")),s.addOption("0",F("Sunday")),s.addOption("1",F("Monday")),s.addOption("2",F("Tuesday")),s.addOption("3",F("Wednesday")),s.addOption("4",F("Thursday")),s.addOption("5",F("Friday")),s.addOption("6",F("Saturday"));let[u,l]=this.getSetting("date-picker-week-start",r);s.setValue((u==null?void 0:u.toString())||(l==null?void 0:l.toString())||""),s.onChange(c=>{c?this.applySettingsUpdate({"date-picker-week-start":{$set:Number(c)}}):this.applySettingsUpdate({$unset:["date-picker-week-start"]})})}),n.createEl("br"),n.createEl("h4",{text:F("Linked Page Metadata")}),n.createEl("p",{cls:$("metadata-setting-desc"),text:F("Display metadata for the first note linked within a card. Specify which metadata keys to display below. An optional label can be provided, and labels can be hidden altogether.")}),new $e.Setting(n).then(s=>{s.settingEl.addClass($("draggable-setting-container"));let[u]=this.getSetting("metadata-keys",r),l=(u||[]).map(c=>({...Vo,id:Ke(),data:c}));Wg(s.settingEl,n,l,c=>this.applySettingsUpdate({"metadata-keys":{$set:c.map(d=>d.data)}})),this.cleanupFns.push(()=>{s.settingEl&&qg(s.settingEl)})})}cleanUp(){this.cleanupFns.forEach(n=>n()),this.cleanupFns=[]}},ws=class extends $e.Modal{constructor(n,e,r){super(n.app);this.view=n,this.settingsManager=new qc(n.plugin,e,r)}onOpen(){let{contentEl:n,modalEl:e}=this;e.addClass($("board-settings-modal")),this.settingsManager.constructUI(n,this.view.file.basename,!0)}onClose(){let{contentEl:n}=this;this.settingsManager.cleanUp(),n.empty()}},Yc=class extends $e.PluginSettingTab{constructor(n,e){super(n.app,n);this.plugin=n,this.settingsManager=new qc(n,e,n.settings)}display(){let{containerEl:n}=this;n.empty(),n.addClass($("board-settings-modal")),this.settingsManager.constructUI(n,F("Kanban Plugin"),!1)}};var _n="kanban",Es="blocks",Nr=class extends ev.TextFileView{constructor(n,e){super(n);this.actionButtons={};this.plugin=e,this.emitter=us(),this.emitter.on("hotkey",r=>{switch(r){case"daily-notes:goto-prev":{rp(this.app,this.file);break}case"daily-notes:goto-next":{np(this.app,this.file);break}}})}get isPrimary(){var n;return((n=this.plugin.getStateManager(this.file))==null?void 0:n.getAView())===this}get id(){var n;return`${this.leaf.id}:::${(n=this.file)==null?void 0:n.path}`}get isShiftPressed(){return this.plugin.isShiftPressed}setBoard(n,e=!0){this.plugin.stateManagers.get(this.file).setState(n,e)}getBoard(){return this.plugin.stateManagers.get(this.file).state}getViewType(){return _n}getIcon(){return Es}getDisplayText(){var n;return((n=this.file)==null?void 0:n.basename)||"Kanban"}async onLoadFile(n){try{return await super.onLoadFile(n)}catch(e){throw this.plugin.stateManagers.get(this.file).setError(e),e}}destroy(){this.plugin.removeView(this),Object.values(this.actionButtons).forEach(n=>n.remove()),this.actionButtons={}}async onClose(){this.destroy()}async onUnloadFile(n){return this.destroy(),await super.onUnloadFile(n)}handleRename(n,e){this.file.path===n&&this.plugin.handleViewFileRename(this,e)}requestSaveToDisk(n){this.data!==n&&this.isPrimary?(this.data=n,this.requestSave()):this.data=n}getViewData(){return this.data}setViewData(n,e){if(!ip(n)){this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.removeView(this),this.plugin.setMarkdownView(this.leaf,!1);return}this.plugin.addView(this,n,!e&&this.isPrimary)}getPortal(){let n=this.plugin.stateManagers.get(this.file);return v.createElement(Vg,{stateManager:n,view:this})}onMoreOptionsMenu(n){n.addItem(e=>{e.setTitle(F("Open as markdown")).setIcon("document").onClick(()=>{this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.setMarkdownView(this.leaf)})}).addItem(e=>{e.setTitle(F("Open board settings")).setIcon("gear").onClick(()=>{let r=this.plugin.stateManagers.get(this.file),i=r.state;new ws(this,{onSettingsChange:a=>{let o=(0,Jc.default)(i,{data:{settings:{$set:a}}});r.setState(o)}},i.data.settings).open()})}).addItem(e=>{e.setTitle(F("Archive completed cards")).setIcon("sheets-in-box").onClick(()=>{this.plugin.stateManagers.get(this.file).archiveCompletedCards()})}).addSeparator(),super.onMoreOptionsMenu(n)}initHeaderButtons(){let n=this.plugin.getStateManager(this.file);if(!!n)if(n.getSetting("show-board-settings")&&!this.actionButtons["show-board-settings"]?this.actionButtons["show-board-settings"]=this.addAction("gear",F("Open board settings"),()=>{let e=this.plugin.stateManagers.get(this.file),r=e.state;new ws(this,{onSettingsChange:i=>{let a=(0,Jc.default)(r,{data:{settings:{$set:i}}});e.setState(a)}},r.data.settings).open()}):!n.getSetting("show-board-settings")&&this.actionButtons["show-board-settings"]&&(this.actionButtons["show-board-settings"].remove(),delete this.actionButtons["show-board-settings"]),n.getSetting("show-search")&&!this.actionButtons["show-search"]?this.actionButtons["show-search"]=this.addAction("search",F("Search..."),()=>{this.emitter.emit("hotkey","editor:open-search")}):!n.getSetting("show-search")&&this.actionButtons["show-search"]&&(this.actionButtons["show-search"].remove(),delete this.actionButtons["show-search"]),n.getSetting("show-view-as-markdown")&&!this.actionButtons["show-view-as-markdown"]?this.actionButtons["show-view-as-markdown"]=this.addAction("document",F("Open as markdown"),()=>{this.plugin.kanbanFileModes[this.leaf.id||this.file.path]="markdown",this.plugin.setMarkdownView(this.leaf)}):!n.getSetting("show-view-as-markdown")&&this.actionButtons["show-view-as-markdown"]&&(this.actionButtons["show-view-as-markdown"].remove(),delete this.actionButtons["show-view-as-markdown"]),n.getSetting("show-archive-all")&&!this.actionButtons["show-archive-all"]?this.actionButtons["show-archive-all"]=this.addAction("sheets-in-box",F("Archive completed cards"),()=>{this.plugin.stateManagers.get(this.file).archiveCompletedCards()}):!n.getSetting("show-archive-all")&&this.actionButtons["show-archive-all"]&&(this.actionButtons["show-archive-all"].remove(),delete this.actionButtons["show-archive-all"]),n.getSetting("show-add-list")&&!this.actionButtons["show-add-list"]){let e=this.addAction("plus-with-circle",F("Add a list"),()=>{this.emitter.emit("showLaneForm",void 0)});e.addClass($("ignore-click-outside")),this.actionButtons["show-add-list"]=e}else!n.getSetting("show-add-list")&&this.actionButtons["show-add-list"]&&(this.actionButtons["show-add-list"].remove(),delete this.actionButtons["show-add-list"])}clear(){}};var Ii=me(It()),vy=me(require("obsidian"));var Gc={};Oi(Gc,{JsonPatchError:()=>st,_areEquals:()=>ka,applyOperation:()=>Fr,applyPatch:()=>Ms,applyReducer:()=>fk,deepClone:()=>uk,getValueByPointer:()=>Ts,validate:()=>nv,validator:()=>Cs});var lk=function(){var t=function(n,e){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var a in i)i.hasOwnProperty(a)&&(r[a]=i[a])},t(n,e)};return function(n,e){t(n,e);function r(){this.constructor=n}n.prototype=e===null?Object.create(e):(r.prototype=e.prototype,new r)}}(),ck=Object.prototype.hasOwnProperty;function Ss(t,n){return ck.call(t,n)}function xs(t){if(Array.isArray(t)){for(var e=new Array(t.length),n=0;n=48&&r<=57){n++;continue}return!1}return!0}function $n(t){return t.indexOf("/")===-1&&t.indexOf("~")===-1?t:t.replace(/~/g,"~0").replace(/\//g,"~1")}function Sa(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}function _s(t){if(t===void 0)return!0;if(t){if(Array.isArray(t)){for(var n=0,e=t.length;n=d){if(e&&n.op==="add"&&h>l.length)throw new st("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",a,n,t);var o=dk[n.op].call(n,l,h,t);if(o.test===!1)throw new st("Test operation failed","TEST_OPERATION_FAILED",a,n,t);return o}}else if(c>=d){var o=xi[n.op].call(n,l,h,t);if(o.test===!1)throw new st("Test operation failed","TEST_OPERATION_FAILED",a,n,t);return o}if(l=l[h],e&&c0)throw new st('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",n,t,e);if((t.op==="move"||t.op==="copy")&&typeof t.from!="string")throw new st("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",n,t,e);if((t.op==="add"||t.op==="replace"||t.op==="test")&&t.value===void 0)throw new st("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",n,t,e);if((t.op==="add"||t.op==="replace"||t.op==="test")&&_s(t.value))throw new st("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",n,t,e);if(e){if(t.op=="add"){var i=t.path.split("/").length,a=r.split("/").length;if(i!==a+1&&i!==a)throw new st("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",n,t,e)}else if(t.op==="replace"||t.op==="remove"||t.op==="_get"){if(t.path!==r)throw new st("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",n,t,e)}else if(t.op==="move"||t.op==="copy"){var o={op:"_get",path:t.from,value:void 0},s=nv([o],e);if(s&&s.name==="OPERATION_PATH_UNRESOLVABLE")throw new st("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",n,t,e)}}}else throw new st("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",n,t,e)}function nv(t,n,e){try{if(!Array.isArray(t))throw new st("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(n)Ms(Tt(n),Tt(t),e||!0);else{e=e||Cs;for(var r=0;reu,generate:()=>Xc,observe:()=>bk,unobserve:()=>yk});var Qc=new WeakMap,hk=function(){function t(n){this.observers=new Map,this.obj=n}return t}(),pk=function(){function t(n,e){this.callback=n,this.observer=e}return t}();function mk(t){return Qc.get(t)}function gk(t,n){return t.observers.get(n)}function vk(t,n){t.observers.delete(n.callback)}function yk(t,n){n.unobserve()}function bk(t,n){var e=[],r,i=mk(t);if(!i)i=new hk(t),Qc.set(t,i);else{var a=gk(i,n);r=a&&a.observer}if(r)return r;if(r={},i.value=Tt(t),n){r.callback=n,r.next=null;var o=function(){Xc(r)},s=function(){clearTimeout(r.next),r.next=setTimeout(o)};typeof window!="undefined"&&(window.addEventListener("mouseup",s),window.addEventListener("keyup",s),window.addEventListener("mousedown",s),window.addEventListener("keydown",s),window.addEventListener("change",s))}return r.patches=e,r.object=t,r.unobserve=function(){Xc(r),clearTimeout(r.next),vk(i,r),typeof window!="undefined"&&(window.removeEventListener("mouseup",s),window.removeEventListener("keyup",s),window.removeEventListener("mousedown",s),window.removeEventListener("keydown",s),window.removeEventListener("change",s))},i.observers.set(n,new pk(n,r)),r}function Xc(t,n){n===void 0&&(n=!1);var e=Qc.get(t.object);Zc(e.value,t.object,t.patches,"",n),t.patches.length&&Ms(e.value,t.patches);var r=t.patches;return r.length>0&&(t.patches=[],t.callback&&t.callback(r)),r}function Zc(t,n,e,r,i){if(n!==t){typeof n.toJSON=="function"&&(n=n.toJSON());for(var a=xs(n),o=xs(t),s=!1,u=!1,l=o.length-1;l>=0;l--){var c=o[l],d=t[c];if(Ss(n,c)&&!(n[c]===void 0&&d!==void 0&&Array.isArray(n)===!1)){var f=n[c];typeof d=="object"&&d!=null&&typeof f=="object"&&f!=null&&Array.isArray(d)===Array.isArray(f)?Zc(d,f,e,r+"/"+$n(c),i):d!==f&&(s=!0,i&&e.push({op:"test",path:r+"/"+$n(c),value:Tt(d)}),e.push({op:"replace",path:r+"/"+$n(c),value:Tt(f)}))}else Array.isArray(t)===Array.isArray(n)?(i&&e.push({op:"test",path:r+"/"+$n(c),value:Tt(d)}),e.push({op:"remove",path:r+"/"+$n(c)}),u=!0):(i&&e.push({op:"test",path:r,value:t}),e.push({op:"replace",path:r,value:n}),s=!0)}if(!(!u&&a.length==o.length))for(var l=0;l":""))+")"})),f;function f(){let h=[],p,g,w;if((!n||i(s,u,l[l.length-1]||null))&&(h=kk(e(s,l)),h[0]===ru))return h;if(s.children&&h[0]!==cv)for(g=(r?s.children.length:-1)+a,w=l.concat(s);g>-1&&g!0){for(let i=n+1,a=t.length;i{try{await pv(t,e),await Promise.all(e.children.map(r=>Ta(t,r)))}catch(r){throw t.setError(r),r}}))}catch(e){throw t.setError(e),e}return n}function _k(t){return(t.op==="add"||t.op==="replace")&&["/title","/titleRaw","/dateStr","/timeStr",/\d$/,/\/fileAccessor\/.+$/].some(n=>typeof n=="string"?t.path.endsWith(n):n.test(t.path))}async function gv(t,n,e){let r={},i=e.reduce((a,o)=>{if(!_k(o))return a;let s=o.path.split("/").reduce((l,c)=>(/\d+/.test(c)&&l.push(Number(c)),l),[]),u=s.join(",");return r[u]||(r[u]=!0,a.push(s)),a},[]);try{await Promise.all(i.map(a=>{let o=vt(n,a);if(o.type===Xe.Lane)return pv(t,o);if(o.type===Xe.Item)return Ta(t,o)}))}catch(a){throw t.setError(a),a}return n}function Is(t,n){let e=n.end-n.start;return t.slice(0,n.start)+"\0".repeat(e)+t.slice(n.end)}function vv(t){return t.replace(/\s*\0+\s*/g," ").trim()}function Mt(t,n,e,r){let i=t.length,a=0,o;if(n<0?n=-n>i?0:i+n:n=n>i?i:n,e=e>0?e:0,r.length<1e4)o=Array.from(r),o.unshift(n,e),[].splice.apply(t,o);else for(e&&[].splice.apply(t,[n,e]);a0?(Mt(t,t.length,0,n),t):n}var yv={}.hasOwnProperty;function bv(t){let n={},e=-1;for(;++eo))return;let O=n.events.length,B=O,z,Q;for(;B--;)if(n.events[B][0]==="exit"&&n.events[B][1].type==="chunkFlow"){if(z){Q=n.events[B][1].end;break}z=!0}for(S(r),C=O;Ck;){let N=e[D];n.containerState=N[1],N[0].exit.call(n,t)}e.length=k}function T(){i.write([null]),a=void 0,i=void 0,n.containerState._closeFlow=void 0}}function Ak(t,n,e){return ke(t,t.attempt(this.parser.constructs.document,n,e),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function lu(t){if(t===null||Je(t)||xv(t))return 1;if(kv(t))return 2}function ki(t,n,e){let r=[],i=-1;for(;++i1&&t[e][1].end.offset-t[e][1].start.offset>1?2:1;let d=Object.assign({},t[r][1].end),f=Object.assign({},t[e][1].start);Cv(d,-u),Cv(f,u),o={type:u>1?"strongSequence":"emphasisSequence",start:d,end:Object.assign({},t[r][1].end)},s={type:u>1?"strongSequence":"emphasisSequence",start:Object.assign({},t[e][1].start),end:f},a={type:u>1?"strongText":"emphasisText",start:Object.assign({},t[r][1].end),end:Object.assign({},t[e][1].start)},i={type:u>1?"strong":"emphasis",start:Object.assign({},o.start),end:Object.assign({},s.end)},t[r][1].end=Object.assign({},o.start),t[e][1].start=Object.assign({},s.end),l=[],t[r][1].end.offset-t[r][1].start.offset&&(l=Vt(l,[["enter",t[r][1],n],["exit",t[r][1],n]])),l=Vt(l,[["enter",i,n],["enter",o,n],["exit",o,n],["enter",a,n]]),l=Vt(l,ki(n.parser.constructs.insideSpan.null,t.slice(r+1,e),n)),l=Vt(l,[["exit",a,n],["enter",s,n],["exit",s,n],["exit",i,n]]),t[e][1].end.offset-t[e][1].start.offset?(c=2,l=Vt(l,[["enter",t[e][1],n],["exit",t[e][1],n]])):c=0,Mt(t,r-1,e-r+3,l),e=r+l.length-c-2;break}}for(e=-1;++e",GT:">",Gamma:"\u0393",Gammad:"\u03DC",Gbreve:"\u011E",Gcedil:"\u0122",Gcirc:"\u011C",Gcy:"\u0413",Gdot:"\u0120",Gfr:"\u{1D50A}",Gg:"\u22D9",Gopf:"\u{1D53E}",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",Gt:"\u226B",HARDcy:"\u042A",Hacek:"\u02C7",Hat:"^",Hcirc:"\u0124",Hfr:"\u210C",HilbertSpace:"\u210B",Hopf:"\u210D",HorizontalLine:"\u2500",Hscr:"\u210B",Hstrok:"\u0126",HumpDownHump:"\u224E",HumpEqual:"\u224F",IEcy:"\u0415",IJlig:"\u0132",IOcy:"\u0401",Iacut:"\xCD",Iacute:"\xCD",Icir:"\xCE",Icirc:"\xCE",Icy:"\u0418",Idot:"\u0130",Ifr:"\u2111",Igrav:"\xCC",Igrave:"\xCC",Im:"\u2111",Imacr:"\u012A",ImaginaryI:"\u2148",Implies:"\u21D2",Int:"\u222C",Integral:"\u222B",Intersection:"\u22C2",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",Iogon:"\u012E",Iopf:"\u{1D540}",Iota:"\u0399",Iscr:"\u2110",Itilde:"\u0128",Iukcy:"\u0406",Ium:"\xCF",Iuml:"\xCF",Jcirc:"\u0134",Jcy:"\u0419",Jfr:"\u{1D50D}",Jopf:"\u{1D541}",Jscr:"\u{1D4A5}",Jsercy:"\u0408",Jukcy:"\u0404",KHcy:"\u0425",KJcy:"\u040C",Kappa:"\u039A",Kcedil:"\u0136",Kcy:"\u041A",Kfr:"\u{1D50E}",Kopf:"\u{1D542}",Kscr:"\u{1D4A6}",LJcy:"\u0409",L:"<",LT:"<",Lacute:"\u0139",Lambda:"\u039B",Lang:"\u27EA",Laplacetrf:"\u2112",Larr:"\u219E",Lcaron:"\u013D",Lcedil:"\u013B",Lcy:"\u041B",LeftAngleBracket:"\u27E8",LeftArrow:"\u2190",LeftArrowBar:"\u21E4",LeftArrowRightArrow:"\u21C6",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVector:"\u21C3",LeftDownVectorBar:"\u2959",LeftFloor:"\u230A",LeftRightArrow:"\u2194",LeftRightVector:"\u294E",LeftTee:"\u22A3",LeftTeeArrow:"\u21A4",LeftTeeVector:"\u295A",LeftTriangle:"\u22B2",LeftTriangleBar:"\u29CF",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVector:"\u21BF",LeftUpVectorBar:"\u2958",LeftVector:"\u21BC",LeftVectorBar:"\u2952",Leftarrow:"\u21D0",Leftrightarrow:"\u21D4",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",LessLess:"\u2AA1",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",Lfr:"\u{1D50F}",Ll:"\u22D8",Lleftarrow:"\u21DA",Lmidot:"\u013F",LongLeftArrow:"\u27F5",LongLeftRightArrow:"\u27F7",LongRightArrow:"\u27F6",Longleftarrow:"\u27F8",Longleftrightarrow:"\u27FA",Longrightarrow:"\u27F9",Lopf:"\u{1D543}",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",Lscr:"\u2112",Lsh:"\u21B0",Lstrok:"\u0141",Lt:"\u226A",Map:"\u2905",Mcy:"\u041C",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",MinusPlus:"\u2213",Mopf:"\u{1D544}",Mscr:"\u2133",Mu:"\u039C",NJcy:"\u040A",Nacute:"\u0143",Ncaron:"\u0147",Ncedil:"\u0145",Ncy:"\u041D",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:` +`,Nfr:"\u{1D511}",NoBreak:"\u2060",NonBreakingSpace:"\xA0",Nopf:"\u2115",Not:"\u2AEC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",NotLeftTriangle:"\u22EA",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangle:"\u22EB",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",Nscr:"\u{1D4A9}",Ntild:"\xD1",Ntilde:"\xD1",Nu:"\u039D",OElig:"\u0152",Oacut:"\xD3",Oacute:"\xD3",Ocir:"\xD4",Ocirc:"\xD4",Ocy:"\u041E",Odblac:"\u0150",Ofr:"\u{1D512}",Ograv:"\xD2",Ograve:"\xD2",Omacr:"\u014C",Omega:"\u03A9",Omicron:"\u039F",Oopf:"\u{1D546}",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",Or:"\u2A54",Oscr:"\u{1D4AA}",Oslas:"\xD8",Oslash:"\xD8",Otild:"\xD5",Otilde:"\xD5",Otimes:"\u2A37",Oum:"\xD6",Ouml:"\xD6",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",PartialD:"\u2202",Pcy:"\u041F",Pfr:"\u{1D513}",Phi:"\u03A6",Pi:"\u03A0",PlusMinus:"\xB1",Poincareplane:"\u210C",Popf:"\u2119",Pr:"\u2ABB",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",Prime:"\u2033",Product:"\u220F",Proportion:"\u2237",Proportional:"\u221D",Pscr:"\u{1D4AB}",Psi:"\u03A8",QUO:'"',QUOT:'"',Qfr:"\u{1D514}",Qopf:"\u211A",Qscr:"\u{1D4AC}",RBarr:"\u2910",RE:"\xAE",REG:"\xAE",Racute:"\u0154",Rang:"\u27EB",Rarr:"\u21A0",Rarrtl:"\u2916",Rcaron:"\u0158",Rcedil:"\u0156",Rcy:"\u0420",Re:"\u211C",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",Rfr:"\u211C",Rho:"\u03A1",RightAngleBracket:"\u27E9",RightArrow:"\u2192",RightArrowBar:"\u21E5",RightArrowLeftArrow:"\u21C4",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVector:"\u21C2",RightDownVectorBar:"\u2955",RightFloor:"\u230B",RightTee:"\u22A2",RightTeeArrow:"\u21A6",RightTeeVector:"\u295B",RightTriangle:"\u22B3",RightTriangleBar:"\u29D0",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVector:"\u21BE",RightUpVectorBar:"\u2954",RightVector:"\u21C0",RightVectorBar:"\u2953",Rightarrow:"\u21D2",Ropf:"\u211D",RoundImplies:"\u2970",Rrightarrow:"\u21DB",Rscr:"\u211B",Rsh:"\u21B1",RuleDelayed:"\u29F4",SHCHcy:"\u0429",SHcy:"\u0428",SOFTcy:"\u042C",Sacute:"\u015A",Sc:"\u2ABC",Scaron:"\u0160",Scedil:"\u015E",Scirc:"\u015C",Scy:"\u0421",Sfr:"\u{1D516}",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",Sigma:"\u03A3",SmallCircle:"\u2218",Sopf:"\u{1D54A}",Sqrt:"\u221A",Square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",Sscr:"\u{1D4AE}",Star:"\u22C6",Sub:"\u22D0",Subset:"\u22D0",SubsetEqual:"\u2286",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",SuchThat:"\u220B",Sum:"\u2211",Sup:"\u22D1",Superset:"\u2283",SupersetEqual:"\u2287",Supset:"\u22D1",THOR:"\xDE",THORN:"\xDE",TRADE:"\u2122",TSHcy:"\u040B",TScy:"\u0426",Tab:" ",Tau:"\u03A4",Tcaron:"\u0164",Tcedil:"\u0162",Tcy:"\u0422",Tfr:"\u{1D517}",Therefore:"\u2234",Theta:"\u0398",ThickSpace:"\u205F\u200A",ThinSpace:"\u2009",Tilde:"\u223C",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",Topf:"\u{1D54B}",TripleDot:"\u20DB",Tscr:"\u{1D4AF}",Tstrok:"\u0166",Uacut:"\xDA",Uacute:"\xDA",Uarr:"\u219F",Uarrocir:"\u2949",Ubrcy:"\u040E",Ubreve:"\u016C",Ucir:"\xDB",Ucirc:"\xDB",Ucy:"\u0423",Udblac:"\u0170",Ufr:"\u{1D518}",Ugrav:"\xD9",Ugrave:"\xD9",Umacr:"\u016A",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",Uopf:"\u{1D54C}",UpArrow:"\u2191",UpArrowBar:"\u2912",UpArrowDownArrow:"\u21C5",UpDownArrow:"\u2195",UpEquilibrium:"\u296E",UpTee:"\u22A5",UpTeeArrow:"\u21A5",Uparrow:"\u21D1",Updownarrow:"\u21D5",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",Upsi:"\u03D2",Upsilon:"\u03A5",Uring:"\u016E",Uscr:"\u{1D4B0}",Utilde:"\u0168",Uum:"\xDC",Uuml:"\xDC",VDash:"\u22AB",Vbar:"\u2AEB",Vcy:"\u0412",Vdash:"\u22A9",Vdashl:"\u2AE6",Vee:"\u22C1",Verbar:"\u2016",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",Vopf:"\u{1D54D}",Vscr:"\u{1D4B1}",Vvdash:"\u22AA",Wcirc:"\u0174",Wedge:"\u22C0",Wfr:"\u{1D51A}",Wopf:"\u{1D54E}",Wscr:"\u{1D4B2}",Xfr:"\u{1D51B}",Xi:"\u039E",Xopf:"\u{1D54F}",Xscr:"\u{1D4B3}",YAcy:"\u042F",YIcy:"\u0407",YUcy:"\u042E",Yacut:"\xDD",Yacute:"\xDD",Ycirc:"\u0176",Ycy:"\u042B",Yfr:"\u{1D51C}",Yopf:"\u{1D550}",Yscr:"\u{1D4B4}",Yuml:"\u0178",ZHcy:"\u0416",Zacute:"\u0179",Zcaron:"\u017D",Zcy:"\u0417",Zdot:"\u017B",ZeroWidthSpace:"\u200B",Zeta:"\u0396",Zfr:"\u2128",Zopf:"\u2124",Zscr:"\u{1D4B5}",aacut:"\xE1",aacute:"\xE1",abreve:"\u0103",ac:"\u223E",acE:"\u223E\u0333",acd:"\u223F",acir:"\xE2",acirc:"\xE2",acut:"\xB4",acute:"\xB4",acy:"\u0430",aeli:"\xE6",aelig:"\xE6",af:"\u2061",afr:"\u{1D51E}",agrav:"\xE0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",alpha:"\u03B1",amacr:"\u0101",amalg:"\u2A3F",am:"&",amp:"&",and:"\u2227",andand:"\u2A55",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsd:"\u2221",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",aogon:"\u0105",aopf:"\u{1D552}",ap:"\u2248",apE:"\u2A70",apacir:"\u2A6F",ape:"\u224A",apid:"\u224B",apos:"'",approx:"\u2248",approxeq:"\u224A",arin:"\xE5",aring:"\xE5",ascr:"\u{1D4B6}",ast:"*",asymp:"\u2248",asympeq:"\u224D",atild:"\xE3",atilde:"\xE3",aum:"\xE4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",bNot:"\u2AED",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",barvee:"\u22BD",barwed:"\u2305",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",beta:"\u03B2",beth:"\u2136",between:"\u226C",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bnot:"\u2310",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxDL:"\u2557",boxDR:"\u2554",boxDl:"\u2556",boxDr:"\u2553",boxH:"\u2550",boxHD:"\u2566",boxHU:"\u2569",boxHd:"\u2564",boxHu:"\u2567",boxUL:"\u255D",boxUR:"\u255A",boxUl:"\u255C",boxUr:"\u2559",boxV:"\u2551",boxVH:"\u256C",boxVL:"\u2563",boxVR:"\u2560",boxVh:"\u256B",boxVl:"\u2562",boxVr:"\u255F",boxbox:"\u29C9",boxdL:"\u2555",boxdR:"\u2552",boxdl:"\u2510",boxdr:"\u250C",boxh:"\u2500",boxhD:"\u2565",boxhU:"\u2568",boxhd:"\u252C",boxhu:"\u2534",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxuL:"\u255B",boxuR:"\u2558",boxul:"\u2518",boxur:"\u2514",boxv:"\u2502",boxvH:"\u256A",boxvL:"\u2561",boxvR:"\u255E",boxvh:"\u253C",boxvl:"\u2524",boxvr:"\u251C",bprime:"\u2035",breve:"\u02D8",brvba:"\xA6",brvbar:"\xA6",bscr:"\u{1D4B7}",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsol:"\\",bsolb:"\u29C5",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",bumpeq:"\u224F",cacute:"\u0107",cap:"\u2229",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",capcup:"\u2A47",capdot:"\u2A40",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",ccaps:"\u2A4D",ccaron:"\u010D",ccedi:"\xE7",ccedil:"\xE7",ccirc:"\u0109",ccups:"\u2A4C",ccupssm:"\u2A50",cdot:"\u010B",cedi:"\xB8",cedil:"\xB8",cemptyv:"\u29B2",cen:"\xA2",cent:"\xA2",centerdot:"\xB7",cfr:"\u{1D520}",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",chi:"\u03C7",cir:"\u25CB",cirE:"\u29C3",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledR:"\xAE",circledS:"\u24C8",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",clubs:"\u2663",clubsuit:"\u2663",colon:":",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",conint:"\u222E",copf:"\u{1D554}",coprod:"\u2210",cop:"\xA9",copy:"\xA9",copysr:"\u2117",crarr:"\u21B5",cross:"\u2717",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",cup:"\u222A",cupbrcap:"\u2A48",cupcap:"\u2A46",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curre:"\xA4",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",dArr:"\u21D3",dHar:"\u2965",dagger:"\u2020",daleth:"\u2138",darr:"\u2193",dash:"\u2010",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",dcaron:"\u010F",dcy:"\u0434",dd:"\u2146",ddagger:"\u2021",ddarr:"\u21CA",ddotseq:"\u2A77",de:"\xB0",deg:"\xB0",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",dfr:"\u{1D521}",dharl:"\u21C3",dharr:"\u21C2",diam:"\u22C4",diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divid:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",dopf:"\u{1D555}",dot:"\u02D9",doteq:"\u2250",doteqdot:"\u2251",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",downarrow:"\u2193",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",dscr:"\u{1D4B9}",dscy:"\u0455",dsol:"\u29F6",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",dzcy:"\u045F",dzigrarr:"\u27FF",eDDot:"\u2A77",eDot:"\u2251",eacut:"\xE9",eacute:"\xE9",easter:"\u2A6E",ecaron:"\u011B",ecir:"\xEA",ecirc:"\xEA",ecolon:"\u2255",ecy:"\u044D",edot:"\u0117",ee:"\u2147",efDot:"\u2252",efr:"\u{1D522}",eg:"\u2A9A",egrav:"\xE8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",emptyv:"\u2205",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",eng:"\u014B",ensp:"\u2002",eogon:"\u0119",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",equals:"=",equest:"\u225F",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erDot:"\u2253",erarr:"\u2971",escr:"\u212F",esdot:"\u2250",esim:"\u2242",eta:"\u03B7",et:"\xF0",eth:"\xF0",eum:"\xEB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",expectation:"\u2130",exponentiale:"\u2147",fallingdotseq:"\u2252",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",ffr:"\u{1D523}",filig:"\uFB01",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",fopf:"\u{1D557}",forall:"\u2200",fork:"\u22D4",forkv:"\u2AD9",fpartint:"\u2A0D",frac1:"\xBC",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac3:"\xBE",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",fscr:"\u{1D4BB}",gE:"\u2267",gEl:"\u2A8C",gacute:"\u01F5",gamma:"\u03B3",gammad:"\u03DD",gap:"\u2A86",gbreve:"\u011F",gcirc:"\u011D",gcy:"\u0433",gdot:"\u0121",ge:"\u2265",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",ges:"\u2A7E",gescc:"\u2AA9",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",gfr:"\u{1D524}",gg:"\u226B",ggg:"\u22D9",gimel:"\u2137",gjcy:"\u0453",gl:"\u2277",glE:"\u2A92",gla:"\u2AA5",glj:"\u2AA4",gnE:"\u2269",gnap:"\u2A8A",gnapprox:"\u2A8A",gne:"\u2A88",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",gopf:"\u{1D558}",grave:"`",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",g:">",gt:">",gtcc:"\u2AA7",gtcir:"\u2A7A",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",hArr:"\u21D4",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",hardcy:"\u044A",harr:"\u2194",harrcir:"\u2948",harrw:"\u21AD",hbar:"\u210F",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",hfr:"\u{1D525}",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",hopf:"\u{1D559}",horbar:"\u2015",hscr:"\u{1D4BD}",hslash:"\u210F",hstrok:"\u0127",hybull:"\u2043",hyphen:"\u2010",iacut:"\xED",iacute:"\xED",ic:"\u2063",icir:"\xEE",icirc:"\xEE",icy:"\u0438",iecy:"\u0435",iexc:"\xA1",iexcl:"\xA1",iff:"\u21D4",ifr:"\u{1D526}",igrav:"\xEC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",ijlig:"\u0133",imacr:"\u012B",image:"\u2111",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",imof:"\u22B7",imped:"\u01B5",in:"\u2208",incare:"\u2105",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",int:"\u222B",intcal:"\u22BA",integers:"\u2124",intercal:"\u22BA",intlarhk:"\u2A17",intprod:"\u2A3C",iocy:"\u0451",iogon:"\u012F",iopf:"\u{1D55A}",iota:"\u03B9",iprod:"\u2A3C",iques:"\xBF",iquest:"\xBF",iscr:"\u{1D4BE}",isin:"\u2208",isinE:"\u22F9",isindot:"\u22F5",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",itilde:"\u0129",iukcy:"\u0456",ium:"\xEF",iuml:"\xEF",jcirc:"\u0135",jcy:"\u0439",jfr:"\u{1D527}",jmath:"\u0237",jopf:"\u{1D55B}",jscr:"\u{1D4BF}",jsercy:"\u0458",jukcy:"\u0454",kappa:"\u03BA",kappav:"\u03F0",kcedil:"\u0137",kcy:"\u043A",kfr:"\u{1D528}",kgreen:"\u0138",khcy:"\u0445",kjcy:"\u045C",kopf:"\u{1D55C}",kscr:"\u{1D4C0}",lAarr:"\u21DA",lArr:"\u21D0",lAtail:"\u291B",lBarr:"\u290E",lE:"\u2266",lEg:"\u2A8B",lHar:"\u2962",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",lambda:"\u03BB",lang:"\u27E8",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",laqu:"\xAB",laquo:"\xAB",larr:"\u2190",larrb:"\u21E4",larrbfs:"\u291F",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",lat:"\u2AAB",latail:"\u2919",late:"\u2AAD",lates:"\u2AAD\uFE00",lbarr:"\u290C",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",lcaron:"\u013E",lcedil:"\u013C",lceil:"\u2308",lcub:"{",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",le:"\u2264",leftarrow:"\u2190",leftarrowtail:"\u21A2",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",leftrightarrow:"\u2194",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",leftthreetimes:"\u22CB",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",les:"\u2A7D",lescc:"\u2AA8",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",lessgtr:"\u2276",lesssim:"\u2272",lfisht:"\u297C",lfloor:"\u230A",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",ljcy:"\u0459",ll:"\u226A",llarr:"\u21C7",llcorner:"\u231E",llhard:"\u296B",lltri:"\u25FA",lmidot:"\u0140",lmoust:"\u23B0",lmoustache:"\u23B0",lnE:"\u2268",lnap:"\u2A89",lnapprox:"\u2A89",lne:"\u2A87",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",longleftarrow:"\u27F5",longleftrightarrow:"\u27F7",longmapsto:"\u27FC",longrightarrow:"\u27F6",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",lscr:"\u{1D4C1}",lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",lstrok:"\u0142",l:"<",lt:"<",ltcc:"\u2AA6",ltcir:"\u2A79",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltrPar:"\u2996",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",mDDot:"\u223A",mac:"\xAF",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",mcy:"\u043C",mdash:"\u2014",measuredangle:"\u2221",mfr:"\u{1D52A}",mho:"\u2127",micr:"\xB5",micro:"\xB5",mid:"\u2223",midast:"*",midcir:"\u2AF0",middo:"\xB7",middot:"\xB7",minus:"\u2212",minusb:"\u229F",minusd:"\u2238",minusdu:"\u2A2A",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",mopf:"\u{1D55E}",mp:"\u2213",mscr:"\u{1D4C2}",mstpos:"\u223E",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nGg:"\u22D9\u0338",nGt:"\u226B\u20D2",nGtv:"\u226B\u0338",nLeftarrow:"\u21CD",nLeftrightarrow:"\u21CE",nLl:"\u22D8\u0338",nLt:"\u226A\u20D2",nLtv:"\u226A\u0338",nRightarrow:"\u21CF",nVDash:"\u22AF",nVdash:"\u22AE",nabla:"\u2207",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natur:"\u266E",natural:"\u266E",naturals:"\u2115",nbs:"\xA0",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",ncaron:"\u0148",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",ncy:"\u043D",ndash:"\u2013",ne:"\u2260",neArr:"\u21D7",nearhk:"\u2924",nearr:"\u2197",nearrow:"\u2197",nedot:"\u2250\u0338",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",nexist:"\u2204",nexists:"\u2204",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",ngsim:"\u2275",ngt:"\u226F",ngtr:"\u226F",nhArr:"\u21CE",nharr:"\u21AE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",njcy:"\u045A",nlArr:"\u21CD",nlE:"\u2266\u0338",nlarr:"\u219A",nldr:"\u2025",nle:"\u2270",nleftarrow:"\u219A",nleftrightarrow:"\u21AE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nlsim:"\u2274",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nmid:"\u2224",nopf:"\u{1D55F}",no:"\xAC",not:"\xAC",notin:"\u2209",notinE:"\u22F9\u0338",notindot:"\u22F5\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",npar:"\u2226",nparallel:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",npre:"\u2AAF\u0338",nprec:"\u2280",npreceq:"\u2AAF\u0338",nrArr:"\u21CF",nrarr:"\u219B",nrarrc:"\u2933\u0338",nrarrw:"\u219D\u0338",nrightarrow:"\u219B",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",ntild:"\xF1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvDash:"\u22AD",nvHarr:"\u2904",nvap:"\u224D\u20D2",nvdash:"\u22AC",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwArr:"\u21D6",nwarhk:"\u2923",nwarr:"\u2196",nwarrow:"\u2196",nwnear:"\u2927",oS:"\u24C8",oacut:"\xF3",oacute:"\xF3",oast:"\u229B",ocir:"\xF4",ocirc:"\xF4",ocy:"\u043E",odash:"\u229D",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",oelig:"\u0153",ofcir:"\u29BF",ofr:"\u{1D52C}",ogon:"\u02DB",ograv:"\xF2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",omacr:"\u014D",omega:"\u03C9",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",oopf:"\u{1D560}",opar:"\u29B7",operp:"\u29B9",oplus:"\u2295",or:"\u2228",orarr:"\u21BB",ord:"\xBA",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oscr:"\u2134",oslas:"\xF8",oslash:"\xF8",osol:"\u2298",otild:"\xF5",otilde:"\xF5",otimes:"\u2297",otimesas:"\u2A36",oum:"\xF6",ouml:"\xF6",ovbar:"\u233D",par:"\xB6",para:"\xB6",parallel:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",pfr:"\u{1D52D}",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plus:"+",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",plusm:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",pointint:"\u2A15",popf:"\u{1D561}",poun:"\xA3",pound:"\xA3",pr:"\u227A",prE:"\u2AB3",prap:"\u2AB7",prcue:"\u227C",pre:"\u2AAF",prec:"\u227A",precapprox:"\u2AB7",preccurlyeq:"\u227C",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",precsim:"\u227E",prime:"\u2032",primes:"\u2119",prnE:"\u2AB5",prnap:"\u2AB9",prnsim:"\u22E8",prod:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",pscr:"\u{1D4C5}",psi:"\u03C8",puncsp:"\u2008",qfr:"\u{1D52E}",qint:"\u2A0C",qopf:"\u{1D562}",qprime:"\u2057",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",quo:'"',quot:'"',rAarr:"\u21DB",rArr:"\u21D2",rAtail:"\u291C",rBarr:"\u290F",rHar:"\u2964",race:"\u223D\u0331",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",rang:"\u27E9",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raqu:"\xBB",raquo:"\xBB",rarr:"\u2192",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",rarrtl:"\u21A3",rarrw:"\u219D",ratail:"\u291A",ratio:"\u2236",rationals:"\u211A",rbarr:"\u290D",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",rcaron:"\u0159",rcedil:"\u0157",rceil:"\u2309",rcub:"}",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",rect:"\u25AD",re:"\xAE",reg:"\xAE",rfisht:"\u297D",rfloor:"\u230B",rfr:"\u{1D52F}",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",rho:"\u03C1",rhov:"\u03F1",rightarrow:"\u2192",rightarrowtail:"\u21A3",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",rightthreetimes:"\u22CC",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoust:"\u23B1",rmoustache:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",ropf:"\u{1D563}",roplus:"\u2A2E",rotimes:"\u2A35",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",rsaquo:"\u203A",rscr:"\u{1D4C7}",rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",ruluhar:"\u2968",rx:"\u211E",sacute:"\u015B",sbquo:"\u201A",sc:"\u227B",scE:"\u2AB4",scap:"\u2AB8",scaron:"\u0161",sccue:"\u227D",sce:"\u2AB0",scedil:"\u015F",scirc:"\u015D",scnE:"\u2AB6",scnap:"\u2ABA",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",scy:"\u0441",sdot:"\u22C5",sdotb:"\u22A1",sdote:"\u2A66",seArr:"\u21D8",searhk:"\u2925",searr:"\u2198",searrow:"\u2198",sec:"\xA7",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",shchcy:"\u0449",shcy:"\u0448",shortmid:"\u2223",shortparallel:"\u2225",sh:"\xAD",shy:"\xAD",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",softcy:"\u044C",sol:"/",solb:"\u29C4",solbar:"\u233F",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",squ:"\u25A1",square:"\u25A1",squarf:"\u25AA",squf:"\u25AA",srarr:"\u2192",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",sub:"\u2282",subE:"\u2AC5",subdot:"\u2ABD",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",subset:"\u2282",subseteq:"\u2286",subseteqq:"\u2AC5",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succ:"\u227B",succapprox:"\u2AB8",succcurlyeq:"\u227D",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",sum:"\u2211",sung:"\u266A",sup:"\u2283",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",supE:"\u2AC6",supdot:"\u2ABE",supdsub:"\u2AD8",supe:"\u2287",supedot:"\u2AC4",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",supset:"\u2283",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swArr:"\u21D9",swarhk:"\u2926",swarr:"\u2199",swarrow:"\u2199",swnwar:"\u292A",szli:"\xDF",szlig:"\xDF",target:"\u2316",tau:"\u03C4",tbrk:"\u23B4",tcaron:"\u0165",tcedil:"\u0163",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",tfr:"\u{1D531}",there4:"\u2234",therefore:"\u2234",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223C",thor:"\xFE",thorn:"\xFE",tilde:"\u02DC",time:"\xD7",times:"\xD7",timesb:"\u22A0",timesbar:"\u2A31",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",top:"\u22A4",topbot:"\u2336",topcir:"\u2AF1",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",tscr:"\u{1D4C9}",tscy:"\u0446",tshcy:"\u045B",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",uArr:"\u21D1",uHar:"\u2963",uacut:"\xFA",uacute:"\xFA",uarr:"\u2191",ubrcy:"\u045E",ubreve:"\u016D",ucir:"\xFB",ucirc:"\xFB",ucy:"\u0443",udarr:"\u21C5",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",ufr:"\u{1D532}",ugrav:"\xF9",ugrave:"\xF9",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",umacr:"\u016B",um:"\xA8",uml:"\xA8",uogon:"\u0173",uopf:"\u{1D566}",uparrow:"\u2191",updownarrow:"\u2195",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",upsi:"\u03C5",upsih:"\u03D2",upsilon:"\u03C5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",uring:"\u016F",urtri:"\u25F9",uscr:"\u{1D4CA}",utdot:"\u22F0",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",uum:"\xFC",uuml:"\xFC",uwangle:"\u29A7",vArr:"\u21D5",vBar:"\u2AE8",vBarv:"\u2AE9",vDash:"\u22A8",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",varr:"\u2195",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",vcy:"\u0432",vdash:"\u22A2",vee:"\u2228",veebar:"\u22BB",veeeq:"\u225A",vellip:"\u22EE",verbar:"|",vert:"|",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",vzigzag:"\u299A",wcirc:"\u0175",wedbar:"\u2A5F",wedge:"\u2227",wedgeq:"\u2259",weierp:"\u2118",wfr:"\u{1D534}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",xfr:"\u{1D535}",xhArr:"\u27FA",xharr:"\u27F7",xi:"\u03BE",xlArr:"\u27F8",xlarr:"\u27F5",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrArr:"\u27F9",xrarr:"\u27F6",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",yacut:"\xFD",yacute:"\xFD",yacy:"\u044F",ycirc:"\u0177",ycy:"\u044B",ye:"\xA5",yen:"\xA5",yfr:"\u{1D536}",yicy:"\u0457",yopf:"\u{1D56A}",yscr:"\u{1D4CE}",yucy:"\u044E",yum:"\xFF",yuml:"\xFF",zacute:"\u017A",zcaron:"\u017E",zcy:"\u0437",zdot:"\u017C",zeetrf:"\u2128",zeta:"\u03B6",zfr:"\u{1D537}",zhcy:"\u0436",zigrarr:"\u21DD",zopf:"\u{1D56B}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"};var Bk={}.hasOwnProperty;function _i(t){return Bk.call(uu,t)?uu[t]:!1}var Os={name:"characterReference",tokenize:Kk};function Kk(t,n,e){let r=this,i=0,a,o;return s;function s(d){return t.enter("characterReference"),t.enter("characterReferenceMarker"),t.consume(d),t.exit("characterReferenceMarker"),u}function u(d){return d===35?(t.enter("characterReferenceMarkerNumeric"),t.consume(d),t.exit("characterReferenceMarkerNumeric"),l):(t.enter("characterReferenceValue"),a=31,o=jt,c(d))}function l(d){return d===88||d===120?(t.enter("characterReferenceMarkerHexadecimal"),t.consume(d),t.exit("characterReferenceMarkerHexadecimal"),t.enter("characterReferenceValue"),a=6,o=Ev,c):(t.enter("characterReferenceValue"),a=7,o=Ma,c(d))}function c(d){let f;return d===59&&i?(f=t.exit("characterReferenceValue"),o===jt&&!_i(r.sliceSerialize(f))?e(d):(t.enter("characterReferenceMarker"),t.consume(d),t.exit("characterReferenceMarker"),t.exit("characterReference"),n)):o(d)&&i++=4?o(l):e(l)}function o(l){return l===null?u(l):se(l)?t.attempt(Uk,o,u)(l):(t.enter("codeFlowValue"),s(l))}function s(l){return l===null||se(l)?(t.exit("codeFlowValue"),o(l)):(t.consume(l),s)}function u(l){return t.exit("codeIndented"),n(l)}}function Vk(t,n,e){let r=this;return i;function i(o){return r.parser.lazy[r.now().line]?e(o):se(o)?(t.enter("lineEnding"),t.consume(o),t.exit("lineEnding"),i):ke(t,a,"linePrefix",4+1)(o)}function a(o){let s=r.events[r.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?n(o):se(o)?i(o):e(o)}}var du={name:"codeText",tokenize:qk,resolve:jk,previous:Wk};function jk(t){let n=t.length-4,e=3,r,i;if((t[e][1].type==="lineEnding"||t[e][1].type==="space")&&(t[n][1].type==="lineEnding"||t[n][1].type==="space")){for(r=e;++r=4?n(o):t.interrupt(r.parser.constructs.flow,e,n)(o)}}function Rs(t,n,e,r,i,a,o,s,u){let l=u||Number.POSITIVE_INFINITY,c=0;return d;function d(S){return S===60?(t.enter(r),t.enter(i),t.enter(a),t.consume(S),t.exit(a),f):S===null||S===41||Ca(S)?e(S):(t.enter(r),t.enter(o),t.enter(s),t.enter("chunkString",{contentType:"string"}),g(S))}function f(S){return S===62?(t.enter(a),t.consume(S),t.exit(a),t.exit(i),t.exit(r),n):(t.enter(s),t.enter("chunkString",{contentType:"string"}),h(S))}function h(S){return S===62?(t.exit("chunkString"),t.exit(s),f(S)):S===null||S===60||se(S)?e(S):(t.consume(S),S===92?p:h)}function p(S){return S===60||S===62||S===92?(t.consume(S),h):h(S)}function g(S){return S===40?++c>l?e(S):(t.consume(S),g):S===41?c--?(t.consume(S),g):(t.exit("chunkString"),t.exit(s),t.exit(o),t.exit(r),n(S)):S===null||Je(S)?c?e(S):(t.exit("chunkString"),t.exit(s),t.exit(o),t.exit(r),n(S)):Ca(S)?e(S):(t.consume(S),S===92?w:g)}function w(S){return S===40||S===41||S===92?(t.consume(S),g):g(S)}}function Hs(t,n,e,r,i,a){let o=this,s=0,u;return l;function l(h){return t.enter(r),t.enter(i),t.consume(h),t.exit(i),t.enter(a),c}function c(h){return h===null||h===91||h===93&&!u||h===94&&!s&&"_hiddenFootnoteSupport"in o.parser.constructs||s>999?e(h):h===93?(t.exit(a),t.enter(i),t.consume(h),t.exit(i),t.exit(r),n):se(h)?(t.enter("lineEnding"),t.consume(h),t.exit("lineEnding"),c):(t.enter("chunkString",{contentType:"string"}),d(h))}function d(h){return h===null||h===91||h===93||se(h)||s++>999?(t.exit("chunkString"),c(h)):(t.consume(h),u=u||!He(h),h===92?f:d)}function f(h){return h===91||h===92||h===93?(t.consume(h),s++,d):d(h)}}function Bs(t,n,e,r,i,a){let o;return s;function s(f){return t.enter(r),t.enter(i),t.consume(f),t.exit(i),o=f===40?41:f,u}function u(f){return f===o?(t.enter(i),t.consume(f),t.exit(i),t.exit(r),n):(t.enter(a),l(f))}function l(f){return f===o?(t.exit(a),u(o)):f===null?e(f):se(f)?(t.enter("lineEnding"),t.consume(f),t.exit("lineEnding"),ke(t,l,"linePrefix")):(t.enter("chunkString",{contentType:"string"}),c(f))}function c(f){return f===o||f===null||se(f)?(t.exit("chunkString"),l(f)):(t.consume(f),f===92?d:c)}function d(f){return f===o||f===92?(t.consume(f),c):c(f)}}function Rr(t,n){let e;return r;function r(i){return se(i)?(t.enter("lineEnding"),t.consume(i),t.exit("lineEnding"),e=!0,r):He(i)?ke(t,r,e?"linePrefix":"lineSuffix")(i):n(i)}}function ir(t){return t.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}var hu={name:"definition",tokenize:e0},Zk={tokenize:t0,partial:!0};function e0(t,n,e){let r=this,i;return a;function a(u){return t.enter("definition"),Hs.call(r,t,o,e,"definitionLabel","definitionLabelMarker","definitionLabelString")(u)}function o(u){return i=ir(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),u===58?(t.enter("definitionMarker"),t.consume(u),t.exit("definitionMarker"),Rr(t,Rs(t,t.attempt(Zk,ke(t,s,"whitespace"),ke(t,s,"whitespace")),e,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString"))):e(u)}function s(u){return u===null||se(u)?(t.exit("definition"),r.parser.defined.includes(i)||r.parser.defined.push(i),n(u)):e(u)}}function t0(t,n,e){return r;function r(o){return Je(o)?Rr(t,i)(o):e(o)}function i(o){return o===34||o===39||o===40?Bs(t,ke(t,a,"whitespace"),e,"definitionTitle","definitionTitleMarker","definitionTitleString")(o):e(o)}function a(o){return o===null||se(o)?n(o):e(o)}}var pu={name:"hardBreakEscape",tokenize:n0};function n0(t,n,e){return r;function r(a){return t.enter("hardBreakEscape"),t.enter("escapeMarker"),t.consume(a),i}function i(a){return se(a)?(t.exit("escapeMarker"),t.exit("hardBreakEscape"),n(a)):e(a)}}var mu={name:"headingAtx",tokenize:i0,resolve:r0};function r0(t,n){let e=t.length-2,r=3,i,a;return t[r][1].type==="whitespace"&&(r+=2),e-2>r&&t[e][1].type==="whitespace"&&(e-=2),t[e][1].type==="atxHeadingSequence"&&(r===e-1||e-4>r&&t[e-2][1].type==="whitespace")&&(e-=r+1===e?2:4),e>r&&(i={type:"atxHeadingText",start:t[r][1].start,end:t[e][1].end},a={type:"chunkText",start:t[r][1].start,end:t[e][1].end,contentType:"text"},Mt(t,r,e-r+1,[["enter",i,n],["enter",a,n],["exit",a,n],["exit",i,n]])),t}function i0(t,n,e){let r=this,i=0;return a;function a(c){return t.enter("atxHeading"),t.enter("atxHeadingSequence"),o(c)}function o(c){return c===35&&i++<6?(t.consume(c),o):c===null||Je(c)?(t.exit("atxHeadingSequence"),r.interrupt?n(c):s(c)):e(c)}function s(c){return c===35?(t.enter("atxHeadingSequence"),u(c)):c===null||se(c)?(t.exit("atxHeading"),n(c)):He(c)?ke(t,s,"whitespace")(c):(t.enter("atxHeadingText"),l(c))}function u(c){return c===35?(t.consume(c),u):(t.exit("atxHeadingSequence"),s(c))}function l(c){return c===null||c===35||Je(c)?(t.exit("atxHeadingText"),s(c)):(t.consume(c),l)}}var Dv=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],gu=["pre","script","style","textarea"];var vu={name:"htmlFlow",tokenize:s0,resolveTo:o0,concrete:!0},a0={tokenize:l0,partial:!0};function o0(t){let n=t.length;for(;n--&&!(t[n][0]==="enter"&&t[n][1].type==="htmlFlow"););return n>1&&t[n-2][1].type==="linePrefix"&&(t[n][1].start=t[n-2][1].start,t[n+1][1].start=t[n-2][1].start,t.splice(n-2,2)),t}function s0(t,n,e){let r=this,i,a,o,s,u;return l;function l(I){return t.enter("htmlFlow"),t.enter("htmlFlowData"),t.consume(I),c}function c(I){return I===33?(t.consume(I),d):I===47?(t.consume(I),p):I===63?(t.consume(I),i=3,r.interrupt?n:he):fn(I)?(t.consume(I),o=String.fromCharCode(I),a=!0,g):e(I)}function d(I){return I===45?(t.consume(I),i=2,f):I===91?(t.consume(I),i=5,o="CDATA[",s=0,h):fn(I)?(t.consume(I),i=4,r.interrupt?n:he):e(I)}function f(I){return I===45?(t.consume(I),r.interrupt?n:he):e(I)}function h(I){return I===o.charCodeAt(s++)?(t.consume(I),s===o.length?r.interrupt?n:X:h):e(I)}function p(I){return fn(I)?(t.consume(I),o=String.fromCharCode(I),g):e(I)}function g(I){return I===null||I===47||I===62||Je(I)?I!==47&&a&&gu.includes(o.toLowerCase())?(i=1,r.interrupt?n(I):X(I)):Dv.includes(o.toLowerCase())?(i=6,I===47?(t.consume(I),w):r.interrupt?n(I):X(I)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?e(I):a?T(I):S(I)):I===45||jt(I)?(t.consume(I),o+=String.fromCharCode(I),g):e(I)}function w(I){return I===62?(t.consume(I),r.interrupt?n:X):e(I)}function S(I){return He(I)?(t.consume(I),S):z(I)}function T(I){return I===47?(t.consume(I),z):I===58||I===95||fn(I)?(t.consume(I),k):He(I)?(t.consume(I),T):z(I)}function k(I){return I===45||I===46||I===58||I===95||jt(I)?(t.consume(I),k):D(I)}function D(I){return I===61?(t.consume(I),N):He(I)?(t.consume(I),D):T(I)}function N(I){return I===null||I===60||I===61||I===62||I===96?e(I):I===34||I===39?(t.consume(I),u=I,C):He(I)?(t.consume(I),N):(u=null,O(I))}function C(I){return I===null||se(I)?e(I):I===u?(t.consume(I),B):(t.consume(I),C)}function O(I){return I===null||I===34||I===39||I===60||I===61||I===62||I===96||Je(I)?D(I):(t.consume(I),O)}function B(I){return I===47||I===62||He(I)?T(I):e(I)}function z(I){return I===62?(t.consume(I),Q):e(I)}function Q(I){return He(I)?(t.consume(I),Q):I===null||se(I)?X(I):e(I)}function X(I){return I===45&&i===2?(t.consume(I),te):I===60&&i===1?(t.consume(I),ce):I===62&&i===4?(t.consume(I),De):I===63&&i===3?(t.consume(I),he):I===93&&i===5?(t.consume(I),fe):se(I)&&(i===6||i===7)?t.check(a0,De,ie)(I):I===null||se(I)?ie(I):(t.consume(I),X)}function ie(I){return t.exit("htmlFlowData"),q(I)}function q(I){return I===null?A(I):se(I)?t.attempt({tokenize:J,partial:!0},q,A)(I):(t.enter("htmlFlowData"),X(I))}function J(I,et,qe){return K;function K(U){return I.enter("lineEnding"),I.consume(U),I.exit("lineEnding"),V}function V(U){return r.parser.lazy[r.now().line]?qe(U):et(U)}}function te(I){return I===45?(t.consume(I),he):X(I)}function ce(I){return I===47?(t.consume(I),o="",de):X(I)}function de(I){return I===62&&gu.includes(o.toLowerCase())?(t.consume(I),De):fn(I)&&o.length<8?(t.consume(I),o+=String.fromCharCode(I),de):X(I)}function fe(I){return I===93?(t.consume(I),he):X(I)}function he(I){return I===62?(t.consume(I),De):I===45&&i===2?(t.consume(I),he):X(I)}function De(I){return I===null||se(I)?(t.exit("htmlFlowData"),A(I)):(t.consume(I),De)}function A(I){return t.exit("htmlFlow"),n(I)}}function l0(t,n,e){return r;function r(i){return t.exit("htmlFlowData"),t.enter("lineEndingBlank"),t.consume(i),t.exit("lineEndingBlank"),t.attempt(Er,n,e)}}var yu={name:"htmlText",tokenize:c0};function c0(t,n,e){let r=this,i,a,o,s;return u;function u(A){return t.enter("htmlText"),t.enter("htmlTextData"),t.consume(A),l}function l(A){return A===33?(t.consume(A),c):A===47?(t.consume(A),O):A===63?(t.consume(A),N):fn(A)?(t.consume(A),Q):e(A)}function c(A){return A===45?(t.consume(A),d):A===91?(t.consume(A),a="CDATA[",o=0,w):fn(A)?(t.consume(A),D):e(A)}function d(A){return A===45?(t.consume(A),f):e(A)}function f(A){return A===null||A===62?e(A):A===45?(t.consume(A),h):p(A)}function h(A){return A===null||A===62?e(A):p(A)}function p(A){return A===null?e(A):A===45?(t.consume(A),g):se(A)?(s=p,fe(A)):(t.consume(A),p)}function g(A){return A===45?(t.consume(A),De):p(A)}function w(A){return A===a.charCodeAt(o++)?(t.consume(A),o===a.length?S:w):e(A)}function S(A){return A===null?e(A):A===93?(t.consume(A),T):se(A)?(s=S,fe(A)):(t.consume(A),S)}function T(A){return A===93?(t.consume(A),k):S(A)}function k(A){return A===62?De(A):A===93?(t.consume(A),k):S(A)}function D(A){return A===null||A===62?De(A):se(A)?(s=D,fe(A)):(t.consume(A),D)}function N(A){return A===null?e(A):A===63?(t.consume(A),C):se(A)?(s=N,fe(A)):(t.consume(A),N)}function C(A){return A===62?De(A):N(A)}function O(A){return fn(A)?(t.consume(A),B):e(A)}function B(A){return A===45||jt(A)?(t.consume(A),B):z(A)}function z(A){return se(A)?(s=z,fe(A)):He(A)?(t.consume(A),z):De(A)}function Q(A){return A===45||jt(A)?(t.consume(A),Q):A===47||A===62||Je(A)?X(A):e(A)}function X(A){return A===47?(t.consume(A),De):A===58||A===95||fn(A)?(t.consume(A),ie):se(A)?(s=X,fe(A)):He(A)?(t.consume(A),X):De(A)}function ie(A){return A===45||A===46||A===58||A===95||jt(A)?(t.consume(A),ie):q(A)}function q(A){return A===61?(t.consume(A),J):se(A)?(s=q,fe(A)):He(A)?(t.consume(A),q):X(A)}function J(A){return A===null||A===60||A===61||A===62||A===96?e(A):A===34||A===39?(t.consume(A),i=A,te):se(A)?(s=J,fe(A)):He(A)?(t.consume(A),J):(t.consume(A),i=void 0,de)}function te(A){return A===i?(t.consume(A),ce):A===null?e(A):se(A)?(s=te,fe(A)):(t.consume(A),te)}function ce(A){return A===62||A===47||Je(A)?X(A):e(A)}function de(A){return A===null||A===34||A===39||A===60||A===61||A===96?e(A):A===62||Je(A)?X(A):(t.consume(A),de)}function fe(A){return t.exit("htmlTextData"),t.enter("lineEnding"),t.consume(A),t.exit("lineEnding"),ke(t,he,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function he(A){return t.enter("htmlTextData"),s(A)}function De(A){return A===62?(t.consume(A),t.exit("htmlTextData"),t.exit("htmlText"),n):e(A)}}var Hr={name:"labelEnd",tokenize:m0,resolveTo:p0,resolveAll:h0},u0={tokenize:g0},d0={tokenize:v0},f0={tokenize:y0};function h0(t){let n=-1,e;for(;++n-1&&(o[0]=o[0].slice(r)),a>0&&o.push(t[i].slice(0,a))),o}function N0(t,n){let e=-1,r=[],i;for(;++ey_,contentInitial:()=>f_,disable:()=>b_,document:()=>d_,flow:()=>p_,flowInitial:()=>h_,insideSpan:()=>v_,string:()=>m_,text:()=>g_});var d_={[42]:Bt,[43]:Bt,[45]:Bt,[48]:Bt,[49]:Bt,[50]:Bt,[51]:Bt,[52]:Bt,[53]:Bt,[54]:Bt,[55]:Bt,[56]:Bt,[57]:Bt,[62]:Us},f_={[91]:xu},h_={[-2]:Aa,[-1]:Aa,[32]:Aa},p_={[35]:_u,[42]:$r,[45]:[Gs,$r],[60]:Mu,[61]:Gs,[95]:$r,[96]:Vs,[126]:Vs},m_={[38]:zs,[92]:js},g_={[-5]:La,[-4]:La,[-3]:La,[33]:Cu,[38]:zs,[42]:Ia,[60]:[bu,Du],[91]:Iu,[92]:[ku,js],[93]:Kr,[95]:Ia,[96]:Eu},v_={null:[Ia,Qv]},y_={null:[42,95]},b_={null:[]};function ry(t={}){let n=Bv([Au].concat(t.extensions||[])),e={defined:[],lazy:{},constructs:n,content:r(Vv),document:r(qv),flow:r(Gv),string:r(Xv),text:r(Zv)};return e;function r(i){return a;function a(o){return ny(e,i,o)}}}var iy=/[\0\t\n\r]/g;function ay(){let t=1,n="",e=!0,r;return i;function i(a,o,s){let u=[],l,c,d,f,h;for(a=n+a.toString(o),d=0,n="",e&&(a.charCodeAt(0)===65279&&d++,e=void 0);d13&&e<32||e>126&&e<160||e>55295&&e<57344||e>64975&&e<65008||(e&65535)==65535||(e&65535)==65534||e>1114111?"\uFFFD":String.fromCharCode(e)}var w_=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function sy(t){return t.replace(w_,E_)}function E_(t,n,e){if(n)return n;if(e.charCodeAt(0)===35){let i=e.charCodeAt(1),a=i===120||i===88;return Qs(e.slice(a?2:1),a?16:10)}return Ci(e)||t}var Ii={}.hasOwnProperty;function Pa(t){return!t||typeof t!="object"?"":Ii.call(t,"position")||Ii.call(t,"type")?ly(t.position):Ii.call(t,"start")||Ii.call(t,"end")?ly(t):Ii.call(t,"line")||Ii.call(t,"column")?Lu(t):""}function Lu(t){return cy(t&&t.line)+":"+cy(t&&t.column)}function ly(t){return Lu(t&&t.start)+"-"+Lu(t&&t.end)}function cy(t){return t&&typeof t=="number"?t:1}var Pu={}.hasOwnProperty,Xs=function(t,n,e){return typeof n!="string"&&(e=n,n=void 0),S_(e)(oy(ry(e).document().write(ay()(t,n,!0))))};function S_(t={}){let n=uy({transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:u(Mn),autolinkProtocol:ie,autolinkEmail:ie,atxHeading:u(Xt),blockQuote:u(rt),characterEscape:ie,characterReference:ie,codeFenced:u(gt),codeFencedFenceInfo:l,codeFencedFenceMeta:l,codeIndented:u(gt,l),codeText:u(dt,l),codeTextData:ie,data:ie,codeFlowValue:ie,definition:u(un),definitionDestinationString:l,definitionLabelString:l,definitionTitleString:l,emphasis:u(dn),hardBreakEscape:u(Ct),hardBreakTrailing:u(Ct),htmlFlow:u(Zt,l),htmlFlowData:ie,htmlText:u(Zt,l),htmlTextData:ie,image:u(Kn),label:l,link:u(Mn),listItem:u($n),listItemValue:g,listOrdered:u(yn,p),listUnordered:u(yn),paragraph:u(fn),reference:z,referenceString:l,resourceDestinationString:l,resourceTitleString:l,setextHeading:u(Xt),strong:u(yt),thematicBreak:u(it)},exit:{atxHeading:d(),atxHeadingSequence:K,autolink:d(),autolinkEmail:Pe,autolinkProtocol:Ee,blockQuote:d(),characterEscapeValue:Y,characterReferenceMarkerHexadecimal:G,characterReferenceMarkerNumeric:G,characterReferenceValue:we,codeFenced:d(k),codeFencedFence:_,codeFencedFenceInfo:w,codeFencedFenceMeta:S,codeFlowValue:Y,codeIndented:d(P),codeText:d(fe),codeTextData:Y,data:Y,definition:d(),definitionDestinationString:N,definitionLabelString:I,definitionTitleString:D,emphasis:d(),hardBreakEscape:d(ne),hardBreakTrailing:d(ne),htmlFlow:d(le),htmlFlowData:Y,htmlText:d(de),htmlTextData:Y,image:d(Te),label:A,labelText:C,lineEnding:J,link:d(he),listItem:d(),listOrdered:d(),listUnordered:d(),paragraph:d(),referenceString:U,resourceDestinationString:tt,resourceTitleString:$e,resource:B,setextHeading:d(Q),setextHeadingLineSequence:X,setextHeadingText:j,strong:d(),thematicBreak:d()}},t.mdastExtensions||[]),e={};return r;function r(V){let re={type:"root",children:[]},ye=[re],Be=[],ft=[],Ke={stack:ye,tokenStack:Be,config:n,enter:c,exit:f,buffer:l,resume:h,setData:a,getData:o},Ue=-1;for(;++Ue0){let Ge=Be[Be.length-1];(Ge[1]||dy).call(Ke,void 0,Ge[0])}for(re.position={start:s(V.length>0?V[0][1].start:{line:1,column:1,offset:0}),end:s(V.length>0?V[V.length-2][1].end:{line:1,column:1,offset:0})},Ue=-1;++Ue=0;i--){if(!n&&/[`%\n\r]/.test(t[i])){t[i]==="`"&&(e++,e===3&&(n=!0,r=i-1));continue}else if(!n)return{};if(t[i]==="`"&&t[i-1]==="`"&&t[i-2]==="`"&&/[\r\n]/.test(t[i-3]))return JSON.parse(t.slice(i+1,r).trim())}}function My(t){return[xy,Li("date",`${t.getSetting("date-trigger")}{`,"}"),Li("dateLink",`${t.getSetting("date-trigger")}[[`,"]]"),Li("time",`${t.getSetting("time-trigger")}{`,"}"),Li("embedWikilink","![[","]]"),Li("wikilink","[[","]]"),Ey(),yy()]}function Dy(t){return[ky,Pi("date",(n,e)=>{!n||(e.date=n)}),Pi("dateLink",(n,e)=>{!n||(e.date=n)}),Pi("time",(n,e)=>{!n||(e.time=n)}),Pi("embedWikilink",(n,e)=>{if(!n)return;let r=Nr(n),i=t.app.metadataCache.getFirstLinkpathDest(r.root,t.file.path);e.fileAccessor={target:r.root,isEmbed:!0,stats:i==null?void 0:i.stat}}),Pi("wikilink",(n,e)=>{if(!n)return;let r=Nr(n),i=t.app.metadataCache.getFirstLinkpathDest(r.root,t.file.path);if(e.fileAccessor={target:r.root,isEmbed:!1},i){let a=eu(t,i);e.fileMetadata=a.fileMetadata,e.fileMetadataOrder=a.fileMetadataOrder}}),wy((n,e)=>{if(!n.url||/:\/\//.test(n.url)||!/.md$/.test(n.url))return;let r=t.app.metadataCache.getFirstLinkpathDest(decodeURIComponent(n.url),t.file.path);if(e)n.type="embedLink",n.fileAccessor={target:decodeURIComponent(n.url),isEmbed:!0,stats:r.stat};else if(n.fileAccessor={target:decodeURIComponent(n.url),isEmbed:!1},r){let i=eu(t,r);n.fileMetadata=i.fileMetadata,n.fileMetadataOrder=i.fileMetadataOrder}}),Sy(),by()]}function Cy(t,n){let e=L_(n),i={...P_(n)},a={};return Object.keys(e).forEach(o=>{o===ln?(i[o]=e[o],a[o]=e[o]):bv[o]?i[o]=e[o]:a[o]=e[o]}),t.compileSettings(i),{settings:i,frontmatter:a,ast:Xs(n,{extensions:[Nu(["yaml"]),...My(t)],mdastExtensions:[my(["yaml"]),...Dy(t)]})}}function Hu(t,n){return Xs(n,{extensions:My(t),mdastExtensions:Dy(t)})}function nl(t,n,e){let r=t.getSetting("hide-tags-in-title"),i=t.getSetting("hide-date-in-title"),a=pu(e.children[0]),o=mu(n,a);(o==="[ ]"||o==="[x]")&&(o="");let s=o,u={titleRaw:o.replace(/
/g,` -`),blockId:void 0,title:"",titleSearch:"",metadata:{dateStr:void 0,date:void 0,time:void 0,timeStr:void 0,tags:[],fileAccessor:void 0,file:void 0,fileMetadata:void 0,fileMetadataOrder:void 0},dom:void 0,isComplete:!!e.checked};return Av(e,l=>l.type!=="paragraph",l=>{let c=l;if(c.type==="blockid")return u.blockId=c.value,!0;if(c.type==="hashtag")return u.metadata.tags||(u.metadata.tags=[]),u.metadata.tags.push("#"+c.value),r&&(s=$s(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start})),!0;if(c.type==="date"||c.type==="dateLink")return u.metadata.dateStr=c.date,i&&(s=$s(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start})),!0;if(c.type==="time")return u.metadata.timeStr=c.time,s=$s(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start}),!0;if(c.type==="embedWikilink")return u.metadata.fileAccessor=c.fileAccessor,!0;if(c.type==="wikilink"||c.type==="link"&&c.fileAccessor)return u.metadata.fileAccessor=c.fileAccessor,u.metadata.fileMetadata=c.fileMetadata,u.metadata.fileMetadataOrder=c.fileMetadataOrder,!0;if(c.type==="embedLink")return u.metadata.fileAccessor=c.fileAccessor,!0}),u.title=Rv(s).replace(/
/g,` -`),u}function O_(t,n,e){if(t.type!=="heading"||Ta(t,{includeImageAlt:!1})!==F("Archive"))return!1;let r=Lv(n,e);return r&&r.type==="thematicBreak"}function Ay(t,n,e,r,i){let a=[],o=[];return r.children.forEach((s,u)=>{if(s.type==="heading"){let l=O_(s,r.children,u),c=pu(s),d=mu(i,c),f=!1,h=Pv(r.children,u,"list",p=>{if(p.type==="heading")return!1;if(p.type==="paragraph"){let g=Ta(p);if(g.startsWith("%% kanban:settings"))return!1;if(g===F("Complete"))return f=!0,!0}return!0});if(l&&h){o.push(...h.children.map(p=>({...$o,id:We(),data:nl(t,i,p)})));return}h?a.push({...pr,children:h.children.map(p=>({...$o,id:We(),data:nl(t,i,p)})),id:We(),data:{title:d,shouldMarkItemsComplete:f}}):a.push({...pr,children:[],id:We(),data:{title:d,shouldMarkItemsComplete:f}})}}),{...Uo,id:t.file.path,children:a,data:{settings:n,frontmatter:e,archive:o,isSearching:!1,errors:[]}}}async function Bu(t,n,e){let r=`- [${n.data.isComplete?"x":" "}] ${e.replace(/(\r\n|\n)/g,"
").trim()}${n.data.blockId?` ^${n.data.blockId}`:""}`,i=Hu(t,r),a=nl(t,r,i.children[0].children[0]),o=(0,tl.default)(n,{data:{$set:a}});try{await Ma(t,o)}catch(s){console.error(s)}return o}async function Ly(t,n,e,r){let i=`- [${e?"x":" "}] ${n.trim().replace(/(\r\n|\n)/g,"
")}`,a=Hu(t,i),o=nl(t,i,a.children[0].children[0]);o.forceEditMode=!!r;let s={...$o,id:We(),data:o};try{await Ma(t,s)}catch(u){console.error(u)}return s}async function Py(t,n){try{return(0,tl.default)(n,{children:{$set:await Promise.all(n.children.map(async e=>{try{return(0,tl.default)(e,{children:{$set:await Promise.all(e.children.map(r=>Bu(t,r,r.data.titleRaw)))}})}catch(r){throw t.setError(r),r}}))}})}catch(e){throw t.setError(e),e}}function Oy(t){return`- [${t.data.isComplete?"x":" "}] ${t.data.titleRaw.replace(/(\r\n|\n)/g,"
").trim()}${t.data.blockId?` ^${t.data.blockId}`:""}`}function N_(t){let n=[];return n.push(`## ${t.data.title}`),n.push(""),t.data.shouldMarkItemsComplete&&n.push(tv),t.children.forEach(e=>{n.push(Oy(e))}),n.push(""),n.push(""),n.push(""),n.join(` -`)}function F_(t){if(t.length){let n=[nv,"",`## ${F("Archive")}`,""];return t.forEach(e=>{n.push(Oy(e))}),n.join(` -`)}return""}function Ny(t){let n=t.children.reduce((r,i)=>r+N_(i),"");return["---","",(0,Iy.stringifyYaml)(t.data.frontmatter),"---","",""].join(` -`)+n+F_(t.data.archive)+rv(t.data.settings)}var Ku=class{constructor(n){this.stateManager=n}newItem(n,e,r){return Ly(this.stateManager,n,e,r)}updateItemContent(n,e){return Bu(this.stateManager,n,e)}boardToMd(n){return Ny(n)}mdToBoard(n){let{ast:e,settings:r,frontmatter:i}=Cy(this.stateManager,n),a=Ay(this.stateManager,r,i,e,n);if(this.stateManager.state){let s=uu(this.stateManager.state,a).filter(l=>["/id","/dom","/date","/time","/titleSearch","/file"].every(c=>!l.path.endsWith(c))),u=(0,Fy.immutableJSONPatch)(this.stateManager.state,s);return Fv(this.stateManager,u,s)}return Nv(this.stateManager,a)}reparseBoard(){return Py(this.stateManager,this.stateManager.state)}};var $u=class{constructor(n,e,r,i,a){this.stateReceivers=[];this.settingsNotifiers=new Map;this.viewSet=new Set;this.compiledSettings={};this.newBoardPromise=null;this.getSetting=(n,e)=>e&&e[n]!==void 0?e[n]:this.compiledSettings&&this.compiledSettings[n]!==void 0?this.compiledSettings[n]:this.getSettingRaw(n);this.getSettingRaw=(n,e)=>{var r,i;return e&&e[n]!==void 0?e[n]:((i=(r=this.state)==null?void 0:r.data)==null?void 0:i.settings)&&this.state.data.settings[n]!==void 0?this.state.data.settings[n]:this.getGlobalSetting(n)};this.getGlobalSetting=n=>{let e=this.getGlobalSettings();return e&&e[n]!==void 0?e[n]:null};this.app=n,this.file=e.file,this.onEmpty=i,this.getGlobalSettings=a,this.parser=new Ku(this),this.registerView(e,r,!0)}getAView(){return this.viewSet.values().next().value}registerView(n,e,r){this.viewSet.has(n)||(this.viewSet.add(n),n.initHeaderButtons()),r&&(this.newBoardPromise!==null?this.newBoardPromise.then(()=>this.newBoard(e)):this.newBoardPromise=this.newBoard(e).then(()=>{this.newBoardPromise=null}).catch(i=>{console.error(i),this.setError(i)}))}unregisterView(n){this.viewSet.has(n)&&(this.viewSet.delete(n),this.viewSet.size===0&&this.onEmpty())}buildSettingRetrievers(){return{getGlobalSettings:this.getGlobalSettings,getGlobalSetting:this.getGlobalSetting,getSetting:this.getSetting}}async newBoard(n){try{await this.setState(await this.getParsedBoard(n),!1)}catch(e){this.setError(e)}}saveToDisk(){if(this.state.data.errors.length>0)return;let n=this.getAView(),e=this.parser.boardToMd(this.state);n.requestSaveToDisk(e),this.viewSet.forEach(r=>{r.data=e})}softRefresh(){this.stateReceivers.forEach(n=>n({...this.state}))}async forceRefresh(){if(this.state)try{this.compileSettings(),this.state=await this.parser.reparseBoard(),this.stateReceivers.forEach(n=>n(this.state)),this.viewSet.forEach(n=>n.initHeaderButtons())}catch(n){console.error(n),this.setError(n)}}async setState(n,e=!0){var r;try{let i=(r=this.state)==null?void 0:r.data.settings,a=typeof n=="function"?await n(this.state):n,o=a==null?void 0:a.data.settings;i&&o&&av(i,o)?(this.state=(0,Ni.default)(this.state,{data:{settings:{$set:o}}}),this.compileSettings(),this.state=await this.parser.reparseBoard()):(this.state=a,this.compileSettings()),this.viewSet.forEach(s=>s.initHeaderButtons()),e&&this.saveToDisk(),this.stateReceivers.forEach(s=>s(this.state)),i!==o&&o&&this.settingsNotifiers.forEach((s,u)=>{(!i&&o||i[u]!==o[u])&&s.forEach(l=>l())})}catch(i){console.error(i),this.setError(i)}}useState(){let[n,e]=v.useState(this.state);return v.useEffect(()=>(this.stateReceivers.push(r=>{e(r)}),e(this.state),()=>{this.stateReceivers.remove(e)}),[]),n}useSetting(n){let[e,r]=v.useState(this.getSetting(n));return v.useEffect(()=>{let i=()=>{r(this.getSetting(n))};return this.settingsNotifiers.has(n)?this.settingsNotifiers.get(n).push(i):this.settingsNotifiers.set(n,[i]),()=>{this.settingsNotifiers.get(n).remove(i)}},[]),e}compileSettings(n){var s,u,l,c,d;let e=this.getGlobalSetting("metadata-keys")||[],r=this.getSettingRaw("metadata-keys",n)||[],i=this.getSettingRaw("date-format",n)||ti(this.app),a=this.getSettingRaw("time-format",n)||Vi(this.app),o=this.getSettingRaw("prepend-archive-format",n)||`${i} ${a}`;this.compiledSettings={"date-format":i,"date-display-format":this.getSettingRaw("date-display-format",n)||i,"date-trigger":this.getSettingRaw("date-trigger",n)||Ds,"time-format":a,"time-trigger":this.getSettingRaw("time-trigger",n)||Cs,"link-date-to-daily-note":this.getSettingRaw("link-date-to-daily-note",n),"hide-date-in-title":this.getSettingRaw("hide-date-in-title",n),"hide-tags-in-title":this.getSettingRaw("hide-tags-in-title",n),"metadata-keys":[...e,...r],"prepend-archive-separator":this.getSettingRaw("prepend-archive-separator")||"","prepend-archive-format":o,"show-add-list":(s=this.getSettingRaw("show-add-list",n))!=null?s:!0,"show-archive-all":(u=this.getSettingRaw("show-archive-all",n))!=null?u:!0,"show-view-as-markdown":(l=this.getSettingRaw("show-view-as-markdown",n))!=null?l:!0,"show-board-settings":(c=this.getSettingRaw("show-board-settings",n))!=null?c:!0,"show-search":(d=this.getSettingRaw("show-search",n))!=null?d:!0}}async getParsedBoard(n){let e=n.trim(),r={...Uo,id:this.file.path,children:[],data:{archive:[],settings:{"kanban-plugin":"basic"},frontmatter:{},isSearching:!1,errors:[]}};try{e&&(r=await this.parser.mdToBoard(e))}catch(i){console.error(i),r=(0,Ni.default)(r,{data:{errors:{$push:[{description:i.toString(),stack:i.stack}]}}})}return r}setError(n){this.setState((0,Ni.default)(this.state,{data:{errors:{$push:[{description:n.toString(),stack:n.stack}]}}}),!1)}onFileMetadataChange(){this.reparseBoardFromMd()}async reparseBoardFromMd(){try{this.setState(await this.getParsedBoard(this.getAView().data),!1)}catch(n){console.error(n),this.setError(n)}}async archiveCompletedCards(){let n=this.state,e=[],r=!!this.getSetting("prepend-archive-date"),i=this.getSetting("prepend-archive-separator"),a=this.getSetting("prepend-archive-format"),o=u=>{let l=[(0,Ry.moment)().format(a)];i&&l.push(i),l.push(u.data.titleRaw);let c=l.join(" ");return this.parser.updateItemContent(u,c)},s=n.children.map(u=>(0,Ni.default)(u,{children:{$set:u.children.filter(l=>((u.data.shouldMarkItemsComplete||l.data.isComplete)&&e.push(l),!l.data.isComplete&&!u.data.shouldMarkItemsComplete))}}));this.app.workspace.trigger("kanban:board-cards-archived",this.file,e);try{this.setState((0,Ni.default)(n,{children:{$set:s},data:{archive:{$push:r?await Promise.all(e.map(u=>o(u))):e}}}))}catch(u){this.setError(u)}}getNewItem(n,e,r){return this.parser.newItem(n,e,r)}updateItemContent(n,e){return this.parser.updateItemContent(n,e)}};var Uu=class extends vn.Plugin{constructor(){super(...arguments);this.settings={};this.kanbanFileModes={};this.stateManagers=new Map;this.viewMap=new Map;this._loaded=!1;this.viewStateReceivers=[]}async loadSettings(){this.settings=Object.assign({},await this.loadData())}async saveSettings(){await this.saveData(this.settings)}onunload(){this.stateManagers.clear(),this.viewStateReceivers.forEach(e=>e(this.getKanbanViews())),this.app.workspace.getLeavesOfType(Tn).forEach(e=>{this.setMarkdownView(e)}),this.app.workspace.unregisterHoverLinkSource(ln),this.appEl&&(v.unmountComponentAtNode(this.appEl),this.appEl.detach())}async onload(){await this.loadSettings(),this.settingsTab=new iu(this,{onSettingsChange:async n=>{this.settings=n,await this.saveSettings(),this.stateManagers.forEach(e=>{e.forceRefresh()})}}),this.addSettingTab(this.settingsTab),this.registerView(Tn,n=>new Rr(n,this)),this.registerMonkeyPatches(),this.registerCommands(),this.registerEvents(),this.mount()}getKanbanViews(){return Array.from(this.viewMap.values())}getKanbanView(n){return this.viewMap.get(n)}getStateManager(n){return this.stateManagers.get(n)}getStateManagerFromViewID(n){return this.stateManagers.get(this.getKanbanView(n).file)}useViewState(){let[n,e]=v.useState(this.getKanbanViews());return v.useEffect(()=>(this.viewStateReceivers.push(e),()=>{this.viewStateReceivers.remove(e)}),[]),n}addView(n,e,r){this.viewMap.has(n.id)||this.viewMap.set(n.id,n);let i=n.file;this.stateManagers.has(i)?this.stateManagers.get(i).registerView(n,e,r):this.stateManagers.set(i,new $u(this.app,n,e,()=>this.stateManagers.delete(i),()=>this.settings)),this.viewStateReceivers.forEach(a=>a(this.getKanbanViews()))}removeView(n){let e=n.file;this.viewMap.has(n.id)&&this.viewMap.delete(n.id),this.stateManagers.has(e)&&(this.stateManagers.get(e).unregisterView(n),this.viewStateReceivers.forEach(r=>r(this.getKanbanViews())))}handleViewFileRename(n,e){let r=`${n.leaf.id}:::${e}`;this.viewMap.has(r)&&this.viewMap.delete(r),this.viewMap.has(n.id)||this.viewMap.set(n.id,n),n.isPrimary&&this.getStateManager(n.file).softRefresh()}mount(){var n;v.render(Zg(this),(n=this.appEl)!=null?n:this.appEl=document.body.createDiv())}async setMarkdownView(n,e=!0){await n.setViewState({type:"markdown",state:n.view.getState(),popstate:!0},{focus:e})}async setKanbanView(n){await n.setViewState({type:Tn,state:n.view.getState(),popstate:!0})}async newKanban(n){var r;let e=n||this.app.fileManager.getNewFileParent(((r=this.app.workspace.getActiveFile())==null?void 0:r.path)||"");try{let i=await this.app.fileManager.createNewMarkdownFile(e,F("Untitled Kanban"));await this.app.vault.modify(i,Zc),await this.app.workspace.activeLeaf.setViewState({type:Tn,state:{file:i.path}})}catch(i){console.error("Error creating kanban board:",i)}}registerEvents(){this.registerEvent(this.app.workspace.on("file-menu",(e,r)=>{r instanceof vn.TFolder&&e.addItem(i=>{i.setTitle(F("New kanban board")).setIcon(As).onClick(()=>this.newKanban(r))})})),this.registerEvent(this.app.vault.on("rename",(e,r)=>{this.app.workspace.getLeavesOfType(Tn).forEach(a=>{a.view.handleRename(e.path,r)})}));let n=(0,vn.debounce)(e=>{this.stateManagers.forEach(r=>{r.file!==e&&r.onFileMetadataChange()})},2e3,!0);this.registerEvent(this.app.vault.on("modify",e=>{e instanceof vn.TFile&&n(e)})),this.registerEvent(this.app.metadataCache.on("changed",e=>{n(e)})),this.registerEvent(this.app.metadataCache.on("dataview:metadata-change",(e,r)=>{n(r)})),this.registerEvent(this.app.metadataCache.on("dataview:api-ready",()=>{this.stateManagers.forEach(e=>{e.forceRefresh()})})),this.app.workspace.registerHoverLinkSource(ln,{display:"Kanban",defaultMod:!0})}registerCommands(){this.addCommand({id:"create-new-kanban-board",name:F("Create new board"),callback:()=>this.newKanban()}),this.addCommand({id:"archive-completed-cards",name:F("Archive completed cards in active board"),checkCallback:n=>{let e=this.app.workspace.getActiveViewOfType(Rr);if(!e)return!1;if(n)return!0;this.stateManagers.get(e.file).archiveCompletedCards()}}),this.addCommand({id:"toggle-kanban-view",name:F("Toggle between Kanban and markdown mode"),checkCallback:n=>{let e=this.app.workspace.getActiveFile();if(!e)return!1;let r=this.app.metadataCache.getFileCache(e),i=!!(r==null?void 0:r.frontmatter)&&!!r.frontmatter[ln];if(n)return i;let a=this.app.workspace.activeLeaf;(a==null?void 0:a.view)&&a.view instanceof Rr?(this.kanbanFileModes[a.id||e.path]="markdown",this.setMarkdownView(a)):i&&(this.kanbanFileModes[a.id||e.path]=Tn,this.setKanbanView(a))}}),this.addCommand({id:"convert-to-kanban",name:F("Convert empty note to Kanban"),checkCallback:n=>{let e=this.app.workspace.getActiveFile(),r=this.app.workspace.activeLeaf;if(!e||!r)return!1;let i=e.stat.size===0;if(n)return i;i&&this.app.vault.modify(e,Zc).then(()=>{this.setKanbanView(r)}).catch(a=>console.error(a))}}),this.addCommand({id:"add-kanban-lane",name:F("Add a list"),checkCallback:n=>{let e=this.app.workspace.activeLeaf;if(n)return e.view instanceof Rr;e.view.emitter.emit("showLaneForm",void 0)}})}registerMonkeyPatches(){let n=this;this.app.workspace.onLayoutReady(()=>{this.register(Fa(this.app.commands,{executeCommandById(e){return function(r){let i=n.app.workspace.getActiveViewOfType(Rr);return i&&i.emitter.emit("hotkey",r),e.call(this,r)}}}))}),this.register(Fa(vn.WorkspaceLeaf.prototype,{detach(e){return function(){var i;let r=(i=this.view)==null?void 0:i.getState();return(r==null?void 0:r.file)&&n.kanbanFileModes[this.id||r.file]&&delete n.kanbanFileModes[this.id||r.file],e.apply(this)}},setViewState(e){return function(r,...i){var a;if(n._loaded&&r.type==="markdown"&&((a=r.state)==null?void 0:a.file)&&n.kanbanFileModes[this.id||r.state.file]!=="markdown"){let o=n.app.metadataCache.getCache(r.state.file);if((o==null?void 0:o.frontmatter)&&o.frontmatter[ln]){let s={...r,type:Tn};return n.kanbanFileModes[r.state.file]=Tn,e.apply(this,[s,...i])}}return e.apply(this,[r,...i])}}})),this.register(Fa(vn.MarkdownView.prototype,{onMoreOptionsMenu(e){return function(r){let i=this.file,a=i?n.app.metadataCache.getFileCache(i):null;if(!i||!(a==null?void 0:a.frontmatter)||!a.frontmatter[ln])return e.call(this,r);r.addItem(o=>{o.setTitle(F("Open as kanban board")).setIcon(As).onClick(()=>{n.kanbanFileModes[this.leaf.id||i.path]=Tn,n.setKanbanView(this.leaf)})}).addSeparator(),e.call(this,r)}}}))}};0&&(module.exports={}); +`;break}case-2:{o=n?" ":" ";break}case-1:{if(!n&&i)continue;o=" ";break}default:o=String.fromCharCode(a)}i=a===-2,r.push(o)}return r.join("")}var Eu={};Oi(Eu,{attentionMarkers:()=>z0,contentInitial:()=>R0,disable:()=>V0,document:()=>F0,flow:()=>B0,flowInitial:()=>H0,insideSpan:()=>U0,string:()=>K0,text:()=>$0});var F0={[42]:Ht,[43]:Ht,[45]:Ht,[48]:Ht,[49]:Ht,[50]:Ht,[51]:Ht,[52]:Ht,[53]:Ht,[54]:Ht,[55]:Ht,[56]:Ht,[57]:Ht,[62]:Ls},R0={[91]:hu},H0={[-2]:Aa,[-1]:Aa,[32]:Aa},B0={[35]:mu,[42]:Br,[45]:[Ks,Br],[60]:vu,[61]:Ks,[95]:Br,[96]:Ns,[126]:Ns},K0={[38]:Os,[92]:Ps},$0={[-5]:Ia,[-4]:Ia,[-3]:Ia,[33]:bu,[38]:Os,[42]:Da,[60]:[cu,yu],[91]:wu,[92]:[pu,Ps],[93]:Hr,[95]:Da,[96]:du},U0={null:[Da,Iv]},z0={null:[42,95]},V0={null:[]};function Rv(t={}){let n=bv([Eu].concat(t.extensions||[])),e={defined:[],lazy:{},constructs:n,content:r(_v),document:r(Tv),flow:r(Av),string:r(Lv),text:r(Pv)};return e;function r(i){return a;function a(o){return Fv(e,i,o)}}}var Hv=/[\0\t\n\r]/g;function Bv(){let t=1,n="",e=!0,r;return i;function i(a,o,s){let u=[],l,c,d,f,h;for(a=n+a.toString(o),d=0,n="",e&&(a.charCodeAt(0)===65279&&d++,e=void 0);d13&&e<32||e>126&&e<160||e>55295&&e<57344||e>64975&&e<65008||(e&65535)==65535||(e&65535)==65534||e>1114111?"\uFFFD":String.fromCharCode(e)}var j0=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function $v(t){return t.replace(j0,W0)}function W0(t,n,e){if(n)return n;if(e.charCodeAt(0)===35){let i=e.charCodeAt(1),a=i===120||i===88;return $s(e.slice(a?2:1),a?16:10)}return _i(e)||t}var Ti={}.hasOwnProperty;function La(t){return!t||typeof t!="object"?"":Ti.call(t,"position")||Ti.call(t,"type")?Uv(t.position):Ti.call(t,"start")||Ti.call(t,"end")?Uv(t):Ti.call(t,"line")||Ti.call(t,"column")?Su(t):""}function Su(t){return zv(t&&t.line)+":"+zv(t&&t.column)}function Uv(t){return Su(t&&t.start)+"-"+Su(t&&t.end)}function zv(t){return t&&typeof t=="number"?t:1}var xu={}.hasOwnProperty,Us=function(t,n,e){return typeof n!="string"&&(e=n,n=void 0),q0(e)(Kv(Rv(e).document().write(Bv()(t,n,!0))))};function q0(t={}){let n=Vv({transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:u(zn),autolinkProtocol:ie,autolinkEmail:ie,atxHeading:u(nn),blockQuote:u(Ge),characterEscape:ie,characterReference:ie,codeFenced:u(ht),codeFencedFenceInfo:l,codeFencedFenceMeta:l,codeIndented:u(ht,l),codeText:u(pt,l),codeTextData:ie,data:ie,codeFlowValue:ie,definition:u(tn),definitionDestinationString:l,definitionLabelString:l,definitionTitleString:l,emphasis:u(yn),hardBreakEscape:u(Wt),hardBreakTrailing:u(Wt),htmlFlow:u(Ct,l),htmlFlowData:ie,htmlText:u(Ct,l),htmlTextData:ie,image:u(Un),label:l,link:u(zn),listItem:u(Mn),listItemValue:g,listOrdered:u(Tn,p),listUnordered:u(Tn),paragraph:u(Cn),reference:V,referenceString:l,resourceDestinationString:l,resourceTitleString:l,setextHeading:u(nn),strong:u(lt),thematicBreak:u(tt)},exit:{atxHeading:d(),atxHeadingSequence:B,autolink:d(),autolinkEmail:Fe,autolinkProtocol:Ee,blockQuote:d(),characterEscapeValue:q,characterReferenceMarkerHexadecimal:G,characterReferenceMarkerNumeric:G,characterReferenceValue:ye,codeFenced:d(k),codeFencedFence:T,codeFencedFenceInfo:w,codeFencedFenceMeta:S,codeFlowValue:q,codeIndented:d(D),codeText:d(fe),codeTextData:q,data:q,definition:d(),definitionDestinationString:O,definitionLabelString:N,definitionTitleString:C,emphasis:d(),hardBreakEscape:d(te),hardBreakTrailing:d(te),htmlFlow:d(ce),htmlFlowData:q,htmlText:d(de),htmlTextData:q,image:d(De),label:I,labelText:A,lineEnding:J,link:d(he),listItem:d(),listOrdered:d(),listUnordered:d(),paragraph:d(),referenceString:U,resourceDestinationString:et,resourceTitleString:qe,resource:K,setextHeading:d(X),setextHeadingLineSequence:Q,setextHeadingText:z,strong:d(),thematicBreak:d()}},t.mdastExtensions||[]),e={};return r;function r(j){let ne={type:"root",children:[]},be=[ne],Be=[],ct=[],rn={stack:be,tokenStack:Be,config:n,enter:c,exit:f,buffer:l,resume:h,setData:a,getData:o},Ue=-1;for(;++Ue0){let Se=Be[Be.length-1];(Se[1]||jv).call(rn,void 0,Se[0])}for(ne.position={start:s(j.length>0?j[0][1].start:{line:1,column:1,offset:0}),end:s(j.length>0?j[j.length-2][1].end:{line:1,column:1,offset:0})},Ue=-1;++Ue".charCodeAt(0)?o(p):(i.enter(t),i.enter(`${t}Marker`),d(p))}function d(p){return u===n.length?(i.exit(`${t}Marker`),f(p)):p!==n.charCodeAt(u)?o(p):(i.consume(p),u++,d)}function f(p){return i.enter(`${t}Data`),i.enter(`${t}Target`),h(p)}function h(p){return Je(p)||"<".charCodeAt(0)===p||"#".charCodeAt(0)===p||p===null?s?(i.exit(`${t}Target`),i.exit(`${t}Data`),i.exit(t),a(p)):o(p):(s=!0,i.consume(p),h)}}let r={tokenize:e};return{text:{[n.charCodeAt(0)]:r}}}function ny(){let t="hashtag";function n(i){this.enter({type:t,value:null},i)}function e(i){let a=this.sliceSerialize(i),o=Mi(this.stack);o.value=a}function r(i){this.exit(i)}return{enter:{[t]:n},exit:{[`${t}Target`]:e,[t]:r}}}var Ai={carriageReturn:-5,lineFeed:-4,carriageReturnLineFeed:-3,horizontalTab:-2,virtualSpace:-1,eof:null,nul:0,soh:1,stx:2,etx:3,eot:4,enq:5,ack:6,bel:7,bs:8,ht:9,lf:10,vt:11,ff:12,cr:13,so:14,si:15,dle:16,dc1:17,dc2:18,dc3:19,dc4:20,nak:21,syn:22,etb:23,can:24,em:25,sub:26,esc:27,fs:28,gs:29,rs:30,us:31,space:32,exclamationMark:33,quotationMark:34,numberSign:35,dollarSign:36,percentSign:37,ampersand:38,apostrophe:39,leftParenthesis:40,rightParenthesis:41,asterisk:42,plusSign:43,comma:44,dash:45,dot:46,slash:47,digit0:48,digit1:49,digit2:50,digit3:51,digit4:52,digit5:53,digit6:54,digit7:55,digit8:56,digit9:57,colon:58,semicolon:59,lessThan:60,equalsTo:61,greaterThan:62,questionMark:63,atSign:64,uppercaseA:65,uppercaseB:66,uppercaseC:67,uppercaseD:68,uppercaseE:69,uppercaseF:70,uppercaseG:71,uppercaseH:72,uppercaseI:73,uppercaseJ:74,uppercaseK:75,uppercaseL:76,uppercaseM:77,uppercaseN:78,uppercaseO:79,uppercaseP:80,uppercaseQ:81,uppercaseR:82,uppercaseS:83,uppercaseT:84,uppercaseU:85,uppercaseV:86,uppercaseW:87,uppercaseX:88,uppercaseY:89,uppercaseZ:90,leftSquareBracket:91,backslash:92,rightSquareBracket:93,caret:94,underscore:95,graveAccent:96,lowercaseA:97,lowercaseB:98,lowercaseC:99,lowercaseD:100,lowercaseE:101,lowercaseF:102,lowercaseG:103,lowercaseH:104,lowercaseI:105,lowercaseJ:106,lowercaseK:107,lowercaseL:108,lowercaseM:109,lowercaseN:110,lowercaseO:111,lowercaseP:112,lowercaseQ:113,lowercaseR:114,lowercaseS:115,lowercaseT:116,lowercaseU:117,lowercaseV:118,lowercaseW:119,lowercaseX:120,lowercaseY:121,lowercaseZ:122,leftCurlyBrace:123,verticalBar:124,rightCurlyBrace:125,tilde:126,del:127,byteOrderMarker:65279,replacementCharacter:65533};var Mu={data:"data",whitespace:"whitespace",lineEnding:"lineEnding",lineEndingBlank:"lineEndingBlank",linePrefix:"linePrefix",lineSuffix:"lineSuffix",atxHeading:"atxHeading",atxHeadingSequence:"atxHeadingSequence",atxHeadingText:"atxHeadingText",autolink:"autolink",autolinkEmail:"autolinkEmail",autolinkMarker:"autolinkMarker",autolinkProtocol:"autolinkProtocol",characterEscape:"characterEscape",characterEscapeValue:"characterEscapeValue",characterReference:"characterReference",characterReferenceMarker:"characterReferenceMarker",characterReferenceMarkerNumeric:"characterReferenceMarkerNumeric",characterReferenceMarkerHexadecimal:"characterReferenceMarkerHexadecimal",characterReferenceValue:"characterReferenceValue",codeFenced:"codeFenced",codeFencedFence:"codeFencedFence",codeFencedFenceSequence:"codeFencedFenceSequence",codeFencedFenceInfo:"codeFencedFenceInfo",codeFencedFenceMeta:"codeFencedFenceMeta",codeFlowValue:"codeFlowValue",codeIndented:"codeIndented",codeText:"codeText",codeTextData:"codeTextData",codeTextPadding:"codeTextPadding",codeTextSequence:"codeTextSequence",content:"content",definition:"definition",definitionDestination:"definitionDestination",definitionDestinationLiteral:"definitionDestinationLiteral",definitionDestinationLiteralMarker:"definitionDestinationLiteralMarker",definitionDestinationRaw:"definitionDestinationRaw",definitionDestinationString:"definitionDestinationString",definitionLabel:"definitionLabel",definitionLabelMarker:"definitionLabelMarker",definitionLabelString:"definitionLabelString",definitionMarker:"definitionMarker",definitionTitle:"definitionTitle",definitionTitleMarker:"definitionTitleMarker",definitionTitleString:"definitionTitleString",emphasis:"emphasis",emphasisSequence:"emphasisSequence",emphasisText:"emphasisText",escapeMarker:"escapeMarker",hardBreakEscape:"hardBreakEscape",hardBreakTrailing:"hardBreakTrailing",htmlFlow:"htmlFlow",htmlFlowData:"htmlFlowData",htmlText:"htmlText",htmlTextData:"htmlTextData",image:"image",label:"label",labelText:"labelText",labelLink:"labelLink",labelImage:"labelImage",labelMarker:"labelMarker",labelImageMarker:"labelImageMarker",labelEnd:"labelEnd",link:"link",paragraph:"paragraph",reference:"reference",referenceMarker:"referenceMarker",referenceString:"referenceString",resource:"resource",resourceDestination:"resourceDestination",resourceDestinationLiteral:"resourceDestinationLiteral",resourceDestinationLiteralMarker:"resourceDestinationLiteralMarker",resourceDestinationRaw:"resourceDestinationRaw",resourceDestinationString:"resourceDestinationString",resourceMarker:"resourceMarker",resourceTitle:"resourceTitle",resourceTitleMarker:"resourceTitleMarker",resourceTitleString:"resourceTitleString",setextHeading:"setextHeading",setextHeadingText:"setextHeadingText",setextHeadingLine:"setextHeadingLine",setextHeadingLineSequence:"setextHeadingLineSequence",strong:"strong",strongSequence:"strongSequence",strongText:"strongText",thematicBreak:"thematicBreak",thematicBreakSequence:"thematicBreakSequence",blockQuote:"blockQuote",blockQuotePrefix:"blockQuotePrefix",blockQuoteMarker:"blockQuoteMarker",blockQuotePrefixWhitespace:"blockQuotePrefixWhitespace",listOrdered:"listOrdered",listUnordered:"listUnordered",listItemIndent:"listItemIndent",listItemMarker:"listItemMarker",listItemPrefix:"listItemPrefix",listItemPrefixWhitespace:"listItemPrefixWhitespace",listItemValue:"listItemValue",chunkDocument:"chunkDocument",chunkContent:"chunkContent",chunkFlow:"chunkFlow",chunkText:"chunkText",chunkString:"chunkString"};var Z0={tokenize:e_},ry={text:{[Ai.leftSquareBracket]:Z0}};function e_(t,n,e){let r=this;return i;function i(s){return r.previous!==Ai.eof||!r._gfmTasklistFirstContentOfListItem?e(s):(t.enter("taskListCheck"),t.enter("taskListCheckMarker"),t.consume(s),t.exit("taskListCheckMarker"),a)}function a(s){return He(s)?(t.enter("taskListCheckValueUnchecked"),t.consume(s),t.exit("taskListCheckValueUnchecked"),o):s!==Ai.rightSquareBracket?(t.enter("taskListCheckValueChecked"),t.consume(s),t.exit("taskListCheckValueChecked"),o):e(s)}function o(s){return s===Ai.rightSquareBracket?(t.enter("taskListCheckMarker"),t.consume(s),t.exit("taskListCheckMarker"),t.exit("taskListCheck"),t.check({tokenize:t_},n,e)):e(s)}}function t_(t,n,e){let r=this;return ke(t,i,Mu.whitespace);function i(a){let o=r.events[r.events.length-1];return o&&o[1].type===Mu.whitespace&&a!==Ai.eof&&!Je(a)?n(a):e(a)}}var iy={exit:{taskListCheckValueChecked:ay,taskListCheckValueUnchecked:ay,paragraph:n_}};function ay(t){let n=this.stack[this.stack.length-2];n.checked=t.type==="taskListCheckValueChecked",n.checkChar=this.sliceSerialize(t)}function n_(t){let n=this.stack[this.stack.length-2],e=this.stack[this.stack.length-1],r=n.children,i=e.children[0],a=-1,o;if(n&&n.type==="listItem"&&typeof n.checked=="boolean"&&i&&i.type==="text"){for(;++a=0;i--){if(!n&&/[`%\n\r]/.test(t[i])){t[i]==="`"&&(e++,e===3&&(n=!0,r=i-1));continue}else if(!n)return{};if(t[i]==="`"&&t[i-1]==="`"&&t[i-2]==="`"&&/[\r\n]/.test(t[i-3]))return JSON.parse(t.slice(i+1,r).trim())}}function sy(t){return[ry,Ci("date",`${t.getSetting("date-trigger")}{`,"}"),Ci("dateLink",`${t.getSetting("date-trigger")}[[`,"]]"),Ci("time",`${t.getSetting("time-trigger")}{`,"}"),Ci("embedWikilink","![[","]]"),Ci("wikilink","[[","]]"),ty(),Xv()]}function ly(t){return[iy,Di("date",(n,e)=>{!n||(e.date=n)}),Di("dateLink",(n,e)=>{!n||(e.date=n)}),Di("time",(n,e)=>{!n||(e.time=n)}),Di("embedWikilink",(n,e)=>{if(!n)return;let r=Pr(n),i=t.app.metadataCache.getFirstLinkpathDest(r.root,t.file.path);e.fileAccessor={target:r.root,isEmbed:!0,stats:i==null?void 0:i.stat}}),Di("wikilink",(n,e)=>{if(!n)return;let r=Pr(n),i=t.app.metadataCache.getFirstLinkpathDest(r.root,t.file.path);if(e.fileAccessor={target:r.root,isEmbed:!1},i){let a=Vc(t,i);e.fileMetadata=a.fileMetadata,e.fileMetadataOrder=a.fileMetadataOrder}}),ey((n,e)=>{if(!n.url||/:\/\//.test(n.url)||!/.md$/.test(n.url))return;let r=t.app.metadataCache.getFirstLinkpathDest(decodeURIComponent(n.url),t.file.path);if(e)n.type="embedLink",n.fileAccessor={target:decodeURIComponent(n.url),isEmbed:!0,stats:r.stat};else if(n.fileAccessor={target:decodeURIComponent(n.url),isEmbed:!1},r){let i=Vc(t,r);n.fileMetadata=i.fileMetadata,n.fileMetadataOrder=i.fileMetadataOrder}}),ny(),Zv()]}function cy(t,n){let e=r_(n),i={...i_(n)},a={};return Object.keys(e).forEach(o=>{o===dn?(i[o]=e[o],a[o]=e[o]):Zg[o]?i[o]=e[o]:a[o]=e[o]}),t.compileSettings(i),{settings:i,frontmatter:a,ast:Us(n,{extensions:[_u(["yaml"]),...sy(t)],mdastExtensions:[Jv(["yaml"]),...ly(t)]})}}function Cu(t,n){return Us(n,{extensions:sy(t),mdastExtensions:ly(t)})}function Ws(t,n,e){let r=t.getSetting("hide-tags-in-title"),i=t.getSetting("hide-date-in-title"),a=iu(e.children[0]),o=au(n,a);(o==="[ ]"||o==="[x]")&&(o="");let s=o,u={titleRaw:o.replace(/
/g,` +`),blockId:void 0,title:"",titleSearch:"",metadata:{dateStr:void 0,date:void 0,time:void 0,timeStr:void 0,tags:[],fileAccessor:void 0,file:void 0,fileMetadata:void 0,fileMetadataOrder:void 0},dom:void 0,isComplete:!!e.checked};return dv(e,l=>l.type!=="paragraph",l=>{let c=l;if(c.type==="blockid")return u.blockId=c.value,!0;if(c.type==="hashtag")return u.metadata.tags||(u.metadata.tags=[]),u.metadata.tags.push("#"+c.value),r&&(s=Is(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start})),!0;if(c.type==="date"||c.type==="dateLink")return u.metadata.dateStr=c.date,i&&(s=Is(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start})),!0;if(c.type==="time")return u.metadata.timeStr=c.time,s=Is(s,{start:l.position.start.offset-a.start,end:l.position.end.offset-a.start}),!0;if(c.type==="embedWikilink")return u.metadata.fileAccessor=c.fileAccessor,!0;if(c.type==="wikilink"||c.type==="link"&&c.fileAccessor)return u.metadata.fileAccessor=c.fileAccessor,u.metadata.fileMetadata=c.fileMetadata,u.metadata.fileMetadataOrder=c.fileMetadataOrder,!0;if(c.type==="embedLink")return u.metadata.fileAccessor=c.fileAccessor,!0}),u.title=vv(s).replace(/
/g,` +`),u}function a_(t,n,e){if(t.type!=="heading"||_a(t,{includeImageAlt:!1})!==F("Archive"))return!1;let r=fv(n,e);return r&&r.type==="thematicBreak"}function dy(t,n,e,r,i){let a=[],o=[];return r.children.forEach((s,u)=>{if(s.type==="heading"){let l=a_(s,r.children,u),c=iu(s),d=au(i,c),f=!1,h=hv(r.children,u,"list",p=>{if(p.type==="heading")return!1;if(p.type==="paragraph"){let g=_a(p);if(g.startsWith("%% kanban:settings"))return!1;if(g===F("Complete"))return f=!0,!0}return!0});if(l&&h){o.push(...h.children.map(p=>({...Uo,id:Ke(),data:Ws(t,i,p)})));return}h?a.push({...mr,children:h.children.map(p=>({...Uo,id:Ke(),data:Ws(t,i,p)})),id:Ke(),data:{title:d,shouldMarkItemsComplete:f}}):a.push({...mr,children:[],id:Ke(),data:{title:d,shouldMarkItemsComplete:f}})}}),{...zo,id:t.file.path,children:a,data:{settings:n,frontmatter:e,archive:o,isSearching:!1,errors:[]}}}async function Du(t,n,e){let r=`- [${n.data.isComplete?"x":" "}] ${e.replace(/(\r\n|\n)/g,"
").trim()}${n.data.blockId?` ^${n.data.blockId}`:""}`,i=Cu(t,r),a=Ws(t,r,i.children[0].children[0]),o=(0,js.default)(n,{data:{$set:a}});try{await Ta(t,o)}catch(s){console.error(s)}return o}async function fy(t,n,e,r){let i=`- [${e?"x":" "}] ${n.trim().replace(/(\r\n|\n)/g,"
")}`,a=Cu(t,i),o=Ws(t,i,a.children[0].children[0]);o.forceEditMode=!!r;let s={...Uo,id:Ke(),data:o};try{await Ta(t,s)}catch(u){console.error(u)}return s}async function hy(t,n){try{return(0,js.default)(n,{children:{$set:await Promise.all(n.children.map(async e=>{try{return(0,js.default)(e,{children:{$set:await Promise.all(e.children.map(r=>Du(t,r,r.data.titleRaw)))}})}catch(r){throw t.setError(r),r}}))}})}catch(e){throw t.setError(e),e}}function py(t){return`- [${t.data.isComplete?"x":" "}] ${t.data.titleRaw.replace(/(\r\n|\n)/g,"
").trim()}${t.data.blockId?` ^${t.data.blockId}`:""}`}function o_(t){let n=[];return n.push(`## ${t.data.title}`),n.push(""),t.data.shouldMarkItemsComplete&&n.push(Ng),t.children.forEach(e=>{n.push(py(e))}),n.push(""),n.push(""),n.push(""),n.join(` +`)}function s_(t){if(t.length){let n=[Fg,"",`## ${F("Archive")}`,""];return t.forEach(e=>{n.push(py(e))}),n.join(` +`)}return""}function my(t){let n=t.children.reduce((r,i)=>r+o_(i),"");return["---","",(0,uy.stringifyYaml)(t.data.frontmatter),"---","",""].join(` +`)+n+s_(t.data.archive)+Rg(t.data.settings)}var Au=class{constructor(n){this.stateManager=n}newItem(n,e,r){return fy(this.stateManager,n,e,r)}updateItemContent(n,e){return Du(this.stateManager,n,e)}boardToMd(n){return my(n)}mdToBoard(n){let{ast:e,settings:r,frontmatter:i}=cy(this.stateManager,n),a=dy(this.stateManager,r,i,e,n);if(this.stateManager.state){let s=eu(this.stateManager.state,a).filter(l=>["/id","/dom","/date","/time","/titleSearch","/file"].every(c=>!l.path.endsWith(c))),u=(0,gy.immutableJSONPatch)(this.stateManager.state,s);return gv(this.stateManager,u,s)}return mv(this.stateManager,a)}reparseBoard(){return hy(this.stateManager,this.stateManager.state)}};var Iu=class{constructor(n,e,r,i,a){this.stateReceivers=[];this.settingsNotifiers=new Map;this.viewSet=new Set;this.compiledSettings={};this.newBoardPromise=null;this.getSetting=(n,e)=>e&&e[n]!==void 0?e[n]:this.compiledSettings&&this.compiledSettings[n]!==void 0?this.compiledSettings[n]:this.getSettingRaw(n);this.getSettingRaw=(n,e)=>{var r,i;return e&&e[n]!==void 0?e[n]:((i=(r=this.state)==null?void 0:r.data)==null?void 0:i.settings)&&this.state.data.settings[n]!==void 0?this.state.data.settings[n]:this.getGlobalSetting(n)};this.getGlobalSetting=n=>{let e=this.getGlobalSettings();return e&&e[n]!==void 0?e[n]:null};this.app=n,this.file=e.file,this.onEmpty=i,this.getGlobalSettings=a,this.parser=new Au(this),this.registerView(e,r,!0)}getAView(){return this.viewSet.values().next().value}registerView(n,e,r){this.viewSet.has(n)||(this.viewSet.add(n),n.initHeaderButtons()),r&&(this.newBoardPromise!==null?this.newBoardPromise.then(()=>this.newBoard(e)):this.newBoardPromise=this.newBoard(e).then(()=>{this.newBoardPromise=null}).catch(i=>{console.error(i),this.setError(i)}))}unregisterView(n){this.viewSet.has(n)&&(this.viewSet.delete(n),this.viewSet.size===0&&this.onEmpty())}buildSettingRetrievers(){return{getGlobalSettings:this.getGlobalSettings,getGlobalSetting:this.getGlobalSetting,getSetting:this.getSetting}}async newBoard(n){try{await this.setState(await this.getParsedBoard(n),!1)}catch(e){this.setError(e)}}saveToDisk(){if(this.state.data.errors.length>0)return;let n=this.getAView(),e=this.parser.boardToMd(this.state);n.requestSaveToDisk(e),this.viewSet.forEach(r=>{r.data=e})}softRefresh(){this.stateReceivers.forEach(n=>n({...this.state}))}async forceRefresh(){if(this.state)try{this.compileSettings(),this.state=await this.parser.reparseBoard(),this.stateReceivers.forEach(n=>n(this.state)),this.viewSet.forEach(n=>n.initHeaderButtons())}catch(n){console.error(n),this.setError(n)}}async setState(n,e=!0){var r;try{let i=(r=this.state)==null?void 0:r.data.settings,a=typeof n=="function"?await n(this.state):n,o=a==null?void 0:a.data.settings;i&&o&&Bg(i,o)?(this.state=(0,Ii.default)(this.state,{data:{settings:{$set:o}}}),this.compileSettings(),this.state=await this.parser.reparseBoard()):(this.state=a,this.compileSettings()),this.viewSet.forEach(s=>s.initHeaderButtons()),e&&this.saveToDisk(),this.stateReceivers.forEach(s=>s(this.state)),i!==o&&o&&this.settingsNotifiers.forEach((s,u)=>{(!i&&o||i[u]!==o[u])&&s.forEach(l=>l())})}catch(i){console.error(i),this.setError(i)}}useState(){let[n,e]=v.useState(this.state);return v.useEffect(()=>(this.stateReceivers.push(r=>{e(r)}),e(this.state),()=>{this.stateReceivers.remove(e)}),[]),n}useSetting(n){let[e,r]=v.useState(this.getSetting(n));return v.useEffect(()=>{let i=()=>{r(this.getSetting(n))};return this.settingsNotifiers.has(n)?this.settingsNotifiers.get(n).push(i):this.settingsNotifiers.set(n,[i]),()=>{this.settingsNotifiers.get(n).remove(i)}},[]),e}compileSettings(n){var s,u,l,c,d;let e=this.getGlobalSetting("metadata-keys")||[],r=this.getSettingRaw("metadata-keys",n)||[],i=this.getSettingRaw("date-format",n)||Xr(this.app),a=this.getSettingRaw("time-format",n)||Vi(this.app),o=this.getSettingRaw("prepend-archive-format",n)||`${i} ${a}`;this.compiledSettings={"date-format":i,"date-display-format":this.getSettingRaw("date-display-format",n)||i,"date-trigger":this.getSettingRaw("date-trigger",n)||ys,"time-format":a,"time-trigger":this.getSettingRaw("time-trigger",n)||bs,"link-date-to-daily-note":this.getSettingRaw("link-date-to-daily-note",n),"hide-date-in-title":this.getSettingRaw("hide-date-in-title",n),"hide-tags-in-title":this.getSettingRaw("hide-tags-in-title",n),"metadata-keys":[...e,...r],"prepend-archive-separator":this.getSettingRaw("prepend-archive-separator")||"","prepend-archive-format":o,"show-add-list":(s=this.getSettingRaw("show-add-list",n))!=null?s:!0,"show-archive-all":(u=this.getSettingRaw("show-archive-all",n))!=null?u:!0,"show-view-as-markdown":(l=this.getSettingRaw("show-view-as-markdown",n))!=null?l:!0,"show-board-settings":(c=this.getSettingRaw("show-board-settings",n))!=null?c:!0,"show-search":(d=this.getSettingRaw("show-search",n))!=null?d:!0}}async getParsedBoard(n){let e=n.trim(),r={...zo,id:this.file.path,children:[],data:{archive:[],settings:{"kanban-plugin":"basic"},frontmatter:{},isSearching:!1,errors:[]}};try{e&&(r=await this.parser.mdToBoard(e))}catch(i){console.error(i),r=(0,Ii.default)(r,{data:{errors:{$push:[{description:i.toString(),stack:i.stack}]}}})}return r}setError(n){this.setState((0,Ii.default)(this.state,{data:{errors:{$push:[{description:n.toString(),stack:n.stack}]}}}),!1)}onFileMetadataChange(){this.reparseBoardFromMd()}async reparseBoardFromMd(){try{this.setState(await this.getParsedBoard(this.getAView().data),!1)}catch(n){console.error(n),this.setError(n)}}async archiveCompletedCards(){let n=this.state,e=[],r=!!this.getSetting("prepend-archive-date"),i=this.getSetting("prepend-archive-separator"),a=this.getSetting("prepend-archive-format"),o=u=>{let l=[(0,vy.moment)().format(a)];i&&l.push(i),l.push(u.data.titleRaw);let c=l.join(" ");return this.parser.updateItemContent(u,c)},s=n.children.map(u=>(0,Ii.default)(u,{children:{$set:u.children.filter(l=>((u.data.shouldMarkItemsComplete||l.data.isComplete)&&e.push(l),!l.data.isComplete&&!u.data.shouldMarkItemsComplete))}}));this.app.workspace.trigger("kanban:board-cards-archived",this.file,e);try{this.setState((0,Ii.default)(n,{children:{$set:s},data:{archive:{$push:r?await Promise.all(e.map(u=>o(u))):e}}}))}catch(u){this.setError(u)}}getNewItem(n,e,r){return this.parser.newItem(n,e,r)}updateItemContent(n,e){return this.parser.updateItemContent(n,e)}};var Lu=class extends vn.Plugin{constructor(){super(...arguments);this.settings={};this.kanbanFileModes={};this.stateManagers=new Map;this.viewMap=new Map;this._loaded=!1;this.isShiftPressed=!1;this.handleShift=n=>{this.isShiftPressed=n.shiftKey};this.viewStateReceivers=[]}async loadSettings(){this.settings=Object.assign({},await this.loadData())}async saveSettings(){await this.saveData(this.settings)}onunload(){this.stateManagers.clear(),this.viewStateReceivers.forEach(e=>e(this.getKanbanViews())),this.app.workspace.getLeavesOfType(_n).forEach(e=>{this.setMarkdownView(e)}),this.app.workspace.unregisterHoverLinkSource(dn),this.appEl&&(v.unmountComponentAtNode(this.appEl),this.appEl.detach()),window.removeEventListener("keydown",this.handleShift),window.removeEventListener("keyup",this.handleShift)}async onload(){await this.loadSettings(),this.settingsTab=new Yc(this,{onSettingsChange:async n=>{this.settings=n,await this.saveSettings(),this.stateManagers.forEach(e=>{e.forceRefresh()})}}),this.addSettingTab(this.settingsTab),this.registerView(_n,n=>new Nr(n,this)),this.registerMonkeyPatches(),this.registerCommands(),this.registerEvents(),this.mount(),window.addEventListener("keydown",this.handleShift),window.addEventListener("keyup",this.handleShift)}getKanbanViews(){return Array.from(this.viewMap.values())}getKanbanView(n){return this.viewMap.get(n)}getStateManager(n){return this.stateManagers.get(n)}getStateManagerFromViewID(n){return this.stateManagers.get(this.getKanbanView(n).file)}useViewState(){let[n,e]=v.useState(this.getKanbanViews());return v.useEffect(()=>(this.viewStateReceivers.push(e),()=>{this.viewStateReceivers.remove(e)}),[]),n}addView(n,e,r){this.viewMap.has(n.id)||this.viewMap.set(n.id,n);let i=n.file;this.stateManagers.has(i)?this.stateManagers.get(i).registerView(n,e,r):this.stateManagers.set(i,new Iu(this.app,n,e,()=>this.stateManagers.delete(i),()=>this.settings)),this.viewStateReceivers.forEach(a=>a(this.getKanbanViews()))}removeView(n){let e=n.file;this.viewMap.has(n.id)&&this.viewMap.delete(n.id),this.stateManagers.has(e)&&(this.stateManagers.get(e).unregisterView(n),this.viewStateReceivers.forEach(r=>r(this.getKanbanViews())))}handleViewFileRename(n,e){let r=`${n.leaf.id}:::${e}`;this.viewMap.has(r)&&this.viewMap.delete(r),this.viewMap.has(n.id)||this.viewMap.set(n.id,n),n.isPrimary&&this.getStateManager(n.file).softRefresh()}mount(){var n;v.render(Pg(this),(n=this.appEl)!=null?n:this.appEl=document.body.createDiv())}async setMarkdownView(n,e=!0){await n.setViewState({type:"markdown",state:n.view.getState(),popstate:!0},{focus:e})}async setKanbanView(n){await n.setViewState({type:_n,state:n.view.getState(),popstate:!0})}async newKanban(n){var r;let e=n||this.app.fileManager.getNewFileParent(((r=this.app.workspace.getActiveFile())==null?void 0:r.path)||"");try{let i=await this.app.fileManager.createNewMarkdownFile(e,F("Untitled Kanban"));await this.app.vault.modify(i,zc),await this.app.workspace.activeLeaf.setViewState({type:_n,state:{file:i.path}})}catch(i){console.error("Error creating kanban board:",i)}}registerEvents(){this.registerEvent(this.app.workspace.on("file-menu",(e,r)=>{r instanceof vn.TFolder&&e.addItem(i=>{i.setTitle(F("New kanban board")).setIcon(Es).onClick(()=>this.newKanban(r))})})),this.registerEvent(this.app.vault.on("rename",(e,r)=>{this.app.workspace.getLeavesOfType(_n).forEach(a=>{a.view.handleRename(e.path,r)})}));let n=(0,vn.debounce)(e=>{this.stateManagers.forEach(r=>{r.file!==e&&r.onFileMetadataChange()})},2e3,!0);this.registerEvent(this.app.vault.on("modify",e=>{e instanceof vn.TFile&&n(e)})),this.registerEvent(this.app.metadataCache.on("changed",e=>{n(e)})),this.registerEvent(this.app.metadataCache.on("dataview:metadata-change",(e,r)=>{n(r)})),this.registerEvent(this.app.metadataCache.on("dataview:api-ready",()=>{this.stateManagers.forEach(e=>{e.forceRefresh()})})),this.app.workspace.registerHoverLinkSource(dn,{display:"Kanban",defaultMod:!0})}registerCommands(){this.addCommand({id:"create-new-kanban-board",name:F("Create new board"),callback:()=>this.newKanban()}),this.addCommand({id:"archive-completed-cards",name:F("Archive completed cards in active board"),checkCallback:n=>{let e=this.app.workspace.getActiveViewOfType(Nr);if(!e)return!1;if(n)return!0;this.stateManagers.get(e.file).archiveCompletedCards()}}),this.addCommand({id:"toggle-kanban-view",name:F("Toggle between Kanban and markdown mode"),checkCallback:n=>{let e=this.app.workspace.getActiveFile();if(!e)return!1;let r=this.app.metadataCache.getFileCache(e),i=!!(r==null?void 0:r.frontmatter)&&!!r.frontmatter[dn];if(n)return i;let a=this.app.workspace.activeLeaf;(a==null?void 0:a.view)&&a.view instanceof Nr?(this.kanbanFileModes[a.id||e.path]="markdown",this.setMarkdownView(a)):i&&(this.kanbanFileModes[a.id||e.path]=_n,this.setKanbanView(a))}}),this.addCommand({id:"convert-to-kanban",name:F("Convert empty note to Kanban"),checkCallback:n=>{let e=this.app.workspace.getActiveFile(),r=this.app.workspace.activeLeaf;if(!e||!r)return!1;let i=e.stat.size===0;if(n)return i;i&&this.app.vault.modify(e,zc).then(()=>{this.setKanbanView(r)}).catch(a=>console.error(a))}}),this.addCommand({id:"add-kanban-lane",name:F("Add a list"),checkCallback:n=>{let e=this.app.workspace.activeLeaf;if(n)return e.view instanceof Nr;e.view.emitter.emit("showLaneForm",void 0)}})}registerMonkeyPatches(){let n=this;this.app.workspace.onLayoutReady(()=>{this.register(Fa(this.app.commands,{executeCommandById(e){return function(r){let i=n.app.workspace.getActiveViewOfType(Nr);return i&&i.emitter.emit("hotkey",r),e.call(this,r)}}}))}),this.register(Fa(vn.WorkspaceLeaf.prototype,{detach(e){return function(){var i;let r=(i=this.view)==null?void 0:i.getState();return(r==null?void 0:r.file)&&n.kanbanFileModes[this.id||r.file]&&delete n.kanbanFileModes[this.id||r.file],e.apply(this)}},setViewState(e){return function(r,...i){var a;if(n._loaded&&r.type==="markdown"&&((a=r.state)==null?void 0:a.file)&&n.kanbanFileModes[this.id||r.state.file]!=="markdown"){let o=n.app.metadataCache.getCache(r.state.file);if((o==null?void 0:o.frontmatter)&&o.frontmatter[dn]){let s={...r,type:_n};return n.kanbanFileModes[r.state.file]=_n,e.apply(this,[s,...i])}}return e.apply(this,[r,...i])}}})),this.register(Fa(vn.MarkdownView.prototype,{onMoreOptionsMenu(e){return function(r){let i=this.file,a=i?n.app.metadataCache.getFileCache(i):null;if(!i||!(a==null?void 0:a.frontmatter)||!a.frontmatter[dn])return e.call(this,r);r.addItem(o=>{o.setTitle(F("Open as kanban board")).setIcon(Es).onClick(()=>{n.kanbanFileModes[this.leaf.id||i.path]=_n,n.setKanbanView(this.leaf)})}).addSeparator(),e.call(this,r)}}}))}};0&&(module.exports={}); /*! * Fuse.js v3.4.5 - Lightweight fuzzy-search (http://fusejs.io) * diff --git a/.obsidian/plugins/obsidian-kanban/manifest.json b/.obsidian/plugins/obsidian-kanban/manifest.json index edcdfd3..37b73c3 100644 --- a/.obsidian/plugins/obsidian-kanban/manifest.json +++ b/.obsidian/plugins/obsidian-kanban/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-kanban", "name": "Kanban", - "version": "1.2.29", + "version": "1.2.39", "minAppVersion": "0.12.3", "description": "Create markdown-backed Kanban boards in Obsidian.", "author": "mgmeyers", diff --git a/.obsidian/plugins/obsidian-kanban/styles.css b/.obsidian/plugins/obsidian-kanban/styles.css index 8c2a244..efc0244 100644 --- a/.obsidian/plugins/obsidian-kanban/styles.css +++ b/.obsidian/plugins/obsidian-kanban/styles.css @@ -1 +1 @@ -.choices{position:relative;margin-bottom:24px;font-size:16px}.choices:focus{outline:none}.choices:last-child{margin-bottom:0}.choices.is-disabled .choices__inner,.choices.is-disabled .choices__input{background-color:#eaeaea;cursor:not-allowed;-webkit-user-select:none;-ms-user-select:none;user-select:none}.choices.is-disabled .choices__item{cursor:not-allowed}.choices [hidden]{display:none!important}.choices[data-type*=select-one]{cursor:pointer}.choices[data-type*=select-one] .choices__inner{padding-bottom:7.5px}.choices[data-type*=select-one] .choices__input{display:block;width:100%;padding:10px;border-bottom:1px solid #dddddd;background-color:#fff;margin:0}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);padding:0;background-size:8px;position:absolute;top:50%;right:0;margin-top:-10px;margin-right:25px;height:20px;width:20px;border-radius:10em;opacity:.5}.choices[data-type*=select-one] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus{opacity:1}.choices[data-type*=select-one] .choices__button:focus{box-shadow:0 0 0 2px #00bcd4}.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices[data-type*=select-one]:after{content:"";height:0;width:0;border-style:solid;border-color:#333333 transparent transparent transparent;border-width:5px;position:absolute;right:11.5px;top:50%;margin-top:-2.5px;pointer-events:none}.choices[data-type*=select-one].is-open:after{border-color:transparent transparent #333333 transparent;margin-top:-7.5px}.choices[data-type*=select-one][dir=rtl]:after{left:11.5px;right:auto}.choices[data-type*=select-one][dir=rtl] .choices__button{right:auto;left:0;margin-left:25px;margin-right:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=text] .choices__inner{cursor:text}.choices[data-type*=select-multiple] .choices__button,.choices[data-type*=text] .choices__button{position:relative;display:inline-block;margin:0 -4px 0 8px;padding-left:16px;border-left:1px solid #008fa1;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);background-size:8px;width:8px;line-height:1;opacity:.75;border-radius:0}.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-multiple] .choices__button:focus,.choices[data-type*=text] .choices__button:hover,.choices[data-type*=text] .choices__button:focus{opacity:1}.choices__inner{display:inline-block;vertical-align:top;width:100%;background-color:#f9f9f9;padding:7.5px 7.5px 3.75px;border:1px solid #dddddd;border-radius:2.5px;font-size:14px;min-height:44px;overflow:hidden}.is-focused .choices__inner,.is-open .choices__inner{border-color:#b7b7b7}.is-open .choices__inner{border-radius:2.5px 2.5px 0 0}.is-flipped.is-open .choices__inner{border-radius:0 0 2.5px 2.5px}.choices__list{margin:0;padding-left:0;list-style:none}.choices__list--single{display:inline-block;padding:4px 16px 4px 4px;width:100%}[dir=rtl] .choices__list--single{padding-right:4px;padding-left:16px}.choices__list--single .choices__item{width:100%}.choices__list--multiple{display:inline}.choices__list--multiple .choices__item{display:inline-block;vertical-align:middle;border-radius:20px;padding:4px 10px;font-size:12px;font-weight:500;margin-right:3.75px;margin-bottom:3.75px;background-color:#00bcd4;border:1px solid #00a5bb;color:#fff;word-break:break-all;box-sizing:border-box}.choices__list--multiple .choices__item[data-deletable]{padding-right:5px}[dir=rtl] .choices__list--multiple .choices__item{margin-right:0;margin-left:3.75px}.choices__list--multiple .choices__item.is-highlighted{background-color:#00a5bb;border:1px solid #008fa1}.is-disabled .choices__list--multiple .choices__item{background-color:#aaa;border:1px solid #919191}.choices__list--dropdown{visibility:hidden;z-index:1;position:absolute;width:100%;background-color:#fff;border:1px solid #dddddd;top:100%;margin-top:-1px;border-bottom-left-radius:2.5px;border-bottom-right-radius:2.5px;overflow:hidden;word-break:break-all;will-change:visibility}.choices__list--dropdown.is-active{visibility:visible}.is-open .choices__list--dropdown{border-color:#b7b7b7}.is-flipped .choices__list--dropdown{top:auto;bottom:100%;margin-top:0;margin-bottom:-1px;border-radius:.25rem .25rem 0 0}.choices__list--dropdown .choices__list{position:relative;max-height:300px;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position}.choices__list--dropdown .choices__item{position:relative;padding:10px;font-size:14px}[dir=rtl] .choices__list--dropdown .choices__item{text-align:right}@media (min-width: 640px){.choices__list--dropdown .choices__item--selectable{padding-right:100px}.choices__list--dropdown .choices__item--selectable:after{content:attr(data-select-text);font-size:12px;opacity:0;position:absolute;right:10px;top:50%;transform:translateY(-50%)}[dir=rtl] .choices__list--dropdown .choices__item--selectable{text-align:right;padding-left:100px;padding-right:10px}[dir=rtl] .choices__list--dropdown .choices__item--selectable:after{right:auto;left:10px}}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:#f2f2f2}.choices__list--dropdown .choices__item--selectable.is-highlighted:after{opacity:.5}.choices__item{cursor:default}.choices__item--selectable{cursor:pointer}.choices__item--disabled{cursor:not-allowed;-webkit-user-select:none;-ms-user-select:none;user-select:none;opacity:.5}.choices__heading{font-weight:600;font-size:12px;padding:10px;border-bottom:1px solid #f7f7f7;color:gray}.choices__button{text-indent:-9999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.choices__button:focus{outline:none}.choices__input{display:inline-block;vertical-align:baseline;background-color:#f9f9f9;font-size:14px;margin-bottom:5px;border:0;border-radius:0;max-width:100%;padding:4px 0 4px 2px}.choices__input:focus{outline:0}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__placeholder{opacity:.5}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\fffd;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.workspace-leaf-content[data-type=kanban] .view-content{padding:0}.kanban-plugin{--lane-width: 272px}.kanban-plugin{contain:content;background-color:var(--background-secondary-alt);height:100%;width:100%;position:relative;display:flex;flex-direction:column}.kanban-plugin.something-is-dragging *{pointer-events:none}.kanban-plugin__item button,.kanban-plugin__lane button,.kanban-plugin button{line-height:1;padding:10px 12px;margin:0;transition:.1s color,.1s background-color}.kanban-plugin__search-wrapper{width:100%;position:sticky;top:0;left:0;padding:10px 13px;display:flex;justify-content:flex-end;align-items:center;z-index:2;background-color:var(--background-secondary);border-bottom:1px solid var(--background-modifier-border)}button.kanban-plugin__search-cancel-button{display:flex;line-height:1;padding:6px;border:1px solid var(--background-modifier-border);background:var(--background-secondary-alt);color:var(--text-muted);margin:0 0 0 5px;font-size:16px}button.kanban-plugin__search-cancel-button .kanban-plugin__icon{display:flex}.kanban-plugin__icon{display:inline-block;line-height:1}.kanban-plugin__icon>svg{width:1em;height:1em}.kanban-plugin__board{display:flex;width:100%;height:100%}.kanban-plugin__board>div{display:flex;align-items:flex-start;justify-content:flex-start;padding:1rem;width:fit-content;height:100%}.kanban-plugin__board.is-adding-lane>div{padding-right:calc(250px + 1rem)}.kanban-plugin__lane-wrapper{display:flex;flex-shrink:0;margin-right:10px;max-height:100%;width:var(--lane-width)}.kanban-plugin__lane{width:100%;display:flex;flex-direction:column;background-color:var(--background-secondary);border-radius:6px;border:1px solid var(--background-modifier-border)}.kanban-plugin__placeholder.kanban-plugin__lane-placeholder{height:100%;flex-grow:1;margin-right:5px}.kanban-plugin__lane.is-hidden{display:none}.kanban-plugin__lane button{padding:8px 10px}.kanban-plugin__lane-form-wrapper{position:absolute;top:1rem;right:1rem;width:250px;background-color:var(--background-secondary);border-radius:6px;border:2px solid rgba(var(--interactive-accent-rgb),.7);z-index:var(--layer-popover);box-shadow:0 .5px 1px .5px #0000001a,0 2px 10px #0000001a,0 10px 20px #0000001a}.kanban-plugin__lane-input-wrapper{padding:10px}.kanban-plugin__item-input-actions,.kanban-plugin__lane-input-actions{display:flex;align-items:flex-start;justify-content:flex-start;padding:0 10px 10px}.kanban-plugin__item-input-actions button,.kanban-plugin__lane-input-actions button{display:block;margin-right:5px}.kanban-plugin__item-action-add,.kanban-plugin__lane-action-add{background-color:var(--interactive-accent);color:var(--text-on-accent)}.kanban-plugin__item-action-add:hover,.kanban-plugin__lane-action-add:hover{background-color:var(--interactive-accent-hover)}.kanban-plugin__lane-header-wrapper{padding:10px 11px;display:flex;align-items:center;flex-shrink:0;flex-grow:0;border-bottom:1px solid var(--background-modifier-border)}.will-prepend .kanban-plugin__lane-header-wrapper{border-bottom:none}.kanban-plugin__lane-grip{cursor:grab;flex-grow:0;margin-right:5px;color:var(--text-faint)}.kanban-plugin__lane-grip>svg{display:block;height:1rem}.kanban-plugin__lane-title{font-weight:600;font-size:.875rem;flex-grow:1;width:100%}.kanban-plugin__lane-title-count{display:none}.kanban-plugin__item button.kanban-plugin__item-prefix-button,.kanban-plugin__item button.kanban-plugin__item-postfix-button,.kanban-plugin__lane button.kanban-plugin__lane-settings-button{font-size:13px;line-height:1;color:var(--text-muted);padding:4px;display:flex;margin-left:5px;background-color:transparent;margin-right:-4px}.kanban-plugin__item button.kanban-plugin__item-prefix-button{margin:4px 7px 4px 0;padding:0}.kanban-plugin__item button.kanban-plugin__item-prefix-button.is-enabled,.kanban-plugin__item button.kanban-plugin__item-postfix-button.is-enabled,.kanban-plugin__lane button.kanban-plugin__lane-settings-button.is-enabled{color:var(--text-accent)}.kanban-plugin__item button.kanban-plugin__item-prefix-button:hover,.kanban-plugin__item button.kanban-plugin__item-postfix-button:hover,.kanban-plugin__lane button.kanban-plugin__lane-settings-button:hover{background-color:transparent;color:var(--text-normal)}.kanban-plugin__lane-action-wrapper,.kanban-plugin__item-edit-archive-button,.kanban-plugin__item-settings-actions .kanban-plugin__icon,.kanban-plugin__item-edit-archive-button>.kanban-plugin__icon,.kanban-plugin__item-prefix-button>.kanban-plugin__icon,.kanban-plugin__item-postfix-button>.kanban-plugin__icon,.kanban-plugin__lane-settings-button>.kanban-plugin__icon{display:flex}.kanban-plugin__lane-settings-button-wrapper{display:flex}button.kanban-plugin__lane-settings-button+button.kanban-plugin__lane-settings-button{margin-left:2px}.kanban-plugin__lane-settings-button svg{width:1em;height:1em}.kanban-plugin__lane-items-wrapper{margin:4px;height:100%}.kanban-plugin__lane-items{padding:4px;margin:0 4px;display:flex;flex-direction:column}.kanban-plugin__lane-items>.kanban-plugin__placeholder{flex-grow:1}.kanban-plugin__lane-items>.kanban-plugin__placeholder:only-child{height:2.55em;border:3px dashed rgba(var(--text-muted-rgb),.1);margin-bottom:4px;border-radius:6px;transition:border .2s ease}.is-sorting .kanban-plugin__lane-items>.kanban-plugin__placeholder:only-child{border-color:rgba(var(--interactive-accent-rgb),.6)}.kanban-plugin__lane-items>div{margin-top:4px}.kanban-plugin__item-button-wrapper{border-top:1px solid var(--background-modifier-border);padding:8px;flex-shrink:0;flex-grow:0}.kanban-plugin__lane-header-wrapper+.kanban-plugin__item-button-wrapper{border-top:none;border-bottom:1px solid var(--background-modifier-border);padding:4px 8px 8px}.kanban-plugin__item-button-wrapper>button{text-align:left;width:100%}.kanban-plugin__item-form{border-top:1px solid var(--background-modifier-border);padding:8px}.kanban-plugin__lane-header-wrapper+.kanban-plugin__item-form{border-top:none;border-bottom:1px solid var(--background-modifier-border);padding:4px 8px 8px}.kanban-plugin__item-input-wrapper{display:flex}button.kanban-plugin__new-item-button{background-color:transparent;color:var(--text-muted)}.kanban-plugin__new-item-button:hover{color:var(--text-on-accent);background-color:var(--interactive-accent-hover)}.kanban-plugin__item{font-size:.875rem;border:1px solid var(--background-modifier-border);border-radius:6px;overflow:hidden;transition:.3s opacity cubic-bezier(.25,1,.5,1)}.kanban-plugin__drag-container>.kanban-plugin__item-wrapper .kanban-plugin__item{border-color:var(--interactive-accent);box-shadow:0 15px 25px #0003,0 0 0 2px rgba(var(--interactive-accent-rgb),.8)}.kanban-plugin__item.is-search-hit{box-shadow:0 15px 25px #0003,0 0 0 1px var(--background-modifier-border)}.kanban-plugin__item.is-search-miss{font-size:.75rem;opacity:.5}.kanban-plugin__item.is-search-miss .kanban-plugin__item-metadata-wrapper{display:none}.kanban-plugin__item-content-wrapper{background:var(--background-primary)}.kanban-plugin__item-title-wrapper{background:var(--background-primary);display:flex;padding:6px 8px}.kanban-plugin__item-title-wrapper:not(:only-child){border-bottom:1px solid var(--background-modifier-border)}.kanban-plugin__item-title{width:100%;line-height:1.5;overflow:hidden}.kanban-plugin__markdown-preview-view{font-family:var(--default-font);font-size:.875rem;padding:unset;width:unset;height:unset;position:unset;overflow-y:unset;overflow-wrap:unset;color:unset;user-select:unset;-webkit-user-select:unset}.kanban-plugin__markdown-preview-view p,.kanban-plugin__markdown-preview-view ul,.kanban-plugin__markdown-preview-view ol,.kanban-plugin__markdown-preview-view blockquote{margin-block-start:.66em;margin-block-end:.66em}.kanban-plugin__markdown-preview-view blockquote{margin-inline-start:0;margin-inline-end:0}.kanban-plugin__markdown-preview-view ul ol,.kanban-plugin__markdown-preview-view ol ul,.kanban-plugin__markdown-preview-view ul ul,.kanban-plugin__markdown-preview-view ol ol{margin-block-start:0em;margin-block-end:0em}.kanban-plugin__markdown-preview-view>div>*{overflow-x:auto;overflow-wrap:break-word}.kanban-plugin__markdown-preview-view>div>*:first-child,.kanban-plugin__markdown-preview-view>div>.frontmatter-container+*{margin-top:0}.kanban-plugin__markdown-preview-view>div>*:last-child{margin-bottom:0}.kanban-plugin__markdown-preview-view ol.contains-task-list .contains-task-list,.kanban-plugin__markdown-preview-view ul.contains-task-list .contains-task-list,.kanban-plugin__markdown-preview-view ul,.kanban-plugin__markdown-preview-view ol{padding-inline-start:19px}.kanban-plugin__markdown-preview-view ol.contains-task-list,.kanban-plugin__markdown-preview-view ul.contains-task-list{padding-inline-start:0}.kanban-plugin__markdown-preview-view ol>li.task-list-item,.kanban-plugin__markdown-preview-view ul>li.task-list-item{text-indent:0}.kanban-plugin__meta-value .kanban-plugin__markdown-preview-view p,.kanban-plugin__meta-value .kanban-plugin__markdown-preview-view{font-size:inherit;color:inherit;line-height:inherit}.kanban-plugin__markdown-preview-view.inline p,.kanban-plugin__markdown-preview-view.inline{display:inline-block}.kanban-plugin__markdown-preview-view .frontmatter,.kanban-plugin__markdown-preview-view .frontmatter-container{display:none}.kanban-plugin__markdown-preview-view .file-link span{display:inline-flex;align-items:center;justify-content:center;color:var(--text-faint);margin-left:2px;position:relative;top:3px}.kanban-plugin__embed-link-wrapper{padding:2px;float:right}.kanban-plugin__item-metadata-wrapper:not(:empty){background-color:var(--background-primary-alt);padding:6px 8px}.kanban-plugin__item-metadata:not(:empty){padding-top:5px;font-size:12px;font-weight:500;color:var(--text-muted)}.kanban-plugin__item-metadata>span{display:block}.kanban-plugin__item-metadata .is-button{cursor:pointer}.kanban-plugin__item-metadata .is-button:hover{color:var(--text-normal)}.kanban-plugin__item-metadata-date-relative:first-letter{text-transform:uppercase}.kanban-plugin__item-metadata a{text-decoration:none}.kanban-plugin__item-metadata-time:before{content:" \2022 "}.kanban-plugin__item-metadata-time.is-button:hover:before{color:var(--text-muted)}.kanban-plugin__item-metadata-date-wrapper{padding-top:2px}.kanban-plugin__item-tags:not(:empty){padding-top:2px}.kanban-plugin__item-tag{display:inline-block;margin-right:4px}.kanban-plugin__item-tags .kanban-plugin__item-tag{background-color:rgba(var(--interactive-accent-rgb),.1);padding:1px 4px;border-radius:6px;margin:3px 3px 0 0}.kanban-plugin__item-tag.is-search-match,.kanban-plugin__item-tags .kanban-plugin__item-tag.is-search-match{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__meta-table{width:100%;margin:0;line-height:1.5;font-size:.75rem}.kanban-plugin__meta-table td{vertical-align:top;padding:3px 0;width:10%}.kanban-plugin__meta-table td+td{width:90%}.kanban-plugin__meta-table td:only-child{width:100%}.kanban-plugin__meta-table td.kanban-plugin__meta-key{white-space:nowrap;padding-right:5px;color:var(--text-muted)}.kanban-plugin__meta-table td.kanban-plugin__meta-key.is-search-match>span{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__meta-value{white-space:pre-wrap;display:flex}.kanban-plugin__meta-value>.is-search-match,.kanban-plugin__meta-value.is-search-match{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__item-prefix-button-wrapper,.kanban-plugin__item-postfix-button-wrapper{display:flex;flex-grow:0;flex-shrink:0}.kanban-plugin__item-prefix-button-wrapper{flex-direction:column}.kanban-plugin__item-prefix-button-wrapper input[type=checkbox]{margin:4px 7px 4px 0;width:15px;height:15px;filter:hue-rotate(42deg)}.kanban-plugin__item-prefix-button-wrapper input[type=checkbox]+button{margin-top:10px}button.kanban-plugin__item-postfix-button{visibility:hidden;opacity:0;transition:.1s opacity;display:flex;align-self:flex-start}button.kanban-plugin__item-postfix-button.is-enabled,.kanban-plugin__item:hover button.kanban-plugin__item-postfix-button{visibility:visible;opacity:1}.kanban-plugin__item-settings-actions{padding:5px;display:flex}.kanban-plugin__item-settings-actions>button{line-height:1;display:flex;align-items:center;justify-content:center;font-size:.75rem;width:100%}.kanban-plugin__lane-action-wrapper button>.kanban-plugin__icon,.kanban-plugin__item-settings-actions button>.kanban-plugin__icon{margin-right:5px}.kanban-plugin__item-settings-actions>button:first-child,.kanban-plugin__lane-action-wrapper>button:first-child{margin-right:2.5px}.kanban-plugin__item-settings-actions>button:last-child,.kanban-plugin__lane-action-wrapper>button:last-child{margin-left:2.5px}.kanban-plugin__archive-lane-button,.kanban-plugin__item-button-archive{color:var(--text-muted);border:1px solid var(--background-modifier-border)}.kanban-plugin__archive-lane-button:hover,.kanban-plugin__item-button-archive:hover{color:var(--text-normal)}.kanban-plugin__item-button-delete{border:1px solid rgba(var(--background-modifier-error-rgb),.15);color:rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__item-button-delete:hover{background-color:rgba(var(--background-modifier-error-rgb),.2);color:var(--text-error)}.theme-dark .kanban-plugin__item-button-delete{background-color:transparent;border:1px solid rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.theme-dark .kanban-plugin__item-button-delete:hover{background-color:rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.kanban-plugin__checkbox-wrapper{border-top:1px solid var(--background-modifier-border);border-bottom:1px solid var(--background-modifier-border);padding:10px;margin-bottom:10px;display:flex;align-items:center}.kanban-plugin__checkbox-wrapper .checkbox-container{flex-shrink:0;flex-grow:0;margin-left:15px}.kanban-plugin__checkbox-label{font-size:.8125rem;line-height:1.4}.kanban-plugin__lane-setting-wrapper>div{border-top:none;border-bottom:none;padding:10px 15px;margin-bottom:0}.kanban-plugin__lane-setting-wrapper>div:last-child{border-bottom:1px solid var(--background-modifier-border);margin-bottom:10px}.kanban-plugin__action-confirm-wrapper{border:1px solid rgba(var(--background-modifier-error-rgb),.2);background-color:rgba(var(--background-modifier-error-rgb),.1);border-radius:4px;padding:10px;margin:5px 10px}.theme-dark .kanban-plugin__action-confirm-wrapper{border:1px solid rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__delete-lane-button,.kanban-plugin__archive-lane-button{display:flex;align-items:center;justify-content:center;font-size:.75rem;width:50%}.kanban-plugin__delete-lane-button{border:1px solid rgba(var(--background-modifier-error-rgb),.15);color:rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__delete-lane-button:hover{background-color:rgba(var(--background-modifier-error-rgb),.2);color:var(--text-error)}.theme-dark .kanban-plugin__delete-lane-button{background-color:transparent;border:1px solid rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.theme-dark .kanban-plugin__delete-lane-button:hover{background-color:rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.kanban-plugin__action-confirm-text{font-size:.875rem;color:var(--text-error);margin-bottom:10px;line-height:1.4}button.kanban-plugin__confirm-action-button{border:1px solid rgba(var(--background-modifier-error-rgb),.2);margin-right:5px;color:var(--text-error)}button.kanban-plugin__confirm-action-button:hover{background-color:rgba(var(--background-modifier-error-rgb),.5)}button.kanban-plugin__cancel-action-button{border:1px solid var(--background-modifier-border)}.kanban-plugin__grow-wrap{width:100%;display:grid}.kanban-plugin__grow-wrap:after{content:attr(data-replicated-value) " ";white-space:pre-wrap;visibility:hidden}.kanban-plugin__grow-wrap>textarea{resize:none;overflow:hidden;tab-size:2}.kanban-plugin__grow-wrap>textarea:focus{border-color:var(--interactive-accent)}.kanban-plugin__grow-wrap>textarea,.kanban-plugin__grow-wrap:after{border:1px solid var(--background-modifier-border);padding:5px 7px;font:inherit;line-height:1.5;grid-area:1 / 1 / 2 / 2;font-size:.875rem;overflow:hidden;overflow-wrap:break-word;white-space:pre-wrap}.kanban-plugin__autocomplete{font-size:.875rem;border:1px solid var(--background-modifier-border);background-color:var(--background-primary);list-style:none;padding:0;margin:0;min-width:20ch;max-width:40ch;max-height:200px;border-radius:6px;box-shadow:0 15px 25px #0003;overflow-x:hidden;overflow-y:auto}.kanban-plugin__autocomplete li{margin:0}.kanban-plugin .textcomplete-footer,.kanban-plugin .textcomplete-header{display:none}.kanban-plugin__autocomplete-item-active,.kanban-plugin__autocomplete-item{border-top:1px solid var(--background-modifier-border);padding:4px 6px;cursor:pointer}.kanban-plugin__autocomplete .textcomplete-header+.kanban-plugin__autocomplete-item,.kanban-plugin__autocomplete .textcomplete-header+.kanban-plugin__autocomplete-item-active{border-top:none}.kanban-plugin__autocomplete-item:hover,.kanban-plugin__autocomplete-item-active{color:var(--text-on-accent);background-color:var(--interactive-accent-hover)}.kanban-plugin__file-suggestion-wrapper{display:flex;line-height:1.2}.kanban-plugin__file-suggestion-icon{flex-shrink:0;flex-grow:0;padding-right:4px}.kanban-plugin__file-suggestion-subtitle{font-size:.875em;color:var(--text-muted)}.kanban-plugin__autocomplete-item:hover .kanban-plugin__file-suggestion-subtitle,.kanban-plugin__autocomplete-item-active .kanban-plugin__file-suggestion-subtitle{color:var(--text-on-accent)}.modal.kanban-plugin__board-settings-modal{max-height:90vh;padding:0;display:flex;flex-direction:column}.modal.kanban-plugin__board-settings-modal .modal-content{padding:30px 50px;height:100%;overflow-y:auto;overflow-x:hidden;margin:0}.kanban-plugin__board-settings-modal .setting-item-info{width:100%}.kanban-plugin__board-settings-modal .setting-item-control{min-width:300px;flex-shrink:0}.kanban-plugin__board-settings-modal .choices{width:100%;text-align:left}.kanban-plugin__board-settings-modal .choices[data-type*=select-one] .choices__inner{background-color:var(--background-primary);border-color:var(--background-modifier-border);padding:0;min-height:0}.kanban-plugin__board-settings-modal .choices[data-type*=select-one] .choices__input{background-color:var(--background-primary);border-bottom-color:var(--background-modifier-border);font-size:14px}.kanban-plugin__board-settings-modal .choices__input{border-radius:0;border-top:none;border-left:none;border-right:none}.kanban-plugin__board-settings-modal .choices__list--single{padding:4px 20px 4px 6px}.kanban-plugin__board-settings-modal .is-open .choices__list--dropdown,.kanban-plugin__board-settings-modal .choices__list--dropdown{background-color:var(--background-primary);border-color:var(--background-modifier-border);word-break:normal;max-height:200px}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item--selectable:after{display:none}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item--selectable{padding:4px 6px}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item.is-highlighted{background-color:var(--background-primary-alt)}.kanban-plugin__board-settings-modal .choices__placeholder{opacity:1;color:var(--text-muted)}.kanban-plugin__board-settings-modal .error{border-color:var(--background-modifier-error-hover)!important}.kanban-plugin__date-picker{position:absolute;z-index:var(--layer-popover);--cell-size: 2.4em}.kanban-plugin__date-picker .flatpickr-input{width:0;height:0;opacity:0;border:none;padding:0;display:block;margin-bottom:-1px}.kanban-plugin__date-picker .flatpickr-current-month{color:var(--text-normal);font-weight:600;font-size:inherit;width:100%;position:static;height:auto;display:flex;align-items:center;justify-content:center;padding:0}.kanban-plugin__date-picker .flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:var(--text-normal)}.kanban-plugin__date-picker .flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:var(--text-normal)}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{fill:currentColor}.kanban-plugin__date-picker .flatpickr-calendar{font-size:13px;overflow:hidden;background-color:var(--background-primary);width:calc(var(--cell-size) * 7 + 8px);box-shadow:0 0 0 1px var(--background-modifier-border),0 15px 25px #0003}.kanban-plugin__date-picker .flatpickr-months{font-size:13px;padding:2px 2px 4px;align-items:center}.kanban-plugin__date-picker .flatpickr-months .flatpickr-current-month input.cur-year,.kanban-plugin__date-picker .flatpickr-months select{border-radius:4px;padding:4px}.kanban-plugin__date-picker .flatpickr-months .numInputWrapper{border-radius:4px}.kanban-plugin__date-picker .flatpickr-months .flatpickr-month{width:100%;height:auto}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month{color:var(--text-normal);fill:currentColor;border-radius:4px;display:flex;align-items:center;justify-content:center;line-height:1;height:auto;padding:5px;position:static;flex-shrink:0}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month:hover,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month:hover{background-color:var(--background-primary-alt);color:var(--text-normal)}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month:hover svg,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month:hover svg{fill:currentColor}.kanban-plugin__date-picker .flatpickr-current-month .flatpickr-monthDropdown-months{color:var(--text-normal);font-weight:inherit;margin-right:5px}.kanban-plugin__date-picker .flatpickr-current-month input.cur-year{color:var(--text-normal);font-weight:inherit}.kanban-plugin__date-picker .flatpickr-weekdays{height:auto;padding:8px 0 12px}.kanban-plugin__date-picker span.flatpickr-weekday{font-weight:400;color:var(--text-muted)}.kanban-plugin__date-picker .flatpickr-innerContainer{padding:4px}.kanban-plugin__date-picker .flatpickr-day{color:var(--text-normal);display:inline-flex;align-items:center;justify-content:center;width:var(--cell-size);height:var(--cell-size);line-height:1;border-radius:6px}.kanban-plugin__date-picker .flatpickr-day.today{border-color:var(--interactive-accent)}.kanban-plugin__date-picker .flatpickr-day.today:hover{color:var(--text-normal);border-color:var(--interactive-accent);background-color:var(--background-primary-alt)}.kanban-plugin__date-picker .flatpickr-day.selected{border-color:var(--interactive-accent);background-color:var(--interactive-accent);color:var(--text-on-accent)}.kanban-plugin__date-picker .flatpickr-day.selected:hover{border-color:var(--interactive-accent);background-color:var(--interactive-accent)}.kanban-plugin__date-picker .flatpickr-days{width:calc(var(--cell-size) * 7)}.kanban-plugin__date-picker .dayContainer{width:calc(var(--cell-size) * 7);min-width:calc(var(--cell-size) * 7);max-width:calc(var(--cell-size) * 7)}.kanban-plugin__date-picker .flatpickr-day.inRange,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay.inRange,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay.inRange,.kanban-plugin__date-picker .flatpickr-day.today.inRange,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay.today.inRange,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay.today.inRange,.kanban-plugin__date-picker .flatpickr-day:hover,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay:hover,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay:hover,.kanban-plugin__date-picker .flatpickr-day:focus,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay:focus,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay:focus{background-color:var(--background-primary-alt);border-color:var(--background-primary-alt)}.kanban-plugin__date-picker .flatpickr-day.flatpickr-disabled,.kanban-plugin__date-picker .flatpickr-day.flatpickr-disabled:hover,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay,.kanban-plugin__date-picker .flatpickr-day.notAllowed,.kanban-plugin__date-picker .flatpickr-day.notAllowed.prevMonthDay,.kanban-plugin__date-picker .flatpickr-day.notAllowed.nextMonthDay{color:var(--text-faint)}.kanban-plugin__time-picker{position:absolute;max-height:250px;overflow:auto;border-radius:4px;border:1px solid var(--background-modifier-border);box-shadow:0 2px 8px var(--background-modifier-box-shadow);background:var(--background-primary);color:var(--text-normal);font-size:14px;z-index:var(--layer-menu)}.kanban-plugin__time-picker-item{display:flex;align-items:center;color:var(--text-muted);cursor:pointer;line-height:1;padding:6px 8px}.kanban-plugin__time-picker-check{visibility:hidden;display:inline-flex;margin-right:5px}.kanban-plugin__time-picker-item.is-hour{color:var(--text-normal);font-weight:600}.kanban-plugin__time-picker-item.is-selected .kanban-plugin__time-picker-check{visibility:visible}.kanban-plugin__time-picker-item:hover,.kanban-plugin__time-picker-item.is-selected{background:var(--background-secondary)}.kanban-plugin mark{background-color:var(--text-highlight-bg)}.kanban-plugin__draggable-setting-container{border-top:0;padding:0;flex-direction:column}.kanban-plugin__draggable-setting-container>div{width:100%}.kanban-plugin__setting-item-wrapper{border-top:1px solid var(--background-modifier-border)}.kanban-plugin__draggable-setting-container>.kanban-plugin__placeholder{border-top:1px solid var(--background-modifier-border)}.kanban-plugin__setting-item{background-color:var(--background-secondary);width:100%;font-size:16px;display:flex;align-items:flex-start;padding:12px;color:var(--text-muted)}.kanban-plugin__drag-container .kanban-plugin__setting-item{border:1px solid rgba(var(--interactive-accent-rgb),.8);box-shadow:0 15px 25px #0003,0 0 0 2px rgba(var(--interactive-accent-rgb),.8)}.kanban-plugin__setting-controls-wrapper{flex-grow:1;flex-shrink:0}.kanban-plugin__setting-input-wrapper{display:flex;margin-bottom:1rem}.kanban-plugin__setting-input-wrapper>div{margin-right:10px}.kanban-plugin__setting-toggle-wrapper>div{display:flex;align-items:center;line-height:1;margin-bottom:10px}.kanban-plugin__setting-toggle-wrapper .checkbox-container{margin-right:10px}.kanban-plugin__setting-button-wrapper{display:flex;justify-content:flex-end;flex-grow:1;flex-shrink:0}.kanban-plugin__setting-button-wrapper>div{margin-left:12px}.kanban-plugin__setting-key-input-wrapper{margin:1rem 0}.kanban-plugin__setting-key-input-wrapper>input{margin-right:10px}.kanban-plugin__metadata-setting-desc{font-size:14px}.kanban-plugin__setting-button-spacer{visibility:hidden}.kanban-plugin__setting-item-label{font-size:12px;font-weight:bold;margin-bottom:5px}.kanban-plugin__setting-toggle-wrapper .kanban-plugin__setting-item-label{margin-bottom:0}.kanban-plugin__hitbox{border:2px dashed tomato}.kanban-plugin__placeholder{flex-grow:0;flex-shrink:0;width:0;height:0;pointer-events:none}.kanban-plugin__placeholder[data-axis=horizontal]{height:100%}.kanban-plugin__placeholder[data-axis=vertical]{width:100%}.kanban-plugin__scroll-container::-webkit-scrollbar{background-color:transparent;width:16px;height:16px}.kanban-plugin__scroll-container::-webkit-scrollbar-thumb{border:4px solid transparent;background-clip:content-box}.kanban-plugin__scroll-container{will-change:transform}.kanban-plugin__scroll-container.kanban-plugin__horizontal{overflow-y:hidden;overflow-x:auto}.kanban-plugin__scroll-container.kanban-plugin__vertical{overflow-y:auto;overflow-x:hidden}.kanban-plugin__drag-container{contain:layout size;z-index:10000;pointer-events:none;position:fixed;top:0;left:0}.kanban-plugin__loading{background-color:var(--background-secondary-alt);width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sk-pulse{width:60px;height:60px;background-color:var(--text-faint);border-radius:100%;animation:sk-pulse 1.2s infinite cubic-bezier(.455,.03,.515,.955)}@keyframes sk-pulse{0%{transform:scale(0)}to{transform:scale(1);opacity:0}} +.choices{position:relative;margin-bottom:24px;font-size:16px}.choices:focus{outline:none}.choices:last-child{margin-bottom:0}.choices.is-disabled .choices__inner,.choices.is-disabled .choices__input{background-color:#eaeaea;cursor:not-allowed;-webkit-user-select:none;-ms-user-select:none;user-select:none}.choices.is-disabled .choices__item{cursor:not-allowed}.choices [hidden]{display:none!important}.choices[data-type*=select-one]{cursor:pointer}.choices[data-type*=select-one] .choices__inner{padding-bottom:7.5px}.choices[data-type*=select-one] .choices__input{display:block;width:100%;padding:10px;border-bottom:1px solid #dddddd;background-color:#fff;margin:0}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);padding:0;background-size:8px;position:absolute;top:50%;right:0;margin-top:-10px;margin-right:25px;height:20px;width:20px;border-radius:10em;opacity:.5}.choices[data-type*=select-one] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus{opacity:1}.choices[data-type*=select-one] .choices__button:focus{box-shadow:0 0 0 2px #00bcd4}.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices[data-type*=select-one]:after{content:"";height:0;width:0;border-style:solid;border-color:#333333 transparent transparent transparent;border-width:5px;position:absolute;right:11.5px;top:50%;margin-top:-2.5px;pointer-events:none}.choices[data-type*=select-one].is-open:after{border-color:transparent transparent #333333 transparent;margin-top:-7.5px}.choices[data-type*=select-one][dir=rtl]:after{left:11.5px;right:auto}.choices[data-type*=select-one][dir=rtl] .choices__button{right:auto;left:0;margin-left:25px;margin-right:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=text] .choices__inner{cursor:text}.choices[data-type*=select-multiple] .choices__button,.choices[data-type*=text] .choices__button{position:relative;display:inline-block;margin:0 -4px 0 8px;padding-left:16px;border-left:1px solid #008fa1;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);background-size:8px;width:8px;line-height:1;opacity:.75;border-radius:0}.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-multiple] .choices__button:focus,.choices[data-type*=text] .choices__button:hover,.choices[data-type*=text] .choices__button:focus{opacity:1}.choices__inner{display:inline-block;vertical-align:top;width:100%;background-color:#f9f9f9;padding:7.5px 7.5px 3.75px;border:1px solid #dddddd;border-radius:2.5px;font-size:14px;min-height:44px;overflow:hidden}.is-focused .choices__inner,.is-open .choices__inner{border-color:#b7b7b7}.is-open .choices__inner{border-radius:2.5px 2.5px 0 0}.is-flipped.is-open .choices__inner{border-radius:0 0 2.5px 2.5px}.choices__list{margin:0;padding-left:0;list-style:none}.choices__list--single{display:inline-block;padding:4px 16px 4px 4px;width:100%}[dir=rtl] .choices__list--single{padding-right:4px;padding-left:16px}.choices__list--single .choices__item{width:100%}.choices__list--multiple{display:inline}.choices__list--multiple .choices__item{display:inline-block;vertical-align:middle;border-radius:20px;padding:4px 10px;font-size:12px;font-weight:500;margin-right:3.75px;margin-bottom:3.75px;background-color:#00bcd4;border:1px solid #00a5bb;color:#fff;word-break:break-all;box-sizing:border-box}.choices__list--multiple .choices__item[data-deletable]{padding-right:5px}[dir=rtl] .choices__list--multiple .choices__item{margin-right:0;margin-left:3.75px}.choices__list--multiple .choices__item.is-highlighted{background-color:#00a5bb;border:1px solid #008fa1}.is-disabled .choices__list--multiple .choices__item{background-color:#aaa;border:1px solid #919191}.choices__list--dropdown{visibility:hidden;z-index:1;position:absolute;width:100%;background-color:#fff;border:1px solid #dddddd;top:100%;margin-top:-1px;border-bottom-left-radius:2.5px;border-bottom-right-radius:2.5px;overflow:hidden;word-break:break-all;will-change:visibility}.choices__list--dropdown.is-active{visibility:visible}.is-open .choices__list--dropdown{border-color:#b7b7b7}.is-flipped .choices__list--dropdown{top:auto;bottom:100%;margin-top:0;margin-bottom:-1px;border-radius:.25rem .25rem 0 0}.choices__list--dropdown .choices__list{position:relative;max-height:300px;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position}.choices__list--dropdown .choices__item{position:relative;padding:10px;font-size:14px}[dir=rtl] .choices__list--dropdown .choices__item{text-align:right}@media (min-width: 640px){.choices__list--dropdown .choices__item--selectable{padding-right:100px}.choices__list--dropdown .choices__item--selectable:after{content:attr(data-select-text);font-size:12px;opacity:0;position:absolute;right:10px;top:50%;transform:translateY(-50%)}[dir=rtl] .choices__list--dropdown .choices__item--selectable{text-align:right;padding-left:100px;padding-right:10px}[dir=rtl] .choices__list--dropdown .choices__item--selectable:after{right:auto;left:10px}}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:#f2f2f2}.choices__list--dropdown .choices__item--selectable.is-highlighted:after{opacity:.5}.choices__item{cursor:default}.choices__item--selectable{cursor:pointer}.choices__item--disabled{cursor:not-allowed;-webkit-user-select:none;-ms-user-select:none;user-select:none;opacity:.5}.choices__heading{font-weight:600;font-size:12px;padding:10px;border-bottom:1px solid #f7f7f7;color:gray}.choices__button{text-indent:-9999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.choices__button:focus{outline:none}.choices__input{display:inline-block;vertical-align:baseline;background-color:#f9f9f9;font-size:14px;margin-bottom:5px;border:0;border-radius:0;max-width:100%;padding:4px 0 4px 2px}.choices__input:focus{outline:0}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__placeholder{opacity:.5}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\fffd;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.workspace-leaf-content[data-type=kanban] .view-content{padding:0}.kanban-plugin{--lane-width: 272px}.kanban-plugin{contain:content;background-color:var(--background-secondary-alt);height:100%;width:100%;position:relative;display:flex;flex-direction:column}.kanban-plugin.something-is-dragging *{pointer-events:none}.kanban-plugin__item button,.kanban-plugin__lane button,.kanban-plugin button{line-height:1;padding:10px 12px;margin:0;transition:.1s color,.1s background-color}.kanban-plugin__search-wrapper{width:100%;position:sticky;top:0;left:0;padding:10px 13px;display:flex;justify-content:flex-end;align-items:center;z-index:2;background-color:var(--background-secondary);border-bottom:1px solid var(--background-modifier-border)}button.kanban-plugin__search-cancel-button{display:flex;line-height:1;padding:6px;border:1px solid var(--background-modifier-border);background:var(--background-secondary-alt);color:var(--text-muted);margin:0 0 0 5px;font-size:16px}button.kanban-plugin__search-cancel-button .kanban-plugin__icon{display:flex}.kanban-plugin__icon{display:inline-block;line-height:1}.kanban-plugin__icon>svg{width:1em;height:1em}.kanban-plugin__board{display:flex;width:100%;height:100%}.kanban-plugin__board>div{display:flex;align-items:flex-start;justify-content:flex-start;padding:1rem;width:fit-content;height:100%}.kanban-plugin__board.is-adding-lane>div{padding-right:calc(250px + 1rem)}.kanban-plugin__lane-wrapper{display:flex;flex-shrink:0;margin-right:10px;max-height:100%;width:var(--lane-width)}.kanban-plugin__lane{width:100%;display:flex;flex-direction:column;background-color:var(--background-secondary);border-radius:6px;border:1px solid var(--background-modifier-border)}.kanban-plugin__placeholder.kanban-plugin__lane-placeholder{height:100%;flex-grow:1;margin-right:5px}.kanban-plugin__lane.is-hidden{display:none}.kanban-plugin__lane button{padding:8px 10px}.kanban-plugin__lane-form-wrapper{position:absolute;top:1rem;right:1rem;width:250px;background-color:var(--background-secondary);border-radius:6px;border:2px solid rgba(var(--interactive-accent-rgb),.7);z-index:var(--layer-popover);box-shadow:0 .5px 1px .5px #0000001a,0 2px 10px #0000001a,0 10px 20px #0000001a}.kanban-plugin__lane-input-wrapper{padding:10px}.kanban-plugin__item-input-actions,.kanban-plugin__lane-input-actions{display:flex;align-items:flex-start;justify-content:flex-start;padding:0 10px 10px}.kanban-plugin__item-input-actions button,.kanban-plugin__lane-input-actions button{display:block;margin-right:5px}.kanban-plugin__item-action-add,.kanban-plugin__lane-action-add{background-color:var(--interactive-accent);color:var(--text-on-accent)}.kanban-plugin__item-action-add:hover,.kanban-plugin__lane-action-add:hover{background-color:var(--interactive-accent-hover)}.kanban-plugin__lane-header-wrapper{padding:10px 11px;display:flex;align-items:center;flex-shrink:0;flex-grow:0;border-bottom:1px solid var(--background-modifier-border)}.will-prepend .kanban-plugin__lane-header-wrapper{border-bottom:none}.kanban-plugin__lane-grip{cursor:grab;flex-grow:0;margin-right:5px;color:var(--text-faint)}.kanban-plugin__lane-grip>svg{display:block;height:1rem}.kanban-plugin__lane-title{font-weight:600;font-size:.875rem;flex-grow:1;width:100%;display:flex;flex-direction:column}.kanban-plugin__lane-title-text{flex-grow:1}div.kanban-plugin__markdown-preview-view>div>*{overflow-wrap:anywhere}div.kanban-plugin__lane-title-count{background-color:var(--background-secondary-alt);border-radius:3px;color:var(--text-muted);display:block;font-size:13px;line-height:1;padding:4px;margin-left:5px}.kanban-plugin__item button.kanban-plugin__item-prefix-button,.kanban-plugin__item button.kanban-plugin__item-postfix-button,.kanban-plugin__lane button.kanban-plugin__lane-settings-button{font-size:13px;line-height:1;color:var(--text-muted);padding:4px;display:flex;margin-left:5px;background-color:transparent;margin-right:-4px}.kanban-plugin__item button.kanban-plugin__item-prefix-button{margin:4px 7px 4px 0;padding:0}.kanban-plugin__item button.kanban-plugin__item-prefix-button.is-enabled,.kanban-plugin__item button.kanban-plugin__item-postfix-button.is-enabled,.kanban-plugin__lane button.kanban-plugin__lane-settings-button.is-enabled{color:var(--text-accent)}.kanban-plugin__item button.kanban-plugin__item-prefix-button:hover,.kanban-plugin__item button.kanban-plugin__item-postfix-button:hover,.kanban-plugin__lane button.kanban-plugin__lane-settings-button:hover{background-color:transparent;color:var(--text-normal)}.kanban-plugin__lane-action-wrapper,.kanban-plugin__item-edit-archive-button,.kanban-plugin__item-settings-actions .kanban-plugin__icon,.kanban-plugin__item-edit-archive-button>.kanban-plugin__icon,.kanban-plugin__item-prefix-button>.kanban-plugin__icon,.kanban-plugin__item-postfix-button>.kanban-plugin__icon,.kanban-plugin__lane-settings-button>.kanban-plugin__icon{display:flex}.kanban-plugin__lane-settings-button-wrapper{display:flex}button.kanban-plugin__lane-settings-button+button.kanban-plugin__lane-settings-button{margin-left:2px}.kanban-plugin__lane-settings-button svg{width:1em;height:1em}.kanban-plugin__lane-items-wrapper{margin:4px;height:100%}.kanban-plugin__lane-items{padding:4px;margin:0 4px;display:flex;flex-direction:column}.kanban-plugin__lane-items>.kanban-plugin__placeholder{flex-grow:1}.kanban-plugin__lane-items>.kanban-plugin__placeholder:only-child{height:2.55em;border:3px dashed rgba(var(--text-muted-rgb),.1);margin-bottom:4px;border-radius:6px;transition:border .2s ease}.is-sorting .kanban-plugin__lane-items>.kanban-plugin__placeholder:only-child{border-color:rgba(var(--interactive-accent-rgb),.6)}.kanban-plugin__lane-items>div{margin-top:4px}.kanban-plugin__item-button-wrapper{border-top:1px solid var(--background-modifier-border);padding:8px;flex-shrink:0;flex-grow:0}.kanban-plugin__lane-header-wrapper+.kanban-plugin__item-button-wrapper{border-top:none;border-bottom:1px solid var(--background-modifier-border);padding:4px 8px 8px}.kanban-plugin__item-button-wrapper>button{text-align:left;width:100%}.kanban-plugin__item-form{border-top:1px solid var(--background-modifier-border);padding:8px}.kanban-plugin__lane-header-wrapper+.kanban-plugin__item-form{border-top:none;border-bottom:1px solid var(--background-modifier-border);padding:4px 8px 8px}.kanban-plugin__item-input-wrapper{display:flex;flex-direction:column}.kanban-plugin button.kanban-plugin__item-submit-button{background-color:var(--background-secondary-alt);flex-grow:0;flex-shrink:1;width:auto;margin-top:5px;line-height:1;font-size:14px}button.kanban-plugin__new-item-button{background-color:transparent;color:var(--text-muted)}.kanban-plugin__new-item-button:hover{color:var(--text-on-accent);background-color:var(--interactive-accent-hover)}.kanban-plugin__item{font-size:.875rem;border:1px solid var(--background-modifier-border);border-radius:6px;overflow:hidden;transition:.3s opacity cubic-bezier(.25,1,.5,1)}.kanban-plugin__drag-container>.kanban-plugin__item-wrapper .kanban-plugin__item{border-color:var(--interactive-accent);box-shadow:0 15px 25px #0003,0 0 0 2px rgba(var(--interactive-accent-rgb),.8)}.kanban-plugin__item.is-search-hit{box-shadow:0 15px 25px #0003,0 0 0 1px var(--background-modifier-border)}.kanban-plugin__item.is-search-miss{font-size:.75rem;opacity:.5}.kanban-plugin__item.is-search-miss .kanban-plugin__item-metadata-wrapper{display:none}.kanban-plugin__item-content-wrapper{background:var(--background-primary)}.kanban-plugin__item-title-wrapper{background:var(--background-primary);display:flex;padding:6px 8px}.kanban-plugin__item-title-wrapper:not(:only-child){border-bottom:1px solid var(--background-modifier-border)}.kanban-plugin__item-title{width:100%;line-height:1.5;overflow:hidden}.kanban-plugin__markdown-preview-view{font-family:var(--default-font);font-size:.875rem;padding:unset;width:unset;height:unset;position:unset;overflow-y:unset;overflow-wrap:unset;color:unset;user-select:unset;-webkit-user-select:unset}.kanban-plugin__markdown-preview-view p,.kanban-plugin__markdown-preview-view ul,.kanban-plugin__markdown-preview-view ol,.kanban-plugin__markdown-preview-view blockquote{margin-block-start:.66em;margin-block-end:.66em}.kanban-plugin__markdown-preview-view blockquote{margin-inline-start:0;margin-inline-end:0}.kanban-plugin__markdown-preview-view ul ol,.kanban-plugin__markdown-preview-view ol ul,.kanban-plugin__markdown-preview-view ul ul,.kanban-plugin__markdown-preview-view ol ol{margin-block-start:0em;margin-block-end:0em}.kanban-plugin__markdown-preview-view>div>*{overflow-x:auto;overflow-wrap:break-word}.kanban-plugin__markdown-preview-view>div>*:first-child,.kanban-plugin__markdown-preview-view>div>.frontmatter-container+*{margin-top:0}.kanban-plugin__markdown-preview-view>div>*:last-child{margin-bottom:0}.kanban-plugin__markdown-preview-view ul,.kanban-plugin__markdown-preview-view ol{padding-inline-start:24px}.kanban-plugin__meta-value .kanban-plugin__markdown-preview-view p,.kanban-plugin__meta-value .kanban-plugin__markdown-preview-view{font-size:inherit;color:inherit;line-height:inherit}.kanban-plugin__markdown-preview-view.inline p,.kanban-plugin__markdown-preview-view.inline{display:inline-block}.kanban-plugin__markdown-preview-view .frontmatter,.kanban-plugin__markdown-preview-view .frontmatter-container{display:none}.kanban-plugin__markdown-preview-view .file-link span{display:inline-flex;align-items:center;justify-content:center;color:var(--text-faint);margin-left:2px;position:relative;top:3px}.kanban-plugin__embed-link-wrapper{padding:2px;float:right}.kanban-plugin__item-metadata-wrapper:not(:empty){background-color:var(--background-primary-alt);padding:6px 8px}.kanban-plugin__item-metadata:not(:empty){padding-top:5px;font-size:12px;font-weight:500;color:var(--text-muted)}.kanban-plugin__item-metadata>span{display:block}.kanban-plugin__item-metadata .is-button{cursor:pointer}.kanban-plugin__item-metadata .is-button:hover{color:var(--text-normal)}.kanban-plugin__item-metadata-date-relative:first-letter{text-transform:uppercase}.kanban-plugin__item-metadata a{text-decoration:none}.kanban-plugin__item-metadata-time:before{content:" \2022 "}.kanban-plugin__item-metadata-time.is-button:hover:before{color:var(--text-muted)}.kanban-plugin__item-metadata-date-wrapper{padding-top:2px}.kanban-plugin__item-tags:not(:empty){padding-top:2px}.kanban-plugin__item-tag{display:inline-block;margin-right:4px}.kanban-plugin__item-tags .kanban-plugin__item-tag{background-color:rgba(var(--interactive-accent-rgb),.1);padding:1px 4px;border-radius:6px;margin:3px 3px 0 0}.kanban-plugin__item-tag.is-search-match,.kanban-plugin__item-tags .kanban-plugin__item-tag.is-search-match{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__meta-table{width:100%;margin:0;line-height:1.5;font-size:.75rem}.kanban-plugin__meta-table td{vertical-align:top;padding:3px 0;width:10%}.kanban-plugin__meta-table td+td{width:90%}.kanban-plugin__meta-table td:only-child{width:100%}.kanban-plugin__meta-table td.kanban-plugin__meta-key{white-space:nowrap;padding-right:5px;color:var(--text-muted)}.kanban-plugin__meta-table td.kanban-plugin__meta-key.is-search-match>span{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__meta-value{white-space:pre-wrap;display:flex}.kanban-plugin__meta-value>.is-search-match,.kanban-plugin__meta-value.is-search-match{background-color:var(--text-highlight-bg);color:var(--text-normal)}.kanban-plugin__item-prefix-button-wrapper,.kanban-plugin__item-postfix-button-wrapper{display:flex;flex-grow:0;flex-shrink:0}.kanban-plugin__item-prefix-button-wrapper{flex-direction:column}.kanban-plugin__item-prefix-button-wrapper input[type=checkbox]{margin:4px 7px 4px 0;width:15px;height:15px;filter:hue-rotate(42deg)}.kanban-plugin__item-prefix-button-wrapper input[type=checkbox]+button{margin-top:10px}button.kanban-plugin__item-postfix-button{visibility:hidden;opacity:0;transition:.1s opacity;display:flex;align-self:flex-start}button.kanban-plugin__item-postfix-button.is-enabled,.kanban-plugin__item:hover button.kanban-plugin__item-postfix-button{visibility:visible;opacity:1}.kanban-plugin__item-settings-actions{padding:5px;display:flex}.kanban-plugin__item-settings-actions>button{line-height:1;display:flex;align-items:center;justify-content:center;font-size:.75rem;width:100%}.kanban-plugin__lane-action-wrapper button>.kanban-plugin__icon,.kanban-plugin__item-settings-actions button>.kanban-plugin__icon{margin-right:5px}.kanban-plugin__item-settings-actions>button:first-child,.kanban-plugin__lane-action-wrapper>button:first-child{margin-right:2.5px}.kanban-plugin__item-settings-actions>button:last-child,.kanban-plugin__lane-action-wrapper>button:last-child{margin-left:2.5px}.kanban-plugin__archive-lane-button,.kanban-plugin__item-button-archive{color:var(--text-muted);border:1px solid var(--background-modifier-border)}.kanban-plugin__archive-lane-button:hover,.kanban-plugin__item-button-archive:hover{color:var(--text-normal)}.kanban-plugin__item-button-delete{border:1px solid rgba(var(--background-modifier-error-rgb),.15);color:rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__item-button-delete:hover{background-color:rgba(var(--background-modifier-error-rgb),.2);color:var(--text-error)}.theme-dark .kanban-plugin__item-button-delete{background-color:transparent;border:1px solid rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.theme-dark .kanban-plugin__item-button-delete:hover{background-color:rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.kanban-plugin__checkbox-wrapper{border-top:1px solid var(--background-modifier-border);border-bottom:1px solid var(--background-modifier-border);padding:10px;margin-bottom:10px;display:flex;align-items:center}.kanban-plugin__checkbox-wrapper .checkbox-container{flex-shrink:0;flex-grow:0;margin-left:15px}.kanban-plugin__checkbox-label{font-size:.8125rem;line-height:1.4}.kanban-plugin__lane-setting-wrapper>div{border-top:none;border-bottom:none;padding:10px 15px;margin-bottom:0}.kanban-plugin__lane-setting-wrapper>div:last-child{border-bottom:1px solid var(--background-modifier-border);margin-bottom:10px}.kanban-plugin__action-confirm-wrapper{border:1px solid rgba(var(--background-modifier-error-rgb),.2);background-color:rgba(var(--background-modifier-error-rgb),.1);border-radius:4px;padding:10px;margin:5px 10px}.theme-dark .kanban-plugin__action-confirm-wrapper{border:1px solid rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__delete-lane-button,.kanban-plugin__archive-lane-button{display:flex;align-items:center;justify-content:center;font-size:.75rem;width:50%}.kanban-plugin__delete-lane-button{border:1px solid rgba(var(--background-modifier-error-rgb),.15);color:rgba(var(--background-modifier-error-rgb),1)}.kanban-plugin__delete-lane-button:hover{background-color:rgba(var(--background-modifier-error-rgb),.2);color:var(--text-error)}.theme-dark .kanban-plugin__delete-lane-button{background-color:transparent;border:1px solid rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.theme-dark .kanban-plugin__delete-lane-button:hover{background-color:rgba(var(--background-modifier-error-rgb),1);color:var(--text-error)}.kanban-plugin__action-confirm-text{font-size:.875rem;color:var(--text-error);margin-bottom:10px;line-height:1.4}button.kanban-plugin__confirm-action-button{border:1px solid rgba(var(--background-modifier-error-rgb),.2);margin-right:5px;color:var(--text-error)}button.kanban-plugin__confirm-action-button:hover{background-color:rgba(var(--background-modifier-error-rgb),.5)}button.kanban-plugin__cancel-action-button{border:1px solid var(--background-modifier-border)}.kanban-plugin__grow-wrap{width:100%;display:grid}.kanban-plugin__grow-wrap:after{content:attr(data-replicated-value) " ";white-space:pre-wrap;visibility:hidden}.kanban-plugin__grow-wrap>textarea{resize:none;overflow:hidden;tab-size:2}.kanban-plugin__grow-wrap>textarea:focus{border-color:var(--interactive-accent)}.kanban-plugin__grow-wrap>textarea,.kanban-plugin__grow-wrap:after{border:1px solid var(--background-modifier-border);padding:5px 7px;font:inherit;line-height:1.5;grid-area:1 / 1 / 2 / 2;font-size:.875rem;overflow:hidden;overflow-wrap:break-word;white-space:pre-wrap}.kanban-plugin__autocomplete{font-size:.875rem;border:1px solid var(--background-modifier-border);background-color:var(--background-primary);list-style:none;padding:0;margin:0;min-width:20ch;max-width:40ch;max-height:200px;border-radius:6px;box-shadow:0 15px 25px #0003;overflow-x:hidden;overflow-y:auto}.kanban-plugin__autocomplete li{margin:0}.kanban-plugin .textcomplete-footer,.kanban-plugin .textcomplete-header{display:none}.kanban-plugin__autocomplete-item-active,.kanban-plugin__autocomplete-item{border-top:1px solid var(--background-modifier-border);padding:4px 6px;cursor:pointer}.kanban-plugin__autocomplete .textcomplete-header+.kanban-plugin__autocomplete-item,.kanban-plugin__autocomplete .textcomplete-header+.kanban-plugin__autocomplete-item-active{border-top:none}.kanban-plugin__autocomplete-item:hover,.kanban-plugin__autocomplete-item-active{color:var(--text-on-accent);background-color:var(--interactive-accent-hover)}.kanban-plugin__file-suggestion-wrapper{display:flex;line-height:1.2}.kanban-plugin__file-suggestion-icon{flex-shrink:0;flex-grow:0;padding-right:4px}.kanban-plugin__file-suggestion-subtitle{font-size:.875em;color:var(--text-muted)}.kanban-plugin__autocomplete-item:hover .kanban-plugin__file-suggestion-subtitle,.kanban-plugin__autocomplete-item-active .kanban-plugin__file-suggestion-subtitle{color:var(--text-on-accent)}.modal.kanban-plugin__board-settings-modal{max-height:90vh;padding:0;display:flex;flex-direction:column}.modal.kanban-plugin__board-settings-modal .modal-content{padding:30px 50px;height:100%;overflow-y:auto;overflow-x:hidden;margin:0}.kanban-plugin__board-settings-modal .setting-item-info{width:100%}.kanban-plugin__board-settings-modal .setting-item-control{min-width:300px;flex-shrink:0}.kanban-plugin__board-settings-modal .choices{width:100%;text-align:left}.kanban-plugin__board-settings-modal .choices[data-type*=select-one] .choices__inner{background-color:var(--background-primary);border-color:var(--background-modifier-border);padding:0;min-height:0}.kanban-plugin__board-settings-modal .choices[data-type*=select-one] .choices__input{background-color:var(--background-primary);border-bottom-color:var(--background-modifier-border);font-size:14px}.kanban-plugin__board-settings-modal .choices__input{border-radius:0;border-top:none;border-left:none;border-right:none}.kanban-plugin__board-settings-modal .choices__list--single{padding:4px 20px 4px 6px}.kanban-plugin__board-settings-modal .is-open .choices__list--dropdown,.kanban-plugin__board-settings-modal .choices__list--dropdown{background-color:var(--background-primary);border-color:var(--background-modifier-border);word-break:normal;max-height:200px}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item--selectable:after{display:none}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item--selectable{padding:4px 6px}.kanban-plugin__board-settings-modal .choices__list--dropdown .choices__item.is-highlighted{background-color:var(--background-primary-alt)}.kanban-plugin__board-settings-modal .choices__placeholder{opacity:1;color:var(--text-muted)}.kanban-plugin__board-settings-modal .error{border-color:var(--background-modifier-error-hover)!important}.kanban-plugin__date-picker{position:absolute;z-index:var(--layer-popover);--cell-size: 2.4em}.kanban-plugin__date-picker .flatpickr-input{width:0;height:0;opacity:0;border:none;padding:0;display:block;margin-bottom:-1px}.kanban-plugin__date-picker .flatpickr-current-month{color:var(--text-normal);font-weight:600;font-size:inherit;width:100%;position:static;height:auto;display:flex;align-items:center;justify-content:center;padding:0}.kanban-plugin__date-picker .flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:var(--text-normal)}.kanban-plugin__date-picker .flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:var(--text-normal)}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{fill:currentColor}.kanban-plugin__date-picker .flatpickr-calendar{font-size:13px;overflow:hidden;background-color:var(--background-primary);width:calc(var(--cell-size) * 7 + 8px);box-shadow:0 0 0 1px var(--background-modifier-border),0 15px 25px #0003}.kanban-plugin__date-picker .flatpickr-months{font-size:13px;padding:2px 2px 4px;align-items:center}.kanban-plugin__date-picker .flatpickr-months .flatpickr-current-month input.cur-year,.kanban-plugin__date-picker .flatpickr-months select{border-radius:4px;padding:4px}.kanban-plugin__date-picker .flatpickr-months .numInputWrapper{border-radius:4px}.kanban-plugin__date-picker .flatpickr-months .flatpickr-month{width:100%;height:auto}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month{color:var(--text-normal);fill:currentColor;border-radius:4px;display:flex;align-items:center;justify-content:center;line-height:1;height:auto;padding:5px;position:static;flex-shrink:0}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month:hover,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month:hover{background-color:var(--background-primary-alt);color:var(--text-normal)}.kanban-plugin__date-picker .flatpickr-months .flatpickr-prev-month:hover svg,.kanban-plugin__date-picker .flatpickr-months .flatpickr-next-month:hover svg{fill:currentColor}.kanban-plugin__date-picker .flatpickr-current-month .flatpickr-monthDropdown-months{color:var(--text-normal);font-weight:inherit;margin-right:5px}.kanban-plugin__date-picker .flatpickr-current-month input.cur-year{color:var(--text-normal);font-weight:inherit}.kanban-plugin__date-picker .flatpickr-weekdays{height:auto;padding:8px 0 12px}.kanban-plugin__date-picker span.flatpickr-weekday{font-weight:400;color:var(--text-muted)}.kanban-plugin__date-picker .flatpickr-innerContainer{padding:4px}.kanban-plugin__date-picker .flatpickr-day{color:var(--text-normal);display:inline-flex;align-items:center;justify-content:center;width:var(--cell-size);height:var(--cell-size);line-height:1;border-radius:6px}.kanban-plugin__date-picker .flatpickr-day.today{border-color:var(--interactive-accent)}.kanban-plugin__date-picker .flatpickr-day.today:hover{color:var(--text-normal);border-color:var(--interactive-accent);background-color:var(--background-primary-alt)}.kanban-plugin__date-picker .flatpickr-day.selected{border-color:var(--interactive-accent);background-color:var(--interactive-accent);color:var(--text-on-accent)}.kanban-plugin__date-picker .flatpickr-day.selected:hover{border-color:var(--interactive-accent);background-color:var(--interactive-accent)}.kanban-plugin__date-picker .flatpickr-days{width:calc(var(--cell-size) * 7)}.kanban-plugin__date-picker .dayContainer{width:calc(var(--cell-size) * 7);min-width:calc(var(--cell-size) * 7);max-width:calc(var(--cell-size) * 7)}.kanban-plugin__date-picker .flatpickr-day.inRange,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay.inRange,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay.inRange,.kanban-plugin__date-picker .flatpickr-day.today.inRange,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay.today.inRange,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay.today.inRange,.kanban-plugin__date-picker .flatpickr-day:hover,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay:hover,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay:hover,.kanban-plugin__date-picker .flatpickr-day:focus,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay:focus,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay:focus{background-color:var(--background-primary-alt);border-color:var(--background-primary-alt)}.kanban-plugin__date-picker .flatpickr-day.flatpickr-disabled,.kanban-plugin__date-picker .flatpickr-day.flatpickr-disabled:hover,.kanban-plugin__date-picker .flatpickr-day.prevMonthDay,.kanban-plugin__date-picker .flatpickr-day.nextMonthDay,.kanban-plugin__date-picker .flatpickr-day.notAllowed,.kanban-plugin__date-picker .flatpickr-day.notAllowed.prevMonthDay,.kanban-plugin__date-picker .flatpickr-day.notAllowed.nextMonthDay{color:var(--text-faint)}.kanban-plugin__time-picker{position:absolute;max-height:250px;overflow:auto;border-radius:4px;border:1px solid var(--background-modifier-border);box-shadow:0 2px 8px var(--background-modifier-box-shadow);background:var(--background-primary);color:var(--text-normal);font-size:14px;z-index:var(--layer-menu)}.kanban-plugin__time-picker-item{display:flex;align-items:center;color:var(--text-muted);cursor:pointer;line-height:1;padding:6px 8px}.kanban-plugin__time-picker-check{visibility:hidden;display:inline-flex;margin-right:5px}.kanban-plugin__time-picker-item.is-hour{color:var(--text-normal);font-weight:600}.kanban-plugin__time-picker-item.is-selected .kanban-plugin__time-picker-check{visibility:visible}.kanban-plugin__time-picker-item:hover,.kanban-plugin__time-picker-item.is-selected{background:var(--background-secondary)}.kanban-plugin mark{background-color:var(--text-highlight-bg)}.kanban-plugin__draggable-setting-container{border-top:0;padding:0;flex-direction:column}.kanban-plugin__draggable-setting-container>div{width:100%}.kanban-plugin__setting-item-wrapper{border-top:1px solid var(--background-modifier-border)}.kanban-plugin__draggable-setting-container>.kanban-plugin__placeholder{border-top:1px solid var(--background-modifier-border)}.kanban-plugin__setting-item{background-color:var(--background-secondary);width:100%;font-size:16px;display:flex;align-items:flex-start;padding:12px;color:var(--text-muted)}.kanban-plugin__drag-container .kanban-plugin__setting-item{border:1px solid rgba(var(--interactive-accent-rgb),.8);box-shadow:0 15px 25px #0003,0 0 0 2px rgba(var(--interactive-accent-rgb),.8)}.kanban-plugin__setting-controls-wrapper{flex-grow:1;flex-shrink:0}.kanban-plugin__setting-input-wrapper{display:flex;margin-bottom:1rem}.kanban-plugin__setting-input-wrapper>div{margin-right:10px}.kanban-plugin__setting-toggle-wrapper>div{display:flex;align-items:center;line-height:1;margin-bottom:10px}.kanban-plugin__setting-toggle-wrapper .checkbox-container{margin-right:10px}.kanban-plugin__setting-button-wrapper{display:flex;justify-content:flex-end;flex-grow:1;flex-shrink:0}.kanban-plugin__setting-button-wrapper>div{margin-left:12px}.kanban-plugin__setting-key-input-wrapper{margin:1rem 0}.kanban-plugin__setting-key-input-wrapper>input{margin-right:10px}.kanban-plugin__metadata-setting-desc{font-size:14px}.kanban-plugin__setting-button-spacer{visibility:hidden}.kanban-plugin__setting-item-label{font-size:12px;font-weight:bold;margin-bottom:5px}.kanban-plugin__setting-toggle-wrapper .kanban-plugin__setting-item-label{margin-bottom:0}.kanban-plugin__hitbox{border:2px dashed tomato}.kanban-plugin__placeholder{flex-grow:0;flex-shrink:0;width:0;height:0;pointer-events:none}.kanban-plugin__placeholder[data-axis=horizontal]{height:100%}.kanban-plugin__placeholder[data-axis=vertical]{width:100%}.kanban-plugin__scroll-container::-webkit-scrollbar{background-color:transparent;width:16px;height:16px}.kanban-plugin__scroll-container::-webkit-scrollbar-thumb{border:4px solid transparent;background-clip:content-box}.kanban-plugin__scroll-container{will-change:transform}.kanban-plugin__scroll-container.kanban-plugin__horizontal{overflow-y:hidden;overflow-x:auto}.kanban-plugin__scroll-container.kanban-plugin__vertical{overflow-y:auto;overflow-x:hidden}.kanban-plugin__drag-container{contain:layout size;z-index:10000;pointer-events:none;position:fixed;top:0;left:0}.kanban-plugin__loading{background-color:var(--background-secondary-alt);width:100%;height:100%;display:flex;justify-content:center;align-items:center}.sk-pulse{width:60px;height:60px;background-color:var(--text-faint);border-radius:100%;animation:sk-pulse 1.2s infinite cubic-bezier(.455,.03,.515,.955)}@keyframes sk-pulse{0%{transform:scale(0)}to{transform:scale(1);opacity:0}} diff --git a/.obsidian/plugins/obsidian-tasks-plugin/main.js b/.obsidian/plugins/obsidian-tasks-plugin/main.js index 75bfaaa..d1010e0 100644 --- a/.obsidian/plugins/obsidian-tasks-plugin/main.js +++ b/.obsidian/plugins/obsidian-tasks-plugin/main.js @@ -1,5 +1,5 @@ /* -THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source visit the plugins github repository */ @@ -122,10952 +122,12866 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); } -} + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __reExport = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module2) => { + return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; -var E_CANCELED = new Error('request for lock canceled'); - -var Semaphore = /** @class */ (function () { - function Semaphore(_maxConcurrency, _cancelError) { - if (_cancelError === void 0) { _cancelError = E_CANCELED; } - this._maxConcurrency = _maxConcurrency; - this._cancelError = _cancelError; - this._queue = []; - this._waiters = []; - if (_maxConcurrency <= 0) { - throw new Error('semaphore must be initialized to a positive value'); - } - this._value = _maxConcurrency; - } - Semaphore.prototype.acquire = function () { - var _this = this; - var locked = this.isLocked(); - var ticketPromise = new Promise(function (resolve, reject) { - return _this._queue.push({ resolve: resolve, reject: reject }); +// node_modules/rrule/node_modules/tslib/tslib.js +var require_tslib = __commonJS({ + "node_modules/rrule/node_modules/tslib/tslib.js"(exports, module2) { + var __extends2; + var __assign2; + var __rest2; + var __decorate2; + var __param2; + var __metadata2; + var __awaiter2; + var __generator2; + var __exportStar2; + var __values2; + var __read2; + var __spread2; + var __spreadArrays2; + var __await2; + var __asyncGenerator2; + var __asyncDelegator2; + var __asyncValues2; + var __makeTemplateObject2; + var __importStar2; + var __importDefault2; + var __classPrivateFieldGet2; + var __classPrivateFieldSet2; + var __createBinding2; + (function(factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function(exports2) { + factory(createExporter(root, createExporter(exports2))); }); - if (!locked) - this._dispatch(); - return ticketPromise; - }; - Semaphore.prototype.runExclusive = function (callback) { - return __awaiter(this, void 0, void 0, function () { - var _a, value, release; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, this.acquire()]; - case 1: - _a = _b.sent(), value = _a[0], release = _a[1]; - _b.label = 2; - case 2: - _b.trys.push([2, , 4, 5]); - return [4 /*yield*/, callback(value)]; - case 3: return [2 /*return*/, _b.sent()]; - case 4: - release(); - return [7 /*endfinally*/]; - case 5: return [2 /*return*/]; - } - }); - }); - }; - Semaphore.prototype.waitForUnlock = function () { - return __awaiter(this, void 0, void 0, function () { - var waitPromise; - var _this = this; - return __generator(this, function (_a) { - if (!this.isLocked()) { - return [2 /*return*/, Promise.resolve()]; - } - waitPromise = new Promise(function (resolve) { return _this._waiters.push({ resolve: resolve }); }); - return [2 /*return*/, waitPromise]; - }); - }); - }; - Semaphore.prototype.isLocked = function () { - return this._value <= 0; - }; - /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */ - Semaphore.prototype.release = function () { - if (this._maxConcurrency > 1) { - throw new Error('this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead'); + } else if (typeof module2 === "object" && typeof module2.exports === "object") { + factory(createExporter(root, createExporter(module2.exports))); + } else { + factory(createExporter(root)); + } + function createExporter(exports2, previous) { + if (exports2 !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports2, "__esModule", { value: true }); + } else { + exports2.__esModule = true; + } } - if (this._currentReleaser) { - var releaser = this._currentReleaser; - this._currentReleaser = undefined; - releaser(); - } - }; - Semaphore.prototype.cancel = function () { - var _this = this; - this._queue.forEach(function (ticket) { return ticket.reject(_this._cancelError); }); - this._queue = []; - }; - Semaphore.prototype._dispatch = function () { - var _this = this; - var nextTicket = this._queue.shift(); - if (!nextTicket) - return; - var released = false; - this._currentReleaser = function () { - if (released) - return; - released = true; - _this._value++; - _this._resolveWaiters(); - _this._dispatch(); + return function(id, v) { + return exports2[id] = previous ? previous(id, v) : v; }; - nextTicket.resolve([this._value--, this._currentReleaser]); - }; - Semaphore.prototype._resolveWaiters = function () { - this._waiters.forEach(function (waiter) { return waiter.resolve(); }); - this._waiters = []; - }; - return Semaphore; -}()); - -var Mutex = /** @class */ (function () { - function Mutex(cancelError) { - this._semaphore = new Semaphore(1, cancelError); - } - Mutex.prototype.acquire = function () { - return __awaiter(this, void 0, void 0, function () { - var _a, releaser; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, this._semaphore.acquire()]; - case 1: - _a = _b.sent(), releaser = _a[1]; - return [2 /*return*/, releaser]; - } - }); - }); - }; - Mutex.prototype.runExclusive = function (callback) { - return this._semaphore.runExclusive(function () { return callback(); }); - }; - Mutex.prototype.isLocked = function () { - return this._semaphore.isLocked(); - }; - Mutex.prototype.waitForUnlock = function () { - return this._semaphore.waitForUnlock(); - }; - /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */ - Mutex.prototype.release = function () { - this._semaphore.release(); - }; - Mutex.prototype.cancel = function () { - return this._semaphore.cancel(); - }; - return Mutex; -}()); - -const defaultSettings = { - globalFilter: '', - removeGlobalFilter: false, -}; -let settings = Object.assign({}, defaultSettings); -const getSettings = () => { - return Object.assign({}, settings); -}; -const updateSettings = (newSettings) => { - settings = Object.assign(Object.assign({}, settings), newSettings); - return getSettings(); -}; - -let metadataCache; -let vault; -const initializeFile = ({ metadataCache: newMetadataCache, vault: newVault, }) => { - metadataCache = newMetadataCache; - vault = newVault; -}; -/** - * Replaces the original task with one or more new tassk. - * - * If you pass more than one replacement task, all subsequent tasks in the same - * section must be re-rendered, as their section indexes change. Assuming that - * this is done faster than user interaction in practice. - */ -const replaceTaskWithTasks = ({ originalTask, newTasks, }) => __awaiter(void 0, void 0, void 0, function* () { - if (vault === undefined || metadataCache === undefined) { - console.error('Tasks: cannot use File before initializing it.'); - return; - } - if (!Array.isArray(newTasks)) { - newTasks = [newTasks]; - } - tryRepetitive({ - originalTask, - newTasks, - vault, - metadataCache, - previousTries: 0, - }); -}); -/** - * This is a workaround to re-try when the returned file cache is `undefined`. - * Retrying after a while may return a valid file cache. - * Reported in https://github.com/schemar/obsidian-tasks/issues/87 - */ -const tryRepetitive = ({ originalTask, newTasks, vault, metadataCache, previousTries, }) => __awaiter(void 0, void 0, void 0, function* () { - const retry = () => { - if (previousTries > 10) { - console.error('Tasks: Too many retries. File update not possible ...'); - return; + } + })(function(exporter) { + var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d, b) { + d.__proto__ = b; + } || function(d, b) { + for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; + }; + __extends2 = function(d, b) { + extendStatics(d, b); + function __() { + this.constructor = d; } - const timeout = Math.min(Math.pow(10, previousTries), 100); // 1, 10, 100, 100, 100, ... - setTimeout(() => { - tryRepetitive({ - originalTask, - newTasks, - vault, - metadataCache, - previousTries: previousTries + 1, - }); - }, timeout); - }; - const file = vault.getAbstractFileByPath(originalTask.path); - if (!(file instanceof obsidian.TFile)) { - console.warn(`Tasks: No file found for task ${originalTask.description}. Retrying ...`); - return retry(); - } - if (file.extension !== 'md') { - console.error('Tasks: Only supporting files with the .md file extension.'); - return; - } - const fileCache = metadataCache.getFileCache(file); - if (fileCache == undefined || fileCache === null) { - console.warn(`Tasks: No file cache found for file ${file.path}. Retrying ...`); - return retry(); - } - const listItemsCache = fileCache.listItems; - if (listItemsCache === undefined || listItemsCache.length === 0) { - console.warn(`Tasks: No list items found in file cache of ${file.path}. Retrying ...`); - return retry(); - } - const fileContent = yield vault.read(file); - const fileLines = fileContent.split('\n'); - const { globalFilter } = getSettings(); - let listItem; - let sectionIndex = 0; - for (const listItemCache of listItemsCache) { - if (listItemCache.position.start.line < originalTask.sectionStart) { - continue; - } - if (listItemCache.task === undefined) { - continue; - } - const line = fileLines[listItemCache.position.start.line]; - if (line.includes(globalFilter)) { - if (sectionIndex === originalTask.sectionIndex) { - listItem = listItemCache; - break; - } - sectionIndex++; - } - } - if (listItem === undefined) { - console.error('Tasks: could not find task to toggle in the file.'); - return; - } - const updatedFileLines = [ - ...fileLines.slice(0, listItem.position.start.line), - ...newTasks.map((task) => task.toFileLineString()), - ...fileLines.slice(listItem.position.start.line + 1), // Only supports single-line tasks. - ]; - yield vault.modify(file, updatedFileLines.join('\n')); -}); - -class LayoutOptions { - constructor() { - this.hideTaskCount = false; - this.hideBacklinks = false; - this.hidePriority = false; - this.hideStartDate = false; - this.hideScheduledDate = false; - this.hideDoneDate = false; - this.hideDueDate = false; - this.hideRecurrenceRule = false; - this.hideEditButton = false; - this.shortMode = false; - } -} - -// ============================================================================= -// Weekday -// ============================================================================= -var ALL_WEEKDAYS = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']; -var Weekday = /** @class */ (function () { - function Weekday(weekday, n) { - if (n === 0) - throw new Error("Can't create weekday with n == 0"); - this.weekday = weekday; - this.n = n; - } - Weekday.fromStr = function (str) { - return new Weekday(ALL_WEEKDAYS.indexOf(str)); - }; - // __call__ - Cannot call the object directly, do it through - // e.g. RRule.TH.nth(-1) instead, - Weekday.prototype.nth = function (n) { - return this.n === n ? this : new Weekday(this.weekday, n); - }; - // __eq__ - Weekday.prototype.equals = function (other) { - return this.weekday === other.weekday && this.n === other.n; - }; - // __repr__ - Weekday.prototype.toString = function () { - var s = ALL_WEEKDAYS[this.weekday]; - if (this.n) - s = (this.n > 0 ? '+' : '') + String(this.n) + s; - return s; - }; - Weekday.prototype.getJsWeekday = function () { - return this.weekday === 6 ? 0 : this.weekday + 1; - }; - return Weekday; -}()); - -// ============================================================================= -var isPresent = function (value) { - return value !== null && value !== undefined; -}; -var isNumber = function (value) { - return typeof value === 'number'; -}; -var isWeekdayStr = function (value) { - return ALL_WEEKDAYS.indexOf(value) >= 0; -}; -var isArray = Array.isArray; -/** - * Simplified version of python's range() - */ -var range = function (start, end) { - if (end === void 0) { end = start; } - if (arguments.length === 1) { - end = start; - start = 0; - } - var rang = []; - for (var i = start; i < end; i++) - rang.push(i); - return rang; -}; -var repeat = function (value, times) { - var i = 0; - var array = []; - if (isArray(value)) { - for (; i < times; i++) - array[i] = [].concat(value); - } - else { - for (; i < times; i++) - array[i] = value; - } - return array; -}; -var toArray = function (item) { - if (isArray(item)) { - return item; - } - return [item]; -}; -function padStart(item, targetLength, padString) { - if (padString === void 0) { padString = ' '; } - var str = String(item); - targetLength = targetLength >> 0; - if (str.length > targetLength) { - return String(str); - } - targetLength = targetLength - str.length; - if (targetLength > padString.length) { - padString += repeat(padString, targetLength / padString.length); - } - return padString.slice(0, targetLength) + String(str); -} -/** - * Python like split - */ -var split = function (str, sep, num) { - var splits = str.split(sep); - return num - ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) - : splits; -}; -/** - * closure/goog/math/math.js:modulo - * Copyright 2006 The Closure Library Authors. - * The % operator in JavaScript returns the remainder of a / b, but differs from - * some other languages in that the result will have the same sign as the - * dividend. For example, -1 % 8 == -1, whereas in some other languages - * (such as Python) the result would be 7. This function emulates the more - * correct modulo behavior, which is useful for certain applications such as - * calculating an offset index in a circular list. - * - * @param {number} a The dividend. - * @param {number} b The divisor. - * @return {number} a % b where the result is between 0 and b (either 0 <= x < b - * or b < x <= 0, depending on the sign of b). - */ -var pymod = function (a, b) { - var r = a % b; - // If r and b differ in sign, add b to wrap the result to the correct sign. - return r * b < 0 ? r + b : r; -}; -/** - * @see: - */ -var divmod = function (a, b) { - return { div: Math.floor(a / b), mod: pymod(a, b) }; -}; -var empty = function (obj) { - return !isPresent(obj) || obj.length === 0; -}; -/** - * Python-like boolean - * @return {Boolean} value of an object/primitive, taking into account - * the fact that in Python an empty list's/tuple's - * boolean value is False, whereas in JS it's true - */ -var notEmpty = function (obj) { - return !empty(obj); -}; -/** - * Return true if a value is in an array - */ -var includes = function (arr, val) { - return notEmpty(arr) && arr.indexOf(val) !== -1; -}; - -/** - * General date-related utilities. - * Also handles several incompatibilities between JavaScript and Python - * - */ -var dateutil; -(function (dateutil) { - dateutil.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - /** - * Number of milliseconds of one day - */ - dateutil.ONE_DAY = 1000 * 60 * 60 * 24; - /** - * @see: - */ - dateutil.MAXYEAR = 9999; - /** - * Python uses 1-Jan-1 as the base for calculating ordinals but we don't - * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, - * therefore we use 1-Jan-1970 instead - */ - dateutil.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); - /** - * Python: MO-SU: 0 - 6 - * JS: SU-SAT 0 - 6 - */ - dateutil.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; - /** - * py_date.timetuple()[7] - */ - dateutil.getYearDay = function (date) { - var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - return (Math.ceil((dateNoTime.valueOf() - - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / - dateutil.ONE_DAY) + 1); - }; - dateutil.isLeapYear = function (year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - }; - dateutil.isDate = function (value) { - return value instanceof Date; - }; - dateutil.isValidDate = function (value) { - return dateutil.isDate(value) && !isNaN(value.getTime()); - }; - /** - * @return {Number} the date's timezone offset in ms - */ - dateutil.tzOffset = function (date) { - return date.getTimezoneOffset() * 60 * 1000; - }; - /** - * @see: - */ - dateutil.daysBetween = function (date1, date2) { - // The number of milliseconds in one day - // Convert both dates to milliseconds - var date1ms = date1.getTime() - dateutil.tzOffset(date1); - var date2ms = date2.getTime() - dateutil.tzOffset(date2); - // Calculate the difference in milliseconds - var differencems = date1ms - date2ms; - // Convert back to days and return - return Math.round(differencems / dateutil.ONE_DAY); - }; - /** - * @see: - */ - dateutil.toOrdinal = function (date) { - return dateutil.daysBetween(date, dateutil.ORDINAL_BASE); - }; - /** - * @see - - */ - dateutil.fromOrdinal = function (ordinal) { - return new Date(dateutil.ORDINAL_BASE.getTime() + ordinal * dateutil.ONE_DAY); - }; - dateutil.getMonthDays = function (date) { - var month = date.getUTCMonth(); - return month === 1 && dateutil.isLeapYear(date.getUTCFullYear()) - ? 29 - : dateutil.MONTH_DAYS[month]; - }; - /** - * @return {Number} python-like weekday - */ - dateutil.getWeekday = function (date) { - return dateutil.PY_WEEKDAYS[date.getUTCDay()]; - }; - /** - * @see: - */ - dateutil.monthRange = function (year, month) { - var date = new Date(Date.UTC(year, month, 1)); - return [dateutil.getWeekday(date), dateutil.getMonthDays(date)]; - }; - /** - * @see: - */ - dateutil.combine = function (date, time) { - time = time || date; - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); - }; - dateutil.clone = function (date) { - var dolly = new Date(date.getTime()); - return dolly; - }; - dateutil.cloneDates = function (dates) { - var clones = []; - for (var i = 0; i < dates.length; i++) { - clones.push(dateutil.clone(dates[i])); - } - return clones; - }; - /** - * Sorts an array of Date or dateutil.Time objects - */ - dateutil.sort = function (dates) { - dates.sort(function (a, b) { - return a.getTime() - b.getTime(); - }); - }; - dateutil.timeToUntilString = function (time, utc) { - if (utc === void 0) { utc = true; } - var date = new Date(time); - return [ - padStart(date.getUTCFullYear().toString(), 4, '0'), - padStart(date.getUTCMonth() + 1, 2, '0'), - padStart(date.getUTCDate(), 2, '0'), - 'T', - padStart(date.getUTCHours(), 2, '0'), - padStart(date.getUTCMinutes(), 2, '0'), - padStart(date.getUTCSeconds(), 2, '0'), - utc ? 'Z' : '' - ].join(''); - }; - dateutil.untilStringToDate = function (until) { - var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; - var bits = re.exec(until); - if (!bits) - throw new Error("Invalid UNTIL value: " + until); - return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); - }; -})(dateutil || (dateutil = {})); -var dateutil$1 = dateutil; - -/** - * This class helps us to emulate python's generators, sorta. - */ -var IterResult = /** @class */ (function () { - function IterResult(method, args) { - this.minDate = null; - this.maxDate = null; - this._result = []; - this.total = 0; - this.method = method; - this.args = args; - if (method === 'between') { - this.maxDate = args.inc - ? args.before - : new Date(args.before.getTime() - 1); - this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1); - } - else if (method === 'before') { - this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1); - } - else if (method === 'after') { - this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1); - } - } - /** - * Possibly adds a date into the result. - * - * @param {Date} date - the date isn't necessarly added to the result - * list (if it is too late/too early) - * @return {Boolean} true if it makes sense to continue the iteration - * false if we're done. - */ - IterResult.prototype.accept = function (date) { - ++this.total; - var tooEarly = this.minDate && date < this.minDate; - var tooLate = this.maxDate && date > this.maxDate; - if (this.method === 'between') { - if (tooEarly) - return true; - if (tooLate) - return false; - } - else if (this.method === 'before') { - if (tooLate) - return false; - } - else if (this.method === 'after') { - if (tooEarly) - return true; - this.add(date); - return false; - } - return this.add(date); - }; - /** - * - * @param {Date} date that is part of the result. - * @return {Boolean} whether we are interested in more values. - */ - IterResult.prototype.add = function (date) { - this._result.push(date); - return true; - }; - /** - * 'before' and 'after' return only one date, whereas 'all' - * and 'between' an array. - * @return {Date,Array?} - */ - IterResult.prototype.getValue = function () { - var res = this._result; - switch (this.method) { - case 'all': - case 'between': - return res; - case 'before': - case 'after': - default: - return (res.length ? res[res.length - 1] : null); - } - }; - IterResult.prototype.clone = function () { - return new IterResult(this.method, this.args); - }; - return IterResult; -}()); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + __assign2 = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; } return t; - }; - return __assign.apply(this, arguments); -}; - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - -/** - * IterResult subclass that calls a callback function on each add, - * and stops iterating when the callback returns false. - */ -var CallbackIterResult = /** @class */ (function (_super) { - __extends(CallbackIterResult, _super); - function CallbackIterResult(method, args, iterator) { - var _this = _super.call(this, method, args) || this; - _this.iterator = iterator; - return _this; - } - CallbackIterResult.prototype.add = function (date) { - if (this.iterator(date, this._result.length)) { - this._result.push(date); - return true; - } - return false; - }; - return CallbackIterResult; -}(IterResult)); - -// ============================================================================= -// i18n -// ============================================================================= -var ENGLISH = { - dayNames: [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' - ], - monthNames: [ - 'January', 'February', 'March', 'April', 'May', - 'June', 'July', 'August', 'September', 'October', - 'November', 'December' - ], - tokens: { - 'SKIP': /^[ \r\n\t]+|^\.$/, - 'number': /^[1-9][0-9]*/, - 'numberAsText': /^(one|two|three)/i, - 'every': /^every/i, - 'day(s)': /^days?/i, - 'weekday(s)': /^weekdays?/i, - 'week(s)': /^weeks?/i, - 'hour(s)': /^hours?/i, - 'minute(s)': /^minutes?/i, - 'month(s)': /^months?/i, - 'year(s)': /^years?/i, - 'on': /^(on|in)/i, - 'at': /^(at)/i, - 'the': /^the/i, - 'first': /^first/i, - 'second': /^second/i, - 'third': /^third/i, - 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, - 'last': /^last/i, - 'for': /^for/i, - 'time(s)': /^times?/i, - 'until': /^(un)?til/i, - 'monday': /^mo(n(day)?)?/i, - 'tuesday': /^tu(e(s(day)?)?)?/i, - 'wednesday': /^we(d(n(esday)?)?)?/i, - 'thursday': /^th(u(r(sday)?)?)?/i, - 'friday': /^fr(i(day)?)?/i, - 'saturday': /^sa(t(urday)?)?/i, - 'sunday': /^su(n(day)?)?/i, - 'january': /^jan(uary)?/i, - 'february': /^feb(ruary)?/i, - 'march': /^mar(ch)?/i, - 'april': /^apr(il)?/i, - 'may': /^may/i, - 'june': /^june?/i, - 'july': /^july?/i, - 'august': /^aug(ust)?/i, - 'september': /^sep(t(ember)?)?/i, - 'october': /^oct(ober)?/i, - 'november': /^nov(ember)?/i, - 'december': /^dec(ember)?/i, - 'comma': /^(,\s*|(and|or)\s*)+/i - } -}; - -// ============================================================================= -// Helper functions -// ============================================================================= -/** - * Return true if a value is in an array - */ -var contains = function (arr, val) { - return arr.indexOf(val) !== -1; -}; -var defaultGetText = function (id) { return id.toString(); }; -var defaultDateFormatter = function (year, month, day) { return month + " " + day + ", " + year; }; -/** - * - * @param {RRule} rrule - * Optional: - * @param {Function} gettext function - * @param {Object} language definition - * @constructor - */ -var ToText = /** @class */ (function () { - function ToText(rrule, gettext, language, dateFormatter) { - if (gettext === void 0) { gettext = defaultGetText; } - if (language === void 0) { language = ENGLISH; } - if (dateFormatter === void 0) { dateFormatter = defaultDateFormatter; } - this.text = []; - this.language = language || ENGLISH; - this.gettext = gettext; - this.dateFormatter = dateFormatter; - this.rrule = rrule; - this.options = rrule.options; - this.origOptions = rrule.origOptions; - if (this.origOptions.bymonthday) { - var bymonthday = [].concat(this.options.bymonthday); - var bynmonthday = [].concat(this.options.bynmonthday); - bymonthday.sort(function (a, b) { return a - b; }); - bynmonthday.sort(function (a, b) { return b - a; }); - // 1, 2, 3, .., -5, -4, -3, .. - this.bymonthday = bymonthday.concat(bynmonthday); - if (!this.bymonthday.length) - this.bymonthday = null; - } - if (isPresent(this.origOptions.byweekday)) { - var byweekday = !isArray(this.origOptions.byweekday) - ? [this.origOptions.byweekday] - : this.origOptions.byweekday; - var days = String(byweekday); - this.byweekday = { - allWeeks: byweekday.filter(function (weekday) { - return !weekday.n; - }), - someWeeks: byweekday.filter(function (weekday) { - return Boolean(weekday.n); - }), - isWeekdays: days.indexOf('MO') !== -1 && - days.indexOf('TU') !== -1 && - days.indexOf('WE') !== -1 && - days.indexOf('TH') !== -1 && - days.indexOf('FR') !== -1 && - days.indexOf('SA') === -1 && - days.indexOf('SU') === -1, - isEveryDay: days.indexOf('MO') !== -1 && - days.indexOf('TU') !== -1 && - days.indexOf('WE') !== -1 && - days.indexOf('TH') !== -1 && - days.indexOf('FR') !== -1 && - days.indexOf('SA') !== -1 && - days.indexOf('SU') !== -1 - }; - var sortWeekDays = function (a, b) { - return a.weekday - b.weekday; - }; - this.byweekday.allWeeks.sort(sortWeekDays); - this.byweekday.someWeeks.sort(sortWeekDays); - if (!this.byweekday.allWeeks.length) - this.byweekday.allWeeks = null; - if (!this.byweekday.someWeeks.length) - this.byweekday.someWeeks = null; - } - else { - this.byweekday = null; - } - } - /** - * Test whether the rrule can be fully converted to text. - * @param {RRule} rrule - * @return {Boolean} - */ - ToText.isFullyConvertible = function (rrule) { - var canConvert = true; - if (!(rrule.options.freq in ToText.IMPLEMENTED)) - return false; - if (rrule.origOptions.until && rrule.origOptions.count) - return false; - for (var key in rrule.origOptions) { - if (contains(['dtstart', 'wkst', 'freq'], key)) - return true; - if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key)) - return false; - } - return canConvert; - }; - ToText.prototype.isFullyConvertible = function () { - return ToText.isFullyConvertible(this.rrule); - }; - /** - * Perform the conversion. Only some of the frequencies are supported. - * If some of the rrule's options aren't supported, they'll - * be omitted from the output an "(~ approximate)" will be appended. - * @return {*} - */ - ToText.prototype.toString = function () { - var gettext = this.gettext; - if (!(this.options.freq in ToText.IMPLEMENTED)) { - return gettext('RRule error: Unable to fully convert this rrule to text'); - } - this.text = [gettext('every')]; - // @ts-ignore - this[RRule.FREQUENCIES[this.options.freq]](); - if (this.options.until) { - this.add(gettext('until')); - var until = this.options.until; - this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())); - } - else if (this.options.count) { - this.add(gettext('for')) - .add(this.options.count.toString()) - .add(this.plural(this.options.count) ? gettext('times') : gettext('time')); - } - if (!this.isFullyConvertible()) - this.add(gettext('(~ approximate)')); - return this.text.join(''); - }; - ToText.prototype.HOURLY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext('hours') : gettext('hour')); - }; - ToText.prototype.MINUTELY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) - ? gettext('minutes') - : gettext('minute')); - }; - ToText.prototype.DAILY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - if (this.byweekday && this.byweekday.isWeekdays) { - this.add(this.plural(this.options.interval) - ? gettext('weekdays') - : gettext('weekday')); - } - else { - this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day')); - } - if (this.origOptions.bymonth) { - this.add(gettext('in')); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - else if (this.origOptions.byhour) { - this._byhour(); - } - }; - ToText.prototype.WEEKLY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext('weeks') : gettext('week')); - } - if (this.byweekday && this.byweekday.isWeekdays) { - if (this.options.interval === 1) { - this.add(this.plural(this.options.interval) - ? gettext('weekdays') - : gettext('weekday')); - } - else { - this.add(gettext('on')).add(gettext('weekdays')); - } - } - else if (this.byweekday && this.byweekday.isEveryDay) { - this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day')); - } - else { - if (this.options.interval === 1) - this.add(gettext('week')); - if (this.origOptions.bymonth) { - this.add(gettext('in')); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - } - }; - ToText.prototype.MONTHLY = function () { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(gettext('months')); - if (this.plural(this.options.interval)) - this.add(gettext('in')); - } - this._bymonth(); - } - else { - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) - ? gettext('months') - : gettext('month')); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday && this.byweekday.isWeekdays) { - this.add(gettext('on')).add(gettext('weekdays')); - } - else if (this.byweekday) { - this._byweekday(); - } - }; - ToText.prototype.YEARLY = function () { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()); - this.add(gettext('years')); - } - this._bymonth(); - } - else { - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year')); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - if (this.options.byyearday) { - this.add(gettext('on the')) - .add(this.list(this.options.byyearday, this.nth, gettext('and'))) - .add(gettext('day')); - } - if (this.options.byweekno) { - this.add(gettext('in')) - .add(this.plural(this.options.byweekno.length) - ? gettext('weeks') - : gettext('week')) - .add(this.list(this.options.byweekno, undefined, gettext('and'))); - } - }; - ToText.prototype._bymonthday = function () { - var gettext = this.gettext; - if (this.byweekday && this.byweekday.allWeeks) { - this.add(gettext('on')) - .add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or'))) - .add(gettext('the')) - .add(this.list(this.bymonthday, this.nth, gettext('or'))); - } - else { - this.add(gettext('on the')).add(this.list(this.bymonthday, this.nth, gettext('and'))); - } - // this.add(gettext('DAY')) - }; - ToText.prototype._byweekday = function () { - var gettext = this.gettext; - if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { - this.add(gettext('on')).add(this.list(this.byweekday.allWeeks, this.weekdaytext)); - } - if (this.byweekday.someWeeks) { - if (this.byweekday.allWeeks) - this.add(gettext('and')); - this.add(gettext('on the')).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and'))); - } - }; - ToText.prototype._byhour = function () { - var gettext = this.gettext; - this.add(gettext('at')).add(this.list(this.origOptions.byhour, undefined, gettext('and'))); - }; - ToText.prototype._bymonth = function () { - this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('and'))); - }; - ToText.prototype.nth = function (n) { - n = parseInt(n.toString(), 10); - var nth; - var npos; - var gettext = this.gettext; - if (n === -1) - return gettext('last'); - npos = Math.abs(n); - switch (npos) { - case 1: - case 21: - case 31: - nth = npos + gettext('st'); - break; - case 2: - case 22: - nth = npos + gettext('nd'); - break; - case 3: - case 23: - nth = npos + gettext('rd'); - break; - default: - nth = npos + gettext('th'); - } - return n < 0 ? nth + ' ' + gettext('last') : nth; - }; - ToText.prototype.monthtext = function (m) { - return this.language.monthNames[m - 1]; - }; - ToText.prototype.weekdaytext = function (wday) { - var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); - return ((wday.n ? this.nth(wday.n) + ' ' : '') + this.language.dayNames[weekday]); - }; - ToText.prototype.plural = function (n) { - return n % 100 !== 1; - }; - ToText.prototype.add = function (s) { - this.text.push(' '); - this.text.push(s); - return this; - }; - ToText.prototype.list = function (arr, callback, finalDelim, delim) { - if (delim === void 0) { delim = ','; } - if (!isArray(arr)) { - arr = [arr]; - } - var delimJoin = function (array, delimiter, finalDelimiter) { - var list = ''; - for (var i = 0; i < array.length; i++) { - if (i !== 0) { - if (i === array.length - 1) { - list += ' ' + finalDelimiter + ' '; - } - else { - list += delimiter + ' '; - } - } - list += array[i]; - } - return list; + }; + __rest2 = function(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + __decorate2 = 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; + }; + __param2 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); }; - callback = - callback || - function (o) { - return o.toString(); - }; - var self = this; - var realCallback = function (arg) { - return callback && callback.call(self, arg); - }; - if (finalDelim) { - return delimJoin(arr.map(realCallback), delim, finalDelim); + }; + __metadata2 = function(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + }; + __awaiter2 = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); } - else { - return arr.map(realCallback).join(delim + ' '); - } - }; - return ToText; -}()); - -// ============================================================================= -// Parser -// ============================================================================= -var Parser = /** @class */ (function () { - function Parser(rules) { - this.done = true; - this.rules = rules; - } - Parser.prototype.start = function (text) { - this.text = text; - this.done = false; - return this.nextSymbol(); - }; - Parser.prototype.isDone = function () { - return this.done && this.symbol === null; - }; - Parser.prototype.nextSymbol = function () { - var best; - var bestSymbol; - var p = this; - this.symbol = null; - this.value = null; - do { - if (this.done) - return false; - var rule = void 0; - best = null; - for (var name_1 in this.rules) { - rule = this.rules[name_1]; - var match = rule.exec(p.text); - if (match) { - if (best === null || match[0].length > best[0].length) { - best = match; - bestSymbol = name_1; - } - } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); } - if (best != null) { - this.text = this.text.substr(best[0].length); - if (this.text === '') - this.done = true; + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); } - if (best == null) { - this.done = true; - this.symbol = null; - this.value = null; - return; - } - // @ts-ignore - } while (bestSymbol === 'SKIP'); - // @ts-ignore - this.symbol = bestSymbol; - this.value = best; - return true; - }; - Parser.prototype.accept = function (name) { - if (this.symbol === name) { - if (this.value) { - var v = this.value; - this.nextSymbol(); - return v; - } - this.nextSymbol(); - return true; - } - return false; - }; - Parser.prototype.acceptNumber = function () { - return this.accept('number'); - }; - Parser.prototype.expect = function (name) { - if (this.accept(name)) - return true; - throw new Error('expected ' + name + ' but found ' + this.symbol); - }; - return Parser; -}()); -function parseText(text, language) { - if (language === void 0) { language = ENGLISH; } - var options = {}; - var ttr = new Parser(language.tokens); - if (!ttr.start(text)) - return null; - S(); - return options; - function S() { - // every [n] - ttr.expect('every'); - var n = ttr.acceptNumber(); - if (n) - options.interval = parseInt(n[0], 10); - if (ttr.isDone()) - throw new Error('Unexpected end'); - switch (ttr.symbol) { - case 'day(s)': - options.freq = RRule.DAILY; - if (ttr.nextSymbol()) { - AT(); - F(); - } - break; - // FIXME Note: every 2 weekdays != every two weeks on weekdays. - // DAILY on weekdays is not a valid rule - case 'weekday(s)': - options.freq = RRule.WEEKLY; - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ]; - ttr.nextSymbol(); - F(); - break; - case 'week(s)': - options.freq = RRule.WEEKLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'hour(s)': - options.freq = RRule.HOURLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'minute(s)': - options.freq = RRule.MINUTELY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'month(s)': - options.freq = RRule.MONTHLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'year(s)': - options.freq = RRule.YEARLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'monday': - case 'tuesday': - case 'wednesday': - case 'thursday': - case 'friday': - case 'saturday': - case 'sunday': - options.freq = RRule.WEEKLY; - var key = ttr.symbol.substr(0, 2).toUpperCase(); - options.byweekday = [RRule[key]]; - if (!ttr.nextSymbol()) - return; - // TODO check for duplicates - while (ttr.accept('comma')) { - if (ttr.isDone()) - throw new Error('Unexpected end'); - var wkd = decodeWKD(); - if (!wkd) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday'); - } - // @ts-ignore - options.byweekday.push(RRule[wkd]); - ttr.nextSymbol(); - } - MDAYs(); - F(); - break; - case 'january': - case 'february': - case 'march': - case 'april': - case 'may': - case 'june': - case 'july': - case 'august': - case 'september': - case 'october': - case 'november': - case 'december': - options.freq = RRule.YEARLY; - options.bymonth = [decodeM()]; - if (!ttr.nextSymbol()) - return; - // TODO check for duplicates - while (ttr.accept('comma')) { - if (ttr.isDone()) - throw new Error('Unexpected end'); - var m = decodeM(); - if (!m) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month'); - } - options.bymonth.push(m); - ttr.nextSymbol(); - } - ON(); - F(); - break; - default: - throw new Error('Unknown symbol'); - } - } - function ON() { - var on = ttr.accept('on'); - var the = ttr.accept('the'); - if (!(on || the)) - return; - do { - var nth = decodeNTH(); - var wkd = decodeWKD(); - var m = decodeM(); - // nth | - if (nth) { - // ttr.nextSymbol() - if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - // @ts-ignore - options.byweekday.push(RRule[wkd].nth(nth)); - } - else { - if (!options.bymonthday) - options.bymonthday = []; - // @ts-ignore - options.bymonthday.push(nth); - ttr.accept('day(s)'); - } - // - } - else if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - // @ts-ignore - options.byweekday.push(RRule[wkd]); - } - else if (ttr.symbol === 'weekday(s)') { - ttr.nextSymbol(); - if (!options.byweekday) { - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ]; - } - } - else if (ttr.symbol === 'week(s)') { - ttr.nextSymbol(); - var n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number'); - } - options.byweekno = [parseInt(n[0], 10)]; - while (ttr.accept('comma')) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday'); - } - options.byweekno.push(parseInt(n[0], 10)); - } - } - else if (m) { - ttr.nextSymbol(); - if (!options.bymonth) - options.bymonth = []; - // @ts-ignore - options.bymonth.push(m); - } - else { - return; - } - } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on')); - } - function AT() { - var at = ttr.accept('at'); - if (!at) - return; - do { - var n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour'); - } - options.byhour = [parseInt(n[0], 10)]; - while (ttr.accept('comma')) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour'); - } - options.byhour.push(parseInt(n[0], 10)); - } - } while (ttr.accept('comma') || ttr.accept('at')); - } - function decodeM() { - switch (ttr.symbol) { - case 'january': - return 1; - case 'february': - return 2; - case 'march': - return 3; - case 'april': - return 4; - case 'may': - return 5; - case 'june': - return 6; - case 'july': - return 7; - case 'august': - return 8; - case 'september': - return 9; - case 'october': - return 10; - case 'november': - return 11; - case 'december': - return 12; - default: - return false; - } - } - function decodeWKD() { - switch (ttr.symbol) { - case 'monday': - case 'tuesday': - case 'wednesday': - case 'thursday': - case 'friday': - case 'saturday': - case 'sunday': - return ttr.symbol.substr(0, 2).toUpperCase(); - default: - return false; - } - } - function decodeNTH() { - switch (ttr.symbol) { - case 'last': - ttr.nextSymbol(); - return -1; - case 'first': - ttr.nextSymbol(); - return 1; - case 'second': - ttr.nextSymbol(); - return ttr.accept('last') ? -2 : 2; - case 'third': - ttr.nextSymbol(); - return ttr.accept('last') ? -3 : 3; - case 'nth': - var v = parseInt(ttr.value[1], 10); - if (v < -366 || v > 366) - throw new Error('Nth out of range: ' + v); - ttr.nextSymbol(); - return ttr.accept('last') ? -v : v; - default: - return false; - } - } - function MDAYs() { - ttr.accept('on'); - ttr.accept('the'); - var nth = decodeNTH(); - if (!nth) - return; - options.bymonthday = [nth]; - ttr.nextSymbol(); - while (ttr.accept('comma')) { - nth = decodeNTH(); - if (!nth) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday'); - } - options.bymonthday.push(nth); - ttr.nextSymbol(); - } - } - function F() { - if (ttr.symbol === 'until') { - var date = Date.parse(ttr.text); - if (!date) - throw new Error('Cannot parse until date:' + ttr.text); - options.until = new Date(date); - } - else if (ttr.accept('for')) { - options.count = parseInt(ttr.value[0], 10); - ttr.expect('number'); - // ttr.expect('times') - } - } -} - -var Frequency; -(function (Frequency) { - Frequency[Frequency["YEARLY"] = 0] = "YEARLY"; - Frequency[Frequency["MONTHLY"] = 1] = "MONTHLY"; - Frequency[Frequency["WEEKLY"] = 2] = "WEEKLY"; - Frequency[Frequency["DAILY"] = 3] = "DAILY"; - Frequency[Frequency["HOURLY"] = 4] = "HOURLY"; - Frequency[Frequency["MINUTELY"] = 5] = "MINUTELY"; - Frequency[Frequency["SECONDLY"] = 6] = "SECONDLY"; -})(Frequency || (Frequency = {})); -function freqIsDailyOrGreater(freq) { - return freq < Frequency.HOURLY; -} - -/*! -* rrule.js - Library for working with recurrence rules for calendar dates. -* https://github.com/jakubroztocil/rrule -* -* Copyright 2010, Jakub Roztocil and Lars Schoning -* Licenced under the BSD licence. -* https://github.com/jakubroztocil/rrule/blob/master/LICENCE -* -*/ -/** - * - * Implementation of RRule.fromText() and RRule::toText(). - * - * - * On the client side, this file needs to be included - * when those functions are used. - * - */ -// ============================================================================= -// fromText -// ============================================================================= -/** - * Will be able to convert some of the below described rules from - * text format to a rule object. - * - * - * RULES - * - * Every ([n]) - * day(s) - * | [weekday], ..., (and) [weekday] - * | weekday(s) - * | week(s) - * | month(s) - * | [month], ..., (and) [month] - * | year(s) - * - * - * Plus 0, 1, or multiple of these: - * - * on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday] - * - * on [weekday], ..., (and) [weekday] - * - * on the [monthday], [monthday], ... (and) [monthday] (day of the month) - * - * on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year) - * - * - * Plus 0 or 1 of these: - * - * for [n] time(s) - * - * until [date] - * - * Plus (.) - * - * - * Definitely no supported for parsing: - * - * (for year): - * in week(s) [n], ..., (and) [n] - * - * on the [yearday], ..., (and) [n] day of the year - * on day [yearday], ..., (and) [n] - * - * - * NON-TERMINALS - * - * [n]: 1, 2 ..., one, two, three .. - * [month]: January, February, March, April, May, ... December - * [weekday]: Monday, ... Sunday - * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ... - * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, .. - * [date]: - * [month] (0-31(,) ([year])), - * (the) 0-31.(1-12.([year])), - * (the) 0-31/(1-12/([year])), - * [weekday] - * - * [year]: 0000, 0001, ... 01, 02, .. - * - * Definitely not supported for parsing: - * - * [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, .. - * - * @param {String} text - * @return {Object, Boolean} the rule, or null. - */ -var fromText = function (text, language) { - if (language === void 0) { language = ENGLISH; } - return new RRule(parseText(text, language) || undefined); -}; -var common = [ - 'count', - 'until', - 'interval', - 'byweekday', - 'bymonthday', - 'bymonth' -]; -ToText.IMPLEMENTED = []; -ToText.IMPLEMENTED[Frequency.HOURLY] = common; -ToText.IMPLEMENTED[Frequency.MINUTELY] = common; -ToText.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common); -ToText.IMPLEMENTED[Frequency.WEEKLY] = common; -ToText.IMPLEMENTED[Frequency.MONTHLY] = common; -ToText.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common); -// ============================================================================= -// Export -// ============================================================================= -var toText = function (rrule, gettext, language, dateFormatter) { - return new ToText(rrule, gettext, language, dateFormatter).toString(); -}; -var isFullyConvertible = ToText.isFullyConvertible; - -var Time = /** @class */ (function () { - function Time(hour, minute, second, millisecond) { - this.hour = hour; - this.minute = minute; - this.second = second; - this.millisecond = millisecond || 0; - } - Time.prototype.getHours = function () { - return this.hour; - }; - Time.prototype.getMinutes = function () { - return this.minute; - }; - Time.prototype.getSeconds = function () { - return this.second; - }; - Time.prototype.getMilliseconds = function () { - return this.millisecond; - }; - Time.prototype.getTime = function () { - return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + - this.millisecond); - }; - return Time; -}()); -var DateTime = /** @class */ (function (_super) { - __extends(DateTime, _super); - function DateTime(year, month, day, hour, minute, second, millisecond) { - var _this = _super.call(this, hour, minute, second, millisecond) || this; - _this.year = year; - _this.month = month; - _this.day = day; - return _this; - } - DateTime.fromDate = function (date) { - return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000); - }; - DateTime.prototype.getWeekday = function () { - return dateutil.getWeekday(new Date(this.getTime())); - }; - DateTime.prototype.getTime = function () { - return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); - }; - DateTime.prototype.getDay = function () { - return this.day; - }; - DateTime.prototype.getMonth = function () { - return this.month; - }; - DateTime.prototype.getYear = function () { - return this.year; - }; - DateTime.prototype.addYears = function (years) { - this.year += years; - }; - DateTime.prototype.addMonths = function (months) { - this.month += months; - if (this.month > 12) { - var yearDiv = Math.floor(this.month / 12); - var monthMod = pymod(this.month, 12); - this.month = monthMod; - this.year += yearDiv; - if (this.month === 0) { - this.month = 12; - --this.year; - } - } - }; - DateTime.prototype.addWeekly = function (days, wkst) { - if (wkst > this.getWeekday()) { - this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; - } - else { - this.day += -(this.getWeekday() - wkst) + days * 7; - } - this.fixDay(); - }; - DateTime.prototype.addDaily = function (days) { - this.day += days; - this.fixDay(); - }; - DateTime.prototype.addHours = function (hours, filtered, byhour) { - if (filtered) { - // Jump to one iteration before next day - this.hour += Math.floor((23 - this.hour) / hours) * hours; - } - while (true) { - this.hour += hours; - var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; - if (dayDiv) { - this.hour = hourMod; - this.addDaily(dayDiv); - } - if (empty(byhour) || includes(byhour, this.hour)) - break; - } - }; - DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) { - if (filtered) { - // Jump to one iteration before next day - this.minute += - Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; - } - while (true) { - this.minute += minutes; - var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; - if (hourDiv) { - this.minute = minuteMod; - this.addHours(hourDiv, false, byhour); - } - if ((empty(byhour) || includes(byhour, this.hour)) && - (empty(byminute) || includes(byminute, this.minute))) { - break; - } - } - }; - DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) { - if (filtered) { - // Jump to one iteration before next day - this.second += - Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; - } - while (true) { - this.second += seconds; - var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; - if (minuteDiv) { - this.second = secondMod; - this.addMinutes(minuteDiv, false, byhour, byminute); - } - if ((empty(byhour) || includes(byhour, this.hour)) && - (empty(byminute) || includes(byminute, this.minute)) && - (empty(bysecond) || includes(bysecond, this.second))) { - break; - } - } - }; - DateTime.prototype.fixDay = function () { - if (this.day <= 28) { - return; - } - var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - if (this.day <= daysinmonth) { - return; - } - while (this.day > daysinmonth) { - this.day -= daysinmonth; - ++this.month; - if (this.month === 13) { - this.month = 1; - ++this.year; - if (this.year > dateutil.MAXYEAR) { - return; - } - } - daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - } - }; - DateTime.prototype.add = function (options, filtered) { - var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - switch (freq) { - case Frequency.YEARLY: return this.addYears(interval); - case Frequency.MONTHLY: return this.addMonths(interval); - case Frequency.WEEKLY: return this.addWeekly(interval, wkst); - case Frequency.DAILY: return this.addDaily(interval); - case Frequency.HOURLY: return this.addHours(interval, filtered, byhour); - case Frequency.MINUTELY: return this.addMinutes(interval, filtered, byhour, byminute); - case Frequency.SECONDLY: return this.addSeconds(interval, filtered, byhour, byminute, bysecond); - } - }; - return DateTime; -}(Time)); - -function initializeOptions$1(options) { - var invalid = []; - var keys = Object.keys(options); - // Shallow copy for options and origOptions and check for invalid - for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { - var key = keys_1[_i]; - if (!includes(defaultKeys, key)) - invalid.push(key); - if (dateutil$1.isDate(options[key]) && !dateutil$1.isValidDate(options[key])) - invalid.push(key); - } - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign({}, options); -} -function parseOptions(options) { - var opts = __assign(__assign({}, DEFAULT_OPTIONS$1), initializeOptions$1(options)); - if (isPresent(opts.byeaster)) - opts.freq = RRule.YEARLY; - if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) { - throw new Error("Invalid frequency: " + opts.freq + " " + options.freq); - } - if (!opts.dtstart) - opts.dtstart = new Date(new Date().setMilliseconds(0)); - if (!isPresent(opts.wkst)) { - opts.wkst = RRule.MO.weekday; - } - else if (isNumber(opts.wkst)) ; - else { - opts.wkst = opts.wkst.weekday; - } - if (isPresent(opts.bysetpos)) { - if (isNumber(opts.bysetpos)) - opts.bysetpos = [opts.bysetpos]; - for (var i = 0; i < opts.bysetpos.length; i++) { - var v = opts.bysetpos[i]; - if (v === 0 || !(v >= -366 && v <= 366)) { - throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1'); - } - } - } - if (!(Boolean(opts.byweekno) || - notEmpty(opts.byweekno) || - notEmpty(opts.byyearday) || - Boolean(opts.bymonthday) || - notEmpty(opts.bymonthday) || - isPresent(opts.byweekday) || - isPresent(opts.byeaster))) { - switch (opts.freq) { - case RRule.YEARLY: - if (!opts.bymonth) - opts.bymonth = opts.dtstart.getUTCMonth() + 1; - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.MONTHLY: - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.WEEKLY: - opts.byweekday = [dateutil$1.getWeekday(opts.dtstart)]; - break; - } - } - // bymonth - if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { - opts.bymonth = [opts.bymonth]; - } - // byyearday - if (isPresent(opts.byyearday) && - !isArray(opts.byyearday) && - isNumber(opts.byyearday)) { - opts.byyearday = [opts.byyearday]; - } - // bymonthday - if (!isPresent(opts.bymonthday)) { - opts.bymonthday = []; - opts.bynmonthday = []; - } - else if (isArray(opts.bymonthday)) { - var bymonthday = []; - var bynmonthday = []; - for (var i = 0; i < opts.bymonthday.length; i++) { - var v = opts.bymonthday[i]; - if (v > 0) { - bymonthday.push(v); - } - else if (v < 0) { - bynmonthday.push(v); - } - } - opts.bymonthday = bymonthday; - opts.bynmonthday = bynmonthday; - } - else if (opts.bymonthday < 0) { - opts.bynmonthday = [opts.bymonthday]; - opts.bymonthday = []; - } - else { - opts.bynmonthday = []; - opts.bymonthday = [opts.bymonthday]; - } - // byweekno - if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { - opts.byweekno = [opts.byweekno]; - } - // byweekday / bynweekday - if (!isPresent(opts.byweekday)) { - opts.bynweekday = null; - } - else if (isNumber(opts.byweekday)) { - opts.byweekday = [opts.byweekday]; - opts.bynweekday = null; - } - else if (isWeekdayStr(opts.byweekday)) { - opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; - opts.bynweekday = null; - } - else if (opts.byweekday instanceof Weekday) { - if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { - opts.byweekday = [opts.byweekday.weekday]; - opts.bynweekday = null; - } - else { - opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; - opts.byweekday = null; - } - } - else { - var byweekday = []; - var bynweekday = []; - for (var i = 0; i < opts.byweekday.length; i++) { - var wday = opts.byweekday[i]; - if (isNumber(wday)) { - byweekday.push(wday); - continue; - } - else if (isWeekdayStr(wday)) { - byweekday.push(Weekday.fromStr(wday).weekday); - continue; - } - if (!wday.n || opts.freq > RRule.MONTHLY) { - byweekday.push(wday.weekday); - } - else { - bynweekday.push([wday.weekday, wday.n]); - } - } - opts.byweekday = notEmpty(byweekday) ? byweekday : null; - opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; - } - // byhour - if (!isPresent(opts.byhour)) { - opts.byhour = - opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null; - } - else if (isNumber(opts.byhour)) { - opts.byhour = [opts.byhour]; - } - // byminute - if (!isPresent(opts.byminute)) { - opts.byminute = - opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; - } - else if (isNumber(opts.byminute)) { - opts.byminute = [opts.byminute]; - } - // bysecond - if (!isPresent(opts.bysecond)) { - opts.bysecond = - opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; - } - else if (isNumber(opts.bysecond)) { - opts.bysecond = [opts.bysecond]; - } - return { parsedOptions: opts }; -} -function buildTimeset(opts) { - var millisecondModulo = opts.dtstart.getTime() % 1000; - if (!freqIsDailyOrGreater(opts.freq)) { - return []; - } - var timeset = []; - opts.byhour.forEach(function (hour) { - opts.byminute.forEach(function (minute) { - opts.bysecond.forEach(function (second) { - timeset.push(new Time(hour, minute, second, millisecondModulo)); - }); + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); }); - }); - return timeset; -} - -function parseString(rfcString) { - var options = rfcString.split('\n').map(parseLine).filter(function (x) { return x !== null; }); - return __assign(__assign({}, options[0]), options[1]); -} -function parseDtstart(line) { - var options = {}; - var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); - if (!dtstartWithZone) { - return options; - } - dtstartWithZone[0]; var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; - if (tzid) { - options.tzid = tzid; - } - options.dtstart = dateutil$1.untilStringToDate(dtstart); - return options; -} -function parseLine(rfcString) { - rfcString = rfcString.replace(/^\s+|\s+$/, ''); - if (!rfcString.length) - return null; - var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); - if (!header) { - return parseRrule(rfcString); - } - header[0]; var key = header[1]; - switch (key.toUpperCase()) { - case 'RRULE': - case 'EXRULE': - return parseRrule(rfcString); - case 'DTSTART': - return parseDtstart(rfcString); - default: - throw new Error("Unsupported RFC prop " + key + " in " + rfcString); - } -} -function parseRrule(line) { - var strippedLine = line.replace(/^RRULE:/i, ''); - var options = parseDtstart(strippedLine); - var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';'); - attrs.forEach(function (attr) { - var _a = attr.split('='), key = _a[0], value = _a[1]; - switch (key.toUpperCase()) { - case 'FREQ': - options.freq = Frequency[value.toUpperCase()]; - break; - case 'WKST': - options.wkst = Days[value.toUpperCase()]; - break; - case 'COUNT': - case 'INTERVAL': - case 'BYSETPOS': - case 'BYMONTH': - case 'BYMONTHDAY': - case 'BYYEARDAY': - case 'BYWEEKNO': - case 'BYHOUR': - case 'BYMINUTE': - case 'BYSECOND': - var num = parseNumber(value); - var optionKey = key.toLowerCase(); - // @ts-ignore - options[optionKey] = num; - break; - case 'BYWEEKDAY': - case 'BYDAY': - options.byweekday = parseWeekday(value); - break; - case 'DTSTART': - case 'TZID': - // for backwards compatibility - var dtstart = parseDtstart(line); - options.tzid = dtstart.tzid; - options.dtstart = dtstart.dtstart; - break; - case 'UNTIL': - options.until = dateutil$1.untilStringToDate(value); - break; - case 'BYEASTER': - options.byeaster = Number(value); - break; - default: - throw new Error("Unknown RRULE property '" + key + "'"); + }; + __generator2 = function(thisArg, body) { + var _ = { label: 0, sent: function() { + if (t[0] & 1) + throw t[1]; + return t[1]; + }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + return this; + }), g; + function verb(n) { + return function(v) { + return step([n, v]); + }; } - }); - return options; -} -function parseNumber(value) { - if (value.indexOf(',') !== -1) { - var values = value.split(','); - return values.map(parseIndividualNumber); - } - return parseIndividualNumber(value); -} -function parseIndividualNumber(value) { - if (/^[+-]?\d+$/.test(value)) { - return Number(value); - } - return value; -} -function parseWeekday(value) { - var days = value.split(','); - return days.map(function (day) { - if (day.length === 2) { - // MO, TU, ... - return Days[day]; // wday instanceof Weekday + function step(op) { + if (f) + throw new TypeError("Generator is already executing."); + while (_) + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) + return t; + if (y = 0, t) + op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) + _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; } - // -1MO, +3FR, 1SO, 13TU ... - var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); - var n = Number(parts[1]); - var wdaypart = parts[2]; - var wday = Days[wdaypart].weekday; - return new Weekday(wday, n); + }; + __createBinding2 = function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }; + __exportStar2 = function(m, exports2) { + for (var p in m) + if (p !== "default" && !exports2.hasOwnProperty(p)) + exports2[p] = m[p]; + }; + __values2 = function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function() { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + __read2 = function(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } catch (error) { + e = { error }; + } finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } finally { + if (e) + throw e.error; + } + } + return ar; + }; + __spread2 = function() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read2(arguments[i])); + return ar; + }; + __spreadArrays2 = function() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + __await2 = function(v) { + return this instanceof __await2 ? (this.v = v, this) : new __await2(v); + }; + __asyncGenerator2 = function(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i; + function verb(n) { + if (g[n]) + i[n] = function(v) { + return new Promise(function(a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); + }); + }; + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); + } + }; + __asyncDelegator2 = function(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function(e) { + throw e; + }), verb("return"), i[Symbol.iterator] = function() { + return this; + }, i; + function verb(n, f) { + i[n] = o[n] ? function(v) { + return (p = !p) ? { value: __await2(o[n](v)), done: n === "return" } : f ? f(v) : v; + } : f; + } + }; + __asyncValues2 = function(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i); + function verb(n) { + i[n] = o[n] && function(v) { + return new Promise(function(resolve, reject) { + v = o[n](v), settle(resolve, reject, v.done, v.value); + }); + }; + } + function settle(resolve, reject, d, v) { + Promise.resolve(v).then(function(v2) { + resolve({ value: v2, done: d }); + }, reject); + } + }; + __makeTemplateObject2 = function(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } else { + cooked.raw = raw; + } + return cooked; + }; + __importStar2 = function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (Object.hasOwnProperty.call(mod, k)) + result[k] = mod[k]; + } + result["default"] = mod; + return result; + }; + __importDefault2 = function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + __classPrivateFieldGet2 = function(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); + }; + __classPrivateFieldSet2 = function(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; + }; + exporter("__extends", __extends2); + exporter("__assign", __assign2); + exporter("__rest", __rest2); + exporter("__decorate", __decorate2); + exporter("__param", __param2); + exporter("__metadata", __metadata2); + exporter("__awaiter", __awaiter2); + exporter("__generator", __generator2); + exporter("__exportStar", __exportStar2); + exporter("__createBinding", __createBinding2); + exporter("__values", __values2); + exporter("__read", __read2); + exporter("__spread", __spread2); + exporter("__spreadArrays", __spreadArrays2); + exporter("__await", __await2); + exporter("__asyncGenerator", __asyncGenerator2); + exporter("__asyncDelegator", __asyncDelegator2); + exporter("__asyncValues", __asyncValues2); + exporter("__makeTemplateObject", __makeTemplateObject2); + exporter("__importStar", __importStar2); + exporter("__importDefault", __importDefault2); + exporter("__classPrivateFieldGet", __classPrivateFieldGet2); + exporter("__classPrivateFieldSet", __classPrivateFieldSet2); }); -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -var luxon = createCommonjsModule(function (module, exports) { - -Object.defineProperty(exports, '__esModule', { value: true }); - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); } -} +}); -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; -} - -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} - -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); -} - -function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } -} - -function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); -} - -function _isNativeFunction(fn) { - return Function.toString.call(fn).indexOf("[native code]") !== -1; -} - -function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !_isNativeFunction(Class)) return Class; - - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - - _cache.set(Class, Wrapper); - } - - function Wrapper() { - return _construct(Class, arguments, _getPrototypeOf(this).constructor); - } - - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true +// node_modules/luxon/build/cjs-browser/luxon.js +var require_luxon = __commonJS({ + "node_modules/luxon/build/cjs-browser/luxon.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } - }); - return _setPrototypeOf(Wrapper, Class); - }; - - return _wrapNativeSuper(Class); -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(n); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _createForOfIteratorHelperLoose(o) { - var i = 0; - - if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { - if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { - if (i >= o.length) return { - done: true + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); }; - return { - done: false, - value: o[i++] + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) + return false; + if (typeof Proxy === "function") + return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function() { + })); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct2(Parent2, args2, Class2) { + var a = [null]; + a.push.apply(a, args2); + var Constructor = Function.bind.apply(Parent2, a); + var instance2 = new Constructor(); + if (Class2) + _setPrototypeOf(instance2, Class2.prototype); + return instance2; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : void 0; + _wrapNativeSuper = function _wrapNativeSuper2(Class2) { + if (Class2 === null || !_isNativeFunction(Class2)) + return Class2; + if (typeof Class2 !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class2)) + return _cache.get(Class2); + _cache.set(Class2, Wrapper); + } + function Wrapper() { + return _construct(Class2, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class2.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class2); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) + return; + if (typeof o === "string") + return _arrayLikeToArray(o, minLen); + var n2 = Object.prototype.toString.call(o).slice(8, -1); + if (n2 === "Object" && o.constructor) + n2 = o.constructor.name; + if (n2 === "Map" || n2 === "Set") + return Array.from(n2); + if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2)) + return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) + len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) + arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o) { + var i = 0; + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) + return function() { + if (i >= o.length) + return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + i = o[Symbol.iterator](); + return i.next.bind(i); + } + var LuxonError = /* @__PURE__ */ function(_Error) { + _inheritsLoose(LuxonError2, _Error); + function LuxonError2() { + return _Error.apply(this, arguments) || this; + } + return LuxonError2; + }(/* @__PURE__ */ _wrapNativeSuper(Error)); + var InvalidDateTimeError = /* @__PURE__ */ function(_LuxonError) { + _inheritsLoose(InvalidDateTimeError2, _LuxonError); + function InvalidDateTimeError2(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError2; + }(LuxonError); + var InvalidIntervalError = /* @__PURE__ */ function(_LuxonError2) { + _inheritsLoose(InvalidIntervalError2, _LuxonError2); + function InvalidIntervalError2(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError2; + }(LuxonError); + var InvalidDurationError = /* @__PURE__ */ function(_LuxonError3) { + _inheritsLoose(InvalidDurationError2, _LuxonError3); + function InvalidDurationError2(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError2; + }(LuxonError); + var ConflictingSpecificationError = /* @__PURE__ */ function(_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError2, _LuxonError4); + function ConflictingSpecificationError2() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError2; + }(LuxonError); + var InvalidUnitError = /* @__PURE__ */ function(_LuxonError5) { + _inheritsLoose(InvalidUnitError2, _LuxonError5); + function InvalidUnitError2(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError2; + }(LuxonError); + var InvalidArgumentError = /* @__PURE__ */ function(_LuxonError6) { + _inheritsLoose(InvalidArgumentError2, _LuxonError6); + function InvalidArgumentError2() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError2; + }(LuxonError); + var ZoneIsAbstractError = /* @__PURE__ */ function(_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError2, _LuxonError7); + function ZoneIsAbstractError2() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError2; + }(LuxonError); + var n = "numeric"; + var s = "short"; + var l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n }; - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - i = o[Symbol.iterator](); - return i.next.bind(i); -} - -// these aren't really private, but nor are they really useful to document - -/** - * @private - */ -var LuxonError = /*#__PURE__*/function (_Error) { - _inheritsLoose(LuxonError, _Error); - - function LuxonError() { - return _Error.apply(this, arguments) || this; - } - - return LuxonError; -}( /*#__PURE__*/_wrapNativeSuper(Error)); -/** - * @private - */ - - -var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { - _inheritsLoose(InvalidDateTimeError, _LuxonError); - - function InvalidDateTimeError(reason) { - return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; - } - - return InvalidDateTimeError; -}(LuxonError); -/** - * @private - */ - -var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { - _inheritsLoose(InvalidIntervalError, _LuxonError2); - - function InvalidIntervalError(reason) { - return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; - } - - return InvalidIntervalError; -}(LuxonError); -/** - * @private - */ - -var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { - _inheritsLoose(InvalidDurationError, _LuxonError3); - - function InvalidDurationError(reason) { - return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; - } - - return InvalidDurationError; -}(LuxonError); -/** - * @private - */ - -var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { - _inheritsLoose(ConflictingSpecificationError, _LuxonError4); - - function ConflictingSpecificationError() { - return _LuxonError4.apply(this, arguments) || this; - } - - return ConflictingSpecificationError; -}(LuxonError); -/** - * @private - */ - -var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { - _inheritsLoose(InvalidUnitError, _LuxonError5); - - function InvalidUnitError(unit) { - return _LuxonError5.call(this, "Invalid unit " + unit) || this; - } - - return InvalidUnitError; -}(LuxonError); -/** - * @private - */ - -var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { - _inheritsLoose(InvalidArgumentError, _LuxonError6); - - function InvalidArgumentError() { - return _LuxonError6.apply(this, arguments) || this; - } - - return InvalidArgumentError; -}(LuxonError); -/** - * @private - */ - -var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { - _inheritsLoose(ZoneIsAbstractError, _LuxonError7); - - function ZoneIsAbstractError() { - return _LuxonError7.call(this, "Zone is an abstract class") || this; - } - - return ZoneIsAbstractError; -}(LuxonError); - -/** - * @private - */ -var n = "numeric", - s = "short", - l = "long"; -var DATE_SHORT = { - year: n, - month: n, - day: n -}; -var DATE_MED = { - year: n, - month: s, - day: n -}; -var DATE_MED_WITH_WEEKDAY = { - year: n, - month: s, - day: n, - weekday: s -}; -var DATE_FULL = { - year: n, - month: l, - day: n -}; -var DATE_HUGE = { - year: n, - month: l, - day: n, - weekday: l -}; -var TIME_SIMPLE = { - hour: n, - minute: n -}; -var TIME_WITH_SECONDS = { - hour: n, - minute: n, - second: n -}; -var TIME_WITH_SHORT_OFFSET = { - hour: n, - minute: n, - second: n, - timeZoneName: s -}; -var TIME_WITH_LONG_OFFSET = { - hour: n, - minute: n, - second: n, - timeZoneName: l -}; -var TIME_24_SIMPLE = { - hour: n, - minute: n, - hour12: false -}; -/** - * {@link toLocaleString}; format like '09:30:23', always 24-hour. - */ - -var TIME_24_WITH_SECONDS = { - hour: n, - minute: n, - second: n, - hour12: false -}; -/** - * {@link toLocaleString}; format like '09:30:23 EDT', always 24-hour. - */ - -var TIME_24_WITH_SHORT_OFFSET = { - hour: n, - minute: n, - second: n, - hour12: false, - timeZoneName: s -}; -/** - * {@link toLocaleString}; format like '09:30:23 Eastern Daylight Time', always 24-hour. - */ - -var TIME_24_WITH_LONG_OFFSET = { - hour: n, - minute: n, - second: n, - hour12: false, - timeZoneName: l -}; -/** - * {@link toLocaleString}; format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. - */ - -var DATETIME_SHORT = { - year: n, - month: n, - day: n, - hour: n, - minute: n -}; -/** - * {@link toLocaleString}; format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. - */ - -var DATETIME_SHORT_WITH_SECONDS = { - year: n, - month: n, - day: n, - hour: n, - minute: n, - second: n -}; -var DATETIME_MED = { - year: n, - month: s, - day: n, - hour: n, - minute: n -}; -var DATETIME_MED_WITH_SECONDS = { - year: n, - month: s, - day: n, - hour: n, - minute: n, - second: n -}; -var DATETIME_MED_WITH_WEEKDAY = { - year: n, - month: s, - day: n, - weekday: s, - hour: n, - minute: n -}; -var DATETIME_FULL = { - year: n, - month: l, - day: n, - hour: n, - minute: n, - timeZoneName: s -}; -var DATETIME_FULL_WITH_SECONDS = { - year: n, - month: l, - day: n, - hour: n, - minute: n, - second: n, - timeZoneName: s -}; -var DATETIME_HUGE = { - year: n, - month: l, - day: n, - weekday: l, - hour: n, - minute: n, - timeZoneName: l -}; -var DATETIME_HUGE_WITH_SECONDS = { - year: n, - month: l, - day: n, - weekday: l, - hour: n, - minute: n, - second: n, - timeZoneName: l -}; - -/* - This is just a junk drawer, containing anything used across multiple classes. - Because Luxon is small(ish), this should stay small and we won't worry about splitting - it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. -*/ -/** - * @private - */ -// TYPES - -function isUndefined(o) { - return typeof o === "undefined"; -} -function isNumber(o) { - return typeof o === "number"; -} -function isInteger(o) { - return typeof o === "number" && o % 1 === 0; -} -function isString(o) { - return typeof o === "string"; -} -function isDate(o) { - return Object.prototype.toString.call(o) === "[object Date]"; -} // CAPABILITIES - -function hasIntl() { - try { - return typeof Intl !== "undefined" && Intl.DateTimeFormat; - } catch (e) { - return false; - } -} -function hasFormatToParts() { - return !isUndefined(Intl.DateTimeFormat.prototype.formatToParts); -} -function hasRelative() { - try { - return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; - } catch (e) { - return false; - } -} // OBJECTS AND ARRAYS - -function maybeArray(thing) { - return Array.isArray(thing) ? thing : [thing]; -} -function bestBy(arr, by, compare) { - if (arr.length === 0) { - return undefined; - } - - return arr.reduce(function (best, next) { - var pair = [by(next), next]; - - if (!best) { - return pair; - } else if (compare(best[0], pair[0]) === best[0]) { - return best; - } else { - return pair; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hour12: false + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hour12: false + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hour12: false, + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hour12: false, + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + function isUndefined(o) { + return typeof o === "undefined"; } - }, null)[1]; -} -function pick(obj, keys) { - return keys.reduce(function (a, k) { - a[k] = obj[k]; - return a; - }, {}); -} -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} // NUMBERS AND STRINGS - -function integerBetween(thing, bottom, top) { - return isInteger(thing) && thing >= bottom && thing <= top; -} // x % n but takes the sign of n instead of x - -function floorMod(x, n) { - return x - n * Math.floor(x / n); -} -function padStart(input, n) { - if (n === void 0) { - n = 2; - } - - var minus = input < 0 ? "-" : ""; - var target = minus ? input * -1 : input; - var result; - - if (target.toString().length < n) { - result = ("0".repeat(n) + target).slice(-n); - } else { - result = target.toString(); - } - - return "" + minus + result; -} -function parseInteger(string) { - if (isUndefined(string) || string === null || string === "") { - return undefined; - } else { - return parseInt(string, 10); - } -} -function parseMillis(fraction) { - // Return undefined (instead of 0) in these cases, where fraction is not set - if (isUndefined(fraction) || fraction === null || fraction === "") { - return undefined; - } else { - var f = parseFloat("0." + fraction) * 1000; - return Math.floor(f); - } -} -function roundTo(number, digits, towardZero) { - if (towardZero === void 0) { - towardZero = false; - } - - var factor = Math.pow(10, digits), - rounder = towardZero ? Math.trunc : Math.round; - return rounder(number * factor) / factor; -} // DATE BASICS - -function isLeapYear(year) { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -} -function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; -} -function daysInMonth(year, month) { - var modMonth = floorMod(month - 1, 12) + 1, - modYear = year + (month - modMonth) / 12; - - if (modMonth === 2) { - return isLeapYear(modYear) ? 29 : 28; - } else { - return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; - } -} // covert a calendar object to a local timestamp (epoch, but with the offset baked in) - -function objToLocalTS(obj) { - var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that - - if (obj.year < 100 && obj.year >= 0) { - d = new Date(d); - d.setUTCFullYear(d.getUTCFullYear() - 1900); - } - - return +d; -} -function weeksInWeekYear(weekYear) { - var p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, - last = weekYear - 1, - p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7; - return p1 === 4 || p2 === 3 ? 53 : 52; -} -function untruncateYear(year) { - if (year > 99) { - return year; - } else return year > 60 ? 1900 + year : 2000 + year; -} // PARSING - -function parseZoneInfo(ts, offsetFormat, locale, timeZone) { - if (timeZone === void 0) { - timeZone = null; - } - - var date = new Date(ts), - intlOpts = { - hour12: false, - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit" - }; - - if (timeZone) { - intlOpts.timeZone = timeZone; - } - - var modified = Object.assign({ - timeZoneName: offsetFormat - }, intlOpts), - intl = hasIntl(); - - if (intl && hasFormatToParts()) { - var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { - return m.type.toLowerCase() === "timezonename"; - }); - return parsed ? parsed.value : null; - } else if (intl) { - // this probably doesn't work for all locales - var without = new Intl.DateTimeFormat(locale, intlOpts).format(date), - included = new Intl.DateTimeFormat(locale, modified).format(date), - diffed = included.substring(without.length), - trimmed = diffed.replace(/^[, \u200e]+/, ""); - return trimmed; - } else { - return null; - } -} // signedOffset('-5', '30') -> -330 - -function signedOffset(offHourStr, offMinuteStr) { - var offHour = parseInt(offHourStr, 10); // don't || this because we want to preserve -0 - - if (Number.isNaN(offHour)) { - offHour = 0; - } - - var offMin = parseInt(offMinuteStr, 10) || 0, - offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; - return offHour * 60 + offMinSigned; -} // COERCION - -function asNumber(value) { - var numericValue = Number(value); - if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); - return numericValue; -} -function normalizeObject(obj, normalizer, nonUnitKeys) { - var normalized = {}; - - for (var u in obj) { - if (hasOwnProperty(obj, u)) { - if (nonUnitKeys.indexOf(u) >= 0) continue; - var v = obj[u]; - if (v === undefined || v === null) continue; - normalized[normalizer(u)] = asNumber(v); + function isNumber2(o) { + return typeof o === "number"; } - } - - return normalized; -} -function formatOffset(offset, format) { - var hours = Math.trunc(Math.abs(offset / 60)), - minutes = Math.trunc(Math.abs(offset % 60)), - sign = offset >= 0 ? "+" : "-"; - - switch (format) { - case "short": - return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); - - case "narrow": - return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); - - case "techie": - return "" + sign + padStart(hours, 2) + padStart(minutes, 2); - - default: - throw new RangeError("Value format " + format + " is out of range for property format"); - } -} -function timeObject(obj) { - return pick(obj, ["hour", "minute", "second", "millisecond"]); -} -var ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/; - -function stringify(obj) { - return JSON.stringify(obj, Object.keys(obj).sort()); -} -/** - * @private - */ - - -var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; -var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; -function months(length) { - switch (length) { - case "narrow": - return [].concat(monthsNarrow); - - case "short": - return [].concat(monthsShort); - - case "long": - return [].concat(monthsLong); - - case "numeric": - return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; - - case "2-digit": - return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; - - default: - return null; - } -} -var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; -var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; -var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; -function weekdays(length) { - switch (length) { - case "narrow": - return [].concat(weekdaysNarrow); - - case "short": - return [].concat(weekdaysShort); - - case "long": - return [].concat(weekdaysLong); - - case "numeric": - return ["1", "2", "3", "4", "5", "6", "7"]; - - default: - return null; - } -} -var meridiems = ["AM", "PM"]; -var erasLong = ["Before Christ", "Anno Domini"]; -var erasShort = ["BC", "AD"]; -var erasNarrow = ["B", "A"]; -function eras(length) { - switch (length) { - case "narrow": - return [].concat(erasNarrow); - - case "short": - return [].concat(erasShort); - - case "long": - return [].concat(erasLong); - - default: - return null; - } -} -function meridiemForDateTime(dt) { - return meridiems[dt.hour < 12 ? 0 : 1]; -} -function weekdayForDateTime(dt, length) { - return weekdays(length)[dt.weekday - 1]; -} -function monthForDateTime(dt, length) { - return months(length)[dt.month - 1]; -} -function eraForDateTime(dt, length) { - return eras(length)[dt.year < 0 ? 0 : 1]; -} -function formatRelativeTime(unit, count, numeric, narrow) { - if (numeric === void 0) { - numeric = "always"; - } - - if (narrow === void 0) { - narrow = false; - } - - var units = { - years: ["year", "yr."], - quarters: ["quarter", "qtr."], - months: ["month", "mo."], - weeks: ["week", "wk."], - days: ["day", "day", "days"], - hours: ["hour", "hr."], - minutes: ["minute", "min."], - seconds: ["second", "sec."] - }; - var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; - - if (numeric === "auto" && lastable) { - var isDay = unit === "days"; - - switch (count) { - case 1: - return isDay ? "tomorrow" : "next " + units[unit][0]; - - case -1: - return isDay ? "yesterday" : "last " + units[unit][0]; - - case 0: - return isDay ? "today" : "this " + units[unit][0]; - + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; } - } - - var isInPast = Object.is(count, -0) || count < 0, - fmtValue = Math.abs(count), - singular = fmtValue === 1, - lilUnits = units[unit], - fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; - return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; -} -function formatString(knownFormat) { - // these all have the offsets removed because we don't have access to them - // without all the intl stuff this is backfilling - var filtered = pick(knownFormat, ["weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hour12"]), - key = stringify(filtered), - dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; - - switch (key) { - case stringify(DATE_SHORT): - return "M/d/yyyy"; - - case stringify(DATE_MED): - return "LLL d, yyyy"; - - case stringify(DATE_MED_WITH_WEEKDAY): - return "EEE, LLL d, yyyy"; - - case stringify(DATE_FULL): - return "LLLL d, yyyy"; - - case stringify(DATE_HUGE): - return "EEEE, LLLL d, yyyy"; - - case stringify(TIME_SIMPLE): - return "h:mm a"; - - case stringify(TIME_WITH_SECONDS): - return "h:mm:ss a"; - - case stringify(TIME_WITH_SHORT_OFFSET): - return "h:mm a"; - - case stringify(TIME_WITH_LONG_OFFSET): - return "h:mm a"; - - case stringify(TIME_24_SIMPLE): - return "HH:mm"; - - case stringify(TIME_24_WITH_SECONDS): - return "HH:mm:ss"; - - case stringify(TIME_24_WITH_SHORT_OFFSET): - return "HH:mm"; - - case stringify(TIME_24_WITH_LONG_OFFSET): - return "HH:mm"; - - case stringify(DATETIME_SHORT): - return "M/d/yyyy, h:mm a"; - - case stringify(DATETIME_MED): - return "LLL d, yyyy, h:mm a"; - - case stringify(DATETIME_FULL): - return "LLLL d, yyyy, h:mm a"; - - case stringify(DATETIME_HUGE): - return dateTimeHuge; - - case stringify(DATETIME_SHORT_WITH_SECONDS): - return "M/d/yyyy, h:mm:ss a"; - - case stringify(DATETIME_MED_WITH_SECONDS): - return "LLL d, yyyy, h:mm:ss a"; - - case stringify(DATETIME_MED_WITH_WEEKDAY): - return "EEE, d LLL yyyy, h:mm a"; - - case stringify(DATETIME_FULL_WITH_SECONDS): - return "LLLL d, yyyy, h:mm:ss a"; - - case stringify(DATETIME_HUGE_WITH_SECONDS): - return "EEEE, LLLL d, yyyy, h:mm:ss a"; - - default: - return dateTimeHuge; - } -} - -function stringifyTokens(splits, tokenToString) { - var s = ""; - - for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { - var token = _step.value; - - if (token.literal) { - s += token.val; - } else { - s += tokenToString(token.val); + function isString(o) { + return typeof o === "string"; } - } - - return s; -} - -var _macroTokenToFormatOpts = { - D: DATE_SHORT, - DD: DATE_MED, - DDD: DATE_FULL, - DDDD: DATE_HUGE, - t: TIME_SIMPLE, - tt: TIME_WITH_SECONDS, - ttt: TIME_WITH_SHORT_OFFSET, - tttt: TIME_WITH_LONG_OFFSET, - T: TIME_24_SIMPLE, - TT: TIME_24_WITH_SECONDS, - TTT: TIME_24_WITH_SHORT_OFFSET, - TTTT: TIME_24_WITH_LONG_OFFSET, - f: DATETIME_SHORT, - ff: DATETIME_MED, - fff: DATETIME_FULL, - ffff: DATETIME_HUGE, - F: DATETIME_SHORT_WITH_SECONDS, - FF: DATETIME_MED_WITH_SECONDS, - FFF: DATETIME_FULL_WITH_SECONDS, - FFFF: DATETIME_HUGE_WITH_SECONDS -}; -/** - * @private - */ - -var Formatter = /*#__PURE__*/function () { - Formatter.create = function create(locale, opts) { - if (opts === void 0) { - opts = {}; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; } - - return new Formatter(locale, opts); - }; - - Formatter.parseFormat = function parseFormat(fmt) { - var current = null, - currentFull = "", - bracketed = false; - var splits = []; - - for (var i = 0; i < fmt.length; i++) { - var c = fmt.charAt(i); - - if (c === "'") { + function hasIntl() { + try { + return typeof Intl !== "undefined" && Intl.DateTimeFormat; + } catch (e) { + return false; + } + } + function hasFormatToParts() { + return !isUndefined(Intl.DateTimeFormat.prototype.formatToParts); + } + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return void 0; + } + return arr.reduce(function(best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function(a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + function floorMod(x, n2) { + return x - n2 * Math.floor(x / n2); + } + function padStart2(input, n2) { + if (n2 === void 0) { + n2 = 2; + } + var minus = input < 0 ? "-" : ""; + var target = minus ? input * -1 : input; + var result; + if (target.toString().length < n2) { + result = ("0".repeat(n2) + target).slice(-n2); + } else { + result = target.toString(); + } + return "" + minus + result; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return void 0; + } else { + return parseInt(string, 10); + } + } + function parseMillis(fraction) { + if (isUndefined(fraction) || fraction === null || fraction === "") { + return void 0; + } else { + var f = parseFloat("0." + fraction) * 1e3; + return Math.floor(f); + } + } + function roundTo(number, digits, towardZero) { + if (towardZero === void 0) { + towardZero = false; + } + var factor = Math.pow(10, digits), rounder = towardZero ? Math.trunc : Math.round; + return rounder(number * factor) / factor; + } + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + return +d; + } + function weeksInWeekYear(weekYear) { + var p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, last = weekYear - 1, p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7; + return p1 === 4 || p2 === 3 ? 53 : 52; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else + return year > 60 ? 1900 + year : 2e3 + year; + } + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), intlOpts = { + hour12: false, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = Object.assign({ + timeZoneName: offsetFormat + }, intlOpts), intl = hasIntl(); + if (intl && hasFormatToParts()) { + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function(m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } else if (intl) { + var without = new Intl.DateTimeFormat(locale, intlOpts).format(date), included = new Intl.DateTimeFormat(locale, modified).format(date), diffed = included.substring(without.length), trimmed = diffed.replace(/^[, \u200e]+/, ""); + return trimmed; + } else { + return null; + } + } + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) + throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer, nonUnitKeys) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + if (nonUnitKeys.indexOf(u) >= 0) + continue; + var v = obj[u]; + if (v === void 0 || v === null) + continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + function formatOffset(offset2, format) { + var hours = Math.trunc(Math.abs(offset2 / 60)), minutes = Math.trunc(Math.abs(offset2 % 60)), sign = offset2 >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart2(hours, 2) + ":" + padStart2(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart2(hours, 2) + padStart2(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + var ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/; + function stringify(obj) { + return JSON.stringify(obj, Object.keys(obj).sort()); + } + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + var isInPast = Object.is(count, -0) || count < 0, fmtValue = Math.abs(count), singular = fmtValue === 1, lilUnits = units[unit], fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + function formatString(knownFormat) { + var filtered = pick(knownFormat, ["weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hour12"]), key = stringify(filtered), dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; + switch (key) { + case stringify(DATE_SHORT): + return "M/d/yyyy"; + case stringify(DATE_MED): + return "LLL d, yyyy"; + case stringify(DATE_MED_WITH_WEEKDAY): + return "EEE, LLL d, yyyy"; + case stringify(DATE_FULL): + return "LLLL d, yyyy"; + case stringify(DATE_HUGE): + return "EEEE, LLLL d, yyyy"; + case stringify(TIME_SIMPLE): + return "h:mm a"; + case stringify(TIME_WITH_SECONDS): + return "h:mm:ss a"; + case stringify(TIME_WITH_SHORT_OFFSET): + return "h:mm a"; + case stringify(TIME_WITH_LONG_OFFSET): + return "h:mm a"; + case stringify(TIME_24_SIMPLE): + return "HH:mm"; + case stringify(TIME_24_WITH_SECONDS): + return "HH:mm:ss"; + case stringify(TIME_24_WITH_SHORT_OFFSET): + return "HH:mm"; + case stringify(TIME_24_WITH_LONG_OFFSET): + return "HH:mm"; + case stringify(DATETIME_SHORT): + return "M/d/yyyy, h:mm a"; + case stringify(DATETIME_MED): + return "LLL d, yyyy, h:mm a"; + case stringify(DATETIME_FULL): + return "LLLL d, yyyy, h:mm a"; + case stringify(DATETIME_HUGE): + return dateTimeHuge; + case stringify(DATETIME_SHORT_WITH_SECONDS): + return "M/d/yyyy, h:mm:ss a"; + case stringify(DATETIME_MED_WITH_SECONDS): + return "LLL d, yyyy, h:mm:ss a"; + case stringify(DATETIME_MED_WITH_WEEKDAY): + return "EEE, d LLL yyyy, h:mm a"; + case stringify(DATETIME_FULL_WITH_SECONDS): + return "LLLL d, yyyy, h:mm:ss a"; + case stringify(DATETIME_HUGE_WITH_SECONDS): + return "EEEE, LLLL d, yyyy, h:mm:ss a"; + default: + return dateTimeHuge; + } + } + function stringifyTokens(splits, tokenToString) { + var s2 = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done; ) { + var token = _step.value; + if (token.literal) { + s2 += token.val; + } else { + s2 += tokenToString(token.val); + } + } + return s2; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + var Formatter = /* @__PURE__ */ function() { + Formatter2.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter2(locale, opts); + }; + Formatter2.parseFormat = function parseFormat(fmt) { + var current = null, currentFull = "", bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + if (currentFull.length > 0) { + splits.push({ + literal: bracketed, + val: currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: false, + val: currentFull + }); + } + currentFull = c; + current = c; + } + } if (currentFull.length > 0) { splits.push({ literal: bracketed, val: currentFull }); } - - current = null; - currentFull = ""; - bracketed = !bracketed; - } else if (bracketed) { - currentFull += c; - } else if (c === current) { - currentFull += c; - } else { - if (currentFull.length > 0) { - splits.push({ - literal: false, - val: currentFull - }); + return splits; + }; + Formatter2.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter2(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter2.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); } - - currentFull = c; - current = c; - } - } - - if (currentFull.length > 0) { - splits.push({ - literal: bracketed, - val: currentFull - }); - } - - return splits; - }; - - Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { - return _macroTokenToFormatOpts[token]; - }; - - function Formatter(locale, formatOpts) { - this.opts = formatOpts; - this.loc = locale; - this.systemLoc = null; - } - - var _proto = Formatter.prototype; - - _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { - if (this.systemLoc === null) { - this.systemLoc = this.loc.redefaultToSystem(); - } - - var df = this.systemLoc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.format(); - }; - - _proto.formatDateTime = function formatDateTime(dt, opts) { - if (opts === void 0) { - opts = {}; - } - - var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.format(); - }; - - _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { - if (opts === void 0) { - opts = {}; - } - - var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.formatToParts(); - }; - - _proto.resolvedOptions = function resolvedOptions(dt, opts) { - if (opts === void 0) { - opts = {}; - } - - var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.resolvedOptions(); - }; - - _proto.num = function num(n, p) { - if (p === void 0) { - p = 0; - } - - // we get some perf out of doing this here, annoyingly - if (this.opts.forceSimple) { - return padStart(n, p); - } - - var opts = Object.assign({}, this.opts); - - if (p > 0) { - opts.padTo = p; - } - - return this.loc.numberFormatter(opts).format(n); - }; - - _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { - var _this = this; - - var knownEnglish = this.loc.listingMode() === "en", - useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory" && hasFormatToParts(), - string = function string(opts, extract) { - return _this.loc.extract(dt, opts, extract); - }, - formatOffset = function formatOffset(opts) { - if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { - return "Z"; - } - - return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; - }, - meridiem = function meridiem() { - return knownEnglish ? meridiemForDateTime(dt) : string({ - hour: "numeric", - hour12: true - }, "dayperiod"); - }, - month = function month(length, standalone) { - return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { - month: length - } : { - month: length, - day: "numeric" - }, "month"); - }, - weekday = function weekday(length, standalone) { - return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { - weekday: length - } : { - weekday: length, - month: "long", - day: "numeric" - }, "weekday"); - }, - maybeMacro = function maybeMacro(token) { - var formatOpts = Formatter.macroTokenToFormatOpts(token); - - if (formatOpts) { - return _this.formatWithSystemDefault(dt, formatOpts); - } else { - return token; - } - }, - era = function era(length) { - return knownEnglish ? eraForDateTime(dt, length) : string({ - era: length - }, "era"); - }, - tokenToString = function tokenToString(token) { - // Where possible: http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles - switch (token) { - // ms - case "S": - return _this.num(dt.millisecond); - - case "u": // falls through - - case "SSS": - return _this.num(dt.millisecond, 3); - // seconds - - case "s": - return _this.num(dt.second); - - case "ss": - return _this.num(dt.second, 2); - // minutes - - case "m": - return _this.num(dt.minute); - - case "mm": - return _this.num(dt.minute, 2); - // hours - - case "h": - return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); - - case "hh": - return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); - - case "H": - return _this.num(dt.hour); - - case "HH": - return _this.num(dt.hour, 2); - // offset - - case "Z": - // like +6 - return formatOffset({ - format: "narrow", - allowZ: _this.opts.allowZ - }); - - case "ZZ": - // like +06:00 - return formatOffset({ - format: "short", - allowZ: _this.opts.allowZ - }); - - case "ZZZ": - // like +0600 - return formatOffset({ - format: "techie", - allowZ: _this.opts.allowZ - }); - - case "ZZZZ": - // like EST - return dt.zone.offsetName(dt.ts, { - format: "short", - locale: _this.loc.locale - }); - - case "ZZZZZ": - // like Eastern Standard Time - return dt.zone.offsetName(dt.ts, { - format: "long", - locale: _this.loc.locale - }); - // zone - - case "z": - // like America/New_York - return dt.zoneName; - // meridiems - - case "a": - return meridiem(); - // dates - - case "d": - return useDateTimeFormatter ? string({ + var df = this.systemLoc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.format(); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.formatToParts(); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); + return df.resolvedOptions(); + }; + _proto.num = function num(n2, p) { + if (p === void 0) { + p = 0; + } + if (this.opts.forceSimple) { + return padStart2(n2, p); + } + var opts = Object.assign({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + return this.loc.numberFormatter(opts).format(n2); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory" && hasFormatToParts(), string = function string2(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, formatOffset2 = function formatOffset3(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, meridiem = function meridiem2() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hour12: true + }, "dayperiod"); + }, month = function month2(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, day: "numeric" - }, "day") : _this.num(dt.day); - - case "dd": - return useDateTimeFormatter ? string({ - day: "2-digit" - }, "day") : _this.num(dt.day, 2); - // weekdays - standalone - - case "c": - // like 1 - return _this.num(dt.weekday); - - case "ccc": - // like 'Tues' - return weekday("short", true); - - case "cccc": - // like 'Tuesday' - return weekday("long", true); - - case "ccccc": - // like 'T' - return weekday("narrow", true); - // weekdays - format - - case "E": - // like 1 - return _this.num(dt.weekday); - - case "EEE": - // like 'Tues' - return weekday("short", false); - - case "EEEE": - // like 'Tuesday' - return weekday("long", false); - - case "EEEEE": - // like 'T' - return weekday("narrow", false); - // months - standalone - - case "L": - // like 1 - return useDateTimeFormatter ? string({ - month: "numeric", + }, "month"); + }, weekday = function weekday2(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", day: "numeric" - }, "month") : _this.num(dt.month); - - case "LL": - // like 01, doesn't seem to work - return useDateTimeFormatter ? string({ - month: "2-digit", - day: "numeric" - }, "month") : _this.num(dt.month, 2); - - case "LLL": - // like Jan - return month("short", true); - - case "LLLL": - // like January - return month("long", true); - - case "LLLLL": - // like J - return month("narrow", true); - // months - format - - case "M": - // like 1 - return useDateTimeFormatter ? string({ - month: "numeric" - }, "month") : _this.num(dt.month); - - case "MM": - // like 01 - return useDateTimeFormatter ? string({ - month: "2-digit" - }, "month") : _this.num(dt.month, 2); - - case "MMM": - // like Jan - return month("short", false); - - case "MMMM": - // like January - return month("long", false); - - case "MMMMM": - // like J - return month("narrow", false); - // years - - case "y": - // like 2014 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : _this.num(dt.year); - - case "yy": - // like 14 - return useDateTimeFormatter ? string({ - year: "2-digit" - }, "year") : _this.num(dt.year.toString().slice(-2), 2); - - case "yyyy": - // like 0012 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : _this.num(dt.year, 4); - - case "yyyyyy": - // like 000012 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : _this.num(dt.year, 6); - // eras - - case "G": - // like AD - return era("short"); - - case "GG": - // like Anno Domini - return era("long"); - - case "GGGGG": - return era("narrow"); - - case "kk": - return _this.num(dt.weekYear.toString().slice(-2), 2); - - case "kkkk": - return _this.num(dt.weekYear, 4); - - case "W": - return _this.num(dt.weekNumber); - - case "WW": - return _this.num(dt.weekNumber, 2); - - case "o": - return _this.num(dt.ordinal); - - case "ooo": - return _this.num(dt.ordinal, 3); - - case "q": - // like 1 - return _this.num(dt.quarter); - - case "qq": - // like 01 - return _this.num(dt.quarter, 2); - - case "X": - return _this.num(Math.floor(dt.ts / 1000)); - - case "x": - return _this.num(dt.ts); - - default: - return maybeMacro(token); + }, "weekday"); + }, maybeMacro = function maybeMacro2(token) { + var formatOpts = Formatter2.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, era = function era2(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, tokenToString = function tokenToString2(token) { + switch (token) { + case "S": + return _this.num(dt.millisecond); + case "u": + case "SSS": + return _this.num(dt.millisecond, 3); + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + case "Z": + return formatOffset2({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + return formatOffset2({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + return formatOffset2({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + case "z": + return dt.zoneName; + case "a": + return meridiem(); + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + case "c": + return _this.num(dt.weekday); + case "ccc": + return weekday("short", true); + case "cccc": + return weekday("long", true); + case "ccccc": + return weekday("narrow", true); + case "E": + return _this.num(dt.weekday); + case "EEE": + return weekday("short", false); + case "EEEE": + return weekday("long", false); + case "EEEEE": + return weekday("narrow", false); + case "L": + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + return month("short", true); + case "LLLL": + return month("long", true); + case "LLLLL": + return month("narrow", true); + case "M": + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + return month("short", false); + case "MMMM": + return month("long", false); + case "MMMMM": + return month("narrow", false); + case "y": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + case "G": + return era("short"); + case "GG": + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + return _this.num(dt.quarter); + case "qq": + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1e3)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter2.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var tokenToField = function tokenToField2(token) { + switch (token[0]) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + return "hour"; + case "d": + return "day"; + case "M": + return "month"; + case "y": + return "year"; + default: + return null; + } + }, tokenToString = function tokenToString2(lildur) { + return function(token) { + var mapped = tokenToField(token); + if (mapped) { + return _this2.num(lildur.get(mapped), token.length); + } else { + return token; + } + }; + }, tokens = Formatter2.parseFormat(fmt), realTokens = tokens.reduce(function(found, _ref) { + var literal = _ref.literal, val = _ref.val; + return literal ? found : found.concat(val); + }, []), collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function(t) { + return t; + })); + return stringifyTokens(tokens, tokenToString(collapsed)); + }; + return Formatter2; + }(); + var Invalid = /* @__PURE__ */ function() { + function Invalid2(reason, explanation) { + this.reason = reason; + this.explanation = explanation; } - }; - - return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); - }; - - _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { - var _this2 = this; - - var tokenToField = function tokenToField(token) { - switch (token[0]) { - case "S": - return "millisecond"; - - case "s": - return "second"; - - case "m": - return "minute"; - - case "h": - return "hour"; - - case "d": - return "day"; - - case "M": - return "month"; - - case "y": - return "year"; - - default: - return null; - } - }, - tokenToString = function tokenToString(lildur) { - return function (token) { - var mapped = tokenToField(token); - - if (mapped) { - return _this2.num(lildur.get(mapped), token.length); + var _proto = Invalid2.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; } else { - return token; + return this.reason; } }; - }, - tokens = Formatter.parseFormat(fmt), - realTokens = tokens.reduce(function (found, _ref) { - var literal = _ref.literal, - val = _ref.val; - return literal ? found : found.concat(val); - }, []), - collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { - return t; - })); - - return stringifyTokens(tokens, tokenToString(collapsed)); - }; - - return Formatter; -}(); - -var Invalid = /*#__PURE__*/function () { - function Invalid(reason, explanation) { - this.reason = reason; - this.explanation = explanation; - } - - var _proto = Invalid.prototype; - - _proto.toMessage = function toMessage() { - if (this.explanation) { - return this.reason + ": " + this.explanation; - } else { - return this.reason; - } - }; - - return Invalid; -}(); - -/** - * @interface - */ - -var Zone = /*#__PURE__*/function () { - function Zone() {} - - var _proto = Zone.prototype; - - /** - * Returns the offset's common name (such as EST) at the specified timestamp - * @abstract - * @param {number} ts - Epoch milliseconds for which to get the name - * @param {Object} opts - Options to affect the format - * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. - * @param {string} opts.locale - What locale to return the offset name in. - * @return {string} - */ - _proto.offsetName = function offsetName(ts, opts) { - throw new ZoneIsAbstractError(); - } - /** - * Returns the offset's value as a string - * @abstract - * @param {number} ts - Epoch milliseconds for which to get the offset - * @param {string} format - What style of offset to return. - * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively - * @return {string} - */ - ; - - _proto.formatOffset = function formatOffset(ts, format) { - throw new ZoneIsAbstractError(); - } - /** - * Return the offset in minutes for this zone at the specified timestamp. - * @abstract - * @param {number} ts - Epoch milliseconds for which to compute the offset - * @return {number} - */ - ; - - _proto.offset = function offset(ts) { - throw new ZoneIsAbstractError(); - } - /** - * Return whether this Zone is equal to another zone - * @abstract - * @param {Zone} otherZone - the zone to compare - * @return {boolean} - */ - ; - - _proto.equals = function equals(otherZone) { - throw new ZoneIsAbstractError(); - } - /** - * Return whether this Zone is valid. - * @abstract - * @type {boolean} - */ - ; - - _createClass(Zone, [{ - key: "type", - - /** - * The type of zone - * @abstract - * @type {string} - */ - get: function get() { - throw new ZoneIsAbstractError(); - } - /** - * The name of this zone. - * @abstract - * @type {string} - */ - - }, { - key: "name", - get: function get() { - throw new ZoneIsAbstractError(); - } - /** - * Returns whether the offset is known to be fixed for the whole year. - * @abstract - * @type {boolean} - */ - - }, { - key: "universal", - get: function get() { - throw new ZoneIsAbstractError(); - } - }, { - key: "isValid", - get: function get() { - throw new ZoneIsAbstractError(); - } - }]); - - return Zone; -}(); - -var singleton = null; -/** - * Represents the local zone for this JavaScript environment. - * @implements {Zone} - */ - -var LocalZone = /*#__PURE__*/function (_Zone) { - _inheritsLoose(LocalZone, _Zone); - - function LocalZone() { - return _Zone.apply(this, arguments) || this; - } - - var _proto = LocalZone.prototype; - - /** @override **/ - _proto.offsetName = function offsetName(ts, _ref) { - var format = _ref.format, - locale = _ref.locale; - return parseZoneInfo(ts, format, locale); - } - /** @override **/ - ; - - _proto.formatOffset = function formatOffset$1(ts, format) { - return formatOffset(this.offset(ts), format); - } - /** @override **/ - ; - - _proto.offset = function offset(ts) { - return -new Date(ts).getTimezoneOffset(); - } - /** @override **/ - ; - - _proto.equals = function equals(otherZone) { - return otherZone.type === "local"; - } - /** @override **/ - ; - - _createClass(LocalZone, [{ - key: "type", - - /** @override **/ - get: function get() { - return "local"; - } - /** @override **/ - - }, { - key: "name", - get: function get() { - if (hasIntl()) { - return new Intl.DateTimeFormat().resolvedOptions().timeZone; - } else return "local"; - } - /** @override **/ - - }, { - key: "universal", - get: function get() { - return false; - } - }, { - key: "isValid", - get: function get() { - return true; - } - }], [{ - key: "instance", - - /** - * Get a singleton instance of the local zone - * @return {LocalZone} - */ - get: function get() { - if (singleton === null) { - singleton = new LocalZone(); + return Invalid2; + }(); + var Zone = /* @__PURE__ */ function() { + function Zone2() { } - - return singleton; - } - }]); - - return LocalZone; -}(Zone); - -var matchingRegex = RegExp("^" + ianaRegex.source + "$"); -var dtfCache = {}; - -function makeDTF(zone) { - if (!dtfCache[zone]) { - dtfCache[zone] = new Intl.DateTimeFormat("en-US", { - hour12: false, - timeZone: zone, - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit" - }); - } - - return dtfCache[zone]; -} - -var typeToPos = { - year: 0, - month: 1, - day: 2, - hour: 3, - minute: 4, - second: 5 -}; - -function hackyOffset(dtf, date) { - var formatted = dtf.format(date).replace(/\u200E/g, ""), - parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), - fMonth = parsed[1], - fDay = parsed[2], - fYear = parsed[3], - fHour = parsed[4], - fMinute = parsed[5], - fSecond = parsed[6]; - return [fYear, fMonth, fDay, fHour, fMinute, fSecond]; -} - -function partsOffset(dtf, date) { - var formatted = dtf.formatToParts(date), - filled = []; - - for (var i = 0; i < formatted.length; i++) { - var _formatted$i = formatted[i], - type = _formatted$i.type, - value = _formatted$i.value, - pos = typeToPos[type]; - - if (!isUndefined(pos)) { - filled[pos] = parseInt(value, 10); - } - } - - return filled; -} - -var ianaZoneCache = {}; -/** - * A zone identified by an IANA identifier, like America/New_York - * @implements {Zone} - */ - -var IANAZone = /*#__PURE__*/function (_Zone) { - _inheritsLoose(IANAZone, _Zone); - - /** - * @param {string} name - Zone name - * @return {IANAZone} - */ - IANAZone.create = function create(name) { - if (!ianaZoneCache[name]) { - ianaZoneCache[name] = new IANAZone(name); - } - - return ianaZoneCache[name]; - } - /** - * Reset local caches. Should only be necessary in testing scenarios. - * @return {void} - */ - ; - - IANAZone.resetCache = function resetCache() { - ianaZoneCache = {}; - dtfCache = {}; - } - /** - * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. - * @param {string} s - The string to check validity on - * @example IANAZone.isValidSpecifier("America/New_York") //=> true - * @example IANAZone.isValidSpecifier("Fantasia/Castle") //=> true - * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false - * @return {boolean} - */ - ; - - IANAZone.isValidSpecifier = function isValidSpecifier(s) { - return !!(s && s.match(matchingRegex)); - } - /** - * Returns whether the provided string identifies a real zone - * @param {string} zone - The string to check - * @example IANAZone.isValidZone("America/New_York") //=> true - * @example IANAZone.isValidZone("Fantasia/Castle") //=> false - * @example IANAZone.isValidZone("Sport~~blorp") //=> false - * @return {boolean} - */ - ; - - IANAZone.isValidZone = function isValidZone(zone) { - try { - new Intl.DateTimeFormat("en-US", { - timeZone: zone - }).format(); - return true; - } catch (e) { - return false; - } - } // Etc/GMT+8 -> -480 - - /** @ignore */ - ; - - IANAZone.parseGMTOffset = function parseGMTOffset(specifier) { - if (specifier) { - var match = specifier.match(/^Etc\/GMT(0|[+-]\d{1,2})$/i); - - if (match) { - return -60 * parseInt(match[1]); - } - } - - return null; - }; - - function IANAZone(name) { - var _this; - - _this = _Zone.call(this) || this; - /** @private **/ - - _this.zoneName = name; - /** @private **/ - - _this.valid = IANAZone.isValidZone(name); - return _this; - } - /** @override **/ - - - var _proto = IANAZone.prototype; - - /** @override **/ - _proto.offsetName = function offsetName(ts, _ref) { - var format = _ref.format, - locale = _ref.locale; - return parseZoneInfo(ts, format, locale, this.name); - } - /** @override **/ - ; - - _proto.formatOffset = function formatOffset$1(ts, format) { - return formatOffset(this.offset(ts), format); - } - /** @override **/ - ; - - _proto.offset = function offset(ts) { - var date = new Date(ts); - if (isNaN(date)) return NaN; - - var dtf = makeDTF(this.name), - _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), - year = _ref2[0], - month = _ref2[1], - day = _ref2[2], - hour = _ref2[3], - minute = _ref2[4], - second = _ref2[5], - adjustedHour = hour === 24 ? 0 : hour; - - var asUTC = objToLocalTS({ - year: year, - month: month, - day: day, - hour: adjustedHour, - minute: minute, - second: second, - millisecond: 0 - }); - var asTS = +date; - var over = asTS % 1000; - asTS -= over >= 0 ? over : 1000 + over; - return (asUTC - asTS) / (60 * 1000); - } - /** @override **/ - ; - - _proto.equals = function equals(otherZone) { - return otherZone.type === "iana" && otherZone.name === this.name; - } - /** @override **/ - ; - - _createClass(IANAZone, [{ - key: "type", - get: function get() { - return "iana"; - } - /** @override **/ - - }, { - key: "name", - get: function get() { - return this.zoneName; - } - /** @override **/ - - }, { - key: "universal", - get: function get() { - return false; - } - }, { - key: "isValid", - get: function get() { - return this.valid; - } - }]); - - return IANAZone; -}(Zone); - -var singleton$1 = null; -/** - * A zone with a fixed offset (meaning no DST) - * @implements {Zone} - */ - -var FixedOffsetZone = /*#__PURE__*/function (_Zone) { - _inheritsLoose(FixedOffsetZone, _Zone); - - /** - * Get an instance with a specified offset - * @param {number} offset - The offset in minutes - * @return {FixedOffsetZone} - */ - FixedOffsetZone.instance = function instance(offset) { - return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); - } - /** - * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" - * @param {string} s - The offset string to parse - * @example FixedOffsetZone.parseSpecifier("UTC+6") - * @example FixedOffsetZone.parseSpecifier("UTC+06") - * @example FixedOffsetZone.parseSpecifier("UTC-6:00") - * @return {FixedOffsetZone} - */ - ; - - FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { - if (s) { - var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); - - if (r) { - return new FixedOffsetZone(signedOffset(r[1], r[2])); - } - } - - return null; - }; - - _createClass(FixedOffsetZone, null, [{ - key: "utcInstance", - - /** - * Get a singleton instance of UTC - * @return {FixedOffsetZone} - */ - get: function get() { - if (singleton$1 === null) { - singleton$1 = new FixedOffsetZone(0); - } - - return singleton$1; - } - }]); - - function FixedOffsetZone(offset) { - var _this; - - _this = _Zone.call(this) || this; - /** @private **/ - - _this.fixed = offset; - return _this; - } - /** @override **/ - - - var _proto = FixedOffsetZone.prototype; - - /** @override **/ - _proto.offsetName = function offsetName() { - return this.name; - } - /** @override **/ - ; - - _proto.formatOffset = function formatOffset$1(ts, format) { - return formatOffset(this.fixed, format); - } - /** @override **/ - ; - - /** @override **/ - _proto.offset = function offset() { - return this.fixed; - } - /** @override **/ - ; - - _proto.equals = function equals(otherZone) { - return otherZone.type === "fixed" && otherZone.fixed === this.fixed; - } - /** @override **/ - ; - - _createClass(FixedOffsetZone, [{ - key: "type", - get: function get() { - return "fixed"; - } - /** @override **/ - - }, { - key: "name", - get: function get() { - return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); - } - }, { - key: "universal", - get: function get() { - return true; - } - }, { - key: "isValid", - get: function get() { - return true; - } - }]); - - return FixedOffsetZone; -}(Zone); - -/** - * A zone that failed to parse. You should never need to instantiate this. - * @implements {Zone} - */ - -var InvalidZone = /*#__PURE__*/function (_Zone) { - _inheritsLoose(InvalidZone, _Zone); - - function InvalidZone(zoneName) { - var _this; - - _this = _Zone.call(this) || this; - /** @private */ - - _this.zoneName = zoneName; - return _this; - } - /** @override **/ - - - var _proto = InvalidZone.prototype; - - /** @override **/ - _proto.offsetName = function offsetName() { - return null; - } - /** @override **/ - ; - - _proto.formatOffset = function formatOffset() { - return ""; - } - /** @override **/ - ; - - _proto.offset = function offset() { - return NaN; - } - /** @override **/ - ; - - _proto.equals = function equals() { - return false; - } - /** @override **/ - ; - - _createClass(InvalidZone, [{ - key: "type", - get: function get() { - return "invalid"; - } - /** @override **/ - - }, { - key: "name", - get: function get() { - return this.zoneName; - } - /** @override **/ - - }, { - key: "universal", - get: function get() { - return false; - } - }, { - key: "isValid", - get: function get() { - return false; - } - }]); - - return InvalidZone; -}(Zone); - -/** - * @private - */ -function normalizeZone(input, defaultZone) { - var offset; - - if (isUndefined(input) || input === null) { - return defaultZone; - } else if (input instanceof Zone) { - return input; - } else if (isString(input)) { - var lowered = input.toLowerCase(); - if (lowered === "local") return defaultZone;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else if ((offset = IANAZone.parseGMTOffset(input)) != null) { - // handle Etc/GMT-4, which V8 chokes on - return FixedOffsetZone.instance(offset); - } else if (IANAZone.isValidSpecifier(lowered)) return IANAZone.create(input);else return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input); - } else if (isNumber(input)) { - return FixedOffsetZone.instance(input); - } else if (typeof input === "object" && input.offset && typeof input.offset === "number") { - // This is dumb, but the instanceof check above doesn't seem to really work - // so we're duck checking it - return input; - } else { - return new InvalidZone(input); - } -} - -var now = function now() { - return Date.now(); -}, - defaultZone = null, - // not setting this directly to LocalZone.instance bc loading order issues -defaultLocale = null, - defaultNumberingSystem = null, - defaultOutputCalendar = null, - throwOnInvalid = false; -/** - * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. - */ - - -var Settings = /*#__PURE__*/function () { - function Settings() {} - - /** - * Reset Luxon's global caches. Should only be necessary in testing scenarios. - * @return {void} - */ - Settings.resetCaches = function resetCaches() { - Locale.resetCache(); - IANAZone.resetCache(); - }; - - _createClass(Settings, null, [{ - key: "now", - - /** - * Get the callback for returning the current timestamp. - * @type {function} - */ - get: function get() { - return now; - } - /** - * Set the callback for returning the current timestamp. - * The function should return a number, which will be interpreted as an Epoch millisecond count - * @type {function} - * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future - * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time - */ - , - set: function set(n) { - now = n; - } - /** - * Get the default time zone to create DateTimes in. - * @type {string} - */ - - }, { - key: "defaultZoneName", - get: function get() { - return Settings.defaultZone.name; - } - /** - * Set the default time zone to create DateTimes in. Does not affect existing instances. - * @type {string} - */ - , - set: function set(z) { - if (!z) { - defaultZone = null; - } else { - defaultZone = normalizeZone(z); - } - } - /** - * Get the default time zone object to create DateTimes in. Does not affect existing instances. - * @type {Zone} - */ - - }, { - key: "defaultZone", - get: function get() { - return defaultZone || LocalZone.instance; - } - /** - * Get the default locale to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - }, { - key: "defaultLocale", - get: function get() { - return defaultLocale; - } - /** - * Set the default locale to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - , - set: function set(locale) { - defaultLocale = locale; - } - /** - * Get the default numbering system to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - }, { - key: "defaultNumberingSystem", - get: function get() { - return defaultNumberingSystem; - } - /** - * Set the default numbering system to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - , - set: function set(numberingSystem) { - defaultNumberingSystem = numberingSystem; - } - /** - * Get the default output calendar to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - }, { - key: "defaultOutputCalendar", - get: function get() { - return defaultOutputCalendar; - } - /** - * Set the default output calendar to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - , - set: function set(outputCalendar) { - defaultOutputCalendar = outputCalendar; - } - /** - * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals - * @type {boolean} - */ - - }, { - key: "throwOnInvalid", - get: function get() { - return throwOnInvalid; - } - /** - * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals - * @type {boolean} - */ - , - set: function set(t) { - throwOnInvalid = t; - } - }]); - - return Settings; -}(); - -var intlDTCache = {}; - -function getCachedDTF(locString, opts) { - if (opts === void 0) { - opts = {}; - } - - var key = JSON.stringify([locString, opts]); - var dtf = intlDTCache[key]; - - if (!dtf) { - dtf = new Intl.DateTimeFormat(locString, opts); - intlDTCache[key] = dtf; - } - - return dtf; -} - -var intlNumCache = {}; - -function getCachedINF(locString, opts) { - if (opts === void 0) { - opts = {}; - } - - var key = JSON.stringify([locString, opts]); - var inf = intlNumCache[key]; - - if (!inf) { - inf = new Intl.NumberFormat(locString, opts); - intlNumCache[key] = inf; - } - - return inf; -} - -var intlRelCache = {}; - -function getCachedRTF(locString, opts) { - if (opts === void 0) { - opts = {}; - } - - var _opts = opts; - _opts.base; - var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, ["base"]); // exclude `base` from the options - - - var key = JSON.stringify([locString, cacheKeyOpts]); - var inf = intlRelCache[key]; - - if (!inf) { - inf = new Intl.RelativeTimeFormat(locString, opts); - intlRelCache[key] = inf; - } - - return inf; -} - -var sysLocaleCache = null; - -function systemLocale() { - if (sysLocaleCache) { - return sysLocaleCache; - } else if (hasIntl()) { - var computedSys = new Intl.DateTimeFormat().resolvedOptions().locale; // node sometimes defaults to "und". Override that because that is dumb - - sysLocaleCache = !computedSys || computedSys === "und" ? "en-US" : computedSys; - return sysLocaleCache; - } else { - sysLocaleCache = "en-US"; - return sysLocaleCache; - } -} - -function parseLocaleString(localeStr) { - // I really want to avoid writing a BCP 47 parser - // see, e.g. https://github.com/wooorm/bcp-47 - // Instead, we'll do this: - // a) if the string has no -u extensions, just leave it alone - // b) if it does, use Intl to resolve everything - // c) if Intl fails, try again without the -u - var uIndex = localeStr.indexOf("-u-"); - - if (uIndex === -1) { - return [localeStr]; - } else { - var options; - var smaller = localeStr.substring(0, uIndex); - - try { - options = getCachedDTF(localeStr).resolvedOptions(); - } catch (e) { - options = getCachedDTF(smaller).resolvedOptions(); - } - - var _options = options, - numberingSystem = _options.numberingSystem, - calendar = _options.calendar; // return the smaller one so that we can append the calendar and numbering overrides to it - - return [smaller, numberingSystem, calendar]; - } -} - -function intlConfigString(localeStr, numberingSystem, outputCalendar) { - if (hasIntl()) { - if (outputCalendar || numberingSystem) { - localeStr += "-u"; - - if (outputCalendar) { - localeStr += "-ca-" + outputCalendar; - } - - if (numberingSystem) { - localeStr += "-nu-" + numberingSystem; - } - - return localeStr; - } else { - return localeStr; - } - } else { - return []; - } -} - -function mapMonths(f) { - var ms = []; - - for (var i = 1; i <= 12; i++) { - var dt = DateTime.utc(2016, i, 1); - ms.push(f(dt)); - } - - return ms; -} - -function mapWeekdays(f) { - var ms = []; - - for (var i = 1; i <= 7; i++) { - var dt = DateTime.utc(2016, 11, 13 + i); - ms.push(f(dt)); - } - - return ms; -} - -function listStuff(loc, length, defaultOK, englishFn, intlFn) { - var mode = loc.listingMode(defaultOK); - - if (mode === "error") { - return null; - } else if (mode === "en") { - return englishFn(length); - } else { - return intlFn(length); - } -} - -function supportsFastNumbers(loc) { - if (loc.numberingSystem && loc.numberingSystem !== "latn") { - return false; - } else { - return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || hasIntl() && new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn"; - } -} -/** - * @private - */ - - -var PolyNumberFormatter = /*#__PURE__*/function () { - function PolyNumberFormatter(intl, forceSimple, opts) { - this.padTo = opts.padTo || 0; - this.floor = opts.floor || false; - - if (!forceSimple && hasIntl()) { - var intlOpts = { - useGrouping: false + var _proto = Zone2.prototype; + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); }; - if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; - this.inf = getCachedINF(intl, intlOpts); + _proto.formatOffset = function formatOffset2(ts, format) { + throw new ZoneIsAbstractError(); + }; + _proto.offset = function offset2(ts) { + throw new ZoneIsAbstractError(); + }; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + }; + _createClass(Zone2, [{ + key: "type", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "universal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone2; + }(); + var singleton = null; + var LocalZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(LocalZone2, _Zone); + function LocalZone2() { + return _Zone.apply(this, arguments) || this; + } + var _proto = LocalZone2.prototype; + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + }; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + }; + _proto.offset = function offset2(ts) { + return -new Date(ts).getTimezoneOffset(); + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "local"; + }; + _createClass(LocalZone2, [{ + key: "type", + get: function get() { + return "local"; + } + }, { + key: "name", + get: function get() { + if (hasIntl()) { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } else + return "local"; + } + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: function get() { + if (singleton === null) { + singleton = new LocalZone2(); + } + return singleton; + } + }]); + return LocalZone2; + }(Zone); + var matchingRegex = RegExp("^" + ianaRegex.source + "$"); + var dtfCache = {}; + function makeDTF(zone) { + if (!dtfCache[zone]) { + dtfCache[zone] = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zone, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit" + }); + } + return dtfCache[zone]; } - } - - var _proto = PolyNumberFormatter.prototype; - - _proto.format = function format(i) { - if (this.inf) { - var fixed = this.floor ? Math.floor(i) : i; - return this.inf.format(fixed); - } else { - // to match the browser's numberformatter defaults - var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); - - return padStart(_fixed, this.padTo); + var typeToPos = { + year: 0, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), fMonth = parsed[1], fDay = parsed[2], fYear = parsed[3], fHour = parsed[4], fMinute = parsed[5], fSecond = parsed[6]; + return [fYear, fMonth, fDay, fHour, fMinute, fSecond]; } - }; - - return PolyNumberFormatter; -}(); -/** - * @private - */ - - -var PolyDateFormatter = /*#__PURE__*/function () { - function PolyDateFormatter(dt, intl, opts) { - this.opts = opts; - this.hasIntl = hasIntl(); - var z; - - if (dt.zone.universal && this.hasIntl) { - // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. - // That is why fixed-offset TZ is set to that unless it is: - // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. - // 2. Unsupported by the browser: - // - some do not support Etc/ - // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata - var gmtOffset = -1 * (dt.offset / 60); - var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; - var isOffsetZoneSupported = IANAZone.isValidZone(offsetZ); - - if (dt.offset !== 0 && isOffsetZoneSupported) { - z = offsetZ; - this.dt = dt; + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date), filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], type = _formatted$i.type, value = _formatted$i.value, pos = typeToPos[type]; + if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = {}; + var IANAZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(IANAZone2, _Zone); + IANAZone2.create = function create(name) { + if (!ianaZoneCache[name]) { + ianaZoneCache[name] = new IANAZone2(name); + } + return ianaZoneCache[name]; + }; + IANAZone2.resetCache = function resetCache() { + ianaZoneCache = {}; + dtfCache = {}; + }; + IANAZone2.isValidSpecifier = function isValidSpecifier(s2) { + return !!(s2 && s2.match(matchingRegex)); + }; + IANAZone2.isValidZone = function isValidZone(zone) { + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + IANAZone2.parseGMTOffset = function parseGMTOffset(specifier) { + if (specifier) { + var match2 = specifier.match(/^Etc\/GMT(0|[+-]\d{1,2})$/i); + if (match2) { + return -60 * parseInt(match2[1]); + } + } + return null; + }; + function IANAZone2(name) { + var _this; + _this = _Zone.call(this) || this; + _this.zoneName = name; + _this.valid = IANAZone2.isValidZone(name); + return _this; + } + var _proto = IANAZone2.prototype; + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + }; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + }; + _proto.offset = function offset2(ts) { + var date = new Date(ts); + if (isNaN(date)) + return NaN; + var dtf = makeDTF(this.name), _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), year = _ref2[0], month = _ref2[1], day = _ref2[2], hour = _ref2[3], minute = _ref2[4], second = _ref2[5], adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1e3; + asTS -= over >= 0 ? over : 1e3 + over; + return (asUTC - asTS) / (60 * 1e3); + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + }; + _createClass(IANAZone2, [{ + key: "type", + get: function get() { + return "iana"; + } + }, { + key: "name", + get: function get() { + return this.zoneName; + } + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone2; + }(Zone); + var singleton$1 = null; + var FixedOffsetZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(FixedOffsetZone2, _Zone); + FixedOffsetZone2.instance = function instance2(offset2) { + return offset2 === 0 ? FixedOffsetZone2.utcInstance : new FixedOffsetZone2(offset2); + }; + FixedOffsetZone2.parseSpecifier = function parseSpecifier(s2) { + if (s2) { + var r = s2.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone2(signedOffset(r[1], r[2])); + } + } + return null; + }; + _createClass(FixedOffsetZone2, null, [{ + key: "utcInstance", + get: function get() { + if (singleton$1 === null) { + singleton$1 = new FixedOffsetZone2(0); + } + return singleton$1; + } + }]); + function FixedOffsetZone2(offset2) { + var _this; + _this = _Zone.call(this) || this; + _this.fixed = offset2; + return _this; + } + var _proto = FixedOffsetZone2.prototype; + _proto.offsetName = function offsetName() { + return this.name; + }; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + }; + _proto.offset = function offset2() { + return this.fixed; + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + }; + _createClass(FixedOffsetZone2, [{ + key: "type", + get: function get() { + return "fixed"; + } + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + }, { + key: "universal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }]); + return FixedOffsetZone2; + }(Zone); + var InvalidZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(InvalidZone2, _Zone); + function InvalidZone2(zoneName) { + var _this; + _this = _Zone.call(this) || this; + _this.zoneName = zoneName; + return _this; + } + var _proto = InvalidZone2.prototype; + _proto.offsetName = function offsetName() { + return null; + }; + _proto.formatOffset = function formatOffset2() { + return ""; + }; + _proto.offset = function offset2() { + return NaN; + }; + _proto.equals = function equals() { + return false; + }; + _createClass(InvalidZone2, [{ + key: "type", + get: function get() { + return "invalid"; + } + }, { + key: "name", + get: function get() { + return this.zoneName; + } + }, { + key: "universal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone2; + }(Zone); + function normalizeZone(input, defaultZone2) { + var offset2; + if (isUndefined(input) || input === null) { + return defaultZone2; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "local") + return defaultZone2; + else if (lowered === "utc" || lowered === "gmt") + return FixedOffsetZone.utcInstance; + else if ((offset2 = IANAZone.parseGMTOffset(input)) != null) { + return FixedOffsetZone.instance(offset2); + } else if (IANAZone.isValidSpecifier(lowered)) + return IANAZone.create(input); + else + return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input); + } else if (isNumber2(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && input.offset && typeof input.offset === "number") { + return input; } else { - // Not all fixed-offset zones like Etc/+4:30 are present in tzdata. - // So we have to make do. Two cases: - // 1. The format options tell us to show the zone. We can't do that, so the best - // we can do is format the date in UTC. - // 2. The format options don't tell us to show the zone. Then we can adjust them - // the time and tell the formatter to show it to us in UTC, so that the time is right - // and the bad zone doesn't show up. - z = "UTC"; - - if (opts.timeZoneName) { + return new InvalidZone(input); + } + } + var now = function now2() { + return Date.now(); + }; + var defaultZone = null; + var defaultLocale = null; + var defaultNumberingSystem = null; + var defaultOutputCalendar = null; + var throwOnInvalid = false; + var Settings = /* @__PURE__ */ function() { + function Settings2() { + } + Settings2.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + }; + _createClass(Settings2, null, [{ + key: "now", + get: function get() { + return now; + }, + set: function set(n2) { + now = n2; + } + }, { + key: "defaultZoneName", + get: function get() { + return Settings2.defaultZone.name; + }, + set: function set(z) { + if (!z) { + defaultZone = null; + } else { + defaultZone = normalizeZone(z); + } + } + }, { + key: "defaultZone", + get: function get() { + return defaultZone || LocalZone.instance; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + }, + set: function set(locale) { + defaultLocale = locale; + } + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + }, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + }, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + }, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings2; + }(); + var intlDTCache = {}; + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache[key]; + if (!dtf) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache[key] = dtf; + } + return dtf; + } + var intlNumCache = {}; + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache[key]; + if (!inf) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache[key] = inf; + } + return inf; + } + var intlRelCache = {}; + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts, base = _opts.base, cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, ["base"]); + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache[key]; + if (!inf) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache[key] = inf; + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else if (hasIntl()) { + var computedSys = new Intl.DateTimeFormat().resolvedOptions().locale; + sysLocaleCache = !computedSys || computedSys === "und" ? "en-US" : computedSys; + return sysLocaleCache; + } else { + sysLocaleCache = "en-US"; + return sysLocaleCache; + } + } + function parseLocaleString(localeStr) { + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var smaller = localeStr.substring(0, uIndex); + try { + options = getCachedDTF(localeStr).resolvedOptions(); + } catch (e) { + options = getCachedDTF(smaller).resolvedOptions(); + } + var _options = options, numberingSystem = _options.numberingSystem, calendar = _options.calendar; + return [smaller, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (hasIntl()) { + if (outputCalendar || numberingSystem) { + localeStr += "-u"; + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } else { + return []; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime3.utc(2016, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime3.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, defaultOK, englishFn, intlFn) { + var mode = loc.listingMode(defaultOK); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || hasIntl() && new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn"; + } + } + var PolyNumberFormatter = /* @__PURE__ */ function() { + function PolyNumberFormatter2(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + if (!forceSimple && hasIntl()) { + var intlOpts = { + useGrouping: false + }; + if (opts.padTo > 0) + intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter2.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart2(_fixed, this.padTo); + } + }; + return PolyNumberFormatter2; + }(); + var PolyDateFormatter = /* @__PURE__ */ function() { + function PolyDateFormatter2(dt, intl, opts) { + this.opts = opts; + this.hasIntl = hasIntl(); + var z; + if (dt.zone.universal && this.hasIntl) { + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + var isOffsetZoneSupported = IANAZone.isValidZone(offsetZ); + if (dt.offset !== 0 && isOffsetZoneSupported) { + z = offsetZ; + this.dt = dt; + } else { + z = "UTC"; + if (opts.timeZoneName) { + this.dt = dt; + } else { + this.dt = dt.offset === 0 ? dt : DateTime3.fromMillis(dt.ts + dt.offset * 60 * 1e3); + } + } + } else if (dt.zone.type === "local") { this.dt = dt; } else { - this.dt = dt.offset === 0 ? dt : DateTime.fromMillis(dt.ts + dt.offset * 60 * 1000); + this.dt = dt; + z = dt.zone.name; + } + if (this.hasIntl) { + var intlOpts = Object.assign({}, this.opts); + if (z) { + intlOpts.timeZone = z; + } + this.dtf = getCachedDTF(intl, intlOpts); } } - } else if (dt.zone.type === "local") { - this.dt = dt; - } else { - this.dt = dt; - z = dt.zone.name; - } - - if (this.hasIntl) { - var intlOpts = Object.assign({}, this.opts); - - if (z) { - intlOpts.timeZone = z; + var _proto2 = PolyDateFormatter2.prototype; + _proto2.format = function format() { + if (this.hasIntl) { + return this.dtf.format(this.dt.toJSDate()); + } else { + var tokenFormat = formatString(this.opts), loc = Locale.create("en-US"); + return Formatter.create(loc).formatDateTimeFromString(this.dt, tokenFormat); + } + }; + _proto2.formatToParts = function formatToParts() { + if (this.hasIntl && hasFormatToParts()) { + return this.dtf.formatToParts(this.dt.toJSDate()); + } else { + return []; + } + }; + _proto2.resolvedOptions = function resolvedOptions() { + if (this.hasIntl) { + return this.dtf.resolvedOptions(); + } else { + return { + locale: "en-US", + numberingSystem: "latn", + outputCalendar: "gregory" + }; + } + }; + return PolyDateFormatter2; + }(); + var PolyRelFormatter = /* @__PURE__ */ function() { + function PolyRelFormatter2(intl, isEnglish, opts) { + this.opts = Object.assign({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } } - - this.dtf = getCachedDTF(intl, intlOpts); + var _proto3 = PolyRelFormatter2.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter2; + }(); + var Locale = /* @__PURE__ */ function() { + Locale2.fromOpts = function fromOpts(opts) { + return Locale2.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN); + }; + Locale2.create = function create(locale, numberingSystem, outputCalendar, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale, localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()), numberingSystemR = numberingSystem || Settings.defaultNumberingSystem, outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + return new Locale2(localeR, numberingSystemR, outputCalendarR, specifiedLocale); + }; + Locale2.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache = {}; + intlNumCache = {}; + intlRelCache = {}; + }; + Locale2.fromObject = function fromObject(_temp) { + var _ref = _temp === void 0 ? {} : _temp, locale = _ref.locale, numberingSystem = _ref.numberingSystem, outputCalendar = _ref.outputCalendar; + return Locale2.create(locale, numberingSystem, outputCalendar); + }; + function Locale2(locale, numbering, outputCalendar, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), parsedLocale = _parseLocaleString[0], parsedNumberingSystem = _parseLocaleString[1], parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale2.prototype; + _proto4.listingMode = function listingMode(defaultOK) { + if (defaultOK === void 0) { + defaultOK = true; + } + var intl = hasIntl(), hasFTP = intl && hasFormatToParts(), isActuallyEn = this.isEnglish(), hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + if (!hasFTP && !(isActuallyEn && hasNoWeirdness) && !defaultOK) { + return "error"; + } else if (!hasFTP || isActuallyEn && hasNoWeirdness) { + return "en"; + } else { + return "intl"; + } + }; + _proto4.clone = function clone2(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale2.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(Object.assign({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(Object.assign({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format, defaultOK) { + var _this = this; + if (format === void 0) { + format = false; + } + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, months, function() { + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, formatStr = format ? "format" : "standalone"; + if (!_this.monthsCache[formatStr][length]) { + _this.monthsCache[formatStr][length] = mapMonths(function(dt) { + return _this.extract(dt, intl, "month"); + }); + } + return _this.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format, defaultOK) { + var _this2 = this; + if (format === void 0) { + format = false; + } + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, weekdays, function() { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, formatStr = format ? "format" : "standalone"; + if (!_this2.weekdaysCache[formatStr][length]) { + _this2.weekdaysCache[formatStr][length] = mapWeekdays(function(dt) { + return _this2.extract(dt, intl, "weekday"); + }); + } + return _this2.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1(defaultOK) { + var _this3 = this; + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, void 0, defaultOK, function() { + return meridiems; + }, function() { + if (!_this3.meridiemCache) { + var intl = { + hour: "numeric", + hour12: true + }; + _this3.meridiemCache = [DateTime3.utc(2016, 11, 13, 9), DateTime3.utc(2016, 11, 13, 19)].map(function(dt) { + return _this3.extract(dt, intl, "dayperiod"); + }); + } + return _this3.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length, defaultOK) { + var _this4 = this; + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, eras, function() { + var intl = { + era: length + }; + if (!_this4.eraCache[length]) { + _this4.eraCache[length] = [DateTime3.utc(-40, 1, 1), DateTime3.utc(2017, 1, 1)].map(function(dt) { + return _this4.extract(dt, intl, "era"); + }); + } + return _this4.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), results = df.formatToParts(), matching = results.find(function(m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || hasIntl() && new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us"); + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _createClass(Locale2, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale2; + }(); + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function(f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); } - } - - var _proto2 = PolyDateFormatter.prototype; - - _proto2.format = function format() { - if (this.hasIntl) { - return this.dtf.format(this.dt.toJSDate()); - } else { - var tokenFormat = formatString(this.opts), - loc = Locale.create("en-US"); - return Formatter.create(loc).formatDateTimeFromString(this.dt, tokenFormat); - } - }; - - _proto2.formatToParts = function formatToParts() { - if (this.hasIntl && hasFormatToParts()) { - return this.dtf.formatToParts(this.dt.toJSDate()); - } else { - // This is kind of a cop out. We actually could do this for English. However, we couldn't do it for intl strings - // and IMO it's too weird to have an uncanny valley like that - return []; - } - }; - - _proto2.resolvedOptions = function resolvedOptions() { - if (this.hasIntl) { - return this.dtf.resolvedOptions(); - } else { - return { - locale: "en-US", - numberingSystem: "latn", - outputCalendar: "gregory" + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function(m) { + return extractors.reduce(function(_ref, ex) { + var mergedVals = _ref[0], mergedZone = _ref[1], cursor = _ref[2]; + var _ex = ex(m, cursor), val = _ex[0], zone = _ex[1], next = _ex[2]; + return [Object.assign(mergedVals, val), mergedZone || zone, next]; + }, [{}, null, 1]).slice(0, 2); }; } - }; - - return PolyDateFormatter; -}(); -/** - * @private - */ - - -var PolyRelFormatter = /*#__PURE__*/function () { - function PolyRelFormatter(intl, isEnglish, opts) { - this.opts = Object.assign({ - style: "long" - }, opts); - - if (!isEnglish && hasRelative()) { - this.rtf = getCachedRTF(intl, opts); - } - } - - var _proto3 = PolyRelFormatter.prototype; - - _proto3.format = function format(count, unit) { - if (this.rtf) { - return this.rtf.format(count, unit); - } else { - return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); - } - }; - - _proto3.formatToParts = function formatToParts(count, unit) { - if (this.rtf) { - return this.rtf.formatToParts(count, unit); - } else { - return []; - } - }; - - return PolyRelFormatter; -}(); -/** - * @private - */ - - -var Locale = /*#__PURE__*/function () { - Locale.fromOpts = function fromOpts(opts) { - return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN); - }; - - Locale.create = function create(locale, numberingSystem, outputCalendar, defaultToEN) { - if (defaultToEN === void 0) { - defaultToEN = false; - } - - var specifiedLocale = locale || Settings.defaultLocale, - // the system locale is useful for human readable strings but annoying for parsing/formatting known formats - localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()), - numberingSystemR = numberingSystem || Settings.defaultNumberingSystem, - outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; - return new Locale(localeR, numberingSystemR, outputCalendarR, specifiedLocale); - }; - - Locale.resetCache = function resetCache() { - sysLocaleCache = null; - intlDTCache = {}; - intlNumCache = {}; - intlRelCache = {}; - }; - - Locale.fromObject = function fromObject(_temp) { - var _ref = _temp === void 0 ? {} : _temp, - locale = _ref.locale, - numberingSystem = _ref.numberingSystem, - outputCalendar = _ref.outputCalendar; - - return Locale.create(locale, numberingSystem, outputCalendar); - }; - - function Locale(locale, numbering, outputCalendar, specifiedLocale) { - var _parseLocaleString = parseLocaleString(locale), - parsedLocale = _parseLocaleString[0], - parsedNumberingSystem = _parseLocaleString[1], - parsedOutputCalendar = _parseLocaleString[2]; - - this.locale = parsedLocale; - this.numberingSystem = numbering || parsedNumberingSystem || null; - this.outputCalendar = outputCalendar || parsedOutputCalendar || null; - this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); - this.weekdaysCache = { - format: {}, - standalone: {} - }; - this.monthsCache = { - format: {}, - standalone: {} - }; - this.meridiemCache = null; - this.eraCache = {}; - this.specifiedLocale = specifiedLocale; - this.fastNumbersCached = null; - } - - var _proto4 = Locale.prototype; - - _proto4.listingMode = function listingMode(defaultOK) { - if (defaultOK === void 0) { - defaultOK = true; - } - - var intl = hasIntl(), - hasFTP = intl && hasFormatToParts(), - isActuallyEn = this.isEnglish(), - hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); - - if (!hasFTP && !(isActuallyEn && hasNoWeirdness) && !defaultOK) { - return "error"; - } else if (!hasFTP || isActuallyEn && hasNoWeirdness) { - return "en"; - } else { - return "intl"; - } - }; - - _proto4.clone = function clone(alts) { - if (!alts || Object.getOwnPropertyNames(alts).length === 0) { - return this; - } else { - return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false); - } - }; - - _proto4.redefaultToEN = function redefaultToEN(alts) { - if (alts === void 0) { - alts = {}; - } - - return this.clone(Object.assign({}, alts, { - defaultToEN: true - })); - }; - - _proto4.redefaultToSystem = function redefaultToSystem(alts) { - if (alts === void 0) { - alts = {}; - } - - return this.clone(Object.assign({}, alts, { - defaultToEN: false - })); - }; - - _proto4.months = function months$1(length, format, defaultOK) { - var _this = this; - - if (format === void 0) { - format = false; - } - - if (defaultOK === void 0) { - defaultOK = true; - } - - return listStuff(this, length, defaultOK, months, function () { - var intl = format ? { - month: length, - day: "numeric" - } : { - month: length - }, - formatStr = format ? "format" : "standalone"; - - if (!_this.monthsCache[formatStr][length]) { - _this.monthsCache[formatStr][length] = mapMonths(function (dt) { - return _this.extract(dt, intl, "month"); - }); + function parse(s2) { + if (s2 == null) { + return [null, null]; } - - return _this.monthsCache[formatStr][length]; - }); - }; - - _proto4.weekdays = function weekdays$1(length, format, defaultOK) { - var _this2 = this; - - if (format === void 0) { - format = false; - } - - if (defaultOK === void 0) { - defaultOK = true; - } - - return listStuff(this, length, defaultOK, weekdays, function () { - var intl = format ? { - weekday: length, - year: "numeric", - month: "long", - day: "numeric" - } : { - weekday: length - }, - formatStr = format ? "format" : "standalone"; - - if (!_this2.weekdaysCache[formatStr][length]) { - _this2.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { - return _this2.extract(dt, intl, "weekday"); - }); + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; } - - return _this2.weekdaysCache[formatStr][length]; - }); - }; - - _proto4.meridiems = function meridiems$1(defaultOK) { - var _this3 = this; - - if (defaultOK === void 0) { - defaultOK = true; - } - - return listStuff(this, undefined, defaultOK, function () { - return meridiems; - }, function () { - // In theory there could be aribitrary day periods. We're gonna assume there are exactly two - // for AM and PM. This is probably wrong, but it's makes parsing way easier. - if (!_this3.meridiemCache) { - var intl = { - hour: "numeric", - hour12: true - }; - _this3.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { - return _this3.extract(dt, intl, "dayperiod"); - }); - } - - return _this3.meridiemCache; - }); - }; - - _proto4.eras = function eras$1(length, defaultOK) { - var _this4 = this; - - if (defaultOK === void 0) { - defaultOK = true; - } - - return listStuff(this, length, defaultOK, eras, function () { - var intl = { - era: length - }; // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates - // to definitely enumerate them. - - if (!_this4.eraCache[length]) { - _this4.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { - return _this4.extract(dt, intl, "era"); - }); - } - - return _this4.eraCache[length]; - }); - }; - - _proto4.extract = function extract(dt, intlOpts, field) { - var df = this.dtFormatter(dt, intlOpts), - results = df.formatToParts(), - matching = results.find(function (m) { - return m.type.toLowerCase() === field; - }); - return matching ? matching.value : null; - }; - - _proto4.numberFormatter = function numberFormatter(opts) { - if (opts === void 0) { - opts = {}; - } - - // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) - // (in contrast, the rest of the condition is used heavily) - return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); - }; - - _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { - if (intlOpts === void 0) { - intlOpts = {}; - } - - return new PolyDateFormatter(dt, this.intl, intlOpts); - }; - - _proto4.relFormatter = function relFormatter(opts) { - if (opts === void 0) { - opts = {}; - } - - return new PolyRelFormatter(this.intl, this.isEnglish(), opts); - }; - - _proto4.isEnglish = function isEnglish() { - return this.locale === "en" || this.locale.toLowerCase() === "en-us" || hasIntl() && new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us"); - }; - - _proto4.equals = function equals(other) { - return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; - }; - - _createClass(Locale, [{ - key: "fastNumbers", - get: function get() { - if (this.fastNumbersCached == null) { - this.fastNumbersCached = supportsFastNumbers(this); - } - - return this.fastNumbersCached; - } - }]); - - return Locale; -}(); - -/* - * This file handles parsing for well-specified formats. Here's how it works: - * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. - * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object - * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. - * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. - * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. - * Some extractions are super dumb and simpleParse and fromStrings help DRY them. - */ - -function combineRegexes() { - for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { - regexes[_key] = arguments[_key]; - } - - var full = regexes.reduce(function (f, r) { - return f + r.source; - }, ""); - return RegExp("^" + full + "$"); -} - -function combineExtractors() { - for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - extractors[_key2] = arguments[_key2]; - } - - return function (m) { - return extractors.reduce(function (_ref, ex) { - var mergedVals = _ref[0], - mergedZone = _ref[1], - cursor = _ref[2]; - - var _ex = ex(m, cursor), - val = _ex[0], - zone = _ex[1], - next = _ex[2]; - - return [Object.assign(mergedVals, val), mergedZone || zone, next]; - }, [{}, null, 1]).slice(0, 2); - }; -} - -function parse(s) { - if (s == null) { - return [null, null]; - } - - for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - patterns[_key3 - 1] = arguments[_key3]; - } - - for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { - var _patterns$_i = _patterns[_i], - regex = _patterns$_i[0], - extractor = _patterns$_i[1]; - var m = regex.exec(s); - - if (m) { - return extractor(m); - } - } - - return [null, null]; -} - -function simpleParse() { - for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - keys[_key4] = arguments[_key4]; - } - - return function (match, cursor) { - var ret = {}; - var i; - - for (i = 0; i < keys.length; i++) { - ret[keys[i]] = parseInteger(match[cursor + i]); - } - - return [ret, null, cursor + i]; - }; -} // ISO and SQL parsing - - -var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/, - isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/, - isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + offsetRegex.source + "?"), - isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?"), - isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/, - isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/, - isoOrdinalRegex = /(\d{4})-?(\d{3})/, - extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"), - extractISOOrdinalData = simpleParse("year", "ordinal"), - sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/, - // dumbed-down version of the ISO one -sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"), - sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); - -function int(match, pos, fallback) { - var m = match[pos]; - return isUndefined(m) ? fallback : parseInteger(m); -} - -function extractISOYmd(match, cursor) { - var item = { - year: int(match, cursor), - month: int(match, cursor + 1, 1), - day: int(match, cursor + 2, 1) - }; - return [item, null, cursor + 3]; -} - -function extractISOTime(match, cursor) { - var item = { - hours: int(match, cursor, 0), - minutes: int(match, cursor + 1, 0), - seconds: int(match, cursor + 2, 0), - milliseconds: parseMillis(match[cursor + 3]) - }; - return [item, null, cursor + 4]; -} - -function extractISOOffset(match, cursor) { - var local = !match[cursor] && !match[cursor + 1], - fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), - zone = local ? null : FixedOffsetZone.instance(fullOffset); - return [{}, zone, cursor + 3]; -} - -function extractIANAZone(match, cursor) { - var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; - return [{}, zone, cursor + 1]; -} // ISO time parsing - - -var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); // ISO duration parsing - -var isoDuration = /^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/; - -function extractISODuration(match) { - var s = match[0], - yearStr = match[1], - monthStr = match[2], - weekStr = match[3], - dayStr = match[4], - hourStr = match[5], - minuteStr = match[6], - secondStr = match[7], - millisecondsStr = match[8]; - var hasNegativePrefix = s[0] === "-"; - var negativeSeconds = secondStr && secondStr[0] === "-"; - - var maybeNegate = function maybeNegate(num, force) { - if (force === void 0) { - force = false; - } - - return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; - }; - - return [{ - years: maybeNegate(parseInteger(yearStr)), - months: maybeNegate(parseInteger(monthStr)), - weeks: maybeNegate(parseInteger(weekStr)), - days: maybeNegate(parseInteger(dayStr)), - hours: maybeNegate(parseInteger(hourStr)), - minutes: maybeNegate(parseInteger(minuteStr)), - seconds: maybeNegate(parseInteger(secondStr), secondStr === "-0"), - milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) - }]; -} // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York -// and not just that we're in -240 *right now*. But since I don't think these are used that often -// I'm just going to ignore that - - -var obsOffsets = { - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 -}; - -function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = { - year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), - month: monthsShort.indexOf(monthStr) + 1, - day: parseInteger(dayStr), - hour: parseInteger(hourStr), - minute: parseInteger(minuteStr) - }; - if (secondStr) result.second = parseInteger(secondStr); - - if (weekdayStr) { - result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; - } - - return result; -} // RFC 2822/5322 - - -var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; - -function extractRFC2822(match) { - var weekdayStr = match[1], - dayStr = match[2], - monthStr = match[3], - yearStr = match[4], - hourStr = match[5], - minuteStr = match[6], - secondStr = match[7], - obsOffset = match[8], - milOffset = match[9], - offHourStr = match[10], - offMinuteStr = match[11], - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - var offset; - - if (obsOffset) { - offset = obsOffsets[obsOffset]; - } else if (milOffset) { - offset = 0; - } else { - offset = signedOffset(offHourStr, offMinuteStr); - } - - return [result, new FixedOffsetZone(offset)]; -} - -function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); -} // http date - - -var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, - rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, - ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; - -function extractRFC1123Or850(match) { - var weekdayStr = match[1], - dayStr = match[2], - monthStr = match[3], - yearStr = match[4], - hourStr = match[5], - minuteStr = match[6], - secondStr = match[7], - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - return [result, FixedOffsetZone.utcInstance]; -} - -function extractASCII(match) { - var weekdayStr = match[1], - monthStr = match[2], - dayStr = match[3], - hourStr = match[4], - minuteStr = match[5], - secondStr = match[6], - yearStr = match[7], - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - return [result, FixedOffsetZone.utcInstance]; -} - -var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); -var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); -var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); -var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); -var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset); -var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset); -var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset); -var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset); -/** - * @private - */ - -function parseISODate(s) { - return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); -} -function parseRFC2822Date(s) { - return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); -} -function parseHTTPDate(s) { - return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); -} -function parseISODuration(s) { - return parse(s, [isoDuration, extractISODuration]); -} -var extractISOTimeOnly = combineExtractors(extractISOTime); -function parseISOTimeOnly(s) { - return parse(s, [isoTimeOnly, extractISOTimeOnly]); -} -var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); -var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); -var extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); -var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); -function parseSQL(s) { - return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); -} - -var INVALID = "Invalid Duration"; // unit conversion constants - -var lowOrderMatrix = { - weeks: { - days: 7, - hours: 7 * 24, - minutes: 7 * 24 * 60, - seconds: 7 * 24 * 60 * 60, - milliseconds: 7 * 24 * 60 * 60 * 1000 - }, - days: { - hours: 24, - minutes: 24 * 60, - seconds: 24 * 60 * 60, - milliseconds: 24 * 60 * 60 * 1000 - }, - hours: { - minutes: 60, - seconds: 60 * 60, - milliseconds: 60 * 60 * 1000 - }, - minutes: { - seconds: 60, - milliseconds: 60 * 1000 - }, - seconds: { - milliseconds: 1000 - } -}, - casualMatrix = Object.assign({ - years: { - quarters: 4, - months: 12, - weeks: 52, - days: 365, - hours: 365 * 24, - minutes: 365 * 24 * 60, - seconds: 365 * 24 * 60 * 60, - milliseconds: 365 * 24 * 60 * 60 * 1000 - }, - quarters: { - months: 3, - weeks: 13, - days: 91, - hours: 91 * 24, - minutes: 91 * 24 * 60, - seconds: 91 * 24 * 60 * 60, - milliseconds: 91 * 24 * 60 * 60 * 1000 - }, - months: { - weeks: 4, - days: 30, - hours: 30 * 24, - minutes: 30 * 24 * 60, - seconds: 30 * 24 * 60 * 60, - milliseconds: 30 * 24 * 60 * 60 * 1000 - } -}, lowOrderMatrix), - daysInYearAccurate = 146097.0 / 400, - daysInMonthAccurate = 146097.0 / 4800, - accurateMatrix = Object.assign({ - years: { - quarters: 4, - months: 12, - weeks: daysInYearAccurate / 7, - days: daysInYearAccurate, - hours: daysInYearAccurate * 24, - minutes: daysInYearAccurate * 24 * 60, - seconds: daysInYearAccurate * 24 * 60 * 60, - milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 - }, - quarters: { - months: 3, - weeks: daysInYearAccurate / 28, - days: daysInYearAccurate / 4, - hours: daysInYearAccurate * 24 / 4, - minutes: daysInYearAccurate * 24 * 60 / 4, - seconds: daysInYearAccurate * 24 * 60 * 60 / 4, - milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 - }, - months: { - weeks: daysInMonthAccurate / 7, - days: daysInMonthAccurate, - hours: daysInMonthAccurate * 24, - minutes: daysInMonthAccurate * 24 * 60, - seconds: daysInMonthAccurate * 24 * 60 * 60, - milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 - } -}, lowOrderMatrix); // units ordered by size - -var orderedUnits = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; -var reverseUnits = orderedUnits.slice(0).reverse(); // clone really means "create another instance just like this one, but with these changes" - -function clone(dur, alts, clear) { - if (clear === void 0) { - clear = false; - } - - // deep merge for vals - var conf = { - values: clear ? alts.values : Object.assign({}, dur.values, alts.values || {}), - loc: dur.loc.clone(alts.loc), - conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy - }; - return new Duration(conf); -} - -function antiTrunc(n) { - return n < 0 ? Math.floor(n) : Math.ceil(n); -} // NB: mutates parameters - - -function convert(matrix, fromMap, fromUnit, toMap, toUnit) { - var conv = matrix[toUnit][fromUnit], - raw = fromMap[fromUnit] / conv, - sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), - // ok, so this is wild, but see the matrix in the tests - added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw); - toMap[toUnit] += added; - fromMap[fromUnit] -= added * conv; -} // NB: mutates parameters - - -function normalizeValues(matrix, vals) { - reverseUnits.reduce(function (previous, current) { - if (!isUndefined(vals[current])) { - if (previous) { - convert(matrix, vals, previous, vals, current); - } - - return current; - } else { - return previous; - } - }, null); -} -/** - * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime.plus} to add a Duration object to a DateTime, producing another DateTime. - * - * Here is a brief overview of commonly used methods and getters in Duration: - * - * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. - * * **Unit values** See the {@link Duration.years}, {@link Duration.months}, {@link Duration.weeks}, {@link Duration.days}, {@link Duration.hours}, {@link Duration.minutes}, {@link Duration.seconds}, {@link Duration.milliseconds} accessors. - * * **Configuration** See {@link Duration.locale} and {@link Duration.numberingSystem} accessors. - * * **Transformation** To create new Durations out of old ones use {@link Duration.plus}, {@link Duration.minus}, {@link Duration.normalize}, {@link Duration.set}, {@link Duration.reconfigure}, {@link Duration.shiftTo}, and {@link Duration.negate}. - * * **Output** To convert the Duration into other representations, see {@link Duration.as}, {@link Duration.toISO}, {@link Duration.toFormat}, and {@link Duration.toJSON} - * - * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. - */ - - -var Duration = /*#__PURE__*/function () { - /** - * @private - */ - function Duration(config) { - var accurate = config.conversionAccuracy === "longterm" || false; - /** - * @access private - */ - - this.values = config.values; - /** - * @access private - */ - - this.loc = config.loc || Locale.create(); - /** - * @access private - */ - - this.conversionAccuracy = accurate ? "longterm" : "casual"; - /** - * @access private - */ - - this.invalid = config.invalid || null; - /** - * @access private - */ - - this.matrix = accurate ? accurateMatrix : casualMatrix; - /** - * @access private - */ - - this.isLuxonDuration = true; - } - /** - * Create Duration from a number of milliseconds. - * @param {number} count of milliseconds - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - - - Duration.fromMillis = function fromMillis(count, opts) { - return Duration.fromObject(Object.assign({ - milliseconds: count - }, opts)); - } - /** - * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. - * If this object is empty then a zero milliseconds duration is returned. - * @param {Object} obj - the object to create the DateTime from - * @param {number} obj.years - * @param {number} obj.quarters - * @param {number} obj.months - * @param {number} obj.weeks - * @param {number} obj.days - * @param {number} obj.hours - * @param {number} obj.minutes - * @param {number} obj.seconds - * @param {number} obj.milliseconds - * @param {string} [obj.locale='en-US'] - the locale to use - * @param {string} obj.numberingSystem - the numbering system to use - * @param {string} [obj.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - ; - - Duration.fromObject = function fromObject(obj) { - if (obj == null || typeof obj !== "object") { - throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); - } - - return new Duration({ - values: normalizeObject(obj, Duration.normalizeUnit, ["locale", "numberingSystem", "conversionAccuracy", "zone" // a bit of debt; it's super inconvenient internally not to be able to blindly pass this - ]), - loc: Locale.fromObject(obj), - conversionAccuracy: obj.conversionAccuracy - }); - } - /** - * Create a Duration from an ISO 8601 duration string. - * @param {string} text - text to parse - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @see https://en.wikipedia.org/wiki/ISO_8601#Durations - * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } - * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } - * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } - * @return {Duration} - */ - ; - - Duration.fromISO = function fromISO(text, opts) { - var _parseISODuration = parseISODuration(text), - parsed = _parseISODuration[0]; - - if (parsed) { - var obj = Object.assign(parsed, opts); - return Duration.fromObject(obj); - } else { - return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); - } - } - /** - * Create a Duration from an ISO 8601 time string. - * @param {string} text - text to parse - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @see https://en.wikipedia.org/wiki/ISO_8601#Times - * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } - * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @return {Duration} - */ - ; - - Duration.fromISOTime = function fromISOTime(text, opts) { - var _parseISOTimeOnly = parseISOTimeOnly(text), - parsed = _parseISOTimeOnly[0]; - - if (parsed) { - var obj = Object.assign(parsed, opts); - return Duration.fromObject(obj); - } else { - return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); - } - } - /** - * Create an invalid Duration. - * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {Duration} - */ - ; - - Duration.invalid = function invalid(reason, explanation) { - if (explanation === void 0) { - explanation = null; - } - - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); - } - - var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidDurationError(invalid); - } else { - return new Duration({ - invalid: invalid - }); - } - } - /** - * @private - */ - ; - - Duration.normalizeUnit = function normalizeUnit(unit) { - var normalized = { - year: "years", - years: "years", - quarter: "quarters", - quarters: "quarters", - month: "months", - months: "months", - week: "weeks", - weeks: "weeks", - day: "days", - days: "days", - hour: "hours", - hours: "hours", - minute: "minutes", - minutes: "minutes", - second: "seconds", - seconds: "seconds", - millisecond: "milliseconds", - milliseconds: "milliseconds" - }[unit ? unit.toLowerCase() : unit]; - if (!normalized) throw new InvalidUnitError(unit); - return normalized; - } - /** - * Check if an object is a Duration. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - ; - - Duration.isDuration = function isDuration(o) { - return o && o.isLuxonDuration || false; - } - /** - * Get the locale of a Duration, such 'en-GB' - * @type {string} - */ - ; - - var _proto = Duration.prototype; - - /** - * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: - * * `S` for milliseconds - * * `s` for seconds - * * `m` for minutes - * * `h` for hours - * * `d` for days - * * `M` for months - * * `y` for years - * Notes: - * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits - * * The duration will be converted to the set of units in the format string using {@link Duration.shiftTo} and the Durations's conversion accuracy setting. - * @param {string} fmt - the format string - * @param {Object} opts - options - * @param {boolean} [opts.floor=true] - floor numerical values - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" - * @return {string} - */ - _proto.toFormat = function toFormat(fmt, opts) { - if (opts === void 0) { - opts = {}; - } - - // reverse-compat since 1.2; we always round down now, never up, and we do it by default - var fmtOpts = Object.assign({}, opts, { - floor: opts.round !== false && opts.floor !== false - }); - return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID; - } - /** - * Returns a JavaScript object with this Duration's values. - * @param opts - options for generating the object - * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } - * @return {Object} - */ - ; - - _proto.toObject = function toObject(opts) { - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid) return {}; - var base = Object.assign({}, this.values); - - if (opts.includeConfig) { - base.conversionAccuracy = this.conversionAccuracy; - base.numberingSystem = this.loc.numberingSystem; - base.locale = this.loc.locale; - } - - return base; - } - /** - * Returns an ISO 8601-compliant string representation of this Duration. - * @see https://en.wikipedia.org/wiki/ISO_8601#Durations - * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' - * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' - * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' - * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' - * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' - * @return {string} - */ - ; - - _proto.toISO = function toISO() { - // we could use the formatter, but this is an easier way to get the minimum string - if (!this.isValid) return null; - var s = "P"; - if (this.years !== 0) s += this.years + "Y"; - if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; - if (this.weeks !== 0) s += this.weeks + "W"; - if (this.days !== 0) s += this.days + "D"; - if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; - if (this.hours !== 0) s += this.hours + "H"; - if (this.minutes !== 0) s += this.minutes + "M"; - if (this.seconds !== 0 || this.milliseconds !== 0) // this will handle "floating point madness" by removing extra decimal places - // https://stackoverflow.com/questions/588004/is-floating-point-math-broken - s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; - if (s === "P") s += "T0S"; - return s; - } - /** - * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. - * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. - * @see https://en.wikipedia.org/wiki/ISO_8601#Times - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includePrefix=false] - include the `T` prefix - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' - * @return {string} - */ - ; - - _proto.toISOTime = function toISOTime(opts) { - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid) return null; - var millis = this.toMillis(); - if (millis < 0 || millis >= 86400000) return null; - opts = Object.assign({ - suppressMilliseconds: false, - suppressSeconds: false, - includePrefix: false, - format: "extended" - }, opts); - var value = this.shiftTo("hours", "minutes", "seconds", "milliseconds"); - var fmt = opts.format === "basic" ? "hhmm" : "hh:mm"; - - if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) { - fmt += opts.format === "basic" ? "ss" : ":ss"; - - if (!opts.suppressMilliseconds || value.milliseconds !== 0) { - fmt += ".SSS"; - } - } - - var str = value.toFormat(fmt); - - if (opts.includePrefix) { - str = "T" + str; - } - - return str; - } - /** - * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. - * @return {string} - */ - ; - - _proto.toJSON = function toJSON() { - return this.toISO(); - } - /** - * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. - * @return {string} - */ - ; - - _proto.toString = function toString() { - return this.toISO(); - } - /** - * Returns an milliseconds value of this Duration. - * @return {number} - */ - ; - - _proto.toMillis = function toMillis() { - return this.as("milliseconds"); - } - /** - * Returns an milliseconds value of this Duration. Alias of {@link toMillis} - * @return {number} - */ - ; - - _proto.valueOf = function valueOf() { - return this.toMillis(); - } - /** - * Make this Duration longer by the specified amount. Return a newly-constructed Duration. - * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @return {Duration} - */ - ; - - _proto.plus = function plus(duration) { - if (!this.isValid) return this; - var dur = friendlyDuration(duration), - result = {}; - - for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits), _step; !(_step = _iterator()).done;) { - var k = _step.value; - - if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { - result[k] = dur.get(k) + this.get(k); - } - } - - return clone(this, { - values: result - }, true); - } - /** - * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. - * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @return {Duration} - */ - ; - - _proto.minus = function minus(duration) { - if (!this.isValid) return this; - var dur = friendlyDuration(duration); - return this.plus(dur.negate()); - } - /** - * Scale this Duration by the specified amount. Return a newly-constructed Duration. - * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. - * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit(x => x * 2) //=> { hours: 2, minutes: 60 } - * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit((x, u) => u === "hour" ? x * 2 : x) //=> { hours: 2, minutes: 30 } - * @return {Duration} - */ - ; - - _proto.mapUnits = function mapUnits(fn) { - if (!this.isValid) return this; - var result = {}; - - for (var _i = 0, _Object$keys = Object.keys(this.values); _i < _Object$keys.length; _i++) { - var k = _Object$keys[_i]; - result[k] = asNumber(fn(this.values[k], k)); - } - - return clone(this, { - values: result - }, true); - } - /** - * Get the value of unit. - * @param {string} unit - a unit such as 'minute' or 'day' - * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 - * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 - * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 - * @return {number} - */ - ; - - _proto.get = function get(unit) { - return this[Duration.normalizeUnit(unit)]; - } - /** - * "Set" the values of specified units. Return a newly-constructed Duration. - * @param {Object} values - a mapping of units to numbers - * @example dur.set({ years: 2017 }) - * @example dur.set({ hours: 8, minutes: 30 }) - * @return {Duration} - */ - ; - - _proto.set = function set(values) { - if (!this.isValid) return this; - var mixed = Object.assign(this.values, normalizeObject(values, Duration.normalizeUnit, [])); - return clone(this, { - values: mixed - }); - } - /** - * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. - * @example dur.reconfigure({ locale: 'en-GB' }) - * @return {Duration} - */ - ; - - _proto.reconfigure = function reconfigure(_temp) { - var _ref = _temp === void 0 ? {} : _temp, - locale = _ref.locale, - numberingSystem = _ref.numberingSystem, - conversionAccuracy = _ref.conversionAccuracy; - - var loc = this.loc.clone({ - locale: locale, - numberingSystem: numberingSystem - }), - opts = { - loc: loc - }; - - if (conversionAccuracy) { - opts.conversionAccuracy = conversionAccuracy; - } - - return clone(this, opts); - } - /** - * Return the length of the duration in the specified unit. - * @param {string} unit - a unit such as 'minutes' or 'days' - * @example Duration.fromObject({years: 1}).as('days') //=> 365 - * @example Duration.fromObject({years: 1}).as('months') //=> 12 - * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 - * @return {number} - */ - ; - - _proto.as = function as(unit) { - return this.isValid ? this.shiftTo(unit).get(unit) : NaN; - } - /** - * Reduce this Duration to its canonical representation in its current units. - * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } - * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } - * @return {Duration} - */ - ; - - _proto.normalize = function normalize() { - if (!this.isValid) return this; - var vals = this.toObject(); - normalizeValues(this.matrix, vals); - return clone(this, { - values: vals - }, true); - } - /** - * Convert this Duration into its representation in a different set of units. - * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } - * @return {Duration} - */ - ; - - _proto.shiftTo = function shiftTo() { - for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { - units[_key] = arguments[_key]; - } - - if (!this.isValid) return this; - - if (units.length === 0) { - return this; - } - - units = units.map(function (u) { - return Duration.normalizeUnit(u); - }); - var built = {}, - accumulated = {}, - vals = this.toObject(); - var lastUnit; - - for (var _iterator2 = _createForOfIteratorHelperLoose(orderedUnits), _step2; !(_step2 = _iterator2()).done;) { - var k = _step2.value; - - if (units.indexOf(k) >= 0) { - lastUnit = k; - var own = 0; // anything we haven't boiled down yet should get boiled to this unit - - for (var ak in accumulated) { - own += this.matrix[ak][k] * accumulated[ak]; - accumulated[ak] = 0; - } // plus anything that's already in this unit - - - if (isNumber(vals[k])) { - own += vals[k]; - } - - var i = Math.trunc(own); - built[k] = i; - accumulated[k] = own - i; // we'd like to absorb these fractions in another unit - // plus anything further down the chain that should be rolled up in to this - - for (var down in vals) { - if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) { - convert(this.matrix, vals, down, built, k); - } - } // otherwise, keep it in the wings to boil it later - - } else if (isNumber(vals[k])) { - accumulated[k] = vals[k]; - } - } // anything leftover becomes the decimal for the last unit - // lastUnit must be defined since units is not empty - - - for (var key in accumulated) { - if (accumulated[key] !== 0) { - built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; - } - } - - return clone(this, { - values: built - }, true).normalize(); - } - /** - * Return the negative of this Duration. - * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } - * @return {Duration} - */ - ; - - _proto.negate = function negate() { - if (!this.isValid) return this; - var negated = {}; - - for (var _i2 = 0, _Object$keys2 = Object.keys(this.values); _i2 < _Object$keys2.length; _i2++) { - var k = _Object$keys2[_i2]; - negated[k] = -this.values[k]; - } - - return clone(this, { - values: negated - }, true); - } - /** - * Get the years. - * @type {number} - */ - ; - - /** - * Equality check - * Two Durations are equal iff they have the same units and the same values for each unit. - * @param {Duration} other - * @return {boolean} - */ - _proto.equals = function equals(other) { - if (!this.isValid || !other.isValid) { - return false; - } - - if (!this.loc.equals(other.loc)) { - return false; - } - - function eq(v1, v2) { - // Consider 0 and undefined as equal - if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; - return v1 === v2; - } - - for (var _iterator3 = _createForOfIteratorHelperLoose(orderedUnits), _step3; !(_step3 = _iterator3()).done;) { - var u = _step3.value; - - if (!eq(this.values[u], other.values[u])) { - return false; - } - } - - return true; - }; - - _createClass(Duration, [{ - key: "locale", - get: function get() { - return this.isValid ? this.loc.locale : null; - } - /** - * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration - * - * @type {string} - */ - - }, { - key: "numberingSystem", - get: function get() { - return this.isValid ? this.loc.numberingSystem : null; - } - }, { - key: "years", - get: function get() { - return this.isValid ? this.values.years || 0 : NaN; - } - /** - * Get the quarters. - * @type {number} - */ - - }, { - key: "quarters", - get: function get() { - return this.isValid ? this.values.quarters || 0 : NaN; - } - /** - * Get the months. - * @type {number} - */ - - }, { - key: "months", - get: function get() { - return this.isValid ? this.values.months || 0 : NaN; - } - /** - * Get the weeks - * @type {number} - */ - - }, { - key: "weeks", - get: function get() { - return this.isValid ? this.values.weeks || 0 : NaN; - } - /** - * Get the days. - * @type {number} - */ - - }, { - key: "days", - get: function get() { - return this.isValid ? this.values.days || 0 : NaN; - } - /** - * Get the hours. - * @type {number} - */ - - }, { - key: "hours", - get: function get() { - return this.isValid ? this.values.hours || 0 : NaN; - } - /** - * Get the minutes. - * @type {number} - */ - - }, { - key: "minutes", - get: function get() { - return this.isValid ? this.values.minutes || 0 : NaN; - } - /** - * Get the seconds. - * @return {number} - */ - - }, { - key: "seconds", - get: function get() { - return this.isValid ? this.values.seconds || 0 : NaN; - } - /** - * Get the milliseconds. - * @return {number} - */ - - }, { - key: "milliseconds", - get: function get() { - return this.isValid ? this.values.milliseconds || 0 : NaN; - } - /** - * Returns whether the Duration is invalid. Invalid durations are returned by diff operations - * on invalid DateTimes or Intervals. - * @return {boolean} - */ - - }, { - key: "isValid", - get: function get() { - return this.invalid === null; - } - /** - * Returns an error code if this Duration became invalid, or null if the Duration is valid - * @return {string} - */ - - }, { - key: "invalidReason", - get: function get() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this Duration became invalid, or null if the Duration is valid - * @type {string} - */ - - }, { - key: "invalidExplanation", - get: function get() { - return this.invalid ? this.invalid.explanation : null; - } - }]); - - return Duration; -}(); -function friendlyDuration(durationish) { - if (isNumber(durationish)) { - return Duration.fromMillis(durationish); - } else if (Duration.isDuration(durationish)) { - return durationish; - } else if (typeof durationish === "object") { - return Duration.fromObject(durationish); - } else { - throw new InvalidArgumentError("Unknown duration argument " + durationish + " of type " + typeof durationish); - } -} - -var INVALID$1 = "Invalid Interval"; // checks if the start is equal to or before the end - -function validateStartEnd(start, end) { - if (!start || !start.isValid) { - return Interval.invalid("missing or invalid start"); - } else if (!end || !end.isValid) { - return Interval.invalid("missing or invalid end"); - } else if (end < start) { - return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); - } else { - return null; - } -} -/** - * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. - * - * Here is a brief overview of the most commonly used methods and getters in Interval: - * - * * **Creation** To create an Interval, use {@link fromDateTimes}, {@link after}, {@link before}, or {@link fromISO}. - * * **Accessors** Use {@link start} and {@link end} to get the start and end. - * * **Interrogation** To analyze the Interval, use {@link count}, {@link length}, {@link hasSame}, {@link contains}, {@link isAfter}, or {@link isBefore}. - * * **Transformation** To create other Intervals out of this one, use {@link set}, {@link splitAt}, {@link splitBy}, {@link divideEqually}, {@link merge}, {@link xor}, {@link union}, {@link intersection}, or {@link difference}. - * * **Comparison** To compare this Interval to another one, use {@link equals}, {@link overlaps}, {@link abutsStart}, {@link abutsEnd}, {@link engulfs}. - * * **Output** To convert the Interval into other representations, see {@link toString}, {@link toISO}, {@link toISODate}, {@link toISOTime}, {@link toFormat}, and {@link toDuration}. - */ - - -var Interval = /*#__PURE__*/function () { - /** - * @private - */ - function Interval(config) { - /** - * @access private - */ - this.s = config.start; - /** - * @access private - */ - - this.e = config.end; - /** - * @access private - */ - - this.invalid = config.invalid || null; - /** - * @access private - */ - - this.isLuxonInterval = true; - } - /** - * Create an invalid Interval. - * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {Interval} - */ - - - Interval.invalid = function invalid(reason, explanation) { - if (explanation === void 0) { - explanation = null; - } - - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); - } - - var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidIntervalError(invalid); - } else { - return new Interval({ - invalid: invalid - }); - } - } - /** - * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. - * @param {DateTime|Date|Object} start - * @param {DateTime|Date|Object} end - * @return {Interval} - */ - ; - - Interval.fromDateTimes = function fromDateTimes(start, end) { - var builtStart = friendlyDateTime(start), - builtEnd = friendlyDateTime(end); - var validateError = validateStartEnd(builtStart, builtEnd); - - if (validateError == null) { - return new Interval({ - start: builtStart, - end: builtEnd - }); - } else { - return validateError; - } - } - /** - * Create an Interval from a start DateTime and a Duration to extend to. - * @param {DateTime|Date|Object} start - * @param {Duration|Object|number} duration - the length of the Interval. - * @return {Interval} - */ - ; - - Interval.after = function after(start, duration) { - var dur = friendlyDuration(duration), - dt = friendlyDateTime(start); - return Interval.fromDateTimes(dt, dt.plus(dur)); - } - /** - * Create an Interval from an end DateTime and a Duration to extend backwards to. - * @param {DateTime|Date|Object} end - * @param {Duration|Object|number} duration - the length of the Interval. - * @return {Interval} - */ - ; - - Interval.before = function before(end, duration) { - var dur = friendlyDuration(duration), - dt = friendlyDateTime(end); - return Interval.fromDateTimes(dt.minus(dur), dt); - } - /** - * Create an Interval from an ISO 8601 string. - * Accepts `/`, `/`, and `/` formats. - * @param {string} text - the ISO string to parse - * @param {Object} [opts] - options to pass {@link DateTime.fromISO} and optionally {@link Duration.fromISO} - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @return {Interval} - */ - ; - - Interval.fromISO = function fromISO(text, opts) { - var _split = (text || "").split("/", 2), - s = _split[0], - e = _split[1]; - - if (s && e) { - var start, startIsValid; - - try { - start = DateTime.fromISO(s, opts); - startIsValid = start.isValid; - } catch (e) { - startIsValid = false; - } - - var end, endIsValid; - - try { - end = DateTime.fromISO(e, opts); - endIsValid = end.isValid; - } catch (e) { - endIsValid = false; - } - - if (startIsValid && endIsValid) { - return Interval.fromDateTimes(start, end); - } - - if (startIsValid) { - var dur = Duration.fromISO(e, opts); - - if (dur.isValid) { - return Interval.after(start, dur); - } - } else if (endIsValid) { - var _dur = Duration.fromISO(s, opts); - - if (_dur.isValid) { - return Interval.before(end, _dur); + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], regex = _patterns$_i[0], extractor = _patterns$_i[1]; + var m = regex.exec(s2); + if (m) { + return extractor(m); } } + return [null, null]; } - - return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); - } - /** - * Check if an object is an Interval. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - ; - - Interval.isInterval = function isInterval(o) { - return o && o.isLuxonInterval || false; - } - /** - * Returns the start of the Interval - * @type {DateTime} - */ - ; - - var _proto = Interval.prototype; - - /** - * Returns the length of the Interval in the specified unit. - * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. - * @return {number} - */ - _proto.length = function length(unit) { - if (unit === void 0) { - unit = "milliseconds"; - } - - return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; - } - /** - * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. - * Unlike {@link length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' - * asks 'what dates are included in this interval?', not 'how many days long is this interval?' - * @param {string} [unit='milliseconds'] - the unit of time to count. - * @return {number} - */ - ; - - _proto.count = function count(unit) { - if (unit === void 0) { - unit = "milliseconds"; - } - - if (!this.isValid) return NaN; - var start = this.start.startOf(unit), - end = this.end.startOf(unit); - return Math.floor(end.diff(start, unit).get(unit)) + 1; - } - /** - * Returns whether this Interval's start and end are both in the same unit of time - * @param {string} unit - the unit of time to check sameness on - * @return {boolean} - */ - ; - - _proto.hasSame = function hasSame(unit) { - return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; - } - /** - * Return whether this Interval has the same start and end DateTimes. - * @return {boolean} - */ - ; - - _proto.isEmpty = function isEmpty() { - return this.s.valueOf() === this.e.valueOf(); - } - /** - * Return whether this Interval's start is after the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - ; - - _proto.isAfter = function isAfter(dateTime) { - if (!this.isValid) return false; - return this.s > dateTime; - } - /** - * Return whether this Interval's end is before the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - ; - - _proto.isBefore = function isBefore(dateTime) { - if (!this.isValid) return false; - return this.e <= dateTime; - } - /** - * Return whether this Interval contains the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - ; - - _proto.contains = function contains(dateTime) { - if (!this.isValid) return false; - return this.s <= dateTime && this.e > dateTime; - } - /** - * "Sets" the start and/or end dates. Returns a newly-constructed Interval. - * @param {Object} values - the values to set - * @param {DateTime} values.start - the starting DateTime - * @param {DateTime} values.end - the ending DateTime - * @return {Interval} - */ - ; - - _proto.set = function set(_temp) { - var _ref = _temp === void 0 ? {} : _temp, - start = _ref.start, - end = _ref.end; - - if (!this.isValid) return this; - return Interval.fromDateTimes(start || this.s, end || this.e); - } - /** - * Split this Interval at each of the specified DateTimes - * @param {...[DateTime]} dateTimes - the unit of time to count. - * @return {[Interval]} - */ - ; - - _proto.splitAt = function splitAt() { - var _this = this; - - if (!this.isValid) return []; - - for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { - dateTimes[_key] = arguments[_key]; - } - - var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { - return _this.contains(d); - }).sort(), - results = []; - var s = this.s, - i = 0; - - while (s < this.e) { - var added = sorted[i] || this.e, - next = +added > +this.e ? this.e : added; - results.push(Interval.fromDateTimes(s, next)); - s = next; - i += 1; - } - - return results; - } - /** - * Split this Interval into smaller Intervals, each of the specified length. - * Left over time is grouped into a smaller interval - * @param {Duration|Object|number} duration - The length of each resulting interval. - * @return {[Interval]} - */ - ; - - _proto.splitBy = function splitBy(duration) { - var dur = friendlyDuration(duration); - - if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { - return []; - } - - var s = this.s, - idx = 1, - next; - var results = []; - - while (s < this.e) { - var added = this.start.plus(dur.mapUnits(function (x) { - return x * idx; - })); - next = +added > +this.e ? this.e : added; - results.push(Interval.fromDateTimes(s, next)); - s = next; - idx += 1; - } - - return results; - } - /** - * Split this Interval into the specified number of smaller intervals. - * @param {number} numberOfParts - The number of Intervals to divide the Interval into. - * @return {[Interval]} - */ - ; - - _proto.divideEqually = function divideEqually(numberOfParts) { - if (!this.isValid) return []; - return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); - } - /** - * Return whether this Interval overlaps with the specified Interval - * @param {Interval} other - * @return {boolean} - */ - ; - - _proto.overlaps = function overlaps(other) { - return this.e > other.s && this.s < other.e; - } - /** - * Return whether this Interval's end is adjacent to the specified Interval's start. - * @param {Interval} other - * @return {boolean} - */ - ; - - _proto.abutsStart = function abutsStart(other) { - if (!this.isValid) return false; - return +this.e === +other.s; - } - /** - * Return whether this Interval's start is adjacent to the specified Interval's end. - * @param {Interval} other - * @return {boolean} - */ - ; - - _proto.abutsEnd = function abutsEnd(other) { - if (!this.isValid) return false; - return +other.e === +this.s; - } - /** - * Return whether this Interval engulfs the start and end of the specified Interval. - * @param {Interval} other - * @return {boolean} - */ - ; - - _proto.engulfs = function engulfs(other) { - if (!this.isValid) return false; - return this.s <= other.s && this.e >= other.e; - } - /** - * Return whether this Interval has the same start and end as the specified Interval. - * @param {Interval} other - * @return {boolean} - */ - ; - - _proto.equals = function equals(other) { - if (!this.isValid || !other.isValid) { - return false; - } - - return this.s.equals(other.s) && this.e.equals(other.e); - } - /** - * Return an Interval representing the intersection of this Interval and the specified Interval. - * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. - * Returns null if the intersection is empty, meaning, the intervals don't intersect. - * @param {Interval} other - * @return {Interval} - */ - ; - - _proto.intersection = function intersection(other) { - if (!this.isValid) return this; - var s = this.s > other.s ? this.s : other.s, - e = this.e < other.e ? this.e : other.e; - - if (s >= e) { - return null; - } else { - return Interval.fromDateTimes(s, e); - } - } - /** - * Return an Interval representing the union of this Interval and the specified Interval. - * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. - * @param {Interval} other - * @return {Interval} - */ - ; - - _proto.union = function union(other) { - if (!this.isValid) return this; - var s = this.s < other.s ? this.s : other.s, - e = this.e > other.e ? this.e : other.e; - return Interval.fromDateTimes(s, e); - } - /** - * Merge an array of Intervals into a equivalent minimal set of Intervals. - * Combines overlapping and adjacent Intervals. - * @param {[Interval]} intervals - * @return {[Interval]} - */ - ; - - Interval.merge = function merge(intervals) { - var _intervals$sort$reduc = intervals.sort(function (a, b) { - return a.s - b.s; - }).reduce(function (_ref2, item) { - var sofar = _ref2[0], - current = _ref2[1]; - - if (!current) { - return [sofar, item]; - } else if (current.overlaps(item) || current.abutsStart(item)) { - return [sofar, current.union(item)]; - } else { - return [sofar.concat([current]), item]; + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; } - }, [[], null]), - found = _intervals$sort$reduc[0], - final = _intervals$sort$reduc[1]; - - if (final) { - found.push(final); + return function(match2, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match2[cursor + i]); + } + return [ret, null, cursor + i]; + }; } - - return found; - } - /** - * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. - * @param {[Interval]} intervals - * @return {[Interval]} - */ - ; - - Interval.xor = function xor(intervals) { - var _Array$prototype; - - var start = null, - currentCount = 0; - - var results = [], - ends = intervals.map(function (i) { + var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + offsetRegex.source + "?"); + var isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match2, pos, fallback) { + var m = match2[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + function extractISOYmd(match2, cursor) { + var item = { + year: int(match2, cursor), + month: int(match2, cursor + 1, 1), + day: int(match2, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match2, cursor) { + var item = { + hours: int(match2, cursor, 0), + minutes: int(match2, cursor + 1, 0), + seconds: int(match2, cursor + 2, 0), + milliseconds: parseMillis(match2[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match2, cursor) { + var local = !match2[cursor] && !match2[cursor + 1], fullOffset = signedOffset(match2[cursor + 1], match2[cursor + 2]), zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match2, cursor) { + var zone = match2[cursor] ? IANAZone.create(match2[cursor]) : null; + return [{}, zone, cursor + 1]; + } + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + var isoDuration = /^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/; + function extractISODuration(match2) { + var s2 = match2[0], yearStr = match2[1], monthStr = match2[2], weekStr = match2[3], dayStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], millisecondsStr = match2[8]; + var hasNegativePrefix = s2[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate2(num, force) { + if (force === void 0) { + force = false; + } + return num !== void 0 && (force || num && hasNegativePrefix) ? -num : num; + }; return [{ - time: i.s, - type: "s" - }, { - time: i.e, - type: "e" + years: maybeNegate(parseInteger(yearStr)), + months: maybeNegate(parseInteger(monthStr)), + weeks: maybeNegate(parseInteger(weekStr)), + days: maybeNegate(parseInteger(dayStr)), + hours: maybeNegate(parseInteger(hourStr)), + minutes: maybeNegate(parseInteger(minuteStr)), + seconds: maybeNegate(parseInteger(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) }]; - }), - flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), - arr = flattened.sort(function (a, b) { - return a.time - b.time; - }); - - for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { - var i = _step.value; - currentCount += i.type === "s" ? 1 : -1; - - if (currentCount === 1) { - start = i.time; - } else { - if (start && +start !== +i.time) { - results.push(Interval.fromDateTimes(start, i.time)); - } - - start = null; - } } - - return Interval.merge(results); - } - /** - * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. - * @param {...Interval} intervals - * @return {[Interval]} - */ - ; - - _proto.difference = function difference() { - var _this2 = this; - - for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - intervals[_key2] = arguments[_key2]; - } - - return Interval.xor([this].concat(intervals)).map(function (i) { - return _this2.intersection(i); - }).filter(function (i) { - return i && !i.isEmpty(); - }); - } - /** - * Returns a string representation of this Interval appropriate for debugging. - * @return {string} - */ - ; - - _proto.toString = function toString() { - if (!this.isValid) return INVALID$1; - return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; - } - /** - * Returns an ISO 8601-compliant string representation of this Interval. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @param {Object} opts - The same options as {@link DateTime.toISO} - * @return {string} - */ - ; - - _proto.toISO = function toISO(opts) { - if (!this.isValid) return INVALID$1; - return this.s.toISO(opts) + "/" + this.e.toISO(opts); - } - /** - * Returns an ISO 8601-compliant string representation of date of this Interval. - * The time components are ignored. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @return {string} - */ - ; - - _proto.toISODate = function toISODate() { - if (!this.isValid) return INVALID$1; - return this.s.toISODate() + "/" + this.e.toISODate(); - } - /** - * Returns an ISO 8601-compliant string representation of time of this Interval. - * The date components are ignored. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @param {Object} opts - The same options as {@link DateTime.toISO} - * @return {string} - */ - ; - - _proto.toISOTime = function toISOTime(opts) { - if (!this.isValid) return INVALID$1; - return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); - } - /** - * Returns a string representation of this Interval formatted according to the specified format string. - * @param {string} dateFormat - the format string. This string formats the start and end time. See {@link DateTime.toFormat} for details. - * @param {Object} opts - options - * @param {string} [opts.separator = ' – '] - a separator to place between the start and end representations - * @return {string} - */ - ; - - _proto.toFormat = function toFormat(dateFormat, _temp2) { - var _ref3 = _temp2 === void 0 ? {} : _temp2, - _ref3$separator = _ref3.separator, - separator = _ref3$separator === void 0 ? " – " : _ref3$separator; - - if (!this.isValid) return INVALID$1; - return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); - } - /** - * Return a Duration representing the time spanned by this interval. - * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } - * @return {Duration} - */ - ; - - _proto.toDuration = function toDuration(unit, opts) { - if (!this.isValid) { - return Duration.invalid(this.invalidReason); - } - - return this.e.diff(this.s, unit, opts); - } - /** - * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes - * @param {function} mapFn - * @return {Interval} - * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) - * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) - */ - ; - - _proto.mapEndpoints = function mapEndpoints(mapFn) { - return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); - }; - - _createClass(Interval, [{ - key: "start", - get: function get() { - return this.isValid ? this.s : null; - } - /** - * Returns the end of the Interval - * @type {DateTime} - */ - - }, { - key: "end", - get: function get() { - return this.isValid ? this.e : null; - } - /** - * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. - * @type {boolean} - */ - - }, { - key: "isValid", - get: function get() { - return this.invalidReason === null; - } - /** - * Returns an error code if this Interval is invalid, or null if the Interval is valid - * @type {string} - */ - - }, { - key: "invalidReason", - get: function get() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this Interval became invalid, or null if the Interval is valid - * @type {string} - */ - - }, { - key: "invalidExplanation", - get: function get() { - return this.invalid ? this.invalid.explanation : null; - } - }]); - - return Interval; -}(); - -/** - * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. - */ - -var Info = /*#__PURE__*/function () { - function Info() {} - - /** - * Return whether the specified zone contains a DST. - * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. - * @return {boolean} - */ - Info.hasDST = function hasDST(zone) { - if (zone === void 0) { - zone = Settings.defaultZone; - } - - var proto = DateTime.now().setZone(zone).set({ - month: 12 - }); - return !zone.universal && proto.offset !== proto.set({ - month: 6 - }).offset; - } - /** - * Return whether the specified zone is a valid IANA specifier. - * @param {string} zone - Zone to check - * @return {boolean} - */ - ; - - Info.isValidIANAZone = function isValidIANAZone(zone) { - return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone); - } - /** - * Converts the input into a {@link Zone} instance. - * - * * If `input` is already a Zone instance, it is returned unchanged. - * * If `input` is a string containing a valid time zone name, a Zone instance - * with that name is returned. - * * If `input` is a string that doesn't refer to a known time zone, a Zone - * instance with {@link Zone.isValid} == false is returned. - * * If `input is a number, a Zone instance with the specified fixed offset - * in minutes is returned. - * * If `input` is `null` or `undefined`, the default zone is returned. - * @param {string|Zone|number} [input] - the value to be converted - * @return {Zone} - */ - ; - - Info.normalizeZone = function normalizeZone$1(input) { - return normalizeZone(input, Settings.defaultZone); - } - /** - * Return an array of standalone month names. - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.locObj=null] - an existing locale object to use - * @param {string} [opts.outputCalendar='gregory'] - the calendar - * @example Info.months()[0] //=> 'January' - * @example Info.months('short')[0] //=> 'Jan' - * @example Info.months('numeric')[0] //=> '1' - * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' - * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' - * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' - * @return {[string]} - */ - ; - - Info.months = function months(length, _temp) { - if (length === void 0) { - length = "long"; - } - - var _ref = _temp === void 0 ? {} : _temp, - _ref$locale = _ref.locale, - locale = _ref$locale === void 0 ? null : _ref$locale, - _ref$numberingSystem = _ref.numberingSystem, - numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem, - _ref$locObj = _ref.locObj, - locObj = _ref$locObj === void 0 ? null : _ref$locObj, - _ref$outputCalendar = _ref.outputCalendar, - outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar; - - return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); - } - /** - * Return an array of format month names. - * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that - * changes the string. - * See {@link months} - * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.locObj=null] - an existing locale object to use - * @param {string} [opts.outputCalendar='gregory'] - the calendar - * @return {[string]} - */ - ; - - Info.monthsFormat = function monthsFormat(length, _temp2) { - if (length === void 0) { - length = "long"; - } - - var _ref2 = _temp2 === void 0 ? {} : _temp2, - _ref2$locale = _ref2.locale, - locale = _ref2$locale === void 0 ? null : _ref2$locale, - _ref2$numberingSystem = _ref2.numberingSystem, - numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem, - _ref2$locObj = _ref2.locObj, - locObj = _ref2$locObj === void 0 ? null : _ref2$locObj, - _ref2$outputCalendar = _ref2.outputCalendar, - outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar; - - return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); - } - /** - * Return an array of standalone week names. - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.locObj=null] - an existing locale object to use - * @example Info.weekdays()[0] //=> 'Monday' - * @example Info.weekdays('short')[0] //=> 'Mon' - * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' - * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' - * @return {[string]} - */ - ; - - Info.weekdays = function weekdays(length, _temp3) { - if (length === void 0) { - length = "long"; - } - - var _ref3 = _temp3 === void 0 ? {} : _temp3, - _ref3$locale = _ref3.locale, - locale = _ref3$locale === void 0 ? null : _ref3$locale, - _ref3$numberingSystem = _ref3.numberingSystem, - numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem, - _ref3$locObj = _ref3.locObj, - locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; - - return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); - } - /** - * Return an array of format week names. - * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that - * changes the string. - * See {@link weekdays} - * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". - * @param {Object} opts - options - * @param {string} [opts.locale=null] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.locObj=null] - an existing locale object to use - * @return {[string]} - */ - ; - - Info.weekdaysFormat = function weekdaysFormat(length, _temp4) { - if (length === void 0) { - length = "long"; - } - - var _ref4 = _temp4 === void 0 ? {} : _temp4, - _ref4$locale = _ref4.locale, - locale = _ref4$locale === void 0 ? null : _ref4$locale, - _ref4$numberingSystem = _ref4.numberingSystem, - numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, - _ref4$locObj = _ref4.locObj, - locObj = _ref4$locObj === void 0 ? null : _ref4$locObj; - - return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); - } - /** - * Return an array of meridiems. - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @example Info.meridiems() //=> [ 'AM', 'PM' ] - * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] - * @return {[string]} - */ - ; - - Info.meridiems = function meridiems(_temp5) { - var _ref5 = _temp5 === void 0 ? {} : _temp5, - _ref5$locale = _ref5.locale, - locale = _ref5$locale === void 0 ? null : _ref5$locale; - - return Locale.create(locale).meridiems(); - } - /** - * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. - * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @example Info.eras() //=> [ 'BC', 'AD' ] - * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] - * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] - * @return {[string]} - */ - ; - - Info.eras = function eras(length, _temp6) { - if (length === void 0) { - length = "short"; - } - - var _ref6 = _temp6 === void 0 ? {} : _temp6, - _ref6$locale = _ref6.locale, - locale = _ref6$locale === void 0 ? null : _ref6$locale; - - return Locale.create(locale, null, "gregory").eras(length); - } - /** - * Return the set of available features in this environment. - * Some features of Luxon are not available in all environments. For example, on older browsers, timezone support is not available. Use this function to figure out if that's the case. - * Keys: - * * `zones`: whether this environment supports IANA timezones - * * `intlTokens`: whether this environment supports internationalized token-based formatting/parsing - * * `intl`: whether this environment supports general internationalization - * * `relative`: whether this environment supports relative time formatting - * @example Info.features() //=> { intl: true, intlTokens: false, zones: true, relative: false } - * @return {Object} - */ - ; - - Info.features = function features() { - var intl = false, - intlTokens = false, - zones = false, - relative = false; - - if (hasIntl()) { - intl = true; - intlTokens = hasFormatToParts(); - relative = hasRelative(); - - try { - zones = new Intl.DateTimeFormat("en", { - timeZone: "America/New_York" - }).resolvedOptions().timeZone === "America/New_York"; - } catch (e) { - zones = false; - } - } - - return { - intl: intl, - intlTokens: intlTokens, - zones: zones, - relative: relative + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 }; - }; - - return Info; -}(); - -function dayDiff(earlier, later) { - var utcDayStart = function utcDayStart(dt) { - return dt.toUTC(0, { - keepLocalTime: true - }).startOf("day").valueOf(); - }, - ms = utcDayStart(later) - utcDayStart(earlier); - - return Math.floor(Duration.fromMillis(ms).as("days")); -} - -function highOrderDiffs(cursor, later, units) { - var differs = [["years", function (a, b) { - return b.year - a.year; - }], ["quarters", function (a, b) { - return b.quarter - a.quarter; - }], ["months", function (a, b) { - return b.month - a.month + (b.year - a.year) * 12; - }], ["weeks", function (a, b) { - var days = dayDiff(a, b); - return (days - days % 7) / 7; - }], ["days", dayDiff]]; - var results = {}; - var lowestOrder, highWater; - - for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { - var _differs$_i = _differs[_i], - unit = _differs$_i[0], - differ = _differs$_i[1]; - - if (units.indexOf(unit) >= 0) { - var _cursor$plus; - - lowestOrder = unit; - var delta = differ(cursor, later); - highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[unit] = delta, _cursor$plus)); - - if (highWater > later) { - var _cursor$plus2; - - cursor = cursor.plus((_cursor$plus2 = {}, _cursor$plus2[unit] = delta - 1, _cursor$plus2)); - delta -= 1; - } else { - cursor = highWater; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) + result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; } - - results[unit] = delta; + return result; } - } - - return [cursor, results, highWater, lowestOrder]; -} - -function _diff (earlier, later, units, opts) { - var _highOrderDiffs = highOrderDiffs(earlier, later, units), - cursor = _highOrderDiffs[0], - results = _highOrderDiffs[1], - highWater = _highOrderDiffs[2], - lowestOrder = _highOrderDiffs[3]; - - var remainingMillis = later - cursor; - var lowerOrderUnits = units.filter(function (u) { - return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; - }); - - if (lowerOrderUnits.length === 0) { - if (highWater < later) { - var _cursor$plus3; - - highWater = cursor.plus((_cursor$plus3 = {}, _cursor$plus3[lowestOrder] = 1, _cursor$plus3)); - } - - if (highWater !== cursor) { - results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); - } - } - - var duration = Duration.fromObject(Object.assign(results, opts)); - - if (lowerOrderUnits.length > 0) { - var _Duration$fromMillis; - - return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); - } else { - return duration; - } -} - -var numberingSystems = { - arab: "[\u0660-\u0669]", - arabext: "[\u06F0-\u06F9]", - bali: "[\u1B50-\u1B59]", - beng: "[\u09E6-\u09EF]", - deva: "[\u0966-\u096F]", - fullwide: "[\uFF10-\uFF19]", - gujr: "[\u0AE6-\u0AEF]", - hanidec: "[〇|一|二|三|四|五|六|七|八|九]", - khmr: "[\u17E0-\u17E9]", - knda: "[\u0CE6-\u0CEF]", - laoo: "[\u0ED0-\u0ED9]", - limb: "[\u1946-\u194F]", - mlym: "[\u0D66-\u0D6F]", - mong: "[\u1810-\u1819]", - mymr: "[\u1040-\u1049]", - orya: "[\u0B66-\u0B6F]", - tamldec: "[\u0BE6-\u0BEF]", - telu: "[\u0C66-\u0C6F]", - thai: "[\u0E50-\u0E59]", - tibt: "[\u0F20-\u0F29]", - latn: "\\d" -}; -var numberingSystemsUTF16 = { - arab: [1632, 1641], - arabext: [1776, 1785], - bali: [6992, 7001], - beng: [2534, 2543], - deva: [2406, 2415], - fullwide: [65296, 65303], - gujr: [2790, 2799], - khmr: [6112, 6121], - knda: [3302, 3311], - laoo: [3792, 3801], - limb: [6470, 6479], - mlym: [3430, 3439], - mong: [6160, 6169], - mymr: [4160, 4169], - orya: [2918, 2927], - tamldec: [3046, 3055], - telu: [3174, 3183], - thai: [3664, 3673], - tibt: [3872, 3881] -}; // eslint-disable-next-line - -var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); -function parseDigits(str) { - var value = parseInt(str, 10); - - if (isNaN(value)) { - value = ""; - - for (var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - - if (str[i].search(numberingSystems.hanidec) !== -1) { - value += hanidecChars.indexOf(str[i]); + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match2) { + var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], obsOffset = match2[8], milOffset = match2[9], offHourStr = match2[10], offMinuteStr = match2[11], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset2; + if (obsOffset) { + offset2 = obsOffsets[obsOffset]; + } else if (milOffset) { + offset2 = 0; } else { - for (var key in numberingSystemsUTF16) { - var _numberingSystemsUTF = numberingSystemsUTF16[key], - min = _numberingSystemsUTF[0], - max = _numberingSystemsUTF[1]; - - if (code >= min && code <= max) { - value += code - min; + offset2 = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset2)]; + } + function preprocessRFC2822(s2) { + return s2.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/; + var rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/; + var ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match2) { + var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match2) { + var weekdayStr = match2[1], monthStr = match2[2], dayStr = match2[3], hourStr = match2[4], minuteStr = match2[5], secondStr = match2[6], yearStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset); + function parseISODate(s2) { + return parse(s2, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s2) { + return parse(preprocessRFC2822(s2), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s2) { + return parse(s2, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s2) { + return parse(s2, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s2) { + return parse(s2, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s2) { + return parse(s2, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + var INVALID = "Invalid Duration"; + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1e3 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1e3 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1e3 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1e3 + }, + seconds: { + milliseconds: 1e3 + } + }; + var casualMatrix = Object.assign({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1e3 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1e3 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1e3 + } + }, lowOrderMatrix); + var daysInYearAccurate = 146097 / 400; + var daysInMonthAccurate = 146097 / 4800; + var accurateMatrix = Object.assign({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1e3 + } + }, lowOrderMatrix); + var orderedUnits = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits.slice(0).reverse(); + function clone(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + var conf = { + values: clear ? alts.values : Object.assign({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy + }; + return new Duration(conf); + } + function antiTrunc(n2) { + return n2 < 0 ? Math.floor(n2) : Math.ceil(n2); + } + function convert(matrix, fromMap, fromUnit, toMap, toUnit) { + var conv = matrix[toUnit][fromUnit], raw = fromMap[fromUnit] / conv, sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw); + toMap[toUnit] += added; + fromMap[fromUnit] -= added * conv; + } + function normalizeValues(matrix, vals) { + reverseUnits.reduce(function(previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + convert(matrix, vals, previous, vals, current); + } + return current; + } else { + return previous; + } + }, null); + } + var Duration = /* @__PURE__ */ function() { + function Duration2(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + this.values = config.values; + this.loc = config.loc || Locale.create(); + this.conversionAccuracy = accurate ? "longterm" : "casual"; + this.invalid = config.invalid || null; + this.matrix = accurate ? accurateMatrix : casualMatrix; + this.isLuxonDuration = true; + } + Duration2.fromMillis = function fromMillis(count, opts) { + return Duration2.fromObject(Object.assign({ + milliseconds: count + }, opts)); + }; + Duration2.fromObject = function fromObject(obj) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration2({ + values: normalizeObject(obj, Duration2.normalizeUnit, [ + "locale", + "numberingSystem", + "conversionAccuracy", + "zone" + ]), + loc: Locale.fromObject(obj), + conversionAccuracy: obj.conversionAccuracy + }); + }; + Duration2.fromISO = function fromISO(text2, opts) { + var _parseISODuration = parseISODuration(text2), parsed = _parseISODuration[0]; + if (parsed) { + var obj = Object.assign(parsed, opts); + return Duration2.fromObject(obj); + } else { + return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + } + }; + Duration2.fromISOTime = function fromISOTime(text2, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text2), parsed = _parseISOTimeOnly[0]; + if (parsed) { + var obj = Object.assign(parsed, opts); + return Duration2.fromObject(obj); + } else { + return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + } + }; + Duration2.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid2); + } else { + return new Duration2({ + invalid: invalid2 + }); + } + }; + Duration2.normalizeUnit = function normalizeUnit2(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) + throw new InvalidUnitError(unit); + return normalized; + }; + Duration2.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + }; + var _proto = Duration2.prototype; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + var fmtOpts = Object.assign({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID; + }; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) + return {}; + var base = Object.assign({}, this.values); + if (opts.includeConfig) { + base.conversionAccuracy = this.conversionAccuracy; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + }; + _proto.toISO = function toISO() { + if (!this.isValid) + return null; + var s2 = "P"; + if (this.years !== 0) + s2 += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) + s2 += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) + s2 += this.weeks + "W"; + if (this.days !== 0) + s2 += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) + s2 += "T"; + if (this.hours !== 0) + s2 += this.hours + "H"; + if (this.minutes !== 0) + s2 += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + s2 += roundTo(this.seconds + this.milliseconds / 1e3, 3) + "S"; + if (s2 === "P") + s2 += "T0S"; + return s2; + }; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) + return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 864e5) + return null; + opts = Object.assign({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts); + var value = this.shiftTo("hours", "minutes", "seconds", "milliseconds"); + var fmt = opts.format === "basic" ? "hhmm" : "hh:mm"; + if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) { + fmt += opts.format === "basic" ? "ss" : ":ss"; + if (!opts.suppressMilliseconds || value.milliseconds !== 0) { + fmt += ".SSS"; } } - } - } - - return parseInt(value, 10); - } else { - return value; - } -} -function digitRegex(_ref, append) { - var numberingSystem = _ref.numberingSystem; - - if (append === void 0) { - append = ""; - } - - return new RegExp("" + numberingSystems[numberingSystem || "latn"] + append); -} - -var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; - -function intUnit(regex, post) { - if (post === void 0) { - post = function post(i) { - return i; - }; - } - - return { - regex: regex, - deser: function deser(_ref) { - var s = _ref[0]; - return post(parseDigits(s)); - } - }; -} - -var NBSP = String.fromCharCode(160); -var spaceOrNBSP = "( |" + NBSP + ")"; -var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); - -function fixListRegex(s) { - // make dots optional and also make them literal - // make space and non breakable space characters interchangeable - return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); -} - -function stripInsensitivities(s) { - return s.replace(/\./g, "") // ignore dots that were made optional - .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp - .toLowerCase(); -} - -function oneOf(strings, startIndex) { - if (strings === null) { - return null; - } else { - return { - regex: RegExp(strings.map(fixListRegex).join("|")), - deser: function deser(_ref2) { - var s = _ref2[0]; - return strings.findIndex(function (i) { - return stripInsensitivities(s) === stripInsensitivities(i); - }) + startIndex; - } - }; - } -} - -function offset(regex, groups) { - return { - regex: regex, - deser: function deser(_ref3) { - var h = _ref3[1], - m = _ref3[2]; - return signedOffset(h, m); - }, - groups: groups - }; -} - -function simple(regex) { - return { - regex: regex, - deser: function deser(_ref4) { - var s = _ref4[0]; - return s; - } - }; -} - -function escapeToken(value) { - // eslint-disable-next-line no-useless-escape - return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); -} - -function unitForToken(token, loc) { - var one = digitRegex(loc), - two = digitRegex(loc, "{2}"), - three = digitRegex(loc, "{3}"), - four = digitRegex(loc, "{4}"), - six = digitRegex(loc, "{6}"), - oneOrTwo = digitRegex(loc, "{1,2}"), - oneToThree = digitRegex(loc, "{1,3}"), - oneToSix = digitRegex(loc, "{1,6}"), - oneToNine = digitRegex(loc, "{1,9}"), - twoToFour = digitRegex(loc, "{2,4}"), - fourToSix = digitRegex(loc, "{4,6}"), - literal = function literal(t) { - return { - regex: RegExp(escapeToken(t.val)), - deser: function deser(_ref5) { - var s = _ref5[0]; - return s; - }, - literal: true - }; - }, - unitate = function unitate(t) { - if (token.literal) { - return literal(t); - } - - switch (t.val) { - // era - case "G": - return oneOf(loc.eras("short", false), 0); - - case "GG": - return oneOf(loc.eras("long", false), 0); - // years - - case "y": - return intUnit(oneToSix); - - case "yy": - return intUnit(twoToFour, untruncateYear); - - case "yyyy": - return intUnit(four); - - case "yyyyy": - return intUnit(fourToSix); - - case "yyyyyy": - return intUnit(six); - // months - - case "M": - return intUnit(oneOrTwo); - - case "MM": - return intUnit(two); - - case "MMM": - return oneOf(loc.months("short", true, false), 1); - - case "MMMM": - return oneOf(loc.months("long", true, false), 1); - - case "L": - return intUnit(oneOrTwo); - - case "LL": - return intUnit(two); - - case "LLL": - return oneOf(loc.months("short", false, false), 1); - - case "LLLL": - return oneOf(loc.months("long", false, false), 1); - // dates - - case "d": - return intUnit(oneOrTwo); - - case "dd": - return intUnit(two); - // ordinals - - case "o": - return intUnit(oneToThree); - - case "ooo": - return intUnit(three); - // time - - case "HH": - return intUnit(two); - - case "H": - return intUnit(oneOrTwo); - - case "hh": - return intUnit(two); - - case "h": - return intUnit(oneOrTwo); - - case "mm": - return intUnit(two); - - case "m": - return intUnit(oneOrTwo); - - case "q": - return intUnit(oneOrTwo); - - case "qq": - return intUnit(two); - - case "s": - return intUnit(oneOrTwo); - - case "ss": - return intUnit(two); - - case "S": - return intUnit(oneToThree); - - case "SSS": - return intUnit(three); - - case "u": - return simple(oneToNine); - // meridiem - - case "a": - return oneOf(loc.meridiems(), 0); - // weekYear (k) - - case "kkkk": - return intUnit(four); - - case "kk": - return intUnit(twoToFour, untruncateYear); - // weekNumber (W) - - case "W": - return intUnit(oneOrTwo); - - case "WW": - return intUnit(two); - // weekdays - - case "E": - case "c": - return intUnit(one); - - case "EEE": - return oneOf(loc.weekdays("short", false, false), 1); - - case "EEEE": - return oneOf(loc.weekdays("long", false, false), 1); - - case "ccc": - return oneOf(loc.weekdays("short", true, false), 1); - - case "cccc": - return oneOf(loc.weekdays("long", true, false), 1); - // offset/zone - - case "Z": - case "ZZ": - return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); - - case "ZZZ": - return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); - // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing - // because we don't have any way to figure out what they are - - case "z": - return simple(/[a-z_+-/]{1,256}?/i); - - default: - return literal(t); - } - }; - - var unit = unitate(token) || { - invalidReason: MISSING_FTP - }; - unit.token = token; - return unit; -} - -var partTypeStyleToTokenVal = { - year: { - "2-digit": "yy", - numeric: "yyyyy" - }, - month: { - numeric: "M", - "2-digit": "MM", - short: "MMM", - long: "MMMM" - }, - day: { - numeric: "d", - "2-digit": "dd" - }, - weekday: { - short: "EEE", - long: "EEEE" - }, - dayperiod: "a", - dayPeriod: "a", - hour: { - numeric: "h", - "2-digit": "hh" - }, - minute: { - numeric: "m", - "2-digit": "mm" - }, - second: { - numeric: "s", - "2-digit": "ss" - } -}; - -function tokenForPart(part, locale, formatOpts) { - var type = part.type, - value = part.value; - - if (type === "literal") { - return { - literal: true, - val: value - }; - } - - var style = formatOpts[type]; - var val = partTypeStyleToTokenVal[type]; - - if (typeof val === "object") { - val = val[style]; - } - - if (val) { - return { - literal: false, - val: val - }; - } - - return undefined; -} - -function buildRegex(units) { - var re = units.map(function (u) { - return u.regex; - }).reduce(function (f, r) { - return f + "(" + r.source + ")"; - }, ""); - return ["^" + re + "$", units]; -} - -function match(input, regex, handlers) { - var matches = input.match(regex); - - if (matches) { - var all = {}; - var matchIndex = 1; - - for (var i in handlers) { - if (hasOwnProperty(handlers, i)) { - var h = handlers[i], - groups = h.groups ? h.groups + 1 : 1; - - if (!h.literal && h.token) { - all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + var str = value.toFormat(fmt); + if (opts.includePrefix) { + str = "T" + str; } - - matchIndex += groups; - } - } - - return [matches, all]; - } else { - return [matches, {}]; - } -} - -function dateTimeFromMatches(matches) { - var toField = function toField(token) { - switch (token) { - case "S": - return "millisecond"; - - case "s": - return "second"; - - case "m": - return "minute"; - - case "h": - case "H": - return "hour"; - - case "d": - return "day"; - - case "o": - return "ordinal"; - - case "L": - case "M": - return "month"; - - case "y": - return "year"; - - case "E": - case "c": - return "weekday"; - - case "W": - return "weekNumber"; - - case "k": - return "weekYear"; - - case "q": - return "quarter"; - - default: - return null; - } - }; - - var zone; - - if (!isUndefined(matches.Z)) { - zone = new FixedOffsetZone(matches.Z); - } else if (!isUndefined(matches.z)) { - zone = IANAZone.create(matches.z); - } else { - zone = null; - } - - if (!isUndefined(matches.q)) { - matches.M = (matches.q - 1) * 3 + 1; - } - - if (!isUndefined(matches.h)) { - if (matches.h < 12 && matches.a === 1) { - matches.h += 12; - } else if (matches.h === 12 && matches.a === 0) { - matches.h = 0; - } - } - - if (matches.G === 0 && matches.y) { - matches.y = -matches.y; - } - - if (!isUndefined(matches.u)) { - matches.S = parseMillis(matches.u); - } - - var vals = Object.keys(matches).reduce(function (r, k) { - var f = toField(k); - - if (f) { - r[f] = matches[k]; - } - - return r; - }, {}); - return [vals, zone]; -} - -var dummyDateTimeCache = null; - -function getDummyDateTime() { - if (!dummyDateTimeCache) { - dummyDateTimeCache = DateTime.fromMillis(1555555555555); - } - - return dummyDateTimeCache; -} - -function maybeExpandMacroToken(token, locale) { - if (token.literal) { - return token; - } - - var formatOpts = Formatter.macroTokenToFormatOpts(token.val); - - if (!formatOpts) { - return token; - } - - var formatter = Formatter.create(locale, formatOpts); - var parts = formatter.formatDateTimeParts(getDummyDateTime()); - var tokens = parts.map(function (p) { - return tokenForPart(p, locale, formatOpts); - }); - - if (tokens.includes(undefined)) { - return token; - } - - return tokens; -} - -function expandMacroTokens(tokens, locale) { - var _Array$prototype; - - return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { - return maybeExpandMacroToken(t, locale); - })); -} -/** - * @private - */ - - -function explainFromTokens(locale, input, format) { - var tokens = expandMacroTokens(Formatter.parseFormat(format), locale), - units = tokens.map(function (t) { - return unitForToken(t, locale); - }), - disqualifyingUnit = units.find(function (t) { - return t.invalidReason; - }); - - if (disqualifyingUnit) { - return { - input: input, - tokens: tokens, - invalidReason: disqualifyingUnit.invalidReason - }; - } else { - var _buildRegex = buildRegex(units), - regexString = _buildRegex[0], - handlers = _buildRegex[1], - regex = RegExp(regexString, "i"), - _match = match(input, regex, handlers), - rawMatches = _match[0], - matches = _match[1], - _ref6 = matches ? dateTimeFromMatches(matches) : [null, null], - result = _ref6[0], - zone = _ref6[1]; - - if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { - throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); - } - - return { - input: input, - tokens: tokens, - regex: regex, - rawMatches: rawMatches, - matches: matches, - result: result, - zone: zone - }; - } -} -function parseFromTokens(locale, input, format) { - var _explainFromTokens = explainFromTokens(locale, input, format), - result = _explainFromTokens.result, - zone = _explainFromTokens.zone, - invalidReason = _explainFromTokens.invalidReason; - - return [result, zone, invalidReason]; -} - -var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], - leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; - -function unitOutOfRange(unit, value) { - return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); -} - -function dayOfWeek(year, month, day) { - var js = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); - return js === 0 ? 7 : js; -} - -function computeOrdinal(year, month, day) { - return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; -} - -function uncomputeOrdinal(year, ordinal) { - var table = isLeapYear(year) ? leapLadder : nonLeapLadder, - month0 = table.findIndex(function (i) { - return i < ordinal; - }), - day = ordinal - table[month0]; - return { - month: month0 + 1, - day: day - }; -} -/** - * @private - */ - - -function gregorianToWeek(gregObj) { - var year = gregObj.year, - month = gregObj.month, - day = gregObj.day, - ordinal = computeOrdinal(year, month, day), - weekday = dayOfWeek(year, month, day); - var weekNumber = Math.floor((ordinal - weekday + 10) / 7), - weekYear; - - if (weekNumber < 1) { - weekYear = year - 1; - weekNumber = weeksInWeekYear(weekYear); - } else if (weekNumber > weeksInWeekYear(year)) { - weekYear = year + 1; - weekNumber = 1; - } else { - weekYear = year; - } - - return Object.assign({ - weekYear: weekYear, - weekNumber: weekNumber, - weekday: weekday - }, timeObject(gregObj)); -} -function weekToGregorian(weekData) { - var weekYear = weekData.weekYear, - weekNumber = weekData.weekNumber, - weekday = weekData.weekday, - weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), - yearInDays = daysInYear(weekYear); - var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3, - year; - - if (ordinal < 1) { - year = weekYear - 1; - ordinal += daysInYear(year); - } else if (ordinal > yearInDays) { - year = weekYear + 1; - ordinal -= daysInYear(weekYear); - } else { - year = weekYear; - } - - var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), - month = _uncomputeOrdinal.month, - day = _uncomputeOrdinal.day; - - return Object.assign({ - year: year, - month: month, - day: day - }, timeObject(weekData)); -} -function gregorianToOrdinal(gregData) { - var year = gregData.year, - month = gregData.month, - day = gregData.day, - ordinal = computeOrdinal(year, month, day); - return Object.assign({ - year: year, - ordinal: ordinal - }, timeObject(gregData)); -} -function ordinalToGregorian(ordinalData) { - var year = ordinalData.year, - ordinal = ordinalData.ordinal, - _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), - month = _uncomputeOrdinal2.month, - day = _uncomputeOrdinal2.day; - - return Object.assign({ - year: year, - month: month, - day: day - }, timeObject(ordinalData)); -} -function hasInvalidWeekData(obj) { - var validYear = isInteger(obj.weekYear), - validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), - validWeekday = integerBetween(obj.weekday, 1, 7); - - if (!validYear) { - return unitOutOfRange("weekYear", obj.weekYear); - } else if (!validWeek) { - return unitOutOfRange("week", obj.week); - } else if (!validWeekday) { - return unitOutOfRange("weekday", obj.weekday); - } else return false; -} -function hasInvalidOrdinalData(obj) { - var validYear = isInteger(obj.year), - validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); - - if (!validYear) { - return unitOutOfRange("year", obj.year); - } else if (!validOrdinal) { - return unitOutOfRange("ordinal", obj.ordinal); - } else return false; -} -function hasInvalidGregorianData(obj) { - var validYear = isInteger(obj.year), - validMonth = integerBetween(obj.month, 1, 12), - validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); - - if (!validYear) { - return unitOutOfRange("year", obj.year); - } else if (!validMonth) { - return unitOutOfRange("month", obj.month); - } else if (!validDay) { - return unitOutOfRange("day", obj.day); - } else return false; -} -function hasInvalidTimeData(obj) { - var hour = obj.hour, - minute = obj.minute, - second = obj.second, - millisecond = obj.millisecond; - var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, - validMinute = integerBetween(minute, 0, 59), - validSecond = integerBetween(second, 0, 59), - validMillisecond = integerBetween(millisecond, 0, 999); - - if (!validHour) { - return unitOutOfRange("hour", hour); - } else if (!validMinute) { - return unitOutOfRange("minute", minute); - } else if (!validSecond) { - return unitOutOfRange("second", second); - } else if (!validMillisecond) { - return unitOutOfRange("millisecond", millisecond); - } else return false; -} - -var INVALID$2 = "Invalid DateTime"; -var MAX_DATE = 8.64e15; - -function unsupportedZone(zone) { - return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); -} // we cache week data on the DT object and this intermediates the cache - - -function possiblyCachedWeekData(dt) { - if (dt.weekData === null) { - dt.weekData = gregorianToWeek(dt.c); - } - - return dt.weekData; -} // clone really means, "make a new object with these modifications". all "setters" really use this -// to create a new object while only changing some of the properties - - -function clone$1(inst, alts) { - var current = { - ts: inst.ts, - zone: inst.zone, - c: inst.c, - o: inst.o, - loc: inst.loc, - invalid: inst.invalid - }; - return new DateTime(Object.assign({}, current, alts, { - old: current - })); -} // find the right offset a given local time. The o input is our guess, which determines which -// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) - - -function fixOffset(localTS, o, tz) { - // Our UTC time is just a guess because our offset is just a guess - var utcGuess = localTS - o * 60 * 1000; // Test whether the zone matches the offset for this ts - - var o2 = tz.offset(utcGuess); // If so, offset didn't change and we're done - - if (o === o2) { - return [utcGuess, o]; - } // If not, change the ts by the difference in the offset - - - utcGuess -= (o2 - o) * 60 * 1000; // If that gives us the local time we want, we're done - - var o3 = tz.offset(utcGuess); - - if (o2 === o3) { - return [utcGuess, o2]; - } // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time - - - return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; -} // convert an epoch timestamp into a calendar object with the given offset - - -function tsToObj(ts, offset) { - ts += offset * 60 * 1000; - var d = new Date(ts); - return { - year: d.getUTCFullYear(), - month: d.getUTCMonth() + 1, - day: d.getUTCDate(), - hour: d.getUTCHours(), - minute: d.getUTCMinutes(), - second: d.getUTCSeconds(), - millisecond: d.getUTCMilliseconds() - }; -} // convert a calendar object to a epoch timestamp - - -function objToTS(obj, offset, zone) { - return fixOffset(objToLocalTS(obj), offset, zone); -} // create a new DT instance by adding a duration, adjusting for DSTs - - -function adjustTime(inst, dur) { - var oPre = inst.o, - year = inst.c.year + Math.trunc(dur.years), - month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, - c = Object.assign({}, inst.c, { - year: year, - month: month, - day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 - }), - millisToAdd = Duration.fromObject({ - years: dur.years - Math.trunc(dur.years), - quarters: dur.quarters - Math.trunc(dur.quarters), - months: dur.months - Math.trunc(dur.months), - weeks: dur.weeks - Math.trunc(dur.weeks), - days: dur.days - Math.trunc(dur.days), - hours: dur.hours, - minutes: dur.minutes, - seconds: dur.seconds, - milliseconds: dur.milliseconds - }).as("milliseconds"), - localTS = objToLocalTS(c); - - var _fixOffset = fixOffset(localTS, oPre, inst.zone), - ts = _fixOffset[0], - o = _fixOffset[1]; - - if (millisToAdd !== 0) { - ts += millisToAdd; // that could have changed the offset by going over a DST, but we want to keep the ts the same - - o = inst.zone.offset(ts); - } - - return { - ts: ts, - o: o - }; -} // helper useful in turning the results of parsing into real dates -// by handling the zone options - - -function parseDataToDateTime(parsed, parsedZone, opts, format, text) { - var setZone = opts.setZone, - zone = opts.zone; - - if (parsed && Object.keys(parsed).length !== 0) { - var interpretationZone = parsedZone || zone, - inst = DateTime.fromObject(Object.assign(parsed, opts, { - zone: interpretationZone, - // setZone is a valid option in the calling methods, but not in fromObject - setZone: undefined - })); - return setZone ? inst : inst.setZone(zone); - } else { - return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); - } -} // if you want to output a technical format (e.g. RFC 2822), this helper -// helps handle the details - - -function toTechFormat(dt, format, allowZ) { - if (allowZ === void 0) { - allowZ = true; - } - - return dt.isValid ? Formatter.create(Locale.create("en-US"), { - allowZ: allowZ, - forceSimple: true - }).formatDateTimeFromString(dt, format) : null; -} // technical time formats (e.g. the time part of ISO 8601), take some options -// and this commonizes their handling - - -function toTechTimeFormat(dt, _ref) { - var _ref$suppressSeconds = _ref.suppressSeconds, - suppressSeconds = _ref$suppressSeconds === void 0 ? false : _ref$suppressSeconds, - _ref$suppressMillisec = _ref.suppressMilliseconds, - suppressMilliseconds = _ref$suppressMillisec === void 0 ? false : _ref$suppressMillisec, - includeOffset = _ref.includeOffset, - _ref$includePrefix = _ref.includePrefix, - includePrefix = _ref$includePrefix === void 0 ? false : _ref$includePrefix, - _ref$includeZone = _ref.includeZone, - includeZone = _ref$includeZone === void 0 ? false : _ref$includeZone, - _ref$spaceZone = _ref.spaceZone, - spaceZone = _ref$spaceZone === void 0 ? false : _ref$spaceZone, - _ref$format = _ref.format, - format = _ref$format === void 0 ? "extended" : _ref$format; - var fmt = format === "basic" ? "HHmm" : "HH:mm"; - - if (!suppressSeconds || dt.second !== 0 || dt.millisecond !== 0) { - fmt += format === "basic" ? "ss" : ":ss"; - - if (!suppressMilliseconds || dt.millisecond !== 0) { - fmt += ".SSS"; - } - } - - if ((includeZone || includeOffset) && spaceZone) { - fmt += " "; - } - - if (includeZone) { - fmt += "z"; - } else if (includeOffset) { - fmt += format === "basic" ? "ZZZ" : "ZZ"; - } - - var str = toTechFormat(dt, fmt); - - if (includePrefix) { - str = "T" + str; - } - - return str; -} // defaults for unspecified units in the supported calendars - - -var defaultUnitValues = { - month: 1, - day: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}, - defaultWeekUnitValues = { - weekNumber: 1, - weekday: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}, - defaultOrdinalUnitValues = { - ordinal: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}; // Units in the supported calendars, sorted by bigness - -var orderedUnits$1 = ["year", "month", "day", "hour", "minute", "second", "millisecond"], - orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], - orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; // standardize case and plurality in units - -function normalizeUnit(unit) { - var normalized = { - year: "year", - years: "year", - month: "month", - months: "month", - day: "day", - days: "day", - hour: "hour", - hours: "hour", - minute: "minute", - minutes: "minute", - quarter: "quarter", - quarters: "quarter", - second: "second", - seconds: "second", - millisecond: "millisecond", - milliseconds: "millisecond", - weekday: "weekday", - weekdays: "weekday", - weeknumber: "weekNumber", - weeksnumber: "weekNumber", - weeknumbers: "weekNumber", - weekyear: "weekYear", - weekyears: "weekYear", - ordinal: "ordinal" - }[unit.toLowerCase()]; - if (!normalized) throw new InvalidUnitError(unit); - return normalized; -} // this is a dumbed down version of fromObject() that runs about 60% faster -// but doesn't do any validation, makes a bunch of assumptions about what units -// are present, and so on. - - -function quickDT(obj, zone) { - // assume we have the higher-order units - for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits$1), _step; !(_step = _iterator()).done;) { - var u = _step.value; - - if (isUndefined(obj[u])) { - obj[u] = defaultUnitValues[u]; - } - } - - var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); - - if (invalid) { - return DateTime.invalid(invalid); - } - - var tsNow = Settings.now(), - offsetProvis = zone.offset(tsNow), - _objToTS = objToTS(obj, offsetProvis, zone), - ts = _objToTS[0], - o = _objToTS[1]; - - return new DateTime({ - ts: ts, - zone: zone, - o: o - }); -} - -function diffRelative(start, end, opts) { - var round = isUndefined(opts.round) ? true : opts.round, - format = function format(c, unit) { - c = roundTo(c, round || opts.calendary ? 0 : 2, true); - var formatter = end.loc.clone(opts).relFormatter(opts); - return formatter.format(c, unit); - }, - differ = function differ(unit) { - if (opts.calendary) { - if (!end.hasSame(start, unit)) { - return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); - } else return 0; - } else { - return end.diff(start, unit).get(unit); - } - }; - - if (opts.unit) { - return format(differ(opts.unit), opts.unit); - } - - for (var _iterator2 = _createForOfIteratorHelperLoose(opts.units), _step2; !(_step2 = _iterator2()).done;) { - var unit = _step2.value; - var count = differ(unit); - - if (Math.abs(count) >= 1) { - return format(count, unit); - } - } - - return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); -} -/** - * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. - * - * A DateTime comprises of: - * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. - * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). - * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. - * - * Here is a brief overview of the most commonly used functionality it provides: - * - * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link local}, {@link utc}, and (most flexibly) {@link fromObject}. To create one from a standard string format, use {@link fromISO}, {@link fromHTTP}, and {@link fromRFC2822}. To create one from a custom string format, use {@link fromFormat}. To create one from a native JS date, use {@link fromJSDate}. - * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link toObject}), use the {@link year}, {@link month}, - * {@link day}, {@link hour}, {@link minute}, {@link second}, {@link millisecond} accessors. - * * **Week calendar**: For ISO week calendar attributes, see the {@link weekYear}, {@link weekNumber}, and {@link weekday} accessors. - * * **Configuration** See the {@link locale} and {@link numberingSystem} accessors. - * * **Transformation**: To transform the DateTime into other DateTimes, use {@link set}, {@link reconfigure}, {@link setZone}, {@link setLocale}, {@link plus}, {@link minus}, {@link endOf}, {@link startOf}, {@link toUTC}, and {@link toLocal}. - * * **Output**: To convert the DateTime to other representations, use the {@link toRelative}, {@link toRelativeCalendar}, {@link toJSON}, {@link toISO}, {@link toHTTP}, {@link toObject}, {@link toRFC2822}, {@link toString}, {@link toLocaleString}, {@link toFormat}, {@link toMillis} and {@link toJSDate}. - * - * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. - */ - - -var DateTime = /*#__PURE__*/function () { - /** - * @access private - */ - function DateTime(config) { - var zone = config.zone || Settings.defaultZone; - var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); - /** - * @access private - */ - - this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; - var c = null, - o = null; - - if (!invalid) { - var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); - - if (unchanged) { - var _ref2 = [config.old.c, config.old.o]; - c = _ref2[0]; - o = _ref2[1]; - } else { - var ot = zone.offset(this.ts); - c = tsToObj(this.ts, ot); - invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; - c = invalid ? null : c; - o = invalid ? null : ot; - } - } - /** - * @access private - */ - - - this._zone = zone; - /** - * @access private - */ - - this.loc = config.loc || Locale.create(); - /** - * @access private - */ - - this.invalid = invalid; - /** - * @access private - */ - - this.weekData = null; - /** - * @access private - */ - - this.c = c; - /** - * @access private - */ - - this.o = o; - /** - * @access private - */ - - this.isLuxonDateTime = true; - } // CONSTRUCT - - /** - * Create a DateTime for the current instant, in the system's time zone. - * - * Use Settings to override these default values if needed. - * @example DateTime.now().toISO() //~> now in the ISO format - * @return {DateTime} - */ - - - DateTime.now = function now() { - return new DateTime({}); - } - /** - * Create a local DateTime - * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used - * @param {number} [month=1] - The month, 1-indexed - * @param {number} [day=1] - The day of the month, 1-indexed - * @param {number} [hour=0] - The hour of the day, in 24-hour time - * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 - * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 - * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 - * @example DateTime.local() //~> now - * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 - * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 - * @example DateTime.local(2017, 3, 12) //~> 2017-03-12T00:00:00 - * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 - * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 - * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 - * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 - * @return {DateTime} - */ - ; - - DateTime.local = function local(year, month, day, hour, minute, second, millisecond) { - if (isUndefined(year)) { - return DateTime.now(); - } else { - return quickDT({ - year: year, - month: month, - day: day, - hour: hour, - minute: minute, - second: second, - millisecond: millisecond - }, Settings.defaultZone); - } - } - /** - * Create a DateTime in UTC - * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used - * @param {number} [month=1] - The month, 1-indexed - * @param {number} [day=1] - The day of the month - * @param {number} [hour=0] - The hour of the day, in 24-hour time - * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 - * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 - * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 - * @example DateTime.utc() //~> now - * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z - * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z - * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z - * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z - * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z - * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z - * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765Z - * @return {DateTime} - */ - ; - - DateTime.utc = function utc(year, month, day, hour, minute, second, millisecond) { - if (isUndefined(year)) { - return new DateTime({ - ts: Settings.now(), - zone: FixedOffsetZone.utcInstance - }); - } else { - return quickDT({ - year: year, - month: month, - day: day, - hour: hour, - minute: minute, - second: second, - millisecond: millisecond - }, FixedOffsetZone.utcInstance); - } - } - /** - * Create a DateTime from a JavaScript Date object. Uses the default zone. - * @param {Date} date - a JavaScript Date object - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @return {DateTime} - */ - ; - - DateTime.fromJSDate = function fromJSDate(date, options) { - if (options === void 0) { - options = {}; - } - - var ts = isDate(date) ? date.valueOf() : NaN; - - if (Number.isNaN(ts)) { - return DateTime.invalid("invalid input"); - } - - var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); - - if (!zoneToUse.isValid) { - return DateTime.invalid(unsupportedZone(zoneToUse)); - } - - return new DateTime({ - ts: ts, - zone: zoneToUse, - loc: Locale.fromObject(options) - }); - } - /** - * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. - * @param {number} milliseconds - a number of milliseconds since 1970 UTC - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @param {string} [options.locale] - a locale to set on the resulting DateTime instance - * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance - * @return {DateTime} - */ - ; - - DateTime.fromMillis = function fromMillis(milliseconds, options) { - if (options === void 0) { - options = {}; - } - - if (!isNumber(milliseconds)) { - throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); - } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { - // this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start - return DateTime.invalid("Timestamp out of range"); - } else { - return new DateTime({ - ts: milliseconds, - zone: normalizeZone(options.zone, Settings.defaultZone), - loc: Locale.fromObject(options) - }); - } - } - /** - * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. - * @param {number} seconds - a number of seconds since 1970 UTC - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @param {string} [options.locale] - a locale to set on the resulting DateTime instance - * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance - * @return {DateTime} - */ - ; - - DateTime.fromSeconds = function fromSeconds(seconds, options) { - if (options === void 0) { - options = {}; - } - - if (!isNumber(seconds)) { - throw new InvalidArgumentError("fromSeconds requires a numerical input"); - } else { - return new DateTime({ - ts: seconds * 1000, - zone: normalizeZone(options.zone, Settings.defaultZone), - loc: Locale.fromObject(options) - }); - } - } - /** - * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. - * @param {Object} obj - the object to create the DateTime from - * @param {number} obj.year - a year, such as 1987 - * @param {number} obj.month - a month, 1-12 - * @param {number} obj.day - a day of the month, 1-31, depending on the month - * @param {number} obj.ordinal - day of the year, 1-365 or 366 - * @param {number} obj.weekYear - an ISO week year - * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year - * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday - * @param {number} obj.hour - hour of the day, 0-23 - * @param {number} obj.minute - minute of the hour, 0-59 - * @param {number} obj.second - second of the minute, 0-59 - * @param {number} obj.millisecond - millisecond of the second, 0-999 - * @param {string|Zone} [obj.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() - * @param {string} [obj.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} obj.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} obj.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' - * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'utc' }), - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'local' }) - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'America/New_York' }) - * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' - * @return {DateTime} - */ - ; - - DateTime.fromObject = function fromObject(obj) { - var zoneToUse = normalizeZone(obj.zone, Settings.defaultZone); - - if (!zoneToUse.isValid) { - return DateTime.invalid(unsupportedZone(zoneToUse)); - } - - var tsNow = Settings.now(), - offsetProvis = zoneToUse.offset(tsNow), - normalized = normalizeObject(obj, normalizeUnit, ["zone", "locale", "outputCalendar", "numberingSystem"]), - containsOrdinal = !isUndefined(normalized.ordinal), - containsGregorYear = !isUndefined(normalized.year), - containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), - containsGregor = containsGregorYear || containsGregorMD, - definiteWeekDef = normalized.weekYear || normalized.weekNumber, - loc = Locale.fromObject(obj); // cases: - // just a weekday -> this week's instance of that weekday, no worries - // (gregorian data or ordinal) + (weekYear or weekNumber) -> error - // (gregorian month or day) + ordinal -> error - // otherwise just use weeks or ordinals or gregorian, depending on what's specified - - if ((containsGregor || containsOrdinal) && definiteWeekDef) { - throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); - } - - if (containsGregorMD && containsOrdinal) { - throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); - } - - var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; // configure ourselves to deal with gregorian dates or week stuff - - var units, - defaultValues, - objNow = tsToObj(tsNow, offsetProvis); - - if (useWeekData) { - units = orderedWeekUnits; - defaultValues = defaultWeekUnitValues; - objNow = gregorianToWeek(objNow); - } else if (containsOrdinal) { - units = orderedOrdinalUnits; - defaultValues = defaultOrdinalUnitValues; - objNow = gregorianToOrdinal(objNow); - } else { - units = orderedUnits$1; - defaultValues = defaultUnitValues; - } // set default values for missing stuff - - - var foundFirst = false; - - for (var _iterator3 = _createForOfIteratorHelperLoose(units), _step3; !(_step3 = _iterator3()).done;) { - var u = _step3.value; - var v = normalized[u]; - - if (!isUndefined(v)) { - foundFirst = true; - } else if (foundFirst) { - normalized[u] = defaultValues[u]; - } else { - normalized[u] = objNow[u]; - } - } // make sure the values we have are in range - - - var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), - invalid = higherOrderInvalid || hasInvalidTimeData(normalized); - - if (invalid) { - return DateTime.invalid(invalid); - } // compute the actual time - - - var gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, - _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), - tsFinal = _objToTS2[0], - offsetFinal = _objToTS2[1], - inst = new DateTime({ - ts: tsFinal, - zone: zoneToUse, - o: offsetFinal, - loc: loc - }); // gregorian data + weekday serves only to validate - - - if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { - return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); - } - - return inst; - } - /** - * Create a DateTime from an ISO 8601 string - * @param {string} text - the ISO string - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance - * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromISO('2016-05-25T09:08:34.123') - * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') - * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) - * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) - * @example DateTime.fromISO('2016-W05-4') - * @return {DateTime} - */ - ; - - DateTime.fromISO = function fromISO(text, opts) { - if (opts === void 0) { - opts = {}; - } - - var _parseISODate = parseISODate(text), - vals = _parseISODate[0], - parsedZone = _parseISODate[1]; - - return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); - } - /** - * Create a DateTime from an RFC 2822 string - * @param {string} text - the RFC 2822 string - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. - * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') - * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') - * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') - * @return {DateTime} - */ - ; - - DateTime.fromRFC2822 = function fromRFC2822(text, opts) { - if (opts === void 0) { - opts = {}; - } - - var _parseRFC2822Date = parseRFC2822Date(text), - vals = _parseRFC2822Date[0], - parsedZone = _parseRFC2822Date[1]; - - return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); - } - /** - * Create a DateTime from an HTTP header date - * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 - * @param {string} text - the HTTP header date - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. - * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') - * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') - * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') - * @return {DateTime} - */ - ; - - DateTime.fromHTTP = function fromHTTP(text, opts) { - if (opts === void 0) { - opts = {}; - } - - var _parseHTTPDate = parseHTTPDate(text), - vals = _parseHTTPDate[0], - parsedZone = _parseHTTPDate[1]; - - return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); - } - /** - * Create a DateTime from an input string and format string. - * Defaults to en-US if no locale has been specified, regardless of the system's locale. - * @see https://moment.github.io/luxon/docs/manual/parsing.html#table-of-tokens - * @param {string} text - the string to parse - * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale - * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @return {DateTime} - */ - ; - - DateTime.fromFormat = function fromFormat(text, fmt, opts) { - if (opts === void 0) { - opts = {}; - } - - if (isUndefined(text) || isUndefined(fmt)) { - throw new InvalidArgumentError("fromFormat requires an input string and a format"); - } - - var _opts = opts, - _opts$locale = _opts.locale, - locale = _opts$locale === void 0 ? null : _opts$locale, - _opts$numberingSystem = _opts.numberingSystem, - numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, - localeToUse = Locale.fromOpts({ - locale: locale, - numberingSystem: numberingSystem, - defaultToEN: true - }), - _parseFromTokens = parseFromTokens(localeToUse, text, fmt), - vals = _parseFromTokens[0], - parsedZone = _parseFromTokens[1], - invalid = _parseFromTokens[2]; - - if (invalid) { - return DateTime.invalid(invalid); - } else { - return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text); - } - } - /** - * @deprecated use fromFormat instead - */ - ; - - DateTime.fromString = function fromString(text, fmt, opts) { - if (opts === void 0) { - opts = {}; - } - - return DateTime.fromFormat(text, fmt, opts); - } - /** - * Create a DateTime from a SQL date, time, or datetime - * Defaults to en-US if no locale has been specified, regardless of the system's locale - * @param {string} text - the string to parse - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale - * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @example DateTime.fromSQL('2017-05-15') - * @example DateTime.fromSQL('2017-05-15 09:12:34') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) - * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) - * @example DateTime.fromSQL('09:12:34.342') - * @return {DateTime} - */ - ; - - DateTime.fromSQL = function fromSQL(text, opts) { - if (opts === void 0) { - opts = {}; - } - - var _parseSQL = parseSQL(text), - vals = _parseSQL[0], - parsedZone = _parseSQL[1]; - - return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); - } - /** - * Create an invalid DateTime. - * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {DateTime} - */ - ; - - DateTime.invalid = function invalid(reason, explanation) { - if (explanation === void 0) { - explanation = null; - } - - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); - } - - var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidDateTimeError(invalid); - } else { - return new DateTime({ - invalid: invalid - }); - } - } - /** - * Check if an object is a DateTime. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - ; - - DateTime.isDateTime = function isDateTime(o) { - return o && o.isLuxonDateTime || false; - } // INFO - - /** - * Get the value of unit. - * @param {string} unit - a unit such as 'minute' or 'day' - * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 - * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 - * @return {number} - */ - ; - - var _proto = DateTime.prototype; - - _proto.get = function get(unit) { - return this[unit]; - } - /** - * Returns whether the DateTime is valid. Invalid DateTimes occur when: - * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 - * * The DateTime was created by an operation on another invalid date - * @type {boolean} - */ - ; - - /** - * Returns the resolved Intl options for this DateTime. - * This is useful in understanding the behavior of formatting methods - * @param {Object} opts - the same options as toLocaleString - * @return {Object} - */ - _proto.resolvedLocaleOpts = function resolvedLocaleOpts(opts) { - if (opts === void 0) { - opts = {}; - } - - var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), - locale = _Formatter$create$res.locale, - numberingSystem = _Formatter$create$res.numberingSystem, - calendar = _Formatter$create$res.calendar; - - return { - locale: locale, - numberingSystem: numberingSystem, - outputCalendar: calendar - }; - } // TRANSFORM - - /** - * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. - * - * Equivalent to {@link setZone}('utc') - * @param {number} [offset=0] - optionally, an offset from UTC in minutes - * @param {Object} [opts={}] - options to pass to `setZone()` - * @return {DateTime} - */ - ; - - _proto.toUTC = function toUTC(offset, opts) { - if (offset === void 0) { - offset = 0; - } - - if (opts === void 0) { - opts = {}; - } - - return this.setZone(FixedOffsetZone.instance(offset), opts); - } - /** - * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. - * - * Equivalent to `setZone('local')` - * @return {DateTime} - */ - ; - - _proto.toLocal = function toLocal() { - return this.setZone(Settings.defaultZone); - } - /** - * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. - * - * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link plus}. You may wish to use {@link toLocal} and {@link toUTC} which provide simple convenience wrappers for commonly used zones. - * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link Zone} class. - * @param {Object} opts - options - * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. - * @return {DateTime} - */ - ; - - _proto.setZone = function setZone(zone, _temp) { - var _ref3 = _temp === void 0 ? {} : _temp, - _ref3$keepLocalTime = _ref3.keepLocalTime, - keepLocalTime = _ref3$keepLocalTime === void 0 ? false : _ref3$keepLocalTime, - _ref3$keepCalendarTim = _ref3.keepCalendarTime, - keepCalendarTime = _ref3$keepCalendarTim === void 0 ? false : _ref3$keepCalendarTim; - - zone = normalizeZone(zone, Settings.defaultZone); - - if (zone.equals(this.zone)) { - return this; - } else if (!zone.isValid) { - return DateTime.invalid(unsupportedZone(zone)); - } else { - var newTS = this.ts; - - if (keepLocalTime || keepCalendarTime) { - var offsetGuess = zone.offset(this.ts); - var asObj = this.toObject(); - - var _objToTS3 = objToTS(asObj, offsetGuess, zone); - - newTS = _objToTS3[0]; - } - - return clone$1(this, { - ts: newTS, - zone: zone - }); - } - } - /** - * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. - * @param {Object} properties - the properties to set - * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) - * @return {DateTime} - */ - ; - - _proto.reconfigure = function reconfigure(_temp2) { - var _ref4 = _temp2 === void 0 ? {} : _temp2, - locale = _ref4.locale, - numberingSystem = _ref4.numberingSystem, - outputCalendar = _ref4.outputCalendar; - - var loc = this.loc.clone({ - locale: locale, - numberingSystem: numberingSystem, - outputCalendar: outputCalendar - }); - return clone$1(this, { - loc: loc - }); - } - /** - * "Set" the locale. Returns a newly-constructed DateTime. - * Just a convenient alias for reconfigure({ locale }) - * @example DateTime.local(2017, 5, 25).setLocale('en-GB') - * @return {DateTime} - */ - ; - - _proto.setLocale = function setLocale(locale) { - return this.reconfigure({ - locale: locale - }); - } - /** - * "Set" the values of specified units. Returns a newly-constructed DateTime. - * You can only set units with this method; for "setting" metadata, see {@link reconfigure} and {@link setZone}. - * @param {Object} values - a mapping of units to numbers - * @example dt.set({ year: 2017 }) - * @example dt.set({ hour: 8, minute: 30 }) - * @example dt.set({ weekday: 5 }) - * @example dt.set({ year: 2005, ordinal: 234 }) - * @return {DateTime} - */ - ; - - _proto.set = function set(values) { - if (!this.isValid) return this; - var normalized = normalizeObject(values, normalizeUnit, []), - settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), - containsOrdinal = !isUndefined(normalized.ordinal), - containsGregorYear = !isUndefined(normalized.year), - containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), - containsGregor = containsGregorYear || containsGregorMD, - definiteWeekDef = normalized.weekYear || normalized.weekNumber; - - if ((containsGregor || containsOrdinal) && definiteWeekDef) { - throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); - } - - if (containsGregorMD && containsOrdinal) { - throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); - } - - var mixed; - - if (settingWeekStuff) { - mixed = weekToGregorian(Object.assign(gregorianToWeek(this.c), normalized)); - } else if (!isUndefined(normalized.ordinal)) { - mixed = ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c), normalized)); - } else { - mixed = Object.assign(this.toObject(), normalized); // if we didn't set the day but we ended up on an overflow date, - // use the last day of the right month - - if (isUndefined(normalized.day)) { - mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); - } - } - - var _objToTS4 = objToTS(mixed, this.o, this.zone), - ts = _objToTS4[0], - o = _objToTS4[1]; - - return clone$1(this, { - ts: ts, - o: o - }); - } - /** - * Add a period of time to this DateTime and return the resulting DateTime - * - * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. - * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @example DateTime.now().plus(123) //~> in 123 milliseconds - * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes - * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow - * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday - * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min - * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min - * @return {DateTime} - */ - ; - - _proto.plus = function plus(duration) { - if (!this.isValid) return this; - var dur = friendlyDuration(duration); - return clone$1(this, adjustTime(this, dur)); - } - /** - * Subtract a period of time to this DateTime and return the resulting DateTime - * See {@link plus} - * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - @return {DateTime} - */ - ; - - _proto.minus = function minus(duration) { - if (!this.isValid) return this; - var dur = friendlyDuration(duration).negate(); - return clone$1(this, adjustTime(this, dur)); - } - /** - * "Set" this DateTime to the beginning of a unit of time. - * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. - * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' - * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' - * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays - * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' - * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' - * @return {DateTime} - */ - ; - - _proto.startOf = function startOf(unit) { - if (!this.isValid) return this; - var o = {}, - normalizedUnit = Duration.normalizeUnit(unit); - - switch (normalizedUnit) { - case "years": - o.month = 1; - // falls through - - case "quarters": - case "months": - o.day = 1; - // falls through - - case "weeks": - case "days": - o.hour = 0; - // falls through - - case "hours": - o.minute = 0; - // falls through - - case "minutes": - o.second = 0; - // falls through - - case "seconds": - o.millisecond = 0; - break; - // no default, invalid units throw in normalizeUnit() - } - - if (normalizedUnit === "weeks") { - o.weekday = 1; - } - - if (normalizedUnit === "quarters") { - var q = Math.ceil(this.month / 3); - o.month = (q - 1) * 3 + 1; - } - - return this.set(o); - } - /** - * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time - * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. - * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays - * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' - * @return {DateTime} - */ - ; - - _proto.endOf = function endOf(unit) { - var _this$plus; - - return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit).minus(1) : this; - } // OUTPUT - - /** - * Returns a string representation of this DateTime formatted according to the specified format string. - * **You may not want this.** See {@link toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens). - * Defaults to en-US if no locale has been specified, regardless of the system's locale. - * @see https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens - * @param {string} fmt - the format string - * @param {Object} opts - opts to override the configuration options - * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' - * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' - * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' - * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' - * @return {string} - */ - ; - - _proto.toFormat = function toFormat(fmt, opts) { - if (opts === void 0) { - opts = {}; - } - - return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID$2; - } - /** - * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. - * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation - * of the DateTime in the assigned locale. - * Defaults to the system's locale if no locale has been specified - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param opts {Object} - Intl.DateTimeFormat constructor options and configuration options - * @example DateTime.now().toLocaleString(); //=> 4/20/2017 - * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' - * @example DateTime.now().toLocaleString({ locale: 'en-gb' }); //=> '20/04/2017' - * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' - * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' - * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' - * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' - * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' - * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hour12: false }); //=> '11:32' - * @return {string} - */ - ; - - _proto.toLocaleString = function toLocaleString(opts) { - if (opts === void 0) { - opts = DATE_SHORT; - } - - return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2; - } - /** - * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. - * Defaults to the system's locale if no locale has been specified - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts - * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. - * @example DateTime.now().toLocaleParts(); //=> [ - * //=> { type: 'day', value: '25' }, - * //=> { type: 'literal', value: '/' }, - * //=> { type: 'month', value: '05' }, - * //=> { type: 'literal', value: '/' }, - * //=> { type: 'year', value: '1982' } - * //=> ] - */ - ; - - _proto.toLocaleParts = function toLocaleParts(opts) { - if (opts === void 0) { - opts = {}; - } - - return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc(1982, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' - * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' - * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' - * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' - * @return {string} - */ - ; - - _proto.toISO = function toISO(opts) { - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid) { - return null; - } - - return this.toISODate(opts) + "T" + this.toISOTime(opts); - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's date component - * @param {Object} opts - options - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' - * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' - * @return {string} - */ - ; - - _proto.toISODate = function toISODate(_temp3) { - var _ref5 = _temp3 === void 0 ? {} : _temp3, - _ref5$format = _ref5.format, - format = _ref5$format === void 0 ? "extended" : _ref5$format; - - var fmt = format === "basic" ? "yyyyMMdd" : "yyyy-MM-dd"; - - if (this.year > 9999) { - fmt = "+" + fmt; - } - - return toTechFormat(this, fmt); - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's week date - * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' - * @return {string} - */ - ; - - _proto.toISOWeekDate = function toISOWeekDate() { - return toTechFormat(this, "kkkk-'W'WW-c"); - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's time component - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @param {boolean} [opts.includePrefix=false] - include the `T` prefix - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' - * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' - * @return {string} - */ - ; - - _proto.toISOTime = function toISOTime(_temp4) { - var _ref6 = _temp4 === void 0 ? {} : _temp4, - _ref6$suppressMillise = _ref6.suppressMilliseconds, - suppressMilliseconds = _ref6$suppressMillise === void 0 ? false : _ref6$suppressMillise, - _ref6$suppressSeconds = _ref6.suppressSeconds, - suppressSeconds = _ref6$suppressSeconds === void 0 ? false : _ref6$suppressSeconds, - _ref6$includeOffset = _ref6.includeOffset, - includeOffset = _ref6$includeOffset === void 0 ? true : _ref6$includeOffset, - _ref6$includePrefix = _ref6.includePrefix, - includePrefix = _ref6$includePrefix === void 0 ? false : _ref6$includePrefix, - _ref6$format = _ref6.format, - format = _ref6$format === void 0 ? "extended" : _ref6$format; - - return toTechTimeFormat(this, { - suppressSeconds: suppressSeconds, - suppressMilliseconds: suppressMilliseconds, - includeOffset: includeOffset, - includePrefix: includePrefix, - format: format - }); - } - /** - * Returns an RFC 2822-compatible string representation of this DateTime, always in UTC - * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' - * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' - * @return {string} - */ - ; - - _proto.toRFC2822 = function toRFC2822() { - return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); - } - /** - * Returns a string representation of this DateTime appropriate for use in HTTP headers. - * Specifically, the string conforms to RFC 1123. - * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 - * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' - * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' - * @return {string} - */ - ; - - _proto.toHTTP = function toHTTP() { - return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL Date - * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' - * @return {string} - */ - ; - - _proto.toSQLDate = function toSQLDate() { - return toTechFormat(this, "yyyy-MM-dd"); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL Time - * @param {Object} opts - options - * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @example DateTime.utc().toSQL() //=> '05:15:16.345' - * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' - * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' - * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' - * @return {string} - */ - ; - - _proto.toSQLTime = function toSQLTime(_temp5) { - var _ref7 = _temp5 === void 0 ? {} : _temp5, - _ref7$includeOffset = _ref7.includeOffset, - includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, - _ref7$includeZone = _ref7.includeZone, - includeZone = _ref7$includeZone === void 0 ? false : _ref7$includeZone; - - return toTechTimeFormat(this, { - includeOffset: includeOffset, - includeZone: includeZone, - spaceZone: true - }); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL DateTime - * @param {Object} opts - options - * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' - * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' - * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' - * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' - * @return {string} - */ - ; - - _proto.toSQL = function toSQL(opts) { - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid) { - return null; - } - - return this.toSQLDate() + " " + this.toSQLTime(opts); - } - /** - * Returns a string representation of this DateTime appropriate for debugging - * @return {string} - */ - ; - - _proto.toString = function toString() { - return this.isValid ? this.toISO() : INVALID$2; - } - /** - * Returns the epoch milliseconds of this DateTime. Alias of {@link toMillis} - * @return {number} - */ - ; - - _proto.valueOf = function valueOf() { - return this.toMillis(); - } - /** - * Returns the epoch milliseconds of this DateTime. - * @return {number} - */ - ; - - _proto.toMillis = function toMillis() { - return this.isValid ? this.ts : NaN; - } - /** - * Returns the epoch seconds of this DateTime. - * @return {number} - */ - ; - - _proto.toSeconds = function toSeconds() { - return this.isValid ? this.ts / 1000 : NaN; - } - /** - * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. - * @return {string} - */ - ; - - _proto.toJSON = function toJSON() { - return this.toISO(); - } - /** - * Returns a BSON serializable equivalent to this DateTime. - * @return {Date} - */ - ; - - _proto.toBSON = function toBSON() { - return this.toJSDate(); - } - /** - * Returns a JavaScript object with this DateTime's year, month, day, and so on. - * @param opts - options for generating the object - * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output - * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } - * @return {Object} - */ - ; - - _proto.toObject = function toObject(opts) { - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid) return {}; - var base = Object.assign({}, this.c); - - if (opts.includeConfig) { - base.outputCalendar = this.outputCalendar; - base.numberingSystem = this.loc.numberingSystem; - base.locale = this.loc.locale; - } - - return base; - } - /** - * Returns a JavaScript Date equivalent to this DateTime. - * @return {Date} - */ - ; - - _proto.toJSDate = function toJSDate() { - return new Date(this.isValid ? this.ts : NaN); - } // COMPARE - - /** - * Return the difference between two DateTimes as a Duration. - * @param {DateTime} otherDateTime - the DateTime to compare this one to - * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @example - * var i1 = DateTime.fromISO('1982-05-25T09:45'), - * i2 = DateTime.fromISO('1983-10-14T10:30'); - * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } - * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } - * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } - * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } - * @return {Duration} - */ - ; - - _proto.diff = function diff(otherDateTime, unit, opts) { - if (unit === void 0) { - unit = "milliseconds"; - } - - if (opts === void 0) { - opts = {}; - } - - if (!this.isValid || !otherDateTime.isValid) { - return Duration.invalid(this.invalid || otherDateTime.invalid, "created by diffing an invalid DateTime"); - } - - var durOpts = Object.assign({ - locale: this.locale, - numberingSystem: this.numberingSystem - }, opts); - - var units = maybeArray(unit).map(Duration.normalizeUnit), - otherIsLater = otherDateTime.valueOf() > this.valueOf(), - earlier = otherIsLater ? this : otherDateTime, - later = otherIsLater ? otherDateTime : this, - diffed = _diff(earlier, later, units, durOpts); - - return otherIsLater ? diffed.negate() : diffed; - } - /** - * Return the difference between this DateTime and right now. - * See {@link diff} - * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - ; - - _proto.diffNow = function diffNow(unit, opts) { - if (unit === void 0) { - unit = "milliseconds"; - } - - if (opts === void 0) { - opts = {}; - } - - return this.diff(DateTime.now(), unit, opts); - } - /** - * Return an Interval spanning between this DateTime and another DateTime - * @param {DateTime} otherDateTime - the other end point of the Interval - * @return {Interval} - */ - ; - - _proto.until = function until(otherDateTime) { - return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; - } - /** - * Return whether this DateTime is in the same unit of time as another DateTime. - * Higher-order units must also be identical for this function to return `true`. - * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link setZone} to convert one of the dates if needed. - * @param {DateTime} otherDateTime - the other DateTime - * @param {string} unit - the unit of time to check sameness on - * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day - * @return {boolean} - */ - ; - - _proto.hasSame = function hasSame(otherDateTime, unit) { - if (!this.isValid) return false; - var inputMs = otherDateTime.valueOf(); - var otherZoneDateTime = this.setZone(otherDateTime.zone, { - keepLocalTime: true - }); - return otherZoneDateTime.startOf(unit) <= inputMs && inputMs <= otherZoneDateTime.endOf(unit); - } - /** - * Equality check - * Two DateTimes are equal iff they represent the same millisecond, have the same zone and location, and are both valid. - * To compare just the millisecond values, use `+dt1 === +dt2`. - * @param {DateTime} other - the other DateTime - * @return {boolean} - */ - ; - - _proto.equals = function equals(other) { - return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); - } - /** - * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your - * platform supports Intl.RelativeTimeFormat. Rounds down by default. - * @param {Object} options - options that affect the output - * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. - * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" - * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" - * @param {boolean} [options.round=true] - whether to round the numbers in the output. - * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. - * @param {string} options.locale - override the locale of this DateTime - * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this - * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" - * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" - * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" - * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" - * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" - * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" - */ - ; - - _proto.toRelative = function toRelative(options) { - if (options === void 0) { - options = {}; - } - - if (!this.isValid) return null; - var base = options.base || DateTime.fromObject({ - zone: this.zone - }), - padding = options.padding ? this < base ? -options.padding : options.padding : 0; - var units = ["years", "months", "days", "hours", "minutes", "seconds"]; - var unit = options.unit; - - if (Array.isArray(options.unit)) { - units = options.unit; - unit = undefined; - } - - return diffRelative(base, this.plus(padding), Object.assign(options, { - numeric: "always", - units: units, - unit: unit - })); - } - /** - * Returns a string representation of this date relative to today, such as "yesterday" or "next month". - * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. - * @param {Object} options - options that affect the output - * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. - * @param {string} options.locale - override the locale of this DateTime - * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" - * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this - * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" - * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" - * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" - * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" - */ - ; - - _proto.toRelativeCalendar = function toRelativeCalendar(options) { - if (options === void 0) { - options = {}; - } - - if (!this.isValid) return null; - return diffRelative(options.base || DateTime.fromObject({ - zone: this.zone - }), this, Object.assign(options, { - numeric: "auto", - units: ["years", "months", "days"], - calendary: true - })); - } - /** - * Return the min of several date times - * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum - * @return {DateTime} the min DateTime, or undefined if called with no argument - */ - ; - - DateTime.min = function min() { - for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { - dateTimes[_key] = arguments[_key]; - } - - if (!dateTimes.every(DateTime.isDateTime)) { - throw new InvalidArgumentError("min requires all arguments be DateTimes"); - } - - return bestBy(dateTimes, function (i) { - return i.valueOf(); - }, Math.min); - } - /** - * Return the max of several date times - * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum - * @return {DateTime} the max DateTime, or undefined if called with no argument - */ - ; - - DateTime.max = function max() { - for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - dateTimes[_key2] = arguments[_key2]; - } - - if (!dateTimes.every(DateTime.isDateTime)) { - throw new InvalidArgumentError("max requires all arguments be DateTimes"); - } - - return bestBy(dateTimes, function (i) { - return i.valueOf(); - }, Math.max); - } // MISC - - /** - * Explain how a string would be parsed by fromFormat() - * @param {string} text - the string to parse - * @param {string} fmt - the format the string is expected to be in (see description) - * @param {Object} options - options taken by fromFormat() - * @return {Object} - */ - ; - - DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { - if (options === void 0) { - options = {}; - } - - var _options = options, - _options$locale = _options.locale, - locale = _options$locale === void 0 ? null : _options$locale, - _options$numberingSys = _options.numberingSystem, - numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, - localeToUse = Locale.fromOpts({ - locale: locale, - numberingSystem: numberingSystem, - defaultToEN: true - }); - return explainFromTokens(localeToUse, text, fmt); - } - /** - * @deprecated use fromFormatExplain instead - */ - ; - - DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { - if (options === void 0) { - options = {}; - } - - return DateTime.fromFormatExplain(text, fmt, options); - } // FORMAT PRESETS - - /** - * {@link toLocaleString} format like 10/14/1983 - * @type {Object} - */ - ; - - _createClass(DateTime, [{ - key: "isValid", - get: function get() { - return this.invalid === null; - } - /** - * Returns an error code if this DateTime is invalid, or null if the DateTime is valid - * @type {string} - */ - - }, { - key: "invalidReason", - get: function get() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid - * @type {string} - */ - - }, { - key: "invalidExplanation", - get: function get() { - return this.invalid ? this.invalid.explanation : null; - } - /** - * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime - * - * @type {string} - */ - - }, { - key: "locale", - get: function get() { - return this.isValid ? this.loc.locale : null; - } - /** - * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime - * - * @type {string} - */ - - }, { - key: "numberingSystem", - get: function get() { - return this.isValid ? this.loc.numberingSystem : null; - } - /** - * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime - * - * @type {string} - */ - - }, { - key: "outputCalendar", - get: function get() { - return this.isValid ? this.loc.outputCalendar : null; - } - /** - * Get the time zone associated with this DateTime. - * @type {Zone} - */ - - }, { - key: "zone", - get: function get() { - return this._zone; - } - /** - * Get the name of the time zone. - * @type {string} - */ - - }, { - key: "zoneName", - get: function get() { - return this.isValid ? this.zone.name : null; - } - /** - * Get the year - * @example DateTime.local(2017, 5, 25).year //=> 2017 - * @type {number} - */ - - }, { - key: "year", - get: function get() { - return this.isValid ? this.c.year : NaN; - } - /** - * Get the quarter - * @example DateTime.local(2017, 5, 25).quarter //=> 2 - * @type {number} - */ - - }, { - key: "quarter", - get: function get() { - return this.isValid ? Math.ceil(this.c.month / 3) : NaN; - } - /** - * Get the month (1-12). - * @example DateTime.local(2017, 5, 25).month //=> 5 - * @type {number} - */ - - }, { - key: "month", - get: function get() { - return this.isValid ? this.c.month : NaN; - } - /** - * Get the day of the month (1-30ish). - * @example DateTime.local(2017, 5, 25).day //=> 25 - * @type {number} - */ - - }, { - key: "day", - get: function get() { - return this.isValid ? this.c.day : NaN; - } - /** - * Get the hour of the day (0-23). - * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 - * @type {number} - */ - - }, { - key: "hour", - get: function get() { - return this.isValid ? this.c.hour : NaN; - } - /** - * Get the minute of the hour (0-59). - * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 - * @type {number} - */ - - }, { - key: "minute", - get: function get() { - return this.isValid ? this.c.minute : NaN; - } - /** - * Get the second of the minute (0-59). - * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 - * @type {number} - */ - - }, { - key: "second", - get: function get() { - return this.isValid ? this.c.second : NaN; - } - /** - * Get the millisecond of the second (0-999). - * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 - * @type {number} - */ - - }, { - key: "millisecond", - get: function get() { - return this.isValid ? this.c.millisecond : NaN; - } - /** - * Get the week year - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 - * @type {number} - */ - - }, { - key: "weekYear", - get: function get() { - return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; - } - /** - * Get the week number of the week year (1-52ish). - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 - * @type {number} - */ - - }, { - key: "weekNumber", - get: function get() { - return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; - } - /** - * Get the day of the week. - * 1 is Monday and 7 is Sunday - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2014, 11, 31).weekday //=> 4 - * @type {number} - */ - - }, { - key: "weekday", - get: function get() { - return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; - } - /** - * Get the ordinal (meaning the day of the year) - * @example DateTime.local(2017, 5, 25).ordinal //=> 145 - * @type {number|DateTime} - */ - - }, { - key: "ordinal", - get: function get() { - return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; - } - /** - * Get the human readable short month name, such as 'Oct'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).monthShort //=> Oct - * @type {string} - */ - - }, { - key: "monthShort", - get: function get() { - return this.isValid ? Info.months("short", { - locObj: this.loc - })[this.month - 1] : null; - } - /** - * Get the human readable long month name, such as 'October'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).monthLong //=> October - * @type {string} - */ - - }, { - key: "monthLong", - get: function get() { - return this.isValid ? Info.months("long", { - locObj: this.loc - })[this.month - 1] : null; - } - /** - * Get the human readable short weekday, such as 'Mon'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon - * @type {string} - */ - - }, { - key: "weekdayShort", - get: function get() { - return this.isValid ? Info.weekdays("short", { - locObj: this.loc - })[this.weekday - 1] : null; - } - /** - * Get the human readable long weekday, such as 'Monday'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday - * @type {string} - */ - - }, { - key: "weekdayLong", - get: function get() { - return this.isValid ? Info.weekdays("long", { - locObj: this.loc - })[this.weekday - 1] : null; - } - /** - * Get the UTC offset of this DateTime in minutes - * @example DateTime.now().offset //=> -240 - * @example DateTime.utc().offset //=> 0 - * @type {number} - */ - - }, { - key: "offset", - get: function get() { - return this.isValid ? +this.o : NaN; - } - /** - * Get the short human name for the zone's current offset, for example "EST" or "EDT". - * Defaults to the system's locale if no locale has been specified - * @type {string} - */ - - }, { - key: "offsetNameShort", - get: function get() { - if (this.isValid) { - return this.zone.offsetName(this.ts, { - format: "short", - locale: this.locale + return str; + }; + _proto.toJSON = function toJSON() { + return this.toISO(); + }; + _proto.toString = function toString() { + return this.toISO(); + }; + _proto.toMillis = function toMillis() { + return this.as("milliseconds"); + }; + _proto.valueOf = function valueOf() { + return this.toMillis(); + }; + _proto.plus = function plus(duration) { + if (!this.isValid) + return this; + var dur = friendlyDuration(duration), result = {}; + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits), _step; !(_step = _iterator()).done; ) { + var k = _step.value; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone(this, { + values: result + }, true); + }; + _proto.minus = function minus(duration) { + if (!this.isValid) + return this; + var dur = friendlyDuration(duration); + return this.plus(dur.negate()); + }; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) + return this; + var result = {}; + for (var _i = 0, _Object$keys = Object.keys(this.values); _i < _Object$keys.length; _i++) { + var k = _Object$keys[_i]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone(this, { + values: result + }, true); + }; + _proto.get = function get(unit) { + return this[Duration2.normalizeUnit(unit)]; + }; + _proto.set = function set(values) { + if (!this.isValid) + return this; + var mixed = Object.assign(this.values, normalizeObject(values, Duration2.normalizeUnit, [])); + return clone(this, { + values: mixed }); - } else { - return null; - } - } - /** - * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". - * Defaults to the system's locale if no locale has been specified - * @type {string} - */ - - }, { - key: "offsetNameLong", - get: function get() { - if (this.isValid) { - return this.zone.offsetName(this.ts, { - format: "long", - locale: this.locale + }; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, locale = _ref.locale, numberingSystem = _ref.numberingSystem, conversionAccuracy = _ref.conversionAccuracy; + var loc = this.loc.clone({ + locale, + numberingSystem + }), opts = { + loc + }; + if (conversionAccuracy) { + opts.conversionAccuracy = conversionAccuracy; + } + return clone(this, opts); + }; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + }; + _proto.normalize = function normalize() { + if (!this.isValid) + return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone(this, { + values: vals + }, true); + }; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) + return this; + if (units.length === 0) { + return this; + } + units = units.map(function(u) { + return Duration2.normalizeUnit(u); }); + var built = {}, accumulated = {}, vals = this.toObject(); + var lastUnit; + for (var _iterator2 = _createForOfIteratorHelperLoose(orderedUnits), _step2; !(_step2 = _iterator2()).done; ) { + var k = _step2.value; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + if (isNumber2(vals[k])) { + own += vals[k]; + } + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = own - i; + for (var down in vals) { + if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) { + convert(this.matrix, vals, down, built, k); + } + } + } else if (isNumber2(vals[k])) { + accumulated[k] = vals[k]; + } + } + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + return clone(this, { + values: built + }, true).normalize(); + }; + _proto.negate = function negate() { + if (!this.isValid) + return this; + var negated = {}; + for (var _i2 = 0, _Object$keys2 = Object.keys(this.values); _i2 < _Object$keys2.length; _i2++) { + var k = _Object$keys2[_i2]; + negated[k] = -this.values[k]; + } + return clone(this, { + values: negated + }, true); + }; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + if (v1 === void 0 || v1 === 0) + return v2 === void 0 || v2 === 0; + return v1 === v2; + } + for (var _iterator3 = _createForOfIteratorHelperLoose(orderedUnits), _step3; !(_step3 = _iterator3()).done; ) { + var u = _step3.value; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration2, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration2; + }(); + function friendlyDuration(durationish) { + if (isNumber2(durationish)) { + return Duration.fromMillis(durationish); + } else if (Duration.isDuration(durationish)) { + return durationish; + } else if (typeof durationish === "object") { + return Duration.fromObject(durationish); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationish + " of type " + typeof durationish); + } + } + var INVALID$1 = "Invalid Interval"; + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); } else { return null; } } - /** - * Get whether this zone's offset ever changes, as in a DST. - * @type {boolean} - */ - - }, { - key: "isOffsetFixed", - get: function get() { - return this.isValid ? this.zone.universal : null; - } - /** - * Get whether the DateTime is in a DST. - * @type {boolean} - */ - - }, { - key: "isInDST", - get: function get() { - if (this.isOffsetFixed) { - return false; - } else { - return this.offset > this.set({ - month: 1 - }).offset || this.offset > this.set({ - month: 5 + var Interval = /* @__PURE__ */ function() { + function Interval2(config) { + this.s = config.start; + this.e = config.end; + this.invalid = config.invalid || null; + this.isLuxonInterval = true; + } + Interval2.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid2); + } else { + return new Interval2({ + invalid: invalid2 + }); + } + }; + Interval2.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval2({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + }; + Interval2.after = function after(start, duration) { + var dur = friendlyDuration(duration), dt = friendlyDateTime(start); + return Interval2.fromDateTimes(dt, dt.plus(dur)); + }; + Interval2.before = function before(end, duration) { + var dur = friendlyDuration(duration), dt = friendlyDateTime(end); + return Interval2.fromDateTimes(dt.minus(dur), dt); + }; + Interval2.fromISO = function fromISO(text2, opts) { + var _split = (text2 || "").split("/", 2), s2 = _split[0], e = _split[1]; + if (s2 && e) { + var start, startIsValid; + try { + start = DateTime3.fromISO(s2, opts); + startIsValid = start.isValid; + } catch (e2) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime3.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e2) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval2.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval2.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s2, opts); + if (_dur.isValid) { + return Interval2.before(end, _dur); + } + } + } + return Interval2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + }; + Interval2.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + }; + var _proto = Interval2.prototype; + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + }; + _proto.count = function count(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) + return NaN; + var start = this.start.startOf(unit), end = this.end.startOf(unit); + return Math.floor(end.diff(start, unit).get(unit)) + 1; + }; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + }; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + }; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) + return false; + return this.s > dateTime; + }; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) + return false; + return this.e <= dateTime; + }; + _proto.contains = function contains2(dateTime) { + if (!this.isValid) + return false; + return this.s <= dateTime && this.e > dateTime; + }; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, start = _ref.start, end = _ref.end; + if (!this.isValid) + return this; + return Interval2.fromDateTimes(start || this.s, end || this.e); + }; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) + return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function(d) { + return _this.contains(d); + }).sort(), results = []; + var s2 = this.s, i = 0; + while (s2 < this.e) { + var added = sorted[i] || this.e, next = +added > +this.e ? this.e : added; + results.push(Interval2.fromDateTimes(s2, next)); + s2 = next; + i += 1; + } + return results; + }; + _proto.splitBy = function splitBy(duration) { + var dur = friendlyDuration(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s2 = this.s, idx = 1, next; + var results = []; + while (s2 < this.e) { + var added = this.start.plus(dur.mapUnits(function(x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval2.fromDateTimes(s2, next)); + s2 = next; + idx += 1; + } + return results; + }; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) + return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + }; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + }; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) + return false; + return +this.e === +other.s; + }; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) + return false; + return +other.e === +this.s; + }; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) + return false; + return this.s <= other.s && this.e >= other.e; + }; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + }; + _proto.intersection = function intersection(other) { + if (!this.isValid) + return this; + var s2 = this.s > other.s ? this.s : other.s, e = this.e < other.e ? this.e : other.e; + if (s2 >= e) { + return null; + } else { + return Interval2.fromDateTimes(s2, e); + } + }; + _proto.union = function union(other) { + if (!this.isValid) + return this; + var s2 = this.s < other.s ? this.s : other.s, e = this.e > other.e ? this.e : other.e; + return Interval2.fromDateTimes(s2, e); + }; + Interval2.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function(a, b) { + return a.s - b.s; + }).reduce(function(_ref2, item) { + var sofar = _ref2[0], current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), found = _intervals$sort$reduc[0], final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + }; + Interval2.xor = function xor(intervals) { + var _Array$prototype; + var start = null, currentCount = 0; + var results = [], ends = intervals.map(function(i2) { + return [{ + time: i2.s, + type: "s" + }, { + time: i2.e, + type: "e" + }]; + }), flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), arr = flattened.sort(function(a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done; ) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval2.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval2.merge(results); + }; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval2.xor([this].concat(intervals)).map(function(i) { + return _this2.intersection(i); + }).filter(function(i) { + return i && !i.isEmpty(); + }); + }; + _proto.toString = function toString() { + if (!this.isValid) + return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + }; + _proto.toISO = function toISO(opts) { + if (!this.isValid) + return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + }; + _proto.toISODate = function toISODate() { + if (!this.isValid) + return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + }; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) + return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + }; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, _ref3$separator = _ref3.separator, separator = _ref3$separator === void 0 ? " \u2013 " : _ref3$separator; + if (!this.isValid) + return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + }; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + }; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval2.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval2, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval2; + }(); + var Info = /* @__PURE__ */ function() { + function Info2() { + } + Info2.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime3.now().setZone(zone).set({ + month: 12 + }); + return !zone.universal && proto.offset !== proto.set({ + month: 6 }).offset; + }; + Info2.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone); + }; + Info2.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + }; + Info2.months = function months2(length, _temp) { + if (length === void 0) { + length = "long"; + } + var _ref = _temp === void 0 ? {} : _temp, _ref$locale = _ref.locale, locale = _ref$locale === void 0 ? null : _ref$locale, _ref$numberingSystem = _ref.numberingSystem, numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem, _ref$locObj = _ref.locObj, locObj = _ref$locObj === void 0 ? null : _ref$locObj, _ref$outputCalendar = _ref.outputCalendar, outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + }; + Info2.monthsFormat = function monthsFormat(length, _temp2) { + if (length === void 0) { + length = "long"; + } + var _ref2 = _temp2 === void 0 ? {} : _temp2, _ref2$locale = _ref2.locale, locale = _ref2$locale === void 0 ? null : _ref2$locale, _ref2$numberingSystem = _ref2.numberingSystem, numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem, _ref2$locObj = _ref2.locObj, locObj = _ref2$locObj === void 0 ? null : _ref2$locObj, _ref2$outputCalendar = _ref2.outputCalendar, outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + }; + Info2.weekdays = function weekdays2(length, _temp3) { + if (length === void 0) { + length = "long"; + } + var _ref3 = _temp3 === void 0 ? {} : _temp3, _ref3$locale = _ref3.locale, locale = _ref3$locale === void 0 ? null : _ref3$locale, _ref3$numberingSystem = _ref3.numberingSystem, numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem, _ref3$locObj = _ref3.locObj, locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + }; + Info2.weekdaysFormat = function weekdaysFormat(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, _ref4$locale = _ref4.locale, locale = _ref4$locale === void 0 ? null : _ref4$locale, _ref4$numberingSystem = _ref4.numberingSystem, numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, _ref4$locObj = _ref4.locObj, locObj = _ref4$locObj === void 0 ? null : _ref4$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + }; + Info2.meridiems = function meridiems2(_temp5) { + var _ref5 = _temp5 === void 0 ? {} : _temp5, _ref5$locale = _ref5.locale, locale = _ref5$locale === void 0 ? null : _ref5$locale; + return Locale.create(locale).meridiems(); + }; + Info2.eras = function eras2(length, _temp6) { + if (length === void 0) { + length = "short"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, _ref6$locale = _ref6.locale, locale = _ref6$locale === void 0 ? null : _ref6$locale; + return Locale.create(locale, null, "gregory").eras(length); + }; + Info2.features = function features() { + var intl = false, intlTokens = false, zones = false, relative = false; + if (hasIntl()) { + intl = true; + intlTokens = hasFormatToParts(); + relative = hasRelative(); + try { + zones = new Intl.DateTimeFormat("en", { + timeZone: "America/New_York" + }).resolvedOptions().timeZone === "America/New_York"; + } catch (e) { + zones = false; + } + } + return { + intl, + intlTokens, + zones, + relative + }; + }; + return Info2; + }(); + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart2(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function(a, b) { + return b.year - a.year; + }], ["quarters", function(a, b) { + return b.quarter - a.quarter; + }], ["months", function(a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function(a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var lowestOrder, highWater; + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], unit = _differs$_i[0], differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + var _cursor$plus; + lowestOrder = unit; + var delta = differ(cursor, later); + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[unit] = delta, _cursor$plus)); + if (highWater > later) { + var _cursor$plus2; + cursor = cursor.plus((_cursor$plus2 = {}, _cursor$plus2[unit] = delta - 1, _cursor$plus2)); + delta -= 1; + } else { + cursor = highWater; + } + results[unit] = delta; + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff(earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), cursor = _highOrderDiffs[0], results = _highOrderDiffs[1], highWater = _highOrderDiffs[2], lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function(u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus3; + highWater = cursor.plus((_cursor$plus3 = {}, _cursor$plus3[lowestOrder] = 1, _cursor$plus3)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(Object.assign(results, opts)); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; } } - /** - * Returns true if this DateTime is in a leap year, false otherwise - * @example DateTime.local(2016).isInLeapYear //=> true - * @example DateTime.local(2013).isInLeapYear //=> false - * @type {boolean} - */ - - }, { - key: "isInLeapYear", - get: function get() { - return isLeapYear(this.year); + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], min = _numberingSystemsUTF[0], max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } } - /** - * Returns the number of days in this DateTime's month - * @example DateTime.local(2016, 2).daysInMonth //=> 29 - * @example DateTime.local(2016, 3).daysInMonth //=> 31 - * @type {number} - */ - - }, { - key: "daysInMonth", - get: function get() { - return daysInMonth(this.year, this.month); + function digitRegex(_ref, append2) { + var numberingSystem = _ref.numberingSystem; + if (append2 === void 0) { + append2 = ""; + } + return new RegExp("" + numberingSystems[numberingSystem || "latn"] + append2); } - /** - * Returns the number of days in this DateTime's year - * @example DateTime.local(2016).daysInYear //=> 366 - * @example DateTime.local(2013).daysInYear //=> 365 - * @type {number} - */ - - }, { - key: "daysInYear", - get: function get() { - return this.isValid ? daysInYear(this.year) : NaN; + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post2(i) { + return i; + }; + } + return { + regex, + deser: function deser(_ref) { + var s2 = _ref[0]; + return post(parseDigits(s2)); + } + }; } - /** - * Returns the number of weeks in this DateTime's year - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2004).weeksInWeekYear //=> 53 - * @example DateTime.local(2013).weeksInWeekYear //=> 52 - * @type {number} - */ - - }, { - key: "weeksInWeekYear", - get: function get() { - return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "( |" + NBSP + ")"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s2) { + return s2.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); } - }], [{ - key: "DATE_SHORT", - get: function get() { - return DATE_SHORT; + function stripInsensitivities(s2) { + return s2.replace(/\./g, "").replace(spaceOrNBSPRegExp, " ").toLowerCase(); } - /** - * {@link toLocaleString} format like 'Oct 14, 1983' - * @type {Object} - */ - - }, { - key: "DATE_MED", - get: function get() { - return DATE_MED; + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s2 = _ref2[0]; + return strings.findIndex(function(i) { + return stripInsensitivities(s2) === stripInsensitivities(i); + }) + startIndex; + } + }; + } } - /** - * {@link toLocaleString} format like 'Fri, Oct 14, 1983' - * @type {Object} - */ - - }, { - key: "DATE_MED_WITH_WEEKDAY", - get: function get() { - return DATE_MED_WITH_WEEKDAY; + function offset(regex, groups) { + return { + regex, + deser: function deser(_ref3) { + var h = _ref3[1], m = _ref3[2]; + return signedOffset(h, m); + }, + groups + }; } - /** - * {@link toLocaleString} format like 'October 14, 1983' - * @type {Object} - */ - - }, { - key: "DATE_FULL", - get: function get() { - return DATE_FULL; + function simple(regex) { + return { + regex, + deser: function deser(_ref4) { + var s2 = _ref4[0]; + return s2; + } + }; } - /** - * {@link toLocaleString} format like 'Tuesday, October 14, 1983' - * @type {Object} - */ - - }, { - key: "DATE_HUGE", - get: function get() { - return DATE_HUGE; + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); } - /** - * {@link toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "TIME_SIMPLE", - get: function get() { - return TIME_SIMPLE; + function unitForToken(token, loc) { + var one = digitRegex(loc), two = digitRegex(loc, "{2}"), three = digitRegex(loc, "{3}"), four = digitRegex(loc, "{4}"), six = digitRegex(loc, "{6}"), oneOrTwo = digitRegex(loc, "{1,2}"), oneToThree = digitRegex(loc, "{1,3}"), oneToSix = digitRegex(loc, "{1,6}"), oneToNine = digitRegex(loc, "{1,9}"), twoToFour = digitRegex(loc, "{2,4}"), fourToSix = digitRegex(loc, "{4,6}"), literal = function literal2(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s2 = _ref5[0]; + return s2; + }, + literal: true + }; + }, unitate = function unitate2(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + case "G": + return oneOf(loc.eras("short", false), 0); + case "GG": + return oneOf(loc.eras("long", false), 0); + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true, false), 1); + case "MMMM": + return oneOf(loc.months("long", true, false), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false, false), 1); + case "LLLL": + return oneOf(loc.months("long", false, false), 1); + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "a": + return oneOf(loc.meridiems(), 0); + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false, false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false, false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true, false), 1); + case "cccc": + return oneOf(loc.weekdays("long", true, false), 1); + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; } - /** - * {@link toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "TIME_WITH_SECONDS", - get: function get() { - return TIME_WITH_SECONDS; + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour: { + numeric: "h", + "2-digit": "hh" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + } + }; + function tokenForPart(part, locale, formatOpts) { + var type = part.type, value = part.value; + if (type === "literal") { + return { + literal: true, + val: value + }; + } + var style = formatOpts[type]; + var val = partTypeStyleToTokenVal[type]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val + }; + } + return void 0; } - /** - * {@link toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "TIME_WITH_SHORT_OFFSET", - get: function get() { - return TIME_WITH_SHORT_OFFSET; + function buildRegex(units) { + var re = units.map(function(u) { + return u.regex; + }).reduce(function(f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; } - /** - * {@link toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "TIME_WITH_LONG_OFFSET", - get: function get() { - return TIME_WITH_LONG_OFFSET; + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } } - /** - * {@link toLocaleString} format like '09:30', always 24-hour. - * @type {Object} - */ - - }, { - key: "TIME_24_SIMPLE", - get: function get() { - return TIME_24_SIMPLE; + function dateTimeFromMatches(matches) { + var toField = function toField2(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone; + if (!isUndefined(matches.Z)) { + zone = new FixedOffsetZone(matches.Z); + } else if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } else { + zone = null; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function(r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone]; } - /** - * {@link toLocaleString} format like '09:30:23', always 24-hour. - * @type {Object} - */ - - }, { - key: "TIME_24_WITH_SECONDS", - get: function get() { - return TIME_24_WITH_SECONDS; + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime3.fromMillis(1555555555555); + } + return dummyDateTimeCache; } - /** - * {@link toLocaleString} format like '09:30:23 EDT', always 24-hour. - * @type {Object} - */ - - }, { - key: "TIME_24_WITH_SHORT_OFFSET", - get: function get() { - return TIME_24_WITH_SHORT_OFFSET; + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + if (!formatOpts) { + return token; + } + var formatter = Formatter.create(locale, formatOpts); + var parts = formatter.formatDateTimeParts(getDummyDateTime()); + var tokens = parts.map(function(p) { + return tokenForPart(p, locale, formatOpts); + }); + if (tokens.includes(void 0)) { + return token; + } + return tokens; } - /** - * {@link toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. - * @type {Object} - */ - - }, { - key: "TIME_24_WITH_LONG_OFFSET", - get: function get() { - return TIME_24_WITH_LONG_OFFSET; + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function(t) { + return maybeExpandMacroToken(t, locale); + })); } - /** - * {@link toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_SHORT", - get: function get() { - return DATETIME_SHORT; + function explainFromTokens(locale, input, format) { + var tokens = expandMacroTokens(Formatter.parseFormat(format), locale), units = tokens.map(function(t) { + return unitForToken(t, locale); + }), disqualifyingUnit = units.find(function(t) { + return t.invalidReason; + }); + if (disqualifyingUnit) { + return { + input, + tokens, + invalidReason: disqualifyingUnit.invalidReason + }; + } else { + var _buildRegex = buildRegex(units), regexString = _buildRegex[0], handlers = _buildRegex[1], regex = RegExp(regexString, "i"), _match = match(input, regex, handlers), rawMatches = _match[0], matches = _match[1], _ref6 = matches ? dateTimeFromMatches(matches) : [null, null], result = _ref6[0], zone = _ref6[1]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input, + tokens, + regex, + rawMatches, + matches, + result, + zone + }; + } } - /** - * {@link toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_SHORT_WITH_SECONDS", - get: function get() { - return DATETIME_SHORT_WITH_SECONDS; + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), result = _explainFromTokens.result, zone = _explainFromTokens.zone, invalidReason = _explainFromTokens.invalidReason; + return [result, zone, invalidReason]; } - /** - * {@link toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_MED", - get: function get() { - return DATETIME_MED; + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + var leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); } - /** - * {@link toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_MED_WITH_SECONDS", - get: function get() { - return DATETIME_MED_WITH_SECONDS; + function dayOfWeek(year, month, day) { + var js = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); + return js === 0 ? 7 : js; } - /** - * {@link toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_MED_WITH_WEEKDAY", - get: function get() { - return DATETIME_MED_WITH_WEEKDAY; + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; } - /** - * {@link toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_FULL", - get: function get() { - return DATETIME_FULL; + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, month0 = table.findIndex(function(i) { + return i < ordinal; + }), day = ordinal - table[month0]; + return { + month: month0 + 1, + day + }; } - /** - * {@link toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_FULL_WITH_SECONDS", - get: function get() { - return DATETIME_FULL_WITH_SECONDS; + function gregorianToWeek(gregObj) { + var year = gregObj.year, month = gregObj.month, day = gregObj.day, ordinal = computeOrdinal(year, month, day), weekday = dayOfWeek(year, month, day); + var weekNumber = Math.floor((ordinal - weekday + 10) / 7), weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear); + } else if (weekNumber > weeksInWeekYear(year)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return Object.assign({ + weekYear, + weekNumber, + weekday + }, timeObject(gregObj)); } - /** - * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_HUGE", - get: function get() { - return DATETIME_HUGE; + function weekToGregorian(weekData) { + var weekYear = weekData.weekYear, weekNumber = weekData.weekNumber, weekday = weekData.weekday, weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3, year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), month = _uncomputeOrdinal.month, day = _uncomputeOrdinal.day; + return Object.assign({ + year, + month, + day + }, timeObject(weekData)); } - /** - * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - }, { - key: "DATETIME_HUGE_WITH_SECONDS", - get: function get() { - return DATETIME_HUGE_WITH_SECONDS; + function gregorianToOrdinal(gregData) { + var year = gregData.year, month = gregData.month, day = gregData.day, ordinal = computeOrdinal(year, month, day); + return Object.assign({ + year, + ordinal + }, timeObject(gregData)); } - }]); - - return DateTime; -}(); -function friendlyDateTime(dateTimeish) { - if (DateTime.isDateTime(dateTimeish)) { - return dateTimeish; - } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { - return DateTime.fromJSDate(dateTimeish); - } else if (dateTimeish && typeof dateTimeish === "object") { - return DateTime.fromObject(dateTimeish); - } else { - throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, ordinal = ordinalData.ordinal, _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), month = _uncomputeOrdinal2.month, day = _uncomputeOrdinal2.day; + return Object.assign({ + year, + month, + day + }, timeObject(ordinalData)); + } + function hasInvalidWeekData(obj) { + var validYear = isInteger(obj.weekYear), validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.week); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else + return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else + return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), validMonth = integerBetween(obj.month, 1, 12), validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else + return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, minute = obj.minute, second = obj.second, millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, validMinute = integerBetween(minute, 0, 59), validSecond = integerBetween(second, 0, 59), validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else + return false; + } + var INVALID$2 = "Invalid DateTime"; + var MAX_DATE = 864e13; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", 'the zone "' + zone.name + '" is not supported'); + } + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + function clone$1(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime3(Object.assign({}, current, alts, { + old: current + })); + } + function fixOffset(localTS, o, tz) { + var utcGuess = localTS - o * 60 * 1e3; + var o2 = tz.offset(utcGuess); + if (o === o2) { + return [utcGuess, o]; + } + utcGuess -= (o2 - o) * 60 * 1e3; + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + return [localTS - Math.min(o2, o3) * 60 * 1e3, Math.max(o2, o3)]; + } + function tsToObj(ts, offset2) { + ts += offset2 * 60 * 1e3; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + function objToTS(obj, offset2, zone) { + return fixOffset(objToLocalTS(obj), offset2, zone); + } + function adjustTime(inst, dur) { + var oPre = inst.o, year = inst.c.year + Math.trunc(dur.years), month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, c = Object.assign({}, inst.c, { + year, + month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), ts = _fixOffset[0], o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + o = inst.zone.offset(ts); + } + return { + ts, + o + }; + } + function parseDataToDateTime(parsed, parsedZone, opts, format, text2) { + var setZone = opts.setZone, zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0) { + var interpretationZone = parsedZone || zone, inst = DateTime3.fromObject(Object.assign(parsed, opts, { + zone: interpretationZone, + setZone: void 0 + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime3.invalid(new Invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ` + format)); + } + } + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } + function toTechTimeFormat(dt, _ref) { + var _ref$suppressSeconds = _ref.suppressSeconds, suppressSeconds = _ref$suppressSeconds === void 0 ? false : _ref$suppressSeconds, _ref$suppressMillisec = _ref.suppressMilliseconds, suppressMilliseconds = _ref$suppressMillisec === void 0 ? false : _ref$suppressMillisec, includeOffset = _ref.includeOffset, _ref$includePrefix = _ref.includePrefix, includePrefix = _ref$includePrefix === void 0 ? false : _ref$includePrefix, _ref$includeZone = _ref.includeZone, includeZone = _ref$includeZone === void 0 ? false : _ref$includeZone, _ref$spaceZone = _ref.spaceZone, spaceZone = _ref$spaceZone === void 0 ? false : _ref$spaceZone, _ref$format = _ref.format, format = _ref$format === void 0 ? "extended" : _ref$format; + var fmt = format === "basic" ? "HHmm" : "HH:mm"; + if (!suppressSeconds || dt.second !== 0 || dt.millisecond !== 0) { + fmt += format === "basic" ? "ss" : ":ss"; + if (!suppressMilliseconds || dt.millisecond !== 0) { + fmt += ".SSS"; + } + } + if ((includeZone || includeOffset) && spaceZone) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += format === "basic" ? "ZZZ" : "ZZ"; + } + var str = toTechFormat(dt, fmt); + if (includePrefix) { + str = "T" + str; + } + return str; + } + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var orderedUnits$1 = ["year", "month", "day", "hour", "minute", "second", "millisecond"]; + var orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"]; + var orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) + throw new InvalidUnitError(unit); + return normalized; + } + function quickDT(obj, zone) { + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits$1), _step; !(_step = _iterator()).done; ) { + var u = _step.value; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime3.invalid(invalid); + } + var tsNow = Settings.now(), offsetProvis = zone.offset(tsNow), _objToTS = objToTS(obj, offsetProvis, zone), ts = _objToTS[0], o = _objToTS[1]; + return new DateTime3({ + ts, + zone, + o + }); + } + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, format = function format2(c, unit2) { + c = roundTo(c, round || opts.calendary ? 0 : 2, true); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit2); + }, differ = function differ2(unit2) { + if (opts.calendary) { + if (!end.hasSame(start, unit2)) { + return end.startOf(unit2).diff(start.startOf(unit2), unit2).get(unit2); + } else + return 0; + } else { + return end.diff(start, unit2).get(unit2); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator2 = _createForOfIteratorHelperLoose(opts.units), _step2; !(_step2 = _iterator2()).done; ) { + var unit = _step2.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + var DateTime3 = /* @__PURE__ */ function() { + function DateTime4(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref2 = [config.old.c, config.old.o]; + c = _ref2[0]; + o = _ref2[1]; + } else { + var ot = zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + this._zone = zone; + this.loc = config.loc || Locale.create(); + this.invalid = invalid; + this.weekData = null; + this.c = c; + this.o = o; + this.isLuxonDateTime = true; + } + DateTime4.now = function now2() { + return new DateTime4({}); + }; + DateTime4.local = function local(year, month, day, hour, minute, second, millisecond) { + if (isUndefined(year)) { + return DateTime4.now(); + } else { + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, Settings.defaultZone); + } + }; + DateTime4.utc = function utc(year, month, day, hour, minute, second, millisecond) { + if (isUndefined(year)) { + return new DateTime4({ + ts: Settings.now(), + zone: FixedOffsetZone.utcInstance + }); + } else { + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, FixedOffsetZone.utcInstance); + } + }; + DateTime4.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime4.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime4.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime4({ + ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + }; + DateTime4.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber2(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + return DateTime4.invalid("Timestamp out of range"); + } else { + return new DateTime4({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + }; + DateTime4.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber2(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime4({ + ts: seconds * 1e3, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + }; + DateTime4.fromObject = function fromObject(obj) { + var zoneToUse = normalizeZone(obj.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime4.invalid(unsupportedZone(zoneToUse)); + } + var tsNow = Settings.now(), offsetProvis = zoneToUse.offset(tsNow), normalized = normalizeObject(obj, normalizeUnit, ["zone", "locale", "outputCalendar", "numberingSystem"]), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber, loc = Locale.fromObject(obj); + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + var units, defaultValues, objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits$1; + defaultValues = defaultUnitValues; + } + var foundFirst = false; + for (var _iterator3 = _createForOfIteratorHelperLoose(units), _step3; !(_step3 = _iterator3()).done; ) { + var u = _step3.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime4.invalid(invalid); + } + var gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), tsFinal = _objToTS2[0], offsetFinal = _objToTS2[1], inst = new DateTime4({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc + }); + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime4.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + return inst; + }; + DateTime4.fromISO = function fromISO(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text2), vals = _parseISODate[0], parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text2); + }; + DateTime4.fromRFC2822 = function fromRFC2822(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text2), vals = _parseRFC2822Date[0], parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text2); + }; + DateTime4.fromHTTP = function fromHTTP(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text2), vals = _parseHTTPDate[0], parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + }; + DateTime4.fromFormat = function fromFormat(text2, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text2) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, _opts$locale = _opts.locale, locale = _opts$locale === void 0 ? null : _opts$locale, _opts$numberingSystem = _opts.numberingSystem, numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }), _parseFromTokens = parseFromTokens(localeToUse, text2, fmt), vals = _parseFromTokens[0], parsedZone = _parseFromTokens[1], invalid = _parseFromTokens[2]; + if (invalid) { + return DateTime4.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text2); + } + }; + DateTime4.fromString = function fromString(text2, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime4.fromFormat(text2, fmt, opts); + }; + DateTime4.fromSQL = function fromSQL(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text2), vals = _parseSQL[0], parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text2); + }; + DateTime4.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid2); + } else { + return new DateTime4({ + invalid: invalid2 + }); + } + }; + DateTime4.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + }; + var _proto = DateTime4.prototype; + _proto.get = function get(unit) { + return this[unit]; + }; + _proto.resolvedLocaleOpts = function resolvedLocaleOpts(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), locale = _Formatter$create$res.locale, numberingSystem = _Formatter$create$res.numberingSystem, calendar = _Formatter$create$res.calendar; + return { + locale, + numberingSystem, + outputCalendar: calendar + }; + }; + _proto.toUTC = function toUTC(offset2, opts) { + if (offset2 === void 0) { + offset2 = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset2), opts); + }; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + }; + _proto.setZone = function setZone(zone, _temp) { + var _ref3 = _temp === void 0 ? {} : _temp, _ref3$keepLocalTime = _ref3.keepLocalTime, keepLocalTime = _ref3$keepLocalTime === void 0 ? false : _ref3$keepLocalTime, _ref3$keepCalendarTim = _ref3.keepCalendarTime, keepCalendarTime = _ref3$keepCalendarTim === void 0 ? false : _ref3$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime4.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone$1(this, { + ts: newTS, + zone + }); + } + }; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref4 = _temp2 === void 0 ? {} : _temp2, locale = _ref4.locale, numberingSystem = _ref4.numberingSystem, outputCalendar = _ref4.outputCalendar; + var loc = this.loc.clone({ + locale, + numberingSystem, + outputCalendar + }); + return clone$1(this, { + loc + }); + }; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale + }); + }; + _proto.set = function set(values) { + if (!this.isValid) + return this; + var normalized = normalizeObject(values, normalizeUnit, []), settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(Object.assign(gregorianToWeek(this.c), normalized)); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c), normalized)); + } else { + mixed = Object.assign(this.toObject(), normalized); + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), ts = _objToTS4[0], o = _objToTS4[1]; + return clone$1(this, { + ts, + o + }); + }; + _proto.plus = function plus(duration) { + if (!this.isValid) + return this; + var dur = friendlyDuration(duration); + return clone$1(this, adjustTime(this, dur)); + }; + _proto.minus = function minus(duration) { + if (!this.isValid) + return this; + var dur = friendlyDuration(duration).negate(); + return clone$1(this, adjustTime(this, dur)); + }; + _proto.startOf = function startOf(unit) { + if (!this.isValid) + return this; + var o = {}, normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + case "quarters": + case "months": + o.day = 1; + case "weeks": + case "days": + o.hour = 0; + case "hours": + o.minute = 0; + case "minutes": + o.second = 0; + case "seconds": + o.millisecond = 0; + break; + } + if (normalizedUnit === "weeks") { + o.weekday = 1; + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + }; + _proto.endOf = function endOf(unit) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit).minus(1) : this; + }; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID$2; + }; + _proto.toLocaleString = function toLocaleString(opts) { + if (opts === void 0) { + opts = DATE_SHORT; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2; + }; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + }; + _proto.toISO = function toISO(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toISODate(opts) + "T" + this.toISOTime(opts); + }; + _proto.toISODate = function toISODate(_temp3) { + var _ref5 = _temp3 === void 0 ? {} : _temp3, _ref5$format = _ref5.format, format = _ref5$format === void 0 ? "extended" : _ref5$format; + var fmt = format === "basic" ? "yyyyMMdd" : "yyyy-MM-dd"; + if (this.year > 9999) { + fmt = "+" + fmt; + } + return toTechFormat(this, fmt); + }; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + }; + _proto.toISOTime = function toISOTime(_temp4) { + var _ref6 = _temp4 === void 0 ? {} : _temp4, _ref6$suppressMillise = _ref6.suppressMilliseconds, suppressMilliseconds = _ref6$suppressMillise === void 0 ? false : _ref6$suppressMillise, _ref6$suppressSeconds = _ref6.suppressSeconds, suppressSeconds = _ref6$suppressSeconds === void 0 ? false : _ref6$suppressSeconds, _ref6$includeOffset = _ref6.includeOffset, includeOffset = _ref6$includeOffset === void 0 ? true : _ref6$includeOffset, _ref6$includePrefix = _ref6.includePrefix, includePrefix = _ref6$includePrefix === void 0 ? false : _ref6$includePrefix, _ref6$format = _ref6.format, format = _ref6$format === void 0 ? "extended" : _ref6$format; + return toTechTimeFormat(this, { + suppressSeconds, + suppressMilliseconds, + includeOffset, + includePrefix, + format + }); + }; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + }; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + }; + _proto.toSQLDate = function toSQLDate() { + return toTechFormat(this, "yyyy-MM-dd"); + }; + _proto.toSQLTime = function toSQLTime(_temp5) { + var _ref7 = _temp5 === void 0 ? {} : _temp5, _ref7$includeOffset = _ref7.includeOffset, includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, _ref7$includeZone = _ref7.includeZone, includeZone = _ref7$includeZone === void 0 ? false : _ref7$includeZone; + return toTechTimeFormat(this, { + includeOffset, + includeZone, + spaceZone: true + }); + }; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + }; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID$2; + }; + _proto.valueOf = function valueOf() { + return this.toMillis(); + }; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + }; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1e3 : NaN; + }; + _proto.toJSON = function toJSON() { + return this.toISO(); + }; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + }; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) + return {}; + var base = Object.assign({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + }; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + }; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid(this.invalid || otherDateTime.invalid, "created by diffing an invalid DateTime"); + } + var durOpts = Object.assign({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), otherIsLater = otherDateTime.valueOf() > this.valueOf(), earlier = otherIsLater ? this : otherDateTime, later = otherIsLater ? otherDateTime : this, diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + }; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime4.now(), unit, opts); + }; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + }; + _proto.hasSame = function hasSame(otherDateTime, unit) { + if (!this.isValid) + return false; + var inputMs = otherDateTime.valueOf(); + var otherZoneDateTime = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return otherZoneDateTime.startOf(unit) <= inputMs && inputMs <= otherZoneDateTime.endOf(unit); + }; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + }; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) + return null; + var base = options.base || DateTime4.fromObject({ + zone: this.zone + }), padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = void 0; + } + return diffRelative(base, this.plus(padding), Object.assign(options, { + numeric: "always", + units, + unit + })); + }; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) + return null; + return diffRelative(options.base || DateTime4.fromObject({ + zone: this.zone + }), this, Object.assign(options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + }; + DateTime4.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime4.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function(i) { + return i.valueOf(); + }, Math.min); + }; + DateTime4.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime4.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function(i) { + return i.valueOf(); + }, Math.max); + }; + DateTime4.fromFormatExplain = function fromFormatExplain(text2, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$locale = _options.locale, locale = _options$locale === void 0 ? null : _options$locale, _options$numberingSys = _options.numberingSystem, numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text2, fmt); + }; + DateTime4.fromStringExplain = function fromStringExplain(text2, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime4.fromFormatExplain(text2, fmt, options); + }; + _createClass(DateTime4, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + }, { + key: "zone", + get: function get() { + return this._zone; + } + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.universal : null; + } + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime4; + }(); + function friendlyDateTime(dateTimeish) { + if (DateTime3.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber2(dateTimeish.valueOf())) { + return DateTime3.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime3.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + var VERSION = "1.28.0"; + exports.DateTime = DateTime3; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.LocalZone = LocalZone; + exports.Settings = Settings; + exports.VERSION = VERSION; + exports.Zone = Zone; } -} - -var VERSION = "1.28.0"; - -exports.DateTime = DateTime; -exports.Duration = Duration; -exports.FixedOffsetZone = FixedOffsetZone; -exports.IANAZone = IANAZone; -exports.Info = Info; -exports.Interval = Interval; -exports.InvalidZone = InvalidZone; -exports.LocalZone = LocalZone; -exports.Settings = Settings; -exports.VERSION = VERSION; -exports.Zone = Zone; -//# sourceMappingURL=luxon.js.map }); -var DateWithZone = /** @class */ (function () { - function DateWithZone(date, tzid) { - this.date = date; - this.tzid = tzid; +// node_modules/chrono-node/dist/utils/pattern.js +var require_pattern = __commonJS({ + "node_modules/chrono-node/dist/utils/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0; + function repeatedTimeunitPattern(prefix, singleTimeunitPattern) { + const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:"); + return `${prefix}${singleTimeunitPatternNoCapture}\\s*(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`; } - Object.defineProperty(DateWithZone.prototype, "isUTC", { - get: function () { - return !this.tzid || this.tzid.toUpperCase() === 'UTC'; - }, - enumerable: true, - configurable: true - }); - DateWithZone.prototype.toString = function () { - var datestr = dateutil$1.timeToUntilString(this.date.getTime(), this.isUTC); - if (!this.isUTC) { - return ";TZID=" + this.tzid + ":" + datestr; - } - return ":" + datestr; - }; - DateWithZone.prototype.getTime = function () { - return this.date.getTime(); - }; - DateWithZone.prototype.rezonedDate = function () { - if (this.isUTC) { - return this.date; - } - try { - var datetime = luxon.DateTime - .fromJSDate(this.date); - var rezoned = datetime.setZone(this.tzid, { keepLocalTime: true }); - return rezoned.toJSDate(); - } - catch (e) { - if (e instanceof TypeError) { - console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone'); - } - return this.date; - } - }; - return DateWithZone; -}()); + exports.repeatedTimeunitPattern = repeatedTimeunitPattern; + function extractTerms(dictionary) { + let keys; + if (dictionary instanceof Array) { + keys = [...dictionary]; + } else if (dictionary instanceof Map) { + keys = Array.from(dictionary.keys()); + } else { + keys = Object.keys(dictionary); + } + return keys; + } + exports.extractTerms = extractTerms; + function matchAnyPattern(dictionary) { + const joinedTerms = extractTerms(dictionary).sort((a, b) => b.length - a.length).join("|").replace(/\./g, "\\."); + return `(?:${joinedTerms})`; + } + exports.matchAnyPattern = matchAnyPattern; + } +}); -function optionsToString(options) { - var rrule = []; - var dtstart = ''; - var keys = Object.keys(options); - var defaultKeys = Object.keys(DEFAULT_OPTIONS$1); - for (var i = 0; i < keys.length; i++) { - if (keys[i] === 'tzid') - continue; - if (!includes(defaultKeys, keys[i])) - continue; - var key = keys[i].toUpperCase(); - var value = options[keys[i]]; - var outValue = ''; - if (!isPresent(value) || (isArray(value) && !value.length)) - continue; - switch (key) { - case 'FREQ': - outValue = RRule.FREQUENCIES[options.freq]; - break; - case 'WKST': - if (isNumber(value)) { - outValue = new Weekday(value).toString(); - } - else { - outValue = value.toString(); - } - break; - case 'BYWEEKDAY': - /* - NOTE: BYWEEKDAY is a special case. - RRule() deconstructs the rule.options.byweekday array - into an array of Weekday arguments. - On the other hand, rule.origOptions is an array of Weekdays. - We need to handle both cases here. - It might be worth change RRule to keep the Weekdays. - - Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC) - - */ - key = 'BYDAY'; - outValue = toArray(value).map(function (wday) { - if (wday instanceof Weekday) { - return wday; - } - if (isArray(wday)) { - return new Weekday(wday[0], wday[1]); - } - return new Weekday(wday); - }).toString(); - break; - case 'DTSTART': - dtstart = buildDtstart(value, options.tzid); - break; - case 'UNTIL': - outValue = dateutil$1.timeToUntilString(value, !options.tzid); - break; +// node_modules/dayjs/dayjs.min.js +var require_dayjs_min = __commonJS({ + "node_modules/dayjs/dayjs.min.js"(exports, module2) { + !function(t, e) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis != "undefined" ? globalThis : t || self).dayjs = e(); + }(exports, function() { + "use strict"; + var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", f = "month", h = "quarter", c = "year", d = "date", $ = "Invalid Date", l = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") }, m = function(t2, e2, n2) { + var r2 = String(t2); + return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2; + }, g = { s: m, z: function(t2) { + var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60; + return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0"); + }, m: function t2(e2, n2) { + if (e2.date() < n2.date()) + return -t2(n2, e2); + var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, f), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), f); + return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0); + }, a: function(t2) { + return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2); + }, p: function(t2) { + return { M: f, y: c, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: h }[t2] || String(t2 || "").toLowerCase().replace(/s$/, ""); + }, u: function(t2) { + return t2 === void 0; + } }, D = "en", v = {}; + v[D] = M; + var p = function(t2) { + return t2 instanceof _; + }, S = function(t2, e2, n2) { + var r2; + if (!t2) + return D; + if (typeof t2 == "string") + v[t2] && (r2 = t2), e2 && (v[t2] = e2, r2 = t2); + else { + var i2 = t2.name; + v[i2] = t2, r2 = i2; + } + return !n2 && r2 && (D = r2), r2 || !n2 && D; + }, w = function(t2, e2) { + if (p(t2)) + return t2.clone(); + var n2 = typeof e2 == "object" ? e2 : {}; + return n2.date = t2, n2.args = arguments, new _(n2); + }, O = g; + O.l = S, O.i = p, O.w = function(t2, e2) { + return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset }); + }; + var _ = function() { + function M2(t2) { + this.$L = S(t2.locale, null, true), this.parse(t2); + } + var m2 = M2.prototype; + return m2.parse = function(t2) { + this.$d = function(t3) { + var e2 = t3.date, n2 = t3.utc; + if (e2 === null) + return new Date(NaN); + if (O.u(e2)) + return new Date(); + if (e2 instanceof Date) + return new Date(e2); + if (typeof e2 == "string" && !/Z$/i.test(e2)) { + var r2 = e2.match(l); + if (r2) { + var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3); + return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2); + } + } + return new Date(e2); + }(t2), this.$x = t2.x || {}, this.init(); + }, m2.init = function() { + var t2 = this.$d; + this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds(); + }, m2.$utils = function() { + return O; + }, m2.isValid = function() { + return !(this.$d.toString() === $); + }, m2.isSame = function(t2, e2) { + var n2 = w(t2); + return this.startOf(e2) <= n2 && n2 <= this.endOf(e2); + }, m2.isAfter = function(t2, e2) { + return w(t2) < this.startOf(e2); + }, m2.isBefore = function(t2, e2) { + return this.endOf(e2) < w(t2); + }, m2.$g = function(t2, e2, n2) { + return O.u(t2) ? this[e2] : this.set(n2, t2); + }, m2.unix = function() { + return Math.floor(this.valueOf() / 1e3); + }, m2.valueOf = function() { + return this.$d.getTime(); + }, m2.startOf = function(t2, e2) { + var n2 = this, r2 = !!O.u(e2) || e2, h2 = O.p(t2), $2 = function(t3, e3) { + var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2); + return r2 ? i2 : i2.endOf(a); + }, l2 = function(t3, e3) { + return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2); + }, y2 = this.$W, M3 = this.$M, m3 = this.$D, g2 = "set" + (this.$u ? "UTC" : ""); + switch (h2) { + case c: + return r2 ? $2(1, 0) : $2(31, 11); + case f: + return r2 ? $2(1, M3) : $2(0, M3 + 1); + case o: + var D2 = this.$locale().weekStart || 0, v2 = (y2 < D2 ? y2 + 7 : y2) - D2; + return $2(r2 ? m3 - v2 : m3 + (6 - v2), M3); + case a: + case d: + return l2(g2 + "Hours", 0); + case u: + return l2(g2 + "Minutes", 1); + case s: + return l2(g2 + "Seconds", 2); + case i: + return l2(g2 + "Milliseconds", 3); default: - if (isArray(value)) { - var strValues = []; - for (var j = 0; j < value.length; j++) { - strValues[j] = String(value[j]); - } - outValue = strValues.toString(); - } - else { - outValue = String(value); - } + return this.clone(); + } + }, m2.endOf = function(t2) { + return this.startOf(t2, false); + }, m2.$set = function(t2, e2) { + var n2, o2 = O.p(t2), h2 = "set" + (this.$u ? "UTC" : ""), $2 = (n2 = {}, n2[a] = h2 + "Date", n2[d] = h2 + "Date", n2[f] = h2 + "Month", n2[c] = h2 + "FullYear", n2[u] = h2 + "Hours", n2[s] = h2 + "Minutes", n2[i] = h2 + "Seconds", n2[r] = h2 + "Milliseconds", n2)[o2], l2 = o2 === a ? this.$D + (e2 - this.$W) : e2; + if (o2 === f || o2 === c) { + var y2 = this.clone().set(d, 1); + y2.$d[$2](l2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d; + } else + $2 && this.$d[$2](l2); + return this.init(), this; + }, m2.set = function(t2, e2) { + return this.clone().$set(t2, e2); + }, m2.get = function(t2) { + return this[O.p(t2)](); + }, m2.add = function(r2, h2) { + var d2, $2 = this; + r2 = Number(r2); + var l2 = O.p(h2), y2 = function(t2) { + var e2 = w($2); + return O.w(e2.date(e2.date() + Math.round(t2 * r2)), $2); + }; + if (l2 === f) + return this.set(f, this.$M + r2); + if (l2 === c) + return this.set(c, this.$y + r2); + if (l2 === a) + return y2(1); + if (l2 === o) + return y2(7); + var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[l2] || 1, m3 = this.$d.getTime() + r2 * M3; + return O.w(m3, this); + }, m2.subtract = function(t2, e2) { + return this.add(-1 * t2, e2); + }, m2.format = function(t2) { + var e2 = this, n2 = this.$locale(); + if (!this.isValid()) + return n2.invalidDate || $; + var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, f2 = n2.months, h2 = function(t3, n3, i3, s3) { + return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].substr(0, s3); + }, c2 = function(t3) { + return O.s(s2 % 12 || 12, t3, "0"); + }, d2 = n2.meridiem || function(t3, e3, n3) { + var r3 = t3 < 12 ? "AM" : "PM"; + return n3 ? r3.toLowerCase() : r3; + }, l2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h2(n2.monthsShort, a2, f2, 3), MMMM: h2(f2, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h2(n2.weekdaysMin, this.$W, o2, 2), ddd: h2(n2.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c2(1), hh: c2(2), a: d2(s2, u2, true), A: d2(s2, u2, false), m: String(u2), mm: O.s(u2, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i2 }; + return r2.replace(y, function(t3, e3) { + return e3 || l2[t3] || i2.replace(":", ""); + }); + }, m2.utcOffset = function() { + return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); + }, m2.diff = function(r2, d2, $2) { + var l2, y2 = O.p(d2), M3 = w(r2), m3 = (M3.utcOffset() - this.utcOffset()) * e, g2 = this - M3, D2 = O.m(this, M3); + return D2 = (l2 = {}, l2[c] = D2 / 12, l2[f] = D2, l2[h] = D2 / 3, l2[o] = (g2 - m3) / 6048e5, l2[a] = (g2 - m3) / 864e5, l2[u] = g2 / n, l2[s] = g2 / e, l2[i] = g2 / t, l2)[y2] || g2, $2 ? D2 : O.a(D2); + }, m2.daysInMonth = function() { + return this.endOf(f).$D; + }, m2.$locale = function() { + return v[this.$L]; + }, m2.locale = function(t2, e2) { + if (!t2) + return this.$L; + var n2 = this.clone(), r2 = S(t2, e2, true); + return r2 && (n2.$L = r2), n2; + }, m2.clone = function() { + return O.w(this.$d, this); + }, m2.toDate = function() { + return new Date(this.valueOf()); + }, m2.toJSON = function() { + return this.isValid() ? this.toISOString() : null; + }, m2.toISOString = function() { + return this.$d.toISOString(); + }, m2.toString = function() { + return this.$d.toUTCString(); + }, M2; + }(), b = _.prototype; + return w.prototype = b, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function(t2) { + b[t2[1]] = function(e2) { + return this.$g(e2, t2[0], t2[1]); + }; + }), w.extend = function(t2, e2) { + return t2.$i || (t2(e2, _, w), t2.$i = true), w; + }, w.locale = S, w.isDayjs = p, w.unix = function(t2) { + return w(1e3 * t2); + }, w.en = v[D], w.Ls = v, w.p = {}, w; + }); + } +}); + +// node_modules/chrono-node/dist/calculation/years.js +var require_years = __commonJS({ + "node_modules/chrono-node/dist/calculation/years.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0; + var dayjs_1 = __importDefault2(require_dayjs_min()); + function findMostLikelyADYear(yearNumber) { + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; } - if (outValue) { - rrule.push([key, outValue]); + } + return yearNumber; + } + exports.findMostLikelyADYear = findMostLikelyADYear; + function findYearClosestToRef(refDate, day, month) { + const refMoment = dayjs_1.default(refDate); + let dateMoment = refMoment; + dateMoment = dateMoment.month(month - 1); + dateMoment = dateMoment.date(day); + dateMoment = dateMoment.year(refMoment.year()); + const nextYear = dateMoment.add(1, "y"); + const lastYear = dateMoment.add(-1, "y"); + if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = nextYear; + } else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = lastYear; + } + return dateMoment.year(); + } + exports.findYearClosestToRef = findYearClosestToRef; + } +}); + +// node_modules/chrono-node/dist/locales/en/constants.js +var require_constants = __commonJS({ + "node_modules/chrono-node/dist/locales/en/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + sunday: 0, + sun: 0, + "sun.": 0, + monday: 1, + mon: 1, + "mon.": 1, + tuesday: 2, + tue: 2, + "tue.": 2, + wednesday: 3, + wed: 3, + "wed.": 3, + thursday: 4, + thurs: 4, + "thurs.": 4, + thur: 4, + "thur.": 4, + thu: 4, + "thu.": 4, + friday: 5, + fri: 5, + "fri.": 5, + saturday: 6, + sat: 6, + "sat.": 6 + }; + exports.FULL_MONTH_NAME_DICTIONARY = { + january: 1, + february: 2, + march: 3, + april: 4, + may: 5, + june: 6, + july: 7, + august: 8, + september: 9, + october: 10, + november: 11, + december: 12 + }; + exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, dec: 12, "dec.": 12 }); + exports.INTEGER_WORD_DICTIONARY = { + one: 1, + two: 2, + three: 3, + four: 4, + five: 5, + six: 6, + seven: 7, + eight: 8, + nine: 9, + ten: 10, + eleven: 11, + twelve: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + first: 1, + second: 2, + third: 3, + fourth: 4, + fifth: 5, + sixth: 6, + seventh: 7, + eighth: 8, + ninth: 9, + tenth: 10, + eleventh: 11, + twelfth: 12, + thirteenth: 13, + fourteenth: 14, + fifteenth: 15, + sixteenth: 16, + seventeenth: 17, + eighteenth: 18, + nineteenth: 19, + twentieth: 20, + "twenty first": 21, + "twenty-first": 21, + "twenty second": 22, + "twenty-second": 22, + "twenty third": 23, + "twenty-third": 23, + "twenty fourth": 24, + "twenty-fourth": 24, + "twenty fifth": 25, + "twenty-fifth": 25, + "twenty sixth": 26, + "twenty-sixth": 26, + "twenty seventh": 27, + "twenty-seventh": 27, + "twenty eighth": 28, + "twenty-eighth": 28, + "twenty ninth": 29, + "twenty-ninth": 29, + "thirtieth": 30, + "thirty first": 31, + "thirty-first": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconds: "second", + min: "minute", + mins: "minute", + minute: "minute", + minutes: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + hour: "hour", + hours: "hour", + day: "d", + days: "d", + week: "week", + weeks: "week", + month: "month", + months: "month", + y: "year", + yr: "year", + year: "year", + years: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:st|nd|rd|th)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/BE/i.test(match)) { + match = match.replace(/BE/i, ""); + return parseInt(match) - 543; + } + if (/BC/i.test(match)) { + match = match.replace(/BC/i, ""); + return -parseInt(match); + } + if (/AD/i.test(match)) { + match = match.replace(/AD/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:about|around)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/dayjs/plugin/quarterOfYear.js +var require_quarterOfYear = __commonJS({ + "node_modules/dayjs/plugin/quarterOfYear.js"(exports, module2) { + !function(t, n) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = n() : typeof define == "function" && define.amd ? define(n) : (t = typeof globalThis != "undefined" ? globalThis : t || self).dayjs_plugin_quarterOfYear = n(); + }(exports, function() { + "use strict"; + var t = "month", n = "quarter"; + return function(e, i) { + var r = i.prototype; + r.quarter = function(t2) { + return this.$utils().u(t2) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t2 - 1)); + }; + var s = r.add; + r.add = function(e2, i2) { + return e2 = Number(e2), this.$utils().p(i2) === n ? this.add(3 * e2, t) : s.bind(this)(e2, i2); + }; + var u = r.startOf; + r.startOf = function(e2, i2) { + var r2 = this.$utils(), s2 = !!r2.u(i2) || i2; + if (r2.p(e2) === n) { + var o = this.quarter() - 1; + return s2 ? this.month(3 * o).startOf(t).startOf("day") : this.month(3 * o + 2).endOf(t).endOf("day"); + } + return u.bind(this)(e2, i2); + }; + }; + }); + } +}); + +// node_modules/chrono-node/dist/utils/dayjs.js +var require_dayjs = __commonJS({ + "node_modules/chrono-node/dist/utils/dayjs.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0; + function assignTheNextDay(component, targetDayJs) { + targetDayJs = targetDayJs.add(1, "day"); + assignSimilarDate(component, targetDayJs); + implySimilarTime(component, targetDayJs); + } + exports.assignTheNextDay = assignTheNextDay; + function assignSimilarDate(component, targetDayJs) { + component.assign("day", targetDayJs.date()); + component.assign("month", targetDayJs.month() + 1); + component.assign("year", targetDayJs.year()); + } + exports.assignSimilarDate = assignSimilarDate; + function assignSimilarTime(component, targetDayJs) { + component.assign("hour", targetDayJs.hour()); + component.assign("minute", targetDayJs.minute()); + component.assign("second", targetDayJs.second()); + component.assign("millisecond", targetDayJs.millisecond()); + component.assign("timezoneOffset", targetDayJs.utcOffset()); + } + exports.assignSimilarTime = assignSimilarTime; + function implySimilarTime(component, targetDayJs) { + component.imply("hour", targetDayJs.hour()); + component.imply("minute", targetDayJs.minute()); + component.imply("second", targetDayJs.second()); + component.imply("millisecond", targetDayJs.millisecond()); + component.imply("timezoneOffset", targetDayJs.utcOffset()); + } + exports.implySimilarTime = implySimilarTime; + } +}); + +// node_modules/chrono-node/dist/results.js +var require_results = __commonJS({ + "node_modules/chrono-node/dist/results.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingResult = exports.ParsingComponents = void 0; + var quarterOfYear_1 = __importDefault2(require_quarterOfYear()); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + dayjs_1.default.extend(quarterOfYear_1.default); + var ParsingComponents = class { + constructor(refDate, knownComponents) { + this.knownValues = {}; + this.impliedValues = {}; + if (knownComponents) { + for (const key in knownComponents) { + this.knownValues[key] = knownComponents[key]; + } + } + const refDayJs = dayjs_1.default(refDate); + this.imply("day", refDayJs.date()); + this.imply("month", refDayJs.month() + 1); + this.imply("year", refDayJs.year()); + this.imply("hour", 12); + this.imply("minute", 0); + this.imply("second", 0); + this.imply("millisecond", 0); + } + get(component) { + if (component in this.knownValues) { + return this.knownValues[component]; + } + if (component in this.impliedValues) { + return this.impliedValues[component]; + } + return null; + } + isCertain(component) { + return component in this.knownValues; + } + getCertainComponents() { + return Object.keys(this.knownValues); + } + imply(component, value) { + if (component in this.knownValues) { + return this; + } + this.impliedValues[component] = value; + return this; + } + assign(component, value) { + this.knownValues[component] = value; + delete this.impliedValues[component]; + return this; + } + delete(component) { + delete this.knownValues[component]; + delete this.impliedValues[component]; + } + clone() { + const component = new ParsingComponents(new Date()); + component.knownValues = {}; + component.impliedValues = {}; + for (const key in this.knownValues) { + component.knownValues[key] = this.knownValues[key]; + } + for (const key in this.impliedValues) { + component.impliedValues[key] = this.impliedValues[key]; + } + return component; + } + isOnlyDate() { + return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second"); + } + isOnlyTime() { + return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyWeekdayComponent() { + return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyDayMonthComponent() { + return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year"); + } + isValidDate() { + const date = this.isCertain("timezoneOffset") ? this.dateWithoutTimezoneAdjustment() : this.date(); + if (date.getFullYear() !== this.get("year")) + return false; + if (date.getMonth() !== this.get("month") - 1) + return false; + if (date.getDate() !== this.get("day")) + return false; + if (this.get("hour") != null && date.getHours() != this.get("hour")) + return false; + if (this.get("minute") != null && date.getMinutes() != this.get("minute")) + return false; + return true; + } + toString() { + return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}]`; + } + dayjs() { + return dayjs_1.default(this.date()); + } + date() { + const date = this.dateWithoutTimezoneAdjustment(); + return new Date(date.getTime() + this.getTimezoneAdjustmentMinute(date) * 6e4); + } + dateWithoutTimezoneAdjustment() { + const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond")); + date.setFullYear(this.get("year")); + return date; + } + getTimezoneAdjustmentMinute(date) { + var _a; + date = date !== null && date !== void 0 ? date : new Date(); + const currentTimezoneOffset = -date.getTimezoneOffset(); + const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : currentTimezoneOffset; + return currentTimezoneOffset - targetTimezoneOffset; + } + static createRelativeFromRefDate(refDate, fragments) { + let date = dayjs_1.default(refDate); + for (const key in fragments) { + date = date.add(fragments[key], key); + } + const components = new ParsingComponents(refDate); + if (fragments["hour"] || fragments["minute"] || fragments["second"]) { + dayjs_2.assignSimilarTime(components, date); + dayjs_2.assignSimilarDate(components, date); + } else { + dayjs_2.implySimilarTime(components, date); + if (fragments["d"]) { + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + if (fragments["week"]) { + components.imply("weekday", date.day()); + } + components.imply("day", date.date()); + if (fragments["month"]) { + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + components.imply("month", date.month() + 1); + if (fragments["year"]) { + components.assign("year", date.year()); + } else { + components.imply("year", date.year()); + } + } + } + } + return components; + } + }; + exports.ParsingComponents = ParsingComponents; + var ParsingResult = class { + constructor(refDate, index, text2, start, end) { + this.refDate = refDate; + this.index = index; + this.text = text2; + this.start = start || new ParsingComponents(this.refDate); + this.end = end; + } + clone() { + const result = new ParsingResult(this.refDate, this.index, this.text); + result.start = this.start ? this.start.clone() : null; + result.end = this.end ? this.end.clone() : null; + return result; + } + date() { + return this.start.date(); + } + toString() { + return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`; + } + }; + exports.ParsingResult = ParsingResult; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js +var require_AbstractParserWithWordBoundary = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractParserWithWordBoundaryChecking = void 0; + var AbstractParserWithWordBoundaryChecking = class { + constructor() { + this.cachedInnerPattern = null; + this.cachedPattern = null; + } + pattern(context) { + const innerPattern = this.innerPattern(context); + if (innerPattern == this.cachedInnerPattern) { + return this.cachedPattern; + } + this.cachedPattern = new RegExp(`(\\W|^)${innerPattern.source}`, innerPattern.flags); + this.cachedInnerPattern = innerPattern; + return this.cachedPattern; + } + extract(context, match) { + const header = match[1]; + match.index = match.index + header.length; + match[0] = match[0].substring(header.length); + for (let i = 2; i < match.length; i++) { + match[i - 1] = match[i]; + } + return this.innerExtract(context, match); + } + }; + exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js +var require_ENTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + }; + exports.default = ENTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js +var require_ENMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:to|\\-|\\\u2013|until|through|till|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(` + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + `)(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = ENMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js +var require_ENMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${constants_3.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`, "i"); + var MONTH_NAME_GROUP = 1; + var DATE_GROUP = 2; + var DATE_TO_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + return null; + } + const components = context.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = ENMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js +var require_ENMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`((?:in)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var PREFIX_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var YEAR_GROUP = 3; + var ENMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const monthName = match[MONTH_NAME_GROUP].toLowerCase(); + if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { + return null; + } + const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length); + result.start.imply("day", 1); + const month = constants_1.MONTH_DICTIONARY[monthName]; + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, 1, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = ENMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js +var require_ENCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var ENCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = ENCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js +var require_ENSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var ENSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = ENSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js +var require_AbstractTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractTimeExpressionParser = void 0; + var index_1 = require_dist(); + function primaryTimePattern(primaryPrefix, primarySuffix) { + return new RegExp(`(^|\\s|T|\\b)${primaryPrefix}(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\:|\\\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${primarySuffix}`, "i"); + } + function followingTimePatten(followingPhase, followingSuffix) { + return new RegExp(`^(${followingPhase})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${followingSuffix}`, "i"); + } + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var MILLI_SECOND_GROUP = 5; + var AM_PM_HOUR_GROUP = 6; + var AbstractTimeExpressionParser = class { + constructor(strictMode = false) { + this.cachedPrimaryPrefix = null; + this.cachedPrimarySuffix = null; + this.cachedPrimaryTimePattern = null; + this.cachedFollowingPhase = null; + this.cachedFollowingSuffix = null; + this.cachedFollowingTimePatten = null; + this.strictMode = strictMode; + } + primarySuffix() { + return "(?=\\W|$)"; + } + followingSuffix() { + return "(?=\\W|$)"; + } + pattern(context) { + return this.getPrimaryTimePatternThroughCache(); + } + extract(context, match) { + const startComponents = this.extractPrimaryTimeComponents(context, match); + if (!startComponents) { + match.index += match[0].length; + return null; + } + const index = match.index + match[1].length; + const text2 = match[0].substring(match[1].length); + const result = context.createParsingResult(index, text2, startComponents); + match.index += match[0].length; + const remainingText = context.text.substring(match.index); + const followingPattern = this.getFollowingTimePatternThroughCache(); + const followingMatch = followingPattern.exec(remainingText); + if (!followingMatch || followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) { + return this.checkAndReturnWithoutFollowingPattern(result); + } + result.end = this.extractFollowingTimeComponents(context, followingMatch, result); + if (result.end) { + result.text += followingMatch[0]; + } + return this.checkAndReturnWithFollowingPattern(result); + } + extractPrimaryTimeComponents(context, match, strict = false) { + const components = context.createParsingComponents(); + let minute = 0; + let meridiem = null; + let hour = parseInt(match[HOUR_GROUP]); + if (hour > 100) { + if (this.strictMode || match[MINUTE_GROUP] != null) { + return null; + } + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (hour > 24) { + return null; + } + if (match[MINUTE_GROUP] != null) { + if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) { + return null; + } + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60) { + return null; + } + if (hour > 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem !== null) { + components.assign("meridiem", meridiem); + } else { + if (hour < 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } else { + components.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + return components; + } + extractFollowingTimeComponents(context, match, result) { + const components = context.createParsingComponents(); + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + let hour = parseInt(match[HOUR_GROUP]); + let minute = 0; + let meridiem = -1; + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) { + return null; + } + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + if (!components.isCertain("day")) { + components.imply("day", components.get("day") + 1); + } + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == index_1.Meridiem.AM) { + result.start.imply("meridiem", index_1.Meridiem.AM); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", index_1.Meridiem.PM); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem >= 0) { + components.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; + if (startAtPM) { + if (result.start.get("hour") - 12 > hour) { + components.imply("meridiem", index_1.Meridiem.AM); + } else if (hour <= 12) { + components.assign("hour", hour + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } + } else if (hour > 12) { + components.imply("meridiem", index_1.Meridiem.PM); + } else if (hour <= 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } + } + if (components.date().getTime() < result.start.date().getTime()) { + components.imply("day", components.get("day") + 1); + } + return components; + } + checkAndReturnWithoutFollowingPattern(result) { + if (result.text.match(/^\d$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); + if (endingWithNumbers) { + const endingNumbers = endingWithNumbers[1]; + if (this.strictMode) { + return null; + } + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + if (endingNumberVal > 24) { + return null; + } + } + return result; + } + checkAndReturnWithFollowingPattern(result) { + if (result.text.match(/^\d+-\d+$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/); + if (endingWithNumbers) { + if (this.strictMode) { + return null; + } + const startingNumbers = endingWithNumbers[1]; + const endingNumbers = endingWithNumbers[2]; + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + const startingNumberVal = parseInt(startingNumbers); + if (endingNumberVal > 24 || startingNumberVal > 24) { + return null; + } + } + return result; + } + getPrimaryTimePatternThroughCache() { + const primaryPrefix = this.primaryPrefix(); + const primarySuffix = this.primarySuffix(); + if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) { + return this.cachedPrimaryTimePattern; + } + this.cachedPrimaryTimePattern = primaryTimePattern(primaryPrefix, primarySuffix); + this.cachedPrimaryPrefix = primaryPrefix; + this.cachedPrimarySuffix = primarySuffix; + return this.cachedPrimaryTimePattern; + } + getFollowingTimePatternThroughCache() { + const followingPhase = this.followingPhase(); + const followingSuffix = this.followingSuffix(); + if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) { + return this.cachedFollowingTimePatten; + } + this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix); + this.cachedFollowingPhase = followingPhase; + this.cachedFollowingSuffix = followingSuffix; + return this.cachedFollowingTimePatten; + } + }; + exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js +var require_ENTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var ENTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + constructor(strictMode) { + super(strictMode); + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"; + } + primaryPrefix() { + return "(?:(?:at|from)\\s*)??"; + } + primarySuffix() { + return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"; + } + extractPrimaryTimeComponents(context, match) { + const components = super.extractPrimaryTimeComponents(context, match); + if (components) { + if (match[0].endsWith("night")) { + const hour = components.get("hour"); + if (hour >= 6 && hour < 12) { + components.assign("hour", components.get("hour") + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (hour < 6) { + components.assign("meridiem", index_1.Meridiem.AM); + } + } + if (match[0].endsWith("afternoon")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour >= 0 && hour <= 6) { + components.assign("hour", components.get("hour") + 12); + } + } + if (match[0].endsWith("morning")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + } + return components; + } + }; + exports.default = ENTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/utils/timeunits.js +var require_timeunits = __commonJS({ + "node_modules/chrono-node/dist/utils/timeunits.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0; + function reverseTimeUnits(timeUnits) { + const reversed = {}; + for (const key in timeUnits) { + reversed[key] = -timeUnits[key]; + } + return reversed; + } + exports.reverseTimeUnits = reverseTimeUnits; + function addImpliedTimeUnits(components, timeUnits) { + const output = components.clone(); + let date = components.dayjs(); + for (const key in timeUnits) { + date = date.add(timeUnits[key], key); + } + if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) { + output.imply("day", date.date()); + output.imply("month", date.month() + 1); + output.imply("year", date.year()); + } + if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) { + output.imply("second", date.second()); + output.imply("minute", date.minute()); + output.imply("hour", date.hour()); + } + return output; + } + exports.addImpliedTimeUnits = addImpliedTimeUnits; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js +var require_ENTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(?:ago|before|earlier)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")ago(?=(?:\\W|$))", "i"); + var ENTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits); + } + }; + exports.default = ENTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js +var require_ENTimeUnitLaterFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|after|from now|henceforth|forward|out)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|from now)(?=(?:\\W|$))", "i"); + var GROUP_NUM_TIMEUNITS = 1; + var ENTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, fragments); + } + }; + exports.default = ENTimeUnitLaterFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/abstractRefiners.js +var require_abstractRefiners = __commonJS({ + "node_modules/chrono-node/dist/common/abstractRefiners.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MergingRefiner = exports.Filter = void 0; + var Filter = class { + refine(context, results) { + return results.filter((r) => this.isValid(context, r)); + } + }; + exports.Filter = Filter; + var MergingRefiner = class { + refine(context, results) { + if (results.length < 2) { + return results; + } + const mergedResults = []; + let curResult = results[0]; + let nextResult = null; + for (let i = 1; i < results.length; i++) { + nextResult = results[i]; + const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index); + if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) { + mergedResults.push(curResult); + curResult = nextResult; + } else { + const left = curResult; + const right = nextResult; + const mergedResult = this.mergeResults(textBetween, left, right, context); + context.debug(() => { + console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`); + }); + curResult = mergedResult; + } + } + if (curResult != null) { + mergedResults.push(curResult); + } + return mergedResults; + } + }; + exports.MergingRefiner = MergingRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js +var require_AbstractMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var AbstractMergeDateRangeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, fromResult, toResult) { + if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) { + toResult.start.getCertainComponents().forEach((key) => { + if (!fromResult.start.isCertain(key)) { + fromResult.start.assign(key, toResult.start.get(key)); + } + }); + fromResult.start.getCertainComponents().forEach((key) => { + if (!toResult.start.isCertain(key)) { + toResult.start.assign(key, fromResult.start.get(key)); + } + }); + } + if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { + let fromMoment = fromResult.start.dayjs(); + let toMoment = toResult.start.dayjs(); + if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) { + fromMoment = fromMoment.add(-7, "days"); + fromResult.start.imply("day", fromMoment.date()); + fromResult.start.imply("month", fromMoment.month() + 1); + fromResult.start.imply("year", fromMoment.year()); + } else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) { + toMoment = toMoment.add(7, "days"); + toResult.start.imply("day", toMoment.date()); + toResult.start.imply("month", toMoment.month() + 1); + toResult.start.imply("year", toMoment.year()); + } else { + [toResult, fromResult] = [fromResult, toResult]; + } + } + const result = fromResult.clone(); + result.start = fromResult.start; + result.end = toResult.start; + result.index = Math.min(fromResult.index, toResult.index); + if (fromResult.index < toResult.index) { + result.text = fromResult.text + textBetween + toResult.text; + } else { + result.text = toResult.text + textBetween + fromResult.text; + } + return result; + } + }; + exports.default = AbstractMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js +var require_ENMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ENMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(to|-)\s*$/i; + } + }; + exports.default = ENMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/calculation/mergingCalculation.js +var require_mergingCalculation = __commonJS({ + "node_modules/chrono-node/dist/calculation/mergingCalculation.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0; + var index_1 = require_dist(); + function mergeDateTimeResult(dateResult, timeResult) { + const result = dateResult.clone(); + const beginDate = dateResult.start; + const beginTime = timeResult.start; + result.start = mergeDateTimeComponent(beginDate, beginTime); + if (dateResult.end != null || timeResult.end != null) { + const endDate = dateResult.end == null ? dateResult.start : dateResult.end; + const endTime = timeResult.end == null ? timeResult.start : timeResult.end; + const endDateTime = mergeDateTimeComponent(endDate, endTime); + if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { + if (endDateTime.isCertain("day")) { + endDateTime.assign("day", endDateTime.get("day") + 1); + } else { + endDateTime.imply("day", endDateTime.get("day") + 1); + } + } + result.end = endDateTime; + } + return result; + } + exports.mergeDateTimeResult = mergeDateTimeResult; + function mergeDateTimeComponent(dateComponent, timeComponent) { + const dateTimeComponent = dateComponent.clone(); + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", timeComponent.get("hour")); + dateTimeComponent.assign("minute", timeComponent.get("minute")); + if (timeComponent.isCertain("second")) { + dateTimeComponent.assign("second", timeComponent.get("second")); + if (timeComponent.isCertain("millisecond")) { + dateTimeComponent.assign("millisecond", timeComponent.get("millisecond")); + } else { + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("hour", timeComponent.get("hour")); + dateTimeComponent.imply("minute", timeComponent.get("minute")); + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + if (timeComponent.isCertain("timezoneOffset")) { + dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset")); + } + if (timeComponent.isCertain("meridiem")) { + dateTimeComponent.assign("meridiem", timeComponent.get("meridiem")); + } else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) { + dateTimeComponent.imply("meridiem", timeComponent.get("meridiem")); + } + if (dateTimeComponent.get("meridiem") == index_1.Meridiem.PM && dateTimeComponent.get("hour") < 12) { + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12); + } else { + dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12); + } + } + return dateTimeComponent; + } + exports.mergeDateTimeComponent = mergeDateTimeComponent; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js +var require_AbstractMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var mergingCalculation_1 = require_mergingCalculation(); + var ENMergeDateTimeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return (currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime() || nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime()) && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, currentResult, nextResult) { + const result = currentResult.start.isOnlyDate() ? mergingCalculation_1.mergeDateTimeResult(currentResult, nextResult) : mergingCalculation_1.mergeDateTimeResult(nextResult, currentResult); + result.index = currentResult.index; + result.text = currentResult.text + textBetween + nextResult.text; + return result; + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js +var require_ENMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ENMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$"); + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +var require_ExtractTimezoneAbbrRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_NAME_PATTERN = new RegExp("^\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i"); + var DEFAULT_TIMEZONE_ABBR_MAP = { + ACDT: 630, + ACST: 570, + ADT: -180, + AEDT: 660, + AEST: 600, + AFT: 270, + AKDT: -480, + AKST: -540, + ALMT: 360, + AMST: -180, + AMT: -240, + ANAST: 720, + ANAT: 720, + AQTT: 300, + ART: -180, + AST: -240, + AWDT: 540, + AWST: 480, + AZOST: 0, + AZOT: -60, + AZST: 300, + AZT: 240, + BNT: 480, + BOT: -240, + BRST: -120, + BRT: -180, + BST: 60, + BTT: 360, + CAST: 480, + CAT: 120, + CCT: 390, + CDT: -300, + CEST: 120, + CET: 60, + CHADT: 825, + CHAST: 765, + CKT: -600, + CLST: -180, + CLT: -240, + COT: -300, + CST: -360, + CVT: -60, + CXT: 420, + ChST: 600, + DAVT: 420, + EASST: -300, + EAST: -360, + EAT: 180, + ECT: -300, + EDT: -240, + EEST: 180, + EET: 120, + EGST: 0, + EGT: -60, + EST: -300, + ET: -300, + FJST: 780, + FJT: 720, + FKST: -180, + FKT: -240, + FNT: -120, + GALT: -360, + GAMT: -540, + GET: 240, + GFT: -180, + GILT: 720, + GMT: 0, + GST: 240, + GYT: -240, + HAA: -180, + HAC: -300, + HADT: -540, + HAE: -240, + HAP: -420, + HAR: -360, + HAST: -600, + HAT: -90, + HAY: -480, + HKT: 480, + HLV: -210, + HNA: -240, + HNC: -360, + HNE: -300, + HNP: -480, + HNR: -420, + HNT: -150, + HNY: -540, + HOVT: 420, + ICT: 420, + IDT: 180, + IOT: 360, + IRDT: 270, + IRKST: 540, + IRKT: 540, + IRST: 210, + IST: 330, + JST: 540, + KGT: 360, + KRAST: 480, + KRAT: 480, + KST: 540, + KUYT: 240, + LHDT: 660, + LHST: 630, + LINT: 840, + MAGST: 720, + MAGT: 720, + MART: -510, + MAWT: 300, + MDT: -360, + MESZ: 120, + MEZ: 60, + MHT: 720, + MMT: 390, + MSD: 240, + MSK: 240, + MST: -420, + MUT: 240, + MVT: 300, + MYT: 480, + NCT: 660, + NDT: -90, + NFT: 690, + NOVST: 420, + NOVT: 360, + NPT: 345, + NST: -150, + NUT: -660, + NZDT: 780, + NZST: 720, + OMSST: 420, + OMST: 420, + PDT: -420, + PET: -300, + PETST: 720, + PETT: 720, + PGT: 600, + PHOT: 780, + PHT: 480, + PKT: 300, + PMDT: -120, + PMST: -180, + PONT: 660, + PST: -480, + PT: -480, + PWT: 540, + PYST: -180, + PYT: -240, + RET: 240, + SAMT: 240, + SAST: 120, + SBT: 660, + SCT: 240, + SGT: 480, + SRT: -180, + SST: -660, + TAHT: -600, + TFT: 300, + TJT: 300, + TKT: 780, + TLT: 540, + TMT: 300, + TVT: 720, + ULAT: 480, + UTC: 0, + UYST: -120, + UYT: -180, + UZT: 300, + VET: -210, + VLAST: 660, + VLAT: 660, + VUT: 660, + WAST: 120, + WAT: 60, + WEST: 60, + WESZ: 60, + WET: 0, + WEZ: 0, + WFT: 720, + WGST: -120, + WGT: -180, + WIB: 420, + WIT: 540, + WITA: 480, + WST: 780, + WT: 0, + YAKST: 600, + YAKT: 600, + YAPT: 600, + YEKST: 360, + YEKT: 360 + }; + var ExtractTimezoneAbbrRefiner = class { + constructor(timezoneOverrides) { + this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides); + } + refine(context, results) { + var _a; + const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {}; + results.forEach((result) => { + var _a2, _b; + const suffix = context.text.substring(result.index + result.text.length); + const match = TIMEZONE_NAME_PATTERN.exec(suffix); + if (!match) { + return; + } + const timezoneAbbr = match[1].toUpperCase(); + const extractedTimezoneOffset = (_b = (_a2 = timezoneOverrides[timezoneAbbr]) !== null && _a2 !== void 0 ? _a2 : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null; + if (extractedTimezoneOffset === null) { + return; + } + context.debug(() => { + console.log(`Extracting timezone: '${timezoneAbbr}' into : ${extractedTimezoneOffset}`); + }); + const currentTimezoneOffset = result.start.get("timezoneOffset"); + if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) { + return; + } + result.text += match[0]; + if (!result.start.isCertain("timezoneOffset")) { + result.start.assign("timezoneOffset", extractedTimezoneOffset); + } + if (result.end != null && !result.end.isCertain("timezoneOffset")) { + result.end.assign("timezoneOffset", extractedTimezoneOffset); + } + }); + return results; + } + }; + exports.default = ExtractTimezoneAbbrRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js +var require_ExtractTimezoneOffsetRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?", "i"); + var TIMEZONE_OFFSET_SIGN_GROUP = 1; + var TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2; + var TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3; + var ExtractTimezoneOffsetRefiner = class { + refine(context, results) { + results.forEach(function(result) { + if (result.start.isCertain("timezoneOffset")) { + return; + } + const suffix = context.text.substring(result.index + result.text.length); + const match = TIMEZONE_OFFSET_PATTERN.exec(suffix); + if (!match) { + return; + } + context.debug(() => { + console.log(`Extracting timezone: '${match[0]}' into : ${result}`); + }); + const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]); + const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0"); + let timezoneOffset = hourOffset * 60 + minuteOffset; + if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") { + timezoneOffset = -timezoneOffset; + } + if (result.end != null) { + result.end.assign("timezoneOffset", timezoneOffset); + } + result.start.assign("timezoneOffset", timezoneOffset); + result.text += match[0]; + }); + return results; + } + }; + exports.default = ExtractTimezoneOffsetRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js +var require_OverlapRemovalRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var OverlapRemovalRefiner = class { + refine(context, results) { + if (results.length < 2) { + return results; + } + const filteredResults = []; + let prevResult = results[0]; + for (let i = 1; i < results.length; i++) { + const result = results[i]; + if (result.index < prevResult.index + prevResult.text.length) { + if (result.text.length > prevResult.text.length) { + prevResult = result; + } + } else { + filteredResults.push(prevResult); + prevResult = result; + } + } + if (prevResult != null) { + filteredResults.push(prevResult); + } + return filteredResults; + } + }; + exports.default = OverlapRemovalRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js +var require_ForwardDateRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var ForwardDateRefiner = class { + refine(context, results) { + if (!context.option.forwardDate) { + return results; + } + results.forEach(function(result) { + let refMoment = dayjs_1.default(context.refDate); + if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) { + for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) { + result.start.imply("year", result.start.get("year") + 1); + context.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.start})`); + }); + if (result.end && !result.end.isCertain("year")) { + result.end.imply("year", result.end.get("year") + 1); + context.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.end})`); + }); + } + } + } + if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) { + if (refMoment.day() > result.start.get("weekday")) { + refMoment = refMoment.day(result.start.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.start.get("weekday")); + } + result.start.imply("day", refMoment.date()); + result.start.imply("month", refMoment.month() + 1); + result.start.imply("year", refMoment.year()); + context.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.start})`); + }); + if (result.end && result.end.isOnlyWeekdayComponent()) { + if (refMoment.day() > result.end.get("weekday")) { + refMoment = refMoment.day(result.end.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.end.get("weekday")); + } + result.end.imply("day", refMoment.date()); + result.end.imply("month", refMoment.month() + 1); + result.end.imply("year", refMoment.year()); + context.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.end})`); + }); + } + } + }); + return results; + } + }; + exports.default = ForwardDateRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js +var require_UnlikelyFormatFilter = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var UnlikelyFormatFilter = class extends abstractRefiners_1.Filter { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + isValid(context, result) { + if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) { + context.debug(() => { + console.log(`Removing unlikely result '${result.text}'`); + }); + return false; + } + if (!result.start.isValidDate()) { + context.debug(() => { + console.log(`Removing invalid result: ${result} (${result.start})`); + }); + return false; + } + if (result.end && !result.end.isValidDate()) { + context.debug(() => { + console.log(`Removing invalid result: ${result} (${result.end})`); + }); + return false; + } + if (this.strictMode) { + return this.isStrictModeValid(context, result); + } + return true; + } + isStrictModeValid(context, result) { + if (result.start.isOnlyWeekdayComponent()) { + context.debug(() => { + console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`); + }); + return false; + } + if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { + context.debug(() => { + console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); + }); + return false; + } + return true; + } + }; + exports.default = UnlikelyFormatFilter; + } +}); + +// node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js +var require_ISOFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)", "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NUMBER_GROUP = 2; + var DATE_NUMBER_GROUP = 3; + var HOUR_NUMBER_GROUP = 4; + var MINUTE_NUMBER_GROUP = 5; + var SECOND_NUMBER_GROUP = 6; + var MILLISECOND_NUMBER_GROUP = 7; + var TZD_HOUR_OFFSET_GROUP = 8; + var TZD_MINUTE_OFFSET_GROUP = 9; + var ISOFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const components = {}; + components["year"] = parseInt(match[YEAR_NUMBER_GROUP]); + components["month"] = parseInt(match[MONTH_NUMBER_GROUP]); + components["day"] = parseInt(match[DATE_NUMBER_GROUP]); + if (match[HOUR_NUMBER_GROUP] != null) { + components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]); + components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]); + if (match[SECOND_NUMBER_GROUP] != null) { + components["second"] = parseInt(match[SECOND_NUMBER_GROUP]); + } + if (match[MILLISECOND_NUMBER_GROUP] != null) { + components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]); + } + if (match[TZD_HOUR_OFFSET_GROUP] == null) { + components["timezoneOffset"] = 0; + } else { + const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]); + let minuteOffset = 0; + if (match[TZD_MINUTE_OFFSET_GROUP] != null) { + minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]); + } + let offset = hourOffset * 60; + if (offset < 0) { + offset -= minuteOffset; + } else { + offset += minuteOffset; + } + components["timezoneOffset"] = offset; + } + } + return components; + } + }; + exports.default = ISOFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js +var require_MergeWeekdayComponentRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var MergeWeekdayComponentRefiner = class extends abstractRefiners_1.MergingRefiner { + mergeResults(textBetween, currentResult, nextResult) { + const newResult = nextResult.clone(); + newResult.index = currentResult.index; + newResult.text = currentResult.text + textBetween + newResult.text; + newResult.start.assign("weekday", currentResult.start.get("weekday")); + if (newResult.end) { + newResult.end.assign("weekday", currentResult.start.get("weekday")); + } + return newResult; + } + shouldMergeResults(textBetween, currentResult, nextResult) { + const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && !currentResult.start.isCertain("hour") && nextResult.start.isCertain("day"); + return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null; + } + }; + exports.default = MergeWeekdayComponentRefiner; + } +}); + +// node_modules/chrono-node/dist/configurations.js +var require_configurations = __commonJS({ + "node_modules/chrono-node/dist/configurations.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.includeCommonConfiguration = void 0; + var ExtractTimezoneAbbrRefiner_1 = __importDefault2(require_ExtractTimezoneAbbrRefiner()); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var OverlapRemovalRefiner_1 = __importDefault2(require_OverlapRemovalRefiner()); + var ForwardDateRefiner_1 = __importDefault2(require_ForwardDateRefiner()); + var UnlikelyFormatFilter_1 = __importDefault2(require_UnlikelyFormatFilter()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var MergeWeekdayComponentRefiner_1 = __importDefault2(require_MergeWeekdayComponentRefiner()); + function includeCommonConfiguration(configuration, strictMode = false) { + configuration.parsers.unshift(new ISOFormatParser_1.default()); + configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1.default()); + configuration.refiners.unshift(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new ForwardDateRefiner_1.default()); + configuration.refiners.push(new UnlikelyFormatFilter_1.default(strictMode)); + return configuration; + } + exports.includeCommonConfiguration = includeCommonConfiguration; + } +}); + +// node_modules/chrono-node/dist/common/casualReferences.js +var require_casualReferences = __commonJS({ + "node_modules/chrono-node/dist/common/casualReferences.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.tonight = exports.tomorrow = exports.yesterday = exports.today = exports.now = void 0; + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var index_1 = require_dist(); + function now(refDate) { + const targetDate = dayjs_1.default(refDate); + const component = new results_1.ParsingComponents(refDate, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.assignSimilarTime(component, targetDate); + return component; + } + exports.now = now; + function today(refDate) { + const targetDate = dayjs_1.default(refDate); + const component = new results_1.ParsingComponents(refDate, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.today = today; + function yesterday(refDate) { + let targetDate = dayjs_1.default(refDate); + const component = new results_1.ParsingComponents(refDate, {}); + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.yesterday = yesterday; + function tomorrow(refDate) { + const targetDate = dayjs_1.default(refDate); + const component = new results_1.ParsingComponents(refDate, {}); + dayjs_2.assignTheNextDay(component, targetDate); + return component; + } + exports.tomorrow = tomorrow; + function tonight(refDate, implyHour = 22) { + const targetDate = dayjs_1.default(refDate); + const component = new results_1.ParsingComponents(refDate, {}); + component.imply("hour", implyHour); + component.imply("meridiem", index_1.Meridiem.PM); + dayjs_2.assignSimilarDate(component, targetDate); + return component; + } + exports.tonight = tonight; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js +var require_ENCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /(now|today|tonight|tomorrow|tmr|yesterday|last\s*night)(?=\W|$)/i; + var ENCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return PATTERN; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "now": + return references.now(context.refDate); + case "today": + return references.today(context.refDate); + case "yesterday": + return references.yesterday(context.refDate); + case "tomorrow": + case "tmr": + return references.tomorrow(context.refDate); + case "tonight": + return references.tonight(context.refDate); + default: + if (lowerText.match(/last\s*night/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + return component; + } + }; + exports.default = ENCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js +var require_ENCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var PATTERN = /(?:this)?\s*(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i; + var ENCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const component = context.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "afternoon": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "evening": + case "night": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "midnight": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "morning": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "noon": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = ENCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/calculation/weeks.js +var require_weeks = __commonJS({ + "node_modules/chrono-node/dist/calculation/weeks.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0; + var dayjs_1 = __importDefault2(require_dayjs_min()); + function toDayJSWeekday(refDate, offset, modifier) { + if (!modifier) { + return toDayJSClosestWeekday(refDate, offset); + } + let date = dayjs_1.default(refDate); + switch (modifier) { + case "this": + date = date.day(offset); + break; + case "next": + date = date.day(offset + 7); + break; + case "last": + date = date.day(offset - 7); + break; + } + return date; + } + exports.toDayJSWeekday = toDayJSWeekday; + function toDayJSClosestWeekday(refDate, offset) { + let date = dayjs_1.default(refDate); + const refOffset = date.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + date = date.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + date = date.day(offset + 7); + } else { + date = date.day(offset); + } + return date; + } + exports.toDayJSClosestWeekday = toDayJSClosestWeekday; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js +var require_ENWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var ENWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "last" || modifierWord == "past") { + modifier = "last"; + } else if (modifierWord == "next") { + modifier = "next"; + } else if (modifierWord == "this") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = ENWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js +var require_ENRelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(this|next|last|past)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var ENRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "next") { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + if (modifier == "last" || modifier == "past") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + const components = context.createParsingComponents(); + let date = dayjs_1.default(context.refDate); + if (unitWord.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (unitWord.match(/month/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (unitWord.match(/year/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = ENRelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/chrono.js +var require_chrono = __commonJS({ + "node_modules/chrono-node/dist/chrono.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingContext = exports.Chrono = void 0; + var results_1 = require_results(); + var en_1 = require_en(); + var Chrono = class { + constructor(configuration) { + configuration = configuration || en_1.createCasualConfiguration(); + this.parsers = [...configuration.parsers]; + this.refiners = [...configuration.refiners]; + } + clone() { + return new Chrono({ + parsers: [...this.parsers], + refiners: [...this.refiners] + }); + } + parseDate(text2, referenceDate, option) { + const results = this.parse(text2, referenceDate, option); + return results.length > 0 ? results[0].start.date() : null; + } + parse(text2, referenceDate, option) { + const context = new ParsingContext(text2, referenceDate || new Date(), option || {}); + let results = []; + this.parsers.forEach((parser) => { + const parsedResults = Chrono.executeParser(context, parser); + results = results.concat(parsedResults); + }); + results.sort((a, b) => { + return a.index - b.index; + }); + this.refiners.forEach(function(refiner) { + results = refiner.refine(context, results); + }); + return results; + } + static executeParser(context, parser) { + const results = []; + const pattern = parser.pattern(context); + const originalText = context.text; + let remainingText = context.text; + let match = pattern.exec(remainingText); + while (match) { + const index = match.index + originalText.length - remainingText.length; + match.index = index; + const result = parser.extract(context, match); + if (!result) { + remainingText = originalText.substring(match.index + 1); + match = pattern.exec(remainingText); + continue; + } + let parsedResult = null; + if (result instanceof results_1.ParsingResult) { + parsedResult = result; + } else if (result instanceof results_1.ParsingComponents) { + parsedResult = context.createParsingResult(match.index, match[0]); + parsedResult.start = result; + } else { + parsedResult = context.createParsingResult(match.index, match[0], result); + } + context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`)); + results.push(parsedResult); + remainingText = originalText.substring(index + parsedResult.text.length); + match = pattern.exec(remainingText); + } + return results; + } + }; + exports.Chrono = Chrono; + var ParsingContext = class { + constructor(text2, refDate, option) { + this.text = text2; + this.refDate = refDate; + this.option = option; + } + createParsingComponents(components) { + if (components instanceof results_1.ParsingComponents) { + return components; + } + return new results_1.ParsingComponents(this.refDate, components); + } + createParsingResult(index, textOrEndIndex, startComponents, endComponents) { + const text2 = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex); + const start = startComponents ? this.createParsingComponents(startComponents) : null; + const end = endComponents ? this.createParsingComponents(endComponents) : null; + return new results_1.ParsingResult(this.refDate, index, text2, start, end); + } + debug(block) { + if (this.option.debug) { + if (this.option.debug instanceof Function) { + this.option.debug(block); + } else { + const handler = this.option.debug; + handler.debug(block); + } + } + } + }; + exports.ParsingContext = ParsingContext; + } +}); + +// node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js +var require_SlashDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var PATTERN = new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)", "i"); + var OPENING_GROUP = 1; + var ENDING_GROUP = 5; + var FIRST_NUMBERS_GROUP = 2; + var SECOND_NUMBERS_GROUP = 3; + var YEAR_GROUP = 4; + var SlashDateFormatParser = class { + constructor(littleEndian) { + this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP; + this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP; + } + pattern() { + return PATTERN; + } + extract(context, match) { + if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") { + match.index += match[0].length; + return; + } + const index = match.index + match[OPENING_GROUP].length; + const text2 = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); + if (text2.match(/^\d\.\d$/) || text2.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { + return; + } + if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) { + return; + } + const result = context.createParsingResult(index, text2); + let month = parseInt(match[this.groupNumberMonth]); + let day = parseInt(match[this.groupNumberDay]); + if (month < 1 || month > 12) { + if (month > 12) { + if (day >= 1 && day <= 12 && month <= 31) { + [day, month] = [month, day]; + } else { + return null; + } + } + } + if (day < 1 || day > 31) { + return null; + } + result.start.assign("day", day); + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const rawYearNumber = parseInt(match[YEAR_GROUP]); + const year = years_1.findMostLikelyADYear(rawYearNumber); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = SlashDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +var require_ENTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(this|last|past|next|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "last": + case "past": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + }; + exports.default = ENTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/index.js +var require_en = __commonJS({ + "node_modules/chrono-node/dist/locales/en/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0; + var ENTimeUnitWithinFormatParser_1 = __importDefault2(require_ENTimeUnitWithinFormatParser()); + var ENMonthNameLittleEndianParser_1 = __importDefault2(require_ENMonthNameLittleEndianParser()); + var ENMonthNameMiddleEndianParser_1 = __importDefault2(require_ENMonthNameMiddleEndianParser()); + var ENMonthNameParser_1 = __importDefault2(require_ENMonthNameParser()); + var ENCasualYearMonthDayParser_1 = __importDefault2(require_ENCasualYearMonthDayParser()); + var ENSlashMonthFormatParser_1 = __importDefault2(require_ENSlashMonthFormatParser()); + var ENTimeExpressionParser_1 = __importDefault2(require_ENTimeExpressionParser()); + var ENTimeUnitAgoFormatParser_1 = __importDefault2(require_ENTimeUnitAgoFormatParser()); + var ENTimeUnitLaterFormatParser_1 = __importDefault2(require_ENTimeUnitLaterFormatParser()); + var ENMergeDateRangeRefiner_1 = __importDefault2(require_ENMergeDateRangeRefiner()); + var ENMergeDateTimeRefiner_1 = __importDefault2(require_ENMergeDateTimeRefiner()); + var configurations_1 = require_configurations(); + var ENCasualDateParser_1 = __importDefault2(require_ENCasualDateParser()); + var ENCasualTimeParser_1 = __importDefault2(require_ENCasualTimeParser()); + var ENWeekdayParser_1 = __importDefault2(require_ENWeekdayParser()); + var ENRelativeDateFormatParser_1 = __importDefault2(require_ENRelativeDateFormatParser()); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ENTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_ENTimeUnitCasualRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration(false)); + exports.strict = new chrono_1.Chrono(createConfiguration(true, false)); + exports.GB = new chrono_1.Chrono(createConfiguration(false, true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = false) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new ENCasualDateParser_1.default()); + option.parsers.unshift(new ENCasualTimeParser_1.default()); + option.parsers.unshift(new ENMonthNameParser_1.default()); + option.parsers.unshift(new ENRelativeDateFormatParser_1.default()); + option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = false) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new ENTimeUnitWithinFormatParser_1.default(), + new ENMonthNameLittleEndianParser_1.default(), + new ENMonthNameMiddleEndianParser_1.default(), + new ENWeekdayParser_1.default(), + new ENCasualYearMonthDayParser_1.default(), + new ENSlashMonthFormatParser_1.default(), + new ENTimeExpressionParser_1.default(strictMode), + new ENTimeUnitAgoFormatParser_1.default(strictMode), + new ENTimeUnitLaterFormatParser_1.default(strictMode) + ], + refiners: [new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js +var require_DETimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var index_1 = require_dist(); + var DETimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:um|von)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"; + } + primarySuffix() { + return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)"; + } + extractPrimaryTimeComponents(context, match) { + const components = super.extractPrimaryTimeComponents(context, match); + if (components) { + if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour") + 12); + } + } + } + return components; + } + }; + exports.default = DETimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/constants.js +var require_constants2 = __commonJS({ + "node_modules/chrono-node/dist/locales/de/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + "sonntag": 0, + "so": 0, + "montag": 1, + "mo": 1, + "dienstag": 2, + "di": 2, + "mittwoch": 3, + "mi": 3, + "donnerstag": 4, + "do": 4, + "freitag": 5, + "fr": 5, + "samstag": 6, + "sa": 6 + }; + exports.MONTH_DICTIONARY = { + "januar": 1, + "jan": 1, + "jan.": 1, + "februar": 2, + "feb": 2, + "feb.": 2, + "m\xE4rz": 3, + "maerz": 3, + "m\xE4r": 3, + "m\xE4r.": 3, + "mrz": 3, + "mrz.": 3, + "april": 4, + "apr": 4, + "apr.": 4, + "mai": 5, + "juni": 6, + "jun": 6, + "jun.": 6, + "juli": 7, + "jul": 7, + "jul.": 7, + "august": 8, + "aug": 8, + "aug.": 8, + "september": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "oktober": 10, + "okt": 10, + "okt.": 10, + "november": 11, + "nov": 11, + "nov.": 11, + "dezember": 12, + "dez": 12, + "dez.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "eins": 1, + "zwei": 2, + "drei": 3, + "vier": 4, + "f\xFCnf": 5, + "fuenf": 5, + "sechs": 6, + "sieben": 7, + "acht": 8, + "neun": 9, + "zehn": 10, + "elf": 11, + "zw\xF6lf": 12, + "zwoelf": 12 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconds: "second", + min: "minute", + mins: "minute", + minute: "minute", + minutes: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + hour: "hour", + hours: "hour", + day: "d", + days: "d", + week: "week", + weeks: "week", + month: "month", + months: "month", + y: "year", + yr: "year", + year: "year", + years: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)`; + function parseYear(match) { + if (/v/i.test(match)) { + return -parseInt(match.replace(/[^0-9]+/gi, "")); + } + if (/n/i.test(match)) { + return parseInt(match.replace(/[^0-9]+/gi, "")); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js +var require_DEWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var SUFFIX_GROUP = 3; + var WEEKDAY_GROUP = 2; + var DEWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[SUFFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord.match(/letzte/)) { + modifier = "last"; + } else if (modifierWord.match(/chste/)) { + modifier = "next"; + } else if (modifierWord.match(/diese/)) { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = DEWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js +var require_DEMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var DEMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i; + } + }; + exports.default = DEMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js +var require_DEMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var DEMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|um|am|,|-)?\\s*$"); + } + }; + exports.default = DEMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js +var require_DECasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var timeunits_1 = require_timeunits(); + var DECasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const timeKeywordPattern = match[2].toLowerCase(); + const component = context.createParsingComponents(); + dayjs_2.implySimilarTime(component, targetDate); + return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern); + } + static extractTimeComponents(component, timeKeywordPattern) { + switch (timeKeywordPattern) { + case "morgen": + component.imply("hour", 6); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "vormittag": + component.imply("hour", 9); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "mittag": + case "mittags": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "nachmittag": + component.imply("hour", 15); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "abend": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "nacht": + component.imply("hour", 22); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "mitternacht": + if (component.get("hour") > 1) { + component = timeunits_1.addImpliedTimeUnits(component, { "day": 1 }); + } + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = DECasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js +var require_DECasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var references = __importStar2(require_casualReferences()); + var PATTERN = new RegExp(`(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var TIME_GROUP = 2; + var DECasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return PATTERN; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const dateKeyword = (match[DATE_GROUP] || "").toLowerCase(); + const timeKeyword = (match[TIME_GROUP] || "").toLowerCase(); + let component = context.createParsingComponents(); + switch (dateKeyword) { + case "jetzt": + component = references.now(context.refDate); + break; + case "heute": + component = references.today(context.refDate); + break; + case "morgen": + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "\xFCbermorgen": + case "uebermorgen": + targetDate = targetDate.add(1, "day"); + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "gestern": + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + case "vorgestern": + targetDate = targetDate.add(-2, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + default: + if (dateKeyword.match(/letzte\s*nacht/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + if (timeKeyword) { + component = DECasualTimeParser_1.default.extractTimeComponents(component, timeKeyword); + } + return component; + } + }; + exports.default = DECasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js +var require_DEMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants2(); + var constants_2 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var DEMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = DEMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/index.js +var require_de = __commonJS({ + "node_modules/chrono-node/dist/locales/de/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var DETimeExpressionParser_1 = __importDefault2(require_DETimeExpressionParser()); + var DEWeekdayParser_1 = __importDefault2(require_DEWeekdayParser()); + var DEMergeDateRangeRefiner_1 = __importDefault2(require_DEMergeDateRangeRefiner()); + var DEMergeDateTimeRefiner_1 = __importDefault2(require_DEMergeDateTimeRefiner()); + var DECasualDateParser_1 = __importDefault2(require_DECasualDateParser()); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var DEMonthNameLittleEndianParser_1 = __importDefault2(require_DEMonthNameLittleEndianParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new DECasualTimeParser_1.default()); + option.parsers.unshift(new DECasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new ISOFormatParser_1.default(), + new SlashDateFormatParser_1.default(littleEndian), + new DETimeExpressionParser_1.default(), + new DEMonthNameLittleEndianParser_1.default(), + new DEWeekdayParser_1.default() + ], + refiners: [new DEMergeDateRangeRefiner_1.default(), new DEMergeDateTimeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js +var require_FRCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var FRCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "maintenant": + return references.now(context.refDate); + case "aujourd'hui": + return references.today(context.refDate); + case "hier": + return references.yesterday(context.refDate); + case "demain": + return references.tomorrow(context.refDate); + default: + if (lowerText.match(/cette\s*nuit/)) { + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 22); + component.imply("meridiem", index_1.Meridiem.PM); + } else if (lowerText.match(/la\s*veille/)) { + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + } + return component; + } + }; + exports.default = FRCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js +var require_FRCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; + } + innerExtract(context, match) { + const suffixLower = match[2].toLowerCase(); + const component = context.createParsingComponents(); + switch (suffixLower) { + case "apr\xE8s-midi": + case "aprem": + component.imply("hour", 14); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "soir": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "matin": + component.imply("hour", 8); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "a midi": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "\xE0 minuit": + component.imply("hour", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = FRCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js +var require_FRTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var FRTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:[\xE0a])\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"; + } + extractPrimaryTimeComponents(context, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context, match); + } + }; + exports.default = FRTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js +var require_FRMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var FRMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$"); + } + }; + exports.default = FRMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js +var require_FRMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var FRMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(à|a|-)\s*$/i; + } + }; + exports.default = FRMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/constants.js +var require_constants3 = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + exports.WEEKDAY_DICTIONARY = { + "dimanche": 0, + "dim": 0, + "lundi": 1, + "lun": 1, + "mardi": 2, + "mar": 2, + "mercredi": 3, + "mer": 3, + "jeudi": 4, + "jeu": 4, + "vendredi": 5, + "ven": 5, + "samedi": 6, + "sam": 6 + }; + exports.MONTH_DICTIONARY = { + "janvier": 1, + "jan": 1, + "jan.": 1, + "f\xE9vrier": 2, + "f\xE9v": 2, + "f\xE9v.": 2, + "fevrier": 2, + "fev": 2, + "fev.": 2, + "mars": 3, + "mar": 3, + "mar.": 3, + "avril": 4, + "avr": 4, + "avr.": 4, + "mai": 5, + "juin": 6, + "jun": 6, + "juillet": 7, + "juil": 7, + "jul": 7, + "jul.": 7, + "ao\xFBt": 8, + "aout": 8, + "septembre": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "octobre": 10, + "oct": 10, + "oct.": 10, + "novembre": 11, + "nov": 11, + "nov.": 11, + "d\xE9cembre": 12, + "decembre": 12, + "dec": 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "un": 1, + "deux": 2, + "trois": 3, + "quatre": 4, + "cinq": 5, + "six": 6, + "sept": 7, + "huit": 8, + "neuf": 9, + "dix": 10, + "onze": 11, + "douze": 12, + "treize": 13 + }; + exports.TIME_UNIT_DICTIONARY = { + "sec": "second", + "seconde": "second", + "secondes": "second", + "min": "minute", + "mins": "minute", + "minute": "minute", + "minutes": "minute", + "h": "hour", + "hr": "hour", + "hrs": "hour", + "heure": "hour", + "heures": "hour", + "jour": "d", + "jours": "d", + "semaine": "week", + "semaines": "week", + "mois": "month", + "trimestre": "quarter", + "trimestres": "quarter", + "ans": "year", + "ann\xE9e": "year", + "ann\xE9es": "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?|quelques?|demi-?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "une" || num === "un") { + return 1; + } else if (num.match(/quelques?/)) { + return 3; + } else if (num.match(/demi-?/)) { + return 0.5; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + num = num.replace(/(?:er)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/AC/i.test(match)) { + match = match.replace(/BC/i, ""); + return -parseInt(match); + } + if (/AD/i.test(match) || /C/i.test(match)) { + match = match.replace(/[^\d]+/i, ""); + return parseInt(match); + } + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js +var require_FRWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`, "i"); + var WEEKDAY_GROUP = 1; + var POSTFIX_GROUP = 2; + var FRWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (offset === void 0) { + return null; + } + let suffix = match[POSTFIX_GROUP]; + suffix = suffix || ""; + suffix = suffix.toLowerCase(); + let modifier = null; + if (suffix == "dernier") { + modifier = "last"; + } else if (suffix == "prochain") { + modifier = "next"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = FRWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js +var require_FRSpecificTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var AM_PM_HOUR_GROUP = 5; + var FRSpecificTimeExpressionParser = class { + pattern(context) { + return FIRST_REG_PATTERN; + } + extract(context, match) { + const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); + if (result.text.match(/^\d{4}$/)) { + match.index += match[0].length; + return null; + } + result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); + if (!result.start) { + match.index += match[0].length; + return null; + } + const remainingText = context.text.substring(match.index + match[0].length); + const secondMatch = SECOND_REG_PATTERN.exec(remainingText); + if (secondMatch) { + result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); + if (result.end) { + result.text += secondMatch[0]; + } + } + return result; + } + static extractTimeComponent(extractingComponents, match) { + let hour = 0; + let minute = 0; + let meridiem = null; + hour = parseInt(match[HOUR_GROUP]); + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + extractingComponents.assign("hour", hour); + extractingComponents.assign("minute", minute); + if (meridiem !== null) { + extractingComponents.assign("meridiem", meridiem); + } else { + if (hour < 12) { + extractingComponents.imply("meridiem", index_1.Meridiem.AM); + } else { + extractingComponents.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + extractingComponents.assign("second", second); + } + return extractingComponents; + } + }; + exports.default = FRSpecificTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js +var require_FRMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants3(); + var constants_2 = require_constants3(); + var constants_3 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var FRMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = FRMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js +var require_FRTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`il y a\\s*(${constants_1.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js +var require_FRTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:dans|en|pour|pendant)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + }; + exports.default = FRTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +var require_FRTimeUnitRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var pattern_1 = require_pattern(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${constants_1.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`, "i"); + } + innerExtract(context, match) { + const num = match[1] ? constants_1.parseNumberPattern(match[1]) : 1; + const unit = constants_1.TIME_UNIT_DICTIONARY[match[3].toLowerCase()]; + let timeUnits = {}; + timeUnits[unit] = num; + let modifier = match[2] || match[4] || ""; + modifier = modifier.toLowerCase(); + if (!modifier) { + return; + } + if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/index.js +var require_fr = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var FRCasualDateParser_1 = __importDefault2(require_FRCasualDateParser()); + var FRCasualTimeParser_1 = __importDefault2(require_FRCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var FRTimeExpressionParser_1 = __importDefault2(require_FRTimeExpressionParser()); + var FRMergeDateTimeRefiner_1 = __importDefault2(require_FRMergeDateTimeRefiner()); + var FRMergeDateRangeRefiner_1 = __importDefault2(require_FRMergeDateRangeRefiner()); + var FRWeekdayParser_1 = __importDefault2(require_FRWeekdayParser()); + var FRSpecificTimeExpressionParser_1 = __importDefault2(require_FRSpecificTimeExpressionParser()); + var FRMonthNameLittleEndianParser_1 = __importDefault2(require_FRMonthNameLittleEndianParser()); + var FRTimeUnitAgoFormatParser_1 = __importDefault2(require_FRTimeUnitAgoFormatParser()); + var FRTimeUnitWithinFormatParser_1 = __importDefault2(require_FRTimeUnitWithinFormatParser()); + var FRTimeUnitRelativeFormatParser_1 = __importDefault2(require_FRTimeUnitRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new FRCasualDateParser_1.default()); + option.parsers.unshift(new FRCasualTimeParser_1.default()); + option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new FRMonthNameLittleEndianParser_1.default(), + new FRTimeExpressionParser_1.default(), + new FRSpecificTimeExpressionParser_1.default(), + new FRTimeUnitAgoFormatParser_1.default(), + new FRTimeUnitWithinFormatParser_1.default(), + new FRWeekdayParser_1.default() + ], + refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/ja/constants.js +var require_constants4 = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toHankaku = void 0; + function toHankaku(text2) { + return String(text2).replace(/\u2019/g, "'").replace(/\u201D/g, '"').replace(/\u3000/g, " ").replace(/\uFFE5/g, "\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum); + } + exports.toHankaku = toHankaku; + function alphaNum(token) { + return String.fromCharCode(token.charCodeAt(0) - 65248); + } + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js +var require_JPStandardParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants4(); + var years_1 = require_years(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; + var SPECIAL_YEAR_GROUP = 1; + var TYPICAL_YEAR_GROUP = 2; + var ERA_GROUP = 3; + var YEAR_NUMBER_GROUP = 4; + var MONTH_GROUP = 5; + var DAY_GROUP = 6; + var JPStandardParser = class { + pattern() { + return PATTERN; + } + extract(context, match) { + const month = parseInt(constants_1.toHankaku(match[MONTH_GROUP])); + const day = parseInt(constants_1.toHankaku(match[DAY_GROUP])); + const components = context.createParsingComponents({ + day, + month + }); + if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("\u540C|\u4ECA|\u672C")) { + const moment = dayjs_1.default(context.refDate); + components.assign("year", moment.year()); + } + if (match[TYPICAL_YEAR_GROUP]) { + const yearNumText = match[YEAR_NUMBER_GROUP]; + let year = yearNumText == "\u5143" ? 1 : parseInt(constants_1.toHankaku(yearNumText)); + if (match[ERA_GROUP] == "\u4EE4\u548C") { + year += 2018; + } else if (match[ERA_GROUP] == "\u5E73\u6210") { + year += 1988; + } else if (match[ERA_GROUP] == "\u662D\u548C") { + year += 1925; + } + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = JPStandardParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js +var require_JPMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var JPMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(から|ー|-)\s*$/i; + } + }; + exports.default = JPMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js +var require_JPCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; + var JPCasualDateParser = class { + pattern() { + return PATTERN; + } + extract(context, match) { + const text2 = match[0]; + const date = dayjs_1.default(context.refDate); + const components = context.createParsingComponents(); + switch (text2) { + case "\u6628\u65E5": + return references.yesterday(context.refDate); + case "\u660E\u65E5": + return references.tomorrow(context.refDate); + case "\u4ECA\u65E5": + case "\u5F53\u65E5": + return references.today(context.refDate); + } + if (text2 == "\u4ECA\u591C" || text2 == "\u4ECA\u5915" || text2 == "\u4ECA\u6669") { + components.imply("hour", 22); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (text2.match("\u4ECA\u671D")) { + components.imply("hour", 6); + components.assign("meridiem", index_1.Meridiem.AM); + } + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + return components; + } + }; + exports.default = JPCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/index.js +var require_ja = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var JPStandardParser_1 = __importDefault2(require_JPStandardParser()); + var JPMergeDateRangeRefiner_1 = __importDefault2(require_JPMergeDateRangeRefiner()); + var JPCasualDateParser_1 = __importDefault2(require_JPCasualDateParser()); + var chrono_1 = require_chrono(); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new JPCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + return { + parsers: [new JPStandardParser_1.default()], + refiners: [new JPMergeDateRangeRefiner_1.default()] + }; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/pt/constants.js +var require_constants5 = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + exports.WEEKDAY_DICTIONARY = { + "domingo": 0, + "dom": 0, + "segunda": 1, + "segunda-feira": 1, + "seg": 1, + "ter\xE7a": 2, + "ter\xE7a-feira": 2, + "ter": 2, + "quarta": 3, + "quarta-feira": 3, + "qua": 3, + "quinta": 4, + "quinta-feira": 4, + "qui": 4, + "sexta": 5, + "sexta-feira": 5, + "sex": 5, + "s\xE1bado": 6, + "sabado": 6, + "sab": 6 + }; + exports.MONTH_DICTIONARY = { + "janeiro": 1, + "jan": 1, + "jan.": 1, + "fevereiro": 2, + "fev": 2, + "fev.": 2, + "mar\xE7o": 3, + "mar": 3, + "mar.": 3, + "abril": 4, + "abr": 4, + "abr.": 4, + "maio": 5, + "mai": 5, + "mai.": 5, + "junho": 6, + "jun": 6, + "jun.": 6, + "julho": 7, + "jul": 7, + "jul.": 7, + "agosto": 8, + "ago": 8, + "ago.": 8, + "setembro": 9, + "set": 9, + "set.": 9, + "outubro": 10, + "out": 10, + "out.": 10, + "novembro": 11, + "nov": 11, + "nov.": 11, + "dezembro": 12, + "dez": 12, + "dez.": 12 + }; + exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?"; + function parseYear(match) { + if (match.match(/^[0-9]{1,4}$/)) { + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + if (match.match(/a\.?\s*c\.?/i)) { + match = match.replace(/a\.?\s*c\.?/i, ""); + return -parseInt(match); + } + return parseInt(match); + } + exports.parseYear = parseYear; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js +var require_PTWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var PTWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (offset === void 0) { + return null; + } + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let norm = prefix || postfix || ""; + norm = norm.toLowerCase(); + let modifier = null; + if (norm == "passado") { + modifier = "this"; + } else if (norm == "pr\xF3ximo" || norm == "proximo") { + modifier = "next"; + } else if (norm == "este") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = PTWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js +var require_PTTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var PTTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"; + } + }; + exports.default = PTTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js +var require_PTMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var PTMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(?:,|\xE0)?\\s*$"); + } + }; + exports.default = PTMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js +var require_PTMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var PTMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(?:-)\s*$/i; + } + }; + exports.default = PTMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js +var require_PTMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants5(); + var constants_2 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var PTMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = PTMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js +var require_PTCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var PTCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i; + } + innerExtract(context, match) { + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "agora": + return references.now(context.refDate); + case "hoje": + return references.today(context.refDate); + case "amanha": + case "amanh\xE3": + return references.tomorrow(context.refDate); + case "ontem": + return references.yesterday(context.refDate); + } + return component; + } + }; + exports.default = PTCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js +var require_PTCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var PTCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_2.default(context.refDate); + const component = context.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "tarde": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "noite": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 22); + break; + case "manha": + case "manh\xE3": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "meia-noite": + dayjs_1.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "meio-dia": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = PTCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/index.js +var require_pt = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var PTWeekdayParser_1 = __importDefault2(require_PTWeekdayParser()); + var PTTimeExpressionParser_1 = __importDefault2(require_PTTimeExpressionParser()); + var PTMergeDateTimeRefiner_1 = __importDefault2(require_PTMergeDateTimeRefiner()); + var PTMergeDateRangeRefiner_1 = __importDefault2(require_PTMergeDateRangeRefiner()); + var PTMonthNameLittleEndianParser_1 = __importDefault2(require_PTMonthNameLittleEndianParser()); + var PTCasualDateParser_1 = __importDefault2(require_PTCasualDateParser()); + var PTCasualTimeParser_1 = __importDefault2(require_PTCasualTimeParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.push(new PTCasualDateParser_1.default()); + option.parsers.push(new PTCasualTimeParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new PTWeekdayParser_1.default(), + new PTTimeExpressionParser_1.default(), + new PTMonthNameLittleEndianParser_1.default() + ], + refiners: [new PTMergeDateTimeRefiner_1.default(), new PTMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js +var require_NLMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var NLMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(tot|-)\s*$/i; + } + }; + exports.default = NLMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js +var require_NLMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var NLMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); + } + }; + exports.default = NLMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js +var require_NLCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var NLCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; + } + innerExtract(context, match) { + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "nu": + return references.now(context.refDate); + case "vandaag": + return references.today(context.refDate); + case "morgen": + case "morgend": + return references.tomorrow(context.refDate); + case "gisteren": + return references.yesterday(context.refDate); + } + return component; + } + }; + exports.default = NLCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js +var require_NLCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var DAY_GROUP = 1; + var MOMENT_GROUP = 2; + var NLCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const component = context.createParsingComponents(); + if (match[DAY_GROUP] === "deze") { + component.assign("day", context.refDate.getDate()); + component.assign("month", context.refDate.getMonth() + 1); + component.assign("year", context.refDate.getFullYear()); + } + switch (match[MOMENT_GROUP].toLowerCase()) { + case "namiddag": + case "'s namiddags": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + case "'s avonds'": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "middernacht": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "ochtend": + case "'s ochtends": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + case "'s middags": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = NLCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/constants.js +var require_constants6 = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + zondag: 0, + zon: 0, + "zon.": 0, + zo: 0, + "zo.": 0, + maandag: 1, + ma: 1, + "ma.": 1, + dinsdag: 2, + din: 2, + "din.": 2, + di: 2, + "di.": 2, + woensdag: 3, + woe: 3, + "woe.": 3, + wo: 3, + "wo.": 3, + donderdag: 4, + dond: 4, + "dond.": 4, + do: 4, + "do.": 4, + vrijdag: 5, + vrij: 5, + "vrij.": 5, + vr: 5, + "vr.": 5, + zaterdag: 6, + zat: 6, + "zat.": 6, + "za": 6, + "za.": 6 + }; + exports.MONTH_DICTIONARY = { + januari: 1, + jan: 1, + "jan.": 1, + februari: 2, + feb: 2, + "feb.": 2, + maart: 3, + mar: 3, + "mar.": 3, + april: 4, + apr: 4, + "apr.": 4, + mei: 5, + juni: 6, + jun: 6, + "jun.": 6, + juli: 7, + jul: 7, + "jul.": 7, + augustus: 8, + aug: 8, + "aug.": 8, + september: 9, + sep: 9, + "sep.": 9, + sept: 9, + "sept.": 9, + oktober: 10, + okt: 10, + "okt.": 10, + november: 11, + nov: 11, + "nov.": 11, + december: 12, + dec: 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + een: 1, + twee: 2, + drie: 3, + vier: 4, + vijf: 5, + zes: 6, + zeven: 7, + acht: 8, + negen: 9, + tien: 10, + elf: 11, + twaalf: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + eerste: 1, + tweede: 2, + derde: 3, + vierde: 4, + vijfde: 5, + zesde: 6, + zevende: 7, + achtste: 8, + negende: 9, + tiende: 10, + elfde: 11, + twaalfde: 12, + dertiende: 13, + veertiende: 14, + vijftiende: 15, + zestiende: 16, + zeventiende: 17, + achttiende: 18, + negentiende: 19, + twintigste: 20, + "eenentwintigste": 21, + "twee\xEBntwintigste": 22, + "drieentwintigste": 23, + "vierentwintigste": 24, + "vijfentwintigste": 25, + "zesentwintigste": 26, + "zevenentwintigste": 27, + "achtentwintig": 28, + "negenentwintig": 29, + "dertigste": 30, + "eenendertigste": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconden: "second", + min: "minute", + mins: "minute", + minute: "minute", + minuten: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + uur: "hour", + uren: "hour", + dag: "d", + dagen: "d", + week: "week", + weken: "week", + maand: "month", + maanden: "month", + jaar: "year", + jr: "year", + jaren: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|een?|halve?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "een") { + return 1; + } else if (num.match(/halve?/)) { + return 0.5; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:ste|de)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/voor Christus/i.test(match)) { + match = match.replace(/voor Christus/i, ""); + return -parseInt(match); + } + if (/na Christus/i.test(match)) { + match = match.replace(/na Christus/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js +var require_NLTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NLTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:binnen|in|binnen de|voor)\\s*(` + constants_1.TIME_UNITS_PATTERN + `)(?=\\W|$)`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); + } + }; + exports.default = NLTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js +var require_NLWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var NLWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "vorige") { + modifier = "last"; + } else if (modifierWord == "volgende") { + modifier = "next"; + } else if (modifierWord == "deze") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = NLWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js +var require_NLMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants6(); + var constants_2 = require_constants6(); + var constants_3 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_2.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(` + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + `)(?:(?:-|/|,?\\s*)(${constants_3.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var MONTH_NAME_GROUP = 3; + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var YEAR_GROUP = 4; + var NLMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + const components = context.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = NLMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js +var require_NLMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants6(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var MONTH_NAME_GROUP = 1; + var YEAR_GROUP = 2; + var NLMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const components = context.createParsingComponents(); + components.imply("day", 1); + const monthName = match[MONTH_NAME_GROUP]; + const month = constants_1.MONTH_DICTIONARY[monthName.toLowerCase()]; + components.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, 1, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = NLMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js +var require_NLSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var NLSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = NLSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js +var require_NLTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var NLTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:om)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"; + } + extractPrimaryTimeComponents(context, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context, match); + } + }; + exports.default = NLTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js +var require_NLCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var NLCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = NLCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js +var require_NLCasualDateTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var index_1 = require_dist(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var DATE_GROUP = 1; + var TIME_OF_DAY_GROUP = 2; + var NLCasualDateTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; + } + innerExtract(context, match) { + const dateText = match[DATE_GROUP].toLowerCase(); + const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); + const component = context.createParsingComponents(); + const targetDate = dayjs_2.default(context.refDate); + switch (dateText) { + case "gisteren": + dayjs_1.assignSimilarDate(component, targetDate.add(-1, "day")); + break; + case "van": + dayjs_1.assignSimilarDate(component, targetDate); + break; + case "morgen": + dayjs_1.assignTheNextDay(component, targetDate); + break; + } + switch (timeText) { + case "ochtend": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + case "namiddag": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + } + return component; + } + }; + exports.default = NLCasualDateTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/index.js +var require_nl = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var NLMergeDateRangeRefiner_1 = __importDefault2(require_NLMergeDateRangeRefiner()); + var NLMergeDateTimeRefiner_1 = __importDefault2(require_NLMergeDateTimeRefiner()); + var NLCasualDateParser_1 = __importDefault2(require_NLCasualDateParser()); + var NLCasualTimeParser_1 = __importDefault2(require_NLCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var NLTimeUnitWithinFormatParser_1 = __importDefault2(require_NLTimeUnitWithinFormatParser()); + var NLWeekdayParser_1 = __importDefault2(require_NLWeekdayParser()); + var NLMonthNameMiddleEndianParser_1 = __importDefault2(require_NLMonthNameMiddleEndianParser()); + var NLMonthNameParser_1 = __importDefault2(require_NLMonthNameParser()); + var NLSlashMonthFormatParser_1 = __importDefault2(require_NLSlashMonthFormatParser()); + var NLTimeExpressionParser_1 = __importDefault2(require_NLTimeExpressionParser()); + var NLCasualYearMonthDayParser_1 = __importDefault2(require_NLCasualYearMonthDayParser()); + var NLCasualDateTimeParser_1 = __importDefault2(require_NLCasualDateTimeParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new NLCasualDateParser_1.default()); + option.parsers.unshift(new NLCasualTimeParser_1.default()); + option.parsers.unshift(new NLCasualDateTimeParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new NLMonthNameMiddleEndianParser_1.default(), + new NLMonthNameParser_1.default(), + new NLTimeExpressionParser_1.default(), + new NLTimeUnitWithinFormatParser_1.default(), + new NLSlashMonthFormatParser_1.default(), + new NLWeekdayParser_1.default(), + new NLCasualYearMonthDayParser_1.default() + ], + refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/index.js +var require_dist = __commonJS({ + "node_modules/chrono-node/dist/index.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseDate = exports.parse = exports.casual = exports.strict = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0; + var en = __importStar2(require_en()); + exports.en = en; + var chrono_1 = require_chrono(); + Object.defineProperty(exports, "Chrono", { enumerable: true, get: function() { + return chrono_1.Chrono; + } }); + var Meridiem; + (function(Meridiem2) { + Meridiem2[Meridiem2["AM"] = 0] = "AM"; + Meridiem2[Meridiem2["PM"] = 1] = "PM"; + })(Meridiem = exports.Meridiem || (exports.Meridiem = {})); + var de = __importStar2(require_de()); + exports.de = de; + var fr = __importStar2(require_fr()); + exports.fr = fr; + var ja = __importStar2(require_ja()); + exports.ja = ja; + var pt = __importStar2(require_pt()); + exports.pt = pt; + var nl = __importStar2(require_nl()); + exports.nl = nl; + exports.strict = en.strict; + exports.casual = en.casual; + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate; + } +}); + +// src/main.ts +__export(exports, { + default: () => TasksPlugin +}); +var import_obsidian9 = __toModule(require("obsidian")); + +// src/Cache.ts +var import_obsidian3 = __toModule(require("obsidian")); + +// node_modules/async-mutex/index.mjs +var E_TIMEOUT = new Error("timeout while waiting for mutex to become available"); +var E_ALREADY_LOCKED = new Error("mutex already locked"); +var E_CANCELED = new Error("request for lock canceled"); +var __awaiter$2 = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var Semaphore = class { + constructor(_maxConcurrency, _cancelError = E_CANCELED) { + this._maxConcurrency = _maxConcurrency; + this._cancelError = _cancelError; + this._queue = []; + this._waiters = []; + if (_maxConcurrency <= 0) { + throw new Error("semaphore must be initialized to a positive value"); + } + this._value = _maxConcurrency; + } + acquire() { + const locked = this.isLocked(); + const ticketPromise = new Promise((resolve, reject) => this._queue.push({ resolve, reject })); + if (!locked) + this._dispatch(); + return ticketPromise; + } + runExclusive(callback) { + return __awaiter$2(this, void 0, void 0, function* () { + const [value, release] = yield this.acquire(); + try { + return yield callback(value); + } finally { + release(); + } + }); + } + waitForUnlock() { + return __awaiter$2(this, void 0, void 0, function* () { + if (!this.isLocked()) { + return Promise.resolve(); + } + const waitPromise = new Promise((resolve) => this._waiters.push({ resolve })); + return waitPromise; + }); + } + isLocked() { + return this._value <= 0; + } + release() { + if (this._maxConcurrency > 1) { + throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead"); + } + if (this._currentReleaser) { + const releaser = this._currentReleaser; + this._currentReleaser = void 0; + releaser(); + } + } + cancel() { + this._queue.forEach((ticket) => ticket.reject(this._cancelError)); + this._queue = []; + } + _dispatch() { + const nextTicket = this._queue.shift(); + if (!nextTicket) + return; + let released = false; + this._currentReleaser = () => { + if (released) + return; + released = true; + this._value++; + this._resolveWaiters(); + this._dispatch(); + }; + nextTicket.resolve([this._value--, this._currentReleaser]); + } + _resolveWaiters() { + this._waiters.forEach((waiter) => waiter.resolve()); + this._waiters = []; + } +}; +var __awaiter$1 = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var Mutex = class { + constructor(cancelError) { + this._semaphore = new Semaphore(1, cancelError); + } + acquire() { + return __awaiter$1(this, void 0, void 0, function* () { + const [, releaser] = yield this._semaphore.acquire(); + return releaser; + }); + } + runExclusive(callback) { + return this._semaphore.runExclusive(() => callback()); + } + isLocked() { + return this._semaphore.isLocked(); + } + waitForUnlock() { + return this._semaphore.waitForUnlock(); + } + release() { + this._semaphore.release(); + } + cancel() { + return this._semaphore.cancel(); + } +}; + +// src/Task.ts +var import_obsidian2 = __toModule(require("obsidian")); + +// src/File.ts +var import_obsidian = __toModule(require("obsidian")); + +// src/Settings.ts +var defaultSettings = { + globalFilter: "", + removeGlobalFilter: false, + setDoneDate: true +}; +var settings = __spreadValues({}, defaultSettings); +var getSettings = () => { + return __spreadValues({}, settings); +}; +var updateSettings = (newSettings) => { + settings = __spreadValues(__spreadValues({}, settings), newSettings); + return getSettings(); +}; + +// src/File.ts +var metadataCache; +var vault; +var initializeFile = ({ + metadataCache: newMetadataCache, + vault: newVault +}) => { + metadataCache = newMetadataCache; + vault = newVault; +}; +var replaceTaskWithTasks = (_0) => __async(void 0, [_0], function* ({ + originalTask, + newTasks +}) { + if (vault === void 0 || metadataCache === void 0) { + console.error("Tasks: cannot use File before initializing it."); + return; + } + if (!Array.isArray(newTasks)) { + newTasks = [newTasks]; + } + tryRepetitive({ + originalTask, + newTasks, + vault, + metadataCache, + previousTries: 0 + }); +}); +var tryRepetitive = (_0) => __async(void 0, [_0], function* ({ + originalTask, + newTasks, + vault: vault2, + metadataCache: metadataCache2, + previousTries +}) { + const retry = () => { + if (previousTries > 10) { + console.error("Tasks: Too many retries. File update not possible ..."); + return; + } + const timeout = Math.min(Math.pow(10, previousTries), 100); + setTimeout(() => { + tryRepetitive({ + originalTask, + newTasks, + vault: vault2, + metadataCache: metadataCache2, + previousTries: previousTries + 1 + }); + }, timeout); + }; + const file = vault2.getAbstractFileByPath(originalTask.path); + if (!(file instanceof import_obsidian.TFile)) { + console.warn(`Tasks: No file found for task ${originalTask.description}. Retrying ...`); + return retry(); + } + if (file.extension !== "md") { + console.error("Tasks: Only supporting files with the .md file extension."); + return; + } + const fileCache = metadataCache2.getFileCache(file); + if (fileCache == void 0 || fileCache === null) { + console.warn(`Tasks: No file cache found for file ${file.path}. Retrying ...`); + return retry(); + } + const listItemsCache = fileCache.listItems; + if (listItemsCache === void 0 || listItemsCache.length === 0) { + console.warn(`Tasks: No list items found in file cache of ${file.path}. Retrying ...`); + return retry(); + } + const fileContent = yield vault2.read(file); + const fileLines = fileContent.split("\n"); + const { globalFilter } = getSettings(); + let listItem; + let sectionIndex = 0; + for (const listItemCache of listItemsCache) { + if (listItemCache.position.start.line < originalTask.sectionStart) { + continue; + } + if (listItemCache.task === void 0) { + continue; + } + const line = fileLines[listItemCache.position.start.line]; + if (line.includes(globalFilter)) { + if (sectionIndex === originalTask.sectionIndex) { + listItem = listItemCache; + break; + } + sectionIndex++; + } + } + if (listItem === void 0) { + console.error("Tasks: could not find task to toggle in the file."); + return; + } + const updatedFileLines = [ + ...fileLines.slice(0, listItem.position.start.line), + ...newTasks.map((task) => task.toFileLineString()), + ...fileLines.slice(listItem.position.start.line + 1) + ]; + yield vault2.modify(file, updatedFileLines.join("\n")); +}); + +// src/LayoutOptions.ts +var LayoutOptions = class { + constructor() { + this.hideTaskCount = false; + this.hideBacklinks = false; + this.hidePriority = false; + this.hideStartDate = false; + this.hideScheduledDate = false; + this.hideDoneDate = false; + this.hideDueDate = false; + this.hideRecurrenceRule = false; + this.hideEditButton = false; + this.shortMode = false; + } +}; + +// node_modules/rrule/dist/esm/src/weekday.js +var ALL_WEEKDAYS = ["MO", "TU", "WE", "TH", "FR", "SA", "SU"]; +var Weekday = function() { + function Weekday2(weekday, n) { + if (n === 0) + throw new Error("Can't create weekday with n == 0"); + this.weekday = weekday; + this.n = n; + } + Weekday2.fromStr = function(str) { + return new Weekday2(ALL_WEEKDAYS.indexOf(str)); + }; + Weekday2.prototype.nth = function(n) { + return this.n === n ? this : new Weekday2(this.weekday, n); + }; + Weekday2.prototype.equals = function(other) { + return this.weekday === other.weekday && this.n === other.n; + }; + Weekday2.prototype.toString = function() { + var s = ALL_WEEKDAYS[this.weekday]; + if (this.n) + s = (this.n > 0 ? "+" : "") + String(this.n) + s; + return s; + }; + Weekday2.prototype.getJsWeekday = function() { + return this.weekday === 6 ? 0 : this.weekday + 1; + }; + return Weekday2; +}(); + +// node_modules/rrule/dist/esm/src/helpers.js +var isPresent = function(value) { + return value !== null && value !== void 0; +}; +var isNumber = function(value) { + return typeof value === "number"; +}; +var isWeekdayStr = function(value) { + return ALL_WEEKDAYS.indexOf(value) >= 0; +}; +var isArray = Array.isArray; +var range = function(start, end) { + if (end === void 0) { + end = start; + } + if (arguments.length === 1) { + end = start; + start = 0; + } + var rang = []; + for (var i = start; i < end; i++) + rang.push(i); + return rang; +}; +var repeat = function(value, times) { + var i = 0; + var array = []; + if (isArray(value)) { + for (; i < times; i++) + array[i] = [].concat(value); + } else { + for (; i < times; i++) + array[i] = value; + } + return array; +}; +var toArray = function(item) { + if (isArray(item)) { + return item; + } + return [item]; +}; +function padStart(item, targetLength, padString) { + if (padString === void 0) { + padString = " "; + } + var str = String(item); + targetLength = targetLength >> 0; + if (str.length > targetLength) { + return String(str); + } + targetLength = targetLength - str.length; + if (targetLength > padString.length) { + padString += repeat(padString, targetLength / padString.length); + } + return padString.slice(0, targetLength) + String(str); +} +var split = function(str, sep, num) { + var splits = str.split(sep); + return num ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) : splits; +}; +var pymod = function(a, b) { + var r = a % b; + return r * b < 0 ? r + b : r; +}; +var divmod = function(a, b) { + return { div: Math.floor(a / b), mod: pymod(a, b) }; +}; +var empty = function(obj) { + return !isPresent(obj) || obj.length === 0; +}; +var notEmpty = function(obj) { + return !empty(obj); +}; +var includes = function(arr, val) { + return notEmpty(arr) && arr.indexOf(val) !== -1; +}; + +// node_modules/rrule/dist/esm/src/dateutil.js +var dateutil; +(function(dateutil2) { + dateutil2.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + dateutil2.ONE_DAY = 1e3 * 60 * 60 * 24; + dateutil2.MAXYEAR = 9999; + dateutil2.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); + dateutil2.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; + dateutil2.getYearDay = function(date) { + var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); + return Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / dateutil2.ONE_DAY) + 1; + }; + dateutil2.isLeapYear = function(year) { + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; + }; + dateutil2.isDate = function(value) { + return value instanceof Date; + }; + dateutil2.isValidDate = function(value) { + return dateutil2.isDate(value) && !isNaN(value.getTime()); + }; + dateutil2.tzOffset = function(date) { + return date.getTimezoneOffset() * 60 * 1e3; + }; + dateutil2.daysBetween = function(date1, date2) { + var date1ms = date1.getTime() - dateutil2.tzOffset(date1); + var date2ms = date2.getTime() - dateutil2.tzOffset(date2); + var differencems = date1ms - date2ms; + return Math.round(differencems / dateutil2.ONE_DAY); + }; + dateutil2.toOrdinal = function(date) { + return dateutil2.daysBetween(date, dateutil2.ORDINAL_BASE); + }; + dateutil2.fromOrdinal = function(ordinal) { + return new Date(dateutil2.ORDINAL_BASE.getTime() + ordinal * dateutil2.ONE_DAY); + }; + dateutil2.getMonthDays = function(date) { + var month = date.getUTCMonth(); + return month === 1 && dateutil2.isLeapYear(date.getUTCFullYear()) ? 29 : dateutil2.MONTH_DAYS[month]; + }; + dateutil2.getWeekday = function(date) { + return dateutil2.PY_WEEKDAYS[date.getUTCDay()]; + }; + dateutil2.monthRange = function(year, month) { + var date = new Date(Date.UTC(year, month, 1)); + return [dateutil2.getWeekday(date), dateutil2.getMonthDays(date)]; + }; + dateutil2.combine = function(date, time) { + time = time || date; + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); + }; + dateutil2.clone = function(date) { + var dolly = new Date(date.getTime()); + return dolly; + }; + dateutil2.cloneDates = function(dates) { + var clones = []; + for (var i = 0; i < dates.length; i++) { + clones.push(dateutil2.clone(dates[i])); + } + return clones; + }; + dateutil2.sort = function(dates) { + dates.sort(function(a, b) { + return a.getTime() - b.getTime(); + }); + }; + dateutil2.timeToUntilString = function(time, utc) { + if (utc === void 0) { + utc = true; + } + var date = new Date(time); + return [ + padStart(date.getUTCFullYear().toString(), 4, "0"), + padStart(date.getUTCMonth() + 1, 2, "0"), + padStart(date.getUTCDate(), 2, "0"), + "T", + padStart(date.getUTCHours(), 2, "0"), + padStart(date.getUTCMinutes(), 2, "0"), + padStart(date.getUTCSeconds(), 2, "0"), + utc ? "Z" : "" + ].join(""); + }; + dateutil2.untilStringToDate = function(until) { + var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; + var bits = re.exec(until); + if (!bits) + throw new Error("Invalid UNTIL value: " + until); + return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); + }; +})(dateutil || (dateutil = {})); +var dateutil_default = dateutil; + +// node_modules/rrule/dist/esm/src/iterresult.js +var IterResult = function() { + function IterResult2(method, args) { + this.minDate = null; + this.maxDate = null; + this._result = []; + this.total = 0; + this.method = method; + this.args = args; + if (method === "between") { + this.maxDate = args.inc ? args.before : new Date(args.before.getTime() - 1); + this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1); + } else if (method === "before") { + this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1); + } else if (method === "after") { + this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1); + } + } + IterResult2.prototype.accept = function(date) { + ++this.total; + var tooEarly = this.minDate && date < this.minDate; + var tooLate = this.maxDate && date > this.maxDate; + if (this.method === "between") { + if (tooEarly) + return true; + if (tooLate) + return false; + } else if (this.method === "before") { + if (tooLate) + return false; + } else if (this.method === "after") { + if (tooEarly) + return true; + this.add(date); + return false; + } + return this.add(date); + }; + IterResult2.prototype.add = function(date) { + this._result.push(date); + return true; + }; + IterResult2.prototype.getValue = function() { + var res = this._result; + switch (this.method) { + case "all": + case "between": + return res; + case "before": + case "after": + default: + return res.length ? res[res.length - 1] : null; + } + }; + IterResult2.prototype.clone = function() { + return new IterResult2(this.method, this.args); + }; + return IterResult2; +}(); +var iterresult_default = IterResult; + +// node_modules/rrule/node_modules/tslib/modules/index.js +var import_tslib = __toModule(require_tslib()); +var { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __exportStar, + __createBinding, + __values, + __read, + __spread, + __spreadArrays, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet +} = import_tslib.default; + +// node_modules/rrule/dist/esm/src/callbackiterresult.js +var CallbackIterResult = function(_super) { + __extends(CallbackIterResult2, _super); + function CallbackIterResult2(method, args, iterator) { + var _this = _super.call(this, method, args) || this; + _this.iterator = iterator; + return _this; + } + CallbackIterResult2.prototype.add = function(date) { + if (this.iterator(date, this._result.length)) { + this._result.push(date); + return true; + } + return false; + }; + return CallbackIterResult2; +}(iterresult_default); +var callbackiterresult_default = CallbackIterResult; + +// node_modules/rrule/dist/esm/src/nlp/i18n.js +var ENGLISH = { + dayNames: [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + monthNames: [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ], + tokens: { + "SKIP": /^[ \r\n\t]+|^\.$/, + "number": /^[1-9][0-9]*/, + "numberAsText": /^(one|two|three)/i, + "every": /^every/i, + "day(s)": /^days?/i, + "weekday(s)": /^weekdays?/i, + "week(s)": /^weeks?/i, + "hour(s)": /^hours?/i, + "minute(s)": /^minutes?/i, + "month(s)": /^months?/i, + "year(s)": /^years?/i, + "on": /^(on|in)/i, + "at": /^(at)/i, + "the": /^the/i, + "first": /^first/i, + "second": /^second/i, + "third": /^third/i, + "nth": /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + "last": /^last/i, + "for": /^for/i, + "time(s)": /^times?/i, + "until": /^(un)?til/i, + "monday": /^mo(n(day)?)?/i, + "tuesday": /^tu(e(s(day)?)?)?/i, + "wednesday": /^we(d(n(esday)?)?)?/i, + "thursday": /^th(u(r(sday)?)?)?/i, + "friday": /^fr(i(day)?)?/i, + "saturday": /^sa(t(urday)?)?/i, + "sunday": /^su(n(day)?)?/i, + "january": /^jan(uary)?/i, + "february": /^feb(ruary)?/i, + "march": /^mar(ch)?/i, + "april": /^apr(il)?/i, + "may": /^may/i, + "june": /^june?/i, + "july": /^july?/i, + "august": /^aug(ust)?/i, + "september": /^sep(t(ember)?)?/i, + "october": /^oct(ober)?/i, + "november": /^nov(ember)?/i, + "december": /^dec(ember)?/i, + "comma": /^(,\s*|(and|or)\s*)+/i + } +}; +var i18n_default = ENGLISH; + +// node_modules/rrule/dist/esm/src/nlp/totext.js +var contains = function(arr, val) { + return arr.indexOf(val) !== -1; +}; +var defaultGetText = function(id) { + return id.toString(); +}; +var defaultDateFormatter = function(year, month, day) { + return month + " " + day + ", " + year; +}; +var ToText = function() { + function ToText2(rrule, gettext, language, dateFormatter) { + if (gettext === void 0) { + gettext = defaultGetText; + } + if (language === void 0) { + language = i18n_default; + } + if (dateFormatter === void 0) { + dateFormatter = defaultDateFormatter; + } + this.text = []; + this.language = language || i18n_default; + this.gettext = gettext; + this.dateFormatter = dateFormatter; + this.rrule = rrule; + this.options = rrule.options; + this.origOptions = rrule.origOptions; + if (this.origOptions.bymonthday) { + var bymonthday = [].concat(this.options.bymonthday); + var bynmonthday = [].concat(this.options.bynmonthday); + bymonthday.sort(function(a, b) { + return a - b; + }); + bynmonthday.sort(function(a, b) { + return b - a; + }); + this.bymonthday = bymonthday.concat(bynmonthday); + if (!this.bymonthday.length) + this.bymonthday = null; + } + if (isPresent(this.origOptions.byweekday)) { + var byweekday = !isArray(this.origOptions.byweekday) ? [this.origOptions.byweekday] : this.origOptions.byweekday; + var days = String(byweekday); + this.byweekday = { + allWeeks: byweekday.filter(function(weekday) { + return !weekday.n; + }), + someWeeks: byweekday.filter(function(weekday) { + return Boolean(weekday.n); + }), + isWeekdays: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") === -1 && days.indexOf("SU") === -1, + isEveryDay: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") !== -1 && days.indexOf("SU") !== -1 + }; + var sortWeekDays = function(a, b) { + return a.weekday - b.weekday; + }; + this.byweekday.allWeeks.sort(sortWeekDays); + this.byweekday.someWeeks.sort(sortWeekDays); + if (!this.byweekday.allWeeks.length) + this.byweekday.allWeeks = null; + if (!this.byweekday.someWeeks.length) + this.byweekday.someWeeks = null; + } else { + this.byweekday = null; + } + } + ToText2.isFullyConvertible = function(rrule) { + var canConvert = true; + if (!(rrule.options.freq in ToText2.IMPLEMENTED)) + return false; + if (rrule.origOptions.until && rrule.origOptions.count) + return false; + for (var key in rrule.origOptions) { + if (contains(["dtstart", "wkst", "freq"], key)) + return true; + if (!contains(ToText2.IMPLEMENTED[rrule.options.freq], key)) + return false; + } + return canConvert; + }; + ToText2.prototype.isFullyConvertible = function() { + return ToText2.isFullyConvertible(this.rrule); + }; + ToText2.prototype.toString = function() { + var gettext = this.gettext; + if (!(this.options.freq in ToText2.IMPLEMENTED)) { + return gettext("RRule error: Unable to fully convert this rrule to text"); + } + this.text = [gettext("every")]; + this[src_default.FREQUENCIES[this.options.freq]](); + if (this.options.until) { + this.add(gettext("until")); + var until = this.options.until; + this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())); + } else if (this.options.count) { + this.add(gettext("for")).add(this.options.count.toString()).add(this.plural(this.options.count) ? gettext("times") : gettext("time")); + } + if (!this.isFullyConvertible()) + this.add(gettext("(~ approximate)")); + return this.text.join(""); + }; + ToText2.prototype.HOURLY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("hours") : gettext("hour")); + }; + ToText2.prototype.MINUTELY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("minutes") : gettext("minute")); + }; + ToText2.prototype.DAILY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + if (this.byweekday && this.byweekday.isWeekdays) { + this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); + } else { + this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); + } + if (this.origOptions.bymonth) { + this.add(gettext("in")); + this._bymonth(); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } else if (this.origOptions.byhour) { + this._byhour(); + } + }; + ToText2.prototype.WEEKLY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext("weeks") : gettext("week")); + } + if (this.byweekday && this.byweekday.isWeekdays) { + if (this.options.interval === 1) { + this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); + } else { + this.add(gettext("on")).add(gettext("weekdays")); + } + } else if (this.byweekday && this.byweekday.isEveryDay) { + this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); + } else { + if (this.options.interval === 1) + this.add(gettext("week")); + if (this.origOptions.bymonth) { + this.add(gettext("in")); + this._bymonth(); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } + } + }; + ToText2.prototype.MONTHLY = function() { + var gettext = this.gettext; + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()).add(gettext("months")); + if (this.plural(this.options.interval)) + this.add(gettext("in")); + } else { + } + this._bymonth(); + } else { + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("months") : gettext("month")); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday && this.byweekday.isWeekdays) { + this.add(gettext("on")).add(gettext("weekdays")); + } else if (this.byweekday) { + this._byweekday(); + } + }; + ToText2.prototype.YEARLY = function() { + var gettext = this.gettext; + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()); + this.add(gettext("years")); + } else { + } + this._bymonth(); + } else { + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("years") : gettext("year")); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } + if (this.options.byyearday) { + this.add(gettext("on the")).add(this.list(this.options.byyearday, this.nth, gettext("and"))).add(gettext("day")); + } + if (this.options.byweekno) { + this.add(gettext("in")).add(this.plural(this.options.byweekno.length) ? gettext("weeks") : gettext("week")).add(this.list(this.options.byweekno, void 0, gettext("and"))); + } + }; + ToText2.prototype._bymonthday = function() { + var gettext = this.gettext; + if (this.byweekday && this.byweekday.allWeeks) { + this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext("or"))).add(gettext("the")).add(this.list(this.bymonthday, this.nth, gettext("or"))); + } else { + this.add(gettext("on the")).add(this.list(this.bymonthday, this.nth, gettext("and"))); + } + }; + ToText2.prototype._byweekday = function() { + var gettext = this.gettext; + if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { + this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext)); + } + if (this.byweekday.someWeeks) { + if (this.byweekday.allWeeks) + this.add(gettext("and")); + this.add(gettext("on the")).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext("and"))); + } + }; + ToText2.prototype._byhour = function() { + var gettext = this.gettext; + this.add(gettext("at")).add(this.list(this.origOptions.byhour, void 0, gettext("and"))); + }; + ToText2.prototype._bymonth = function() { + this.add(this.list(this.options.bymonth, this.monthtext, this.gettext("and"))); + }; + ToText2.prototype.nth = function(n) { + n = parseInt(n.toString(), 10); + var nth; + var npos; + var gettext = this.gettext; + if (n === -1) + return gettext("last"); + npos = Math.abs(n); + switch (npos) { + case 1: + case 21: + case 31: + nth = npos + gettext("st"); + break; + case 2: + case 22: + nth = npos + gettext("nd"); + break; + case 3: + case 23: + nth = npos + gettext("rd"); + break; + default: + nth = npos + gettext("th"); + } + return n < 0 ? nth + " " + gettext("last") : nth; + }; + ToText2.prototype.monthtext = function(m) { + return this.language.monthNames[m - 1]; + }; + ToText2.prototype.weekdaytext = function(wday) { + var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); + return (wday.n ? this.nth(wday.n) + " " : "") + this.language.dayNames[weekday]; + }; + ToText2.prototype.plural = function(n) { + return n % 100 !== 1; + }; + ToText2.prototype.add = function(s) { + this.text.push(" "); + this.text.push(s); + return this; + }; + ToText2.prototype.list = function(arr, callback, finalDelim, delim) { + if (delim === void 0) { + delim = ","; + } + if (!isArray(arr)) { + arr = [arr]; + } + var delimJoin = function(array, delimiter, finalDelimiter) { + var list = ""; + for (var i = 0; i < array.length; i++) { + if (i !== 0) { + if (i === array.length - 1) { + list += " " + finalDelimiter + " "; + } else { + list += delimiter + " "; + } + } + list += array[i]; + } + return list; + }; + callback = callback || function(o) { + return o.toString(); + }; + var self2 = this; + var realCallback = function(arg) { + return callback && callback.call(self2, arg); + }; + if (finalDelim) { + return delimJoin(arr.map(realCallback), delim, finalDelim); + } else { + return arr.map(realCallback).join(delim + " "); + } + }; + return ToText2; +}(); +var totext_default = ToText; + +// node_modules/rrule/dist/esm/src/nlp/parsetext.js +var Parser = function() { + function Parser2(rules) { + this.done = true; + this.rules = rules; + } + Parser2.prototype.start = function(text2) { + this.text = text2; + this.done = false; + return this.nextSymbol(); + }; + Parser2.prototype.isDone = function() { + return this.done && this.symbol === null; + }; + Parser2.prototype.nextSymbol = function() { + var best; + var bestSymbol; + var p = this; + this.symbol = null; + this.value = null; + do { + if (this.done) + return false; + var rule = void 0; + best = null; + for (var name_1 in this.rules) { + rule = this.rules[name_1]; + var match = rule.exec(p.text); + if (match) { + if (best === null || match[0].length > best[0].length) { + best = match; + bestSymbol = name_1; + } + } + } + if (best != null) { + this.text = this.text.substr(best[0].length); + if (this.text === "") + this.done = true; + } + if (best == null) { + this.done = true; + this.symbol = null; + this.value = null; + return; + } + } while (bestSymbol === "SKIP"); + this.symbol = bestSymbol; + this.value = best; + return true; + }; + Parser2.prototype.accept = function(name) { + if (this.symbol === name) { + if (this.value) { + var v = this.value; + this.nextSymbol(); + return v; + } + this.nextSymbol(); + return true; + } + return false; + }; + Parser2.prototype.acceptNumber = function() { + return this.accept("number"); + }; + Parser2.prototype.expect = function(name) { + if (this.accept(name)) + return true; + throw new Error("expected " + name + " but found " + this.symbol); + }; + return Parser2; +}(); +function parseText(text2, language) { + if (language === void 0) { + language = i18n_default; + } + var options = {}; + var ttr = new Parser(language.tokens); + if (!ttr.start(text2)) + return null; + S(); + return options; + function S() { + ttr.expect("every"); + var n = ttr.acceptNumber(); + if (n) + options.interval = parseInt(n[0], 10); + if (ttr.isDone()) + throw new Error("Unexpected end"); + switch (ttr.symbol) { + case "day(s)": + options.freq = src_default.DAILY; + if (ttr.nextSymbol()) { + AT(); + F(); + } + break; + case "weekday(s)": + options.freq = src_default.WEEKLY; + options.byweekday = [ + src_default.MO, + src_default.TU, + src_default.WE, + src_default.TH, + src_default.FR + ]; + ttr.nextSymbol(); + F(); + break; + case "week(s)": + options.freq = src_default.WEEKLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "hour(s)": + options.freq = src_default.HOURLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "minute(s)": + options.freq = src_default.MINUTELY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "month(s)": + options.freq = src_default.MONTHLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "year(s)": + options.freq = src_default.YEARLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "monday": + case "tuesday": + case "wednesday": + case "thursday": + case "friday": + case "saturday": + case "sunday": + options.freq = src_default.WEEKLY; + var key = ttr.symbol.substr(0, 2).toUpperCase(); + options.byweekday = [src_default[key]]; + if (!ttr.nextSymbol()) + return; + while (ttr.accept("comma")) { + if (ttr.isDone()) + throw new Error("Unexpected end"); + var wkd = decodeWKD(); + if (!wkd) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected weekday"); + } + options.byweekday.push(src_default[wkd]); + ttr.nextSymbol(); + } + MDAYs(); + F(); + break; + case "january": + case "february": + case "march": + case "april": + case "may": + case "june": + case "july": + case "august": + case "september": + case "october": + case "november": + case "december": + options.freq = src_default.YEARLY; + options.bymonth = [decodeM()]; + if (!ttr.nextSymbol()) + return; + while (ttr.accept("comma")) { + if (ttr.isDone()) + throw new Error("Unexpected end"); + var m = decodeM(); + if (!m) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected month"); + } + options.bymonth.push(m); + ttr.nextSymbol(); + } + ON(); + F(); + break; + default: + throw new Error("Unknown symbol"); + } + } + function ON() { + var on = ttr.accept("on"); + var the = ttr.accept("the"); + if (!(on || the)) + return; + do { + var nth = decodeNTH(); + var wkd = decodeWKD(); + var m = decodeM(); + if (nth) { + if (wkd) { + ttr.nextSymbol(); + if (!options.byweekday) + options.byweekday = []; + options.byweekday.push(src_default[wkd].nth(nth)); + } else { + if (!options.bymonthday) + options.bymonthday = []; + options.bymonthday.push(nth); + ttr.accept("day(s)"); + } + } else if (wkd) { + ttr.nextSymbol(); + if (!options.byweekday) + options.byweekday = []; + options.byweekday.push(src_default[wkd]); + } else if (ttr.symbol === "weekday(s)") { + ttr.nextSymbol(); + if (!options.byweekday) { + options.byweekday = [ + src_default.MO, + src_default.TU, + src_default.WE, + src_default.TH, + src_default.FR + ]; + } + } else if (ttr.symbol === "week(s)") { + ttr.nextSymbol(); + var n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected week number"); + } + options.byweekno = [parseInt(n[0], 10)]; + while (ttr.accept("comma")) { + n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); + } + options.byweekno.push(parseInt(n[0], 10)); + } + } else if (m) { + ttr.nextSymbol(); + if (!options.bymonth) + options.bymonth = []; + options.bymonth.push(m); + } else { + return; + } + } while (ttr.accept("comma") || ttr.accept("the") || ttr.accept("on")); + } + function AT() { + var at = ttr.accept("at"); + if (!at) + return; + do { + var n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected hour"); + } + options.byhour = [parseInt(n[0], 10)]; + while (ttr.accept("comma")) { + n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected hour"); + } + options.byhour.push(parseInt(n[0], 10)); + } + } while (ttr.accept("comma") || ttr.accept("at")); + } + function decodeM() { + switch (ttr.symbol) { + case "january": + return 1; + case "february": + return 2; + case "march": + return 3; + case "april": + return 4; + case "may": + return 5; + case "june": + return 6; + case "july": + return 7; + case "august": + return 8; + case "september": + return 9; + case "october": + return 10; + case "november": + return 11; + case "december": + return 12; + default: + return false; + } + } + function decodeWKD() { + switch (ttr.symbol) { + case "monday": + case "tuesday": + case "wednesday": + case "thursday": + case "friday": + case "saturday": + case "sunday": + return ttr.symbol.substr(0, 2).toUpperCase(); + default: + return false; + } + } + function decodeNTH() { + switch (ttr.symbol) { + case "last": + ttr.nextSymbol(); + return -1; + case "first": + ttr.nextSymbol(); + return 1; + case "second": + ttr.nextSymbol(); + return ttr.accept("last") ? -2 : 2; + case "third": + ttr.nextSymbol(); + return ttr.accept("last") ? -3 : 3; + case "nth": + var v = parseInt(ttr.value[1], 10); + if (v < -366 || v > 366) + throw new Error("Nth out of range: " + v); + ttr.nextSymbol(); + return ttr.accept("last") ? -v : v; + default: + return false; + } + } + function MDAYs() { + ttr.accept("on"); + ttr.accept("the"); + var nth = decodeNTH(); + if (!nth) + return; + options.bymonthday = [nth]; + ttr.nextSymbol(); + while (ttr.accept("comma")) { + nth = decodeNTH(); + if (!nth) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); + } + options.bymonthday.push(nth); + ttr.nextSymbol(); + } + } + function F() { + if (ttr.symbol === "until") { + var date = Date.parse(ttr.text); + if (!date) + throw new Error("Cannot parse until date:" + ttr.text); + options.until = new Date(date); + } else if (ttr.accept("for")) { + options.count = parseInt(ttr.value[0], 10); + ttr.expect("number"); + } + } +} + +// node_modules/rrule/dist/esm/src/types.js +var Frequency; +(function(Frequency2) { + Frequency2[Frequency2["YEARLY"] = 0] = "YEARLY"; + Frequency2[Frequency2["MONTHLY"] = 1] = "MONTHLY"; + Frequency2[Frequency2["WEEKLY"] = 2] = "WEEKLY"; + Frequency2[Frequency2["DAILY"] = 3] = "DAILY"; + Frequency2[Frequency2["HOURLY"] = 4] = "HOURLY"; + Frequency2[Frequency2["MINUTELY"] = 5] = "MINUTELY"; + Frequency2[Frequency2["SECONDLY"] = 6] = "SECONDLY"; +})(Frequency || (Frequency = {})); +function freqIsDailyOrGreater(freq) { + return freq < Frequency.HOURLY; +} + +// node_modules/rrule/dist/esm/src/nlp/index.js +var fromText = function(text2, language) { + if (language === void 0) { + language = i18n_default; + } + return new src_default(parseText(text2, language) || void 0); +}; +var common = [ + "count", + "until", + "interval", + "byweekday", + "bymonthday", + "bymonth" +]; +totext_default.IMPLEMENTED = []; +totext_default.IMPLEMENTED[Frequency.HOURLY] = common; +totext_default.IMPLEMENTED[Frequency.MINUTELY] = common; +totext_default.IMPLEMENTED[Frequency.DAILY] = ["byhour"].concat(common); +totext_default.IMPLEMENTED[Frequency.WEEKLY] = common; +totext_default.IMPLEMENTED[Frequency.MONTHLY] = common; +totext_default.IMPLEMENTED[Frequency.YEARLY] = ["byweekno", "byyearday"].concat(common); +var toText = function(rrule, gettext, language, dateFormatter) { + return new totext_default(rrule, gettext, language, dateFormatter).toString(); +}; +var isFullyConvertible = totext_default.isFullyConvertible; + +// node_modules/rrule/dist/esm/src/datetime.js +var Time = function() { + function Time2(hour, minute, second, millisecond) { + this.hour = hour; + this.minute = minute; + this.second = second; + this.millisecond = millisecond || 0; + } + Time2.prototype.getHours = function() { + return this.hour; + }; + Time2.prototype.getMinutes = function() { + return this.minute; + }; + Time2.prototype.getSeconds = function() { + return this.second; + }; + Time2.prototype.getMilliseconds = function() { + return this.millisecond; + }; + Time2.prototype.getTime = function() { + return (this.hour * 60 * 60 + this.minute * 60 + this.second) * 1e3 + this.millisecond; + }; + return Time2; +}(); +var DateTime = function(_super) { + __extends(DateTime3, _super); + function DateTime3(year, month, day, hour, minute, second, millisecond) { + var _this = _super.call(this, hour, minute, second, millisecond) || this; + _this.year = year; + _this.month = month; + _this.day = day; + return _this; + } + DateTime3.fromDate = function(date) { + return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1e3); + }; + DateTime3.prototype.getWeekday = function() { + return dateutil.getWeekday(new Date(this.getTime())); + }; + DateTime3.prototype.getTime = function() { + return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); + }; + DateTime3.prototype.getDay = function() { + return this.day; + }; + DateTime3.prototype.getMonth = function() { + return this.month; + }; + DateTime3.prototype.getYear = function() { + return this.year; + }; + DateTime3.prototype.addYears = function(years) { + this.year += years; + }; + DateTime3.prototype.addMonths = function(months) { + this.month += months; + if (this.month > 12) { + var yearDiv = Math.floor(this.month / 12); + var monthMod = pymod(this.month, 12); + this.month = monthMod; + this.year += yearDiv; + if (this.month === 0) { + this.month = 12; + --this.year; + } + } + }; + DateTime3.prototype.addWeekly = function(days, wkst) { + if (wkst > this.getWeekday()) { + this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; + } else { + this.day += -(this.getWeekday() - wkst) + days * 7; + } + this.fixDay(); + }; + DateTime3.prototype.addDaily = function(days) { + this.day += days; + this.fixDay(); + }; + DateTime3.prototype.addHours = function(hours, filtered, byhour) { + if (filtered) { + this.hour += Math.floor((23 - this.hour) / hours) * hours; + } + while (true) { + this.hour += hours; + var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; + if (dayDiv) { + this.hour = hourMod; + this.addDaily(dayDiv); + } + if (empty(byhour) || includes(byhour, this.hour)) + break; + } + }; + DateTime3.prototype.addMinutes = function(minutes, filtered, byhour, byminute) { + if (filtered) { + this.minute += Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; + } + while (true) { + this.minute += minutes; + var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; + if (hourDiv) { + this.minute = minuteMod; + this.addHours(hourDiv, false, byhour); + } + if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute))) { + break; + } + } + }; + DateTime3.prototype.addSeconds = function(seconds, filtered, byhour, byminute, bysecond) { + if (filtered) { + this.second += Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; + } + while (true) { + this.second += seconds; + var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; + if (minuteDiv) { + this.second = secondMod; + this.addMinutes(minuteDiv, false, byhour, byminute); + } + if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute)) && (empty(bysecond) || includes(bysecond, this.second))) { + break; + } + } + }; + DateTime3.prototype.fixDay = function() { + if (this.day <= 28) { + return; + } + var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; + if (this.day <= daysinmonth) { + return; + } + while (this.day > daysinmonth) { + this.day -= daysinmonth; + ++this.month; + if (this.month === 13) { + this.month = 1; + ++this.year; + if (this.year > dateutil.MAXYEAR) { + return; + } + } + daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; + } + }; + DateTime3.prototype.add = function(options, filtered) { + var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + switch (freq) { + case Frequency.YEARLY: + return this.addYears(interval); + case Frequency.MONTHLY: + return this.addMonths(interval); + case Frequency.WEEKLY: + return this.addWeekly(interval, wkst); + case Frequency.DAILY: + return this.addDaily(interval); + case Frequency.HOURLY: + return this.addHours(interval, filtered, byhour); + case Frequency.MINUTELY: + return this.addMinutes(interval, filtered, byhour, byminute); + case Frequency.SECONDLY: + return this.addSeconds(interval, filtered, byhour, byminute, bysecond); + } + }; + return DateTime3; +}(Time); + +// node_modules/rrule/dist/esm/src/parseoptions.js +function initializeOptions(options) { + var invalid = []; + var keys = Object.keys(options); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + if (!includes(defaultKeys, key)) + invalid.push(key); + if (dateutil_default.isDate(options[key]) && !dateutil_default.isValidDate(options[key])) + invalid.push(key); + } + if (invalid.length) { + throw new Error("Invalid options: " + invalid.join(", ")); + } + return __assign({}, options); +} +function parseOptions(options) { + var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); + if (isPresent(opts.byeaster)) + opts.freq = rrule_default.YEARLY; + if (!(isPresent(opts.freq) && rrule_default.FREQUENCIES[opts.freq])) { + throw new Error("Invalid frequency: " + opts.freq + " " + options.freq); + } + if (!opts.dtstart) + opts.dtstart = new Date(new Date().setMilliseconds(0)); + if (!isPresent(opts.wkst)) { + opts.wkst = rrule_default.MO.weekday; + } else if (isNumber(opts.wkst)) { + } else { + opts.wkst = opts.wkst.weekday; + } + if (isPresent(opts.bysetpos)) { + if (isNumber(opts.bysetpos)) + opts.bysetpos = [opts.bysetpos]; + for (var i = 0; i < opts.bysetpos.length; i++) { + var v = opts.bysetpos[i]; + if (v === 0 || !(v >= -366 && v <= 366)) { + throw new Error("bysetpos must be between 1 and 366, or between -366 and -1"); + } + } + } + if (!(Boolean(opts.byweekno) || notEmpty(opts.byweekno) || notEmpty(opts.byyearday) || Boolean(opts.bymonthday) || notEmpty(opts.bymonthday) || isPresent(opts.byweekday) || isPresent(opts.byeaster))) { + switch (opts.freq) { + case rrule_default.YEARLY: + if (!opts.bymonth) + opts.bymonth = opts.dtstart.getUTCMonth() + 1; + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case rrule_default.MONTHLY: + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case rrule_default.WEEKLY: + opts.byweekday = [dateutil_default.getWeekday(opts.dtstart)]; + break; + } + } + if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { + opts.bymonth = [opts.bymonth]; + } + if (isPresent(opts.byyearday) && !isArray(opts.byyearday) && isNumber(opts.byyearday)) { + opts.byyearday = [opts.byyearday]; + } + if (!isPresent(opts.bymonthday)) { + opts.bymonthday = []; + opts.bynmonthday = []; + } else if (isArray(opts.bymonthday)) { + var bymonthday = []; + var bynmonthday = []; + for (var i = 0; i < opts.bymonthday.length; i++) { + var v = opts.bymonthday[i]; + if (v > 0) { + bymonthday.push(v); + } else if (v < 0) { + bynmonthday.push(v); + } + } + opts.bymonthday = bymonthday; + opts.bynmonthday = bynmonthday; + } else if (opts.bymonthday < 0) { + opts.bynmonthday = [opts.bymonthday]; + opts.bymonthday = []; + } else { + opts.bynmonthday = []; + opts.bymonthday = [opts.bymonthday]; + } + if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { + opts.byweekno = [opts.byweekno]; + } + if (!isPresent(opts.byweekday)) { + opts.bynweekday = null; + } else if (isNumber(opts.byweekday)) { + opts.byweekday = [opts.byweekday]; + opts.bynweekday = null; + } else if (isWeekdayStr(opts.byweekday)) { + opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; + opts.bynweekday = null; + } else if (opts.byweekday instanceof Weekday) { + if (!opts.byweekday.n || opts.freq > rrule_default.MONTHLY) { + opts.byweekday = [opts.byweekday.weekday]; + opts.bynweekday = null; + } else { + opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; + opts.byweekday = null; + } + } else { + var byweekday = []; + var bynweekday = []; + for (var i = 0; i < opts.byweekday.length; i++) { + var wday = opts.byweekday[i]; + if (isNumber(wday)) { + byweekday.push(wday); + continue; + } else if (isWeekdayStr(wday)) { + byweekday.push(Weekday.fromStr(wday).weekday); + continue; + } + if (!wday.n || opts.freq > rrule_default.MONTHLY) { + byweekday.push(wday.weekday); + } else { + bynweekday.push([wday.weekday, wday.n]); + } + } + opts.byweekday = notEmpty(byweekday) ? byweekday : null; + opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; + } + if (!isPresent(opts.byhour)) { + opts.byhour = opts.freq < rrule_default.HOURLY ? [opts.dtstart.getUTCHours()] : null; + } else if (isNumber(opts.byhour)) { + opts.byhour = [opts.byhour]; + } + if (!isPresent(opts.byminute)) { + opts.byminute = opts.freq < rrule_default.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; + } else if (isNumber(opts.byminute)) { + opts.byminute = [opts.byminute]; + } + if (!isPresent(opts.bysecond)) { + opts.bysecond = opts.freq < rrule_default.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; + } else if (isNumber(opts.bysecond)) { + opts.bysecond = [opts.bysecond]; + } + return { parsedOptions: opts }; +} +function buildTimeset(opts) { + var millisecondModulo = opts.dtstart.getTime() % 1e3; + if (!freqIsDailyOrGreater(opts.freq)) { + return []; + } + var timeset = []; + opts.byhour.forEach(function(hour) { + opts.byminute.forEach(function(minute) { + opts.bysecond.forEach(function(second) { + timeset.push(new Time(hour, minute, second, millisecondModulo)); + }); + }); + }); + return timeset; +} + +// node_modules/rrule/dist/esm/src/parsestring.js +function parseString(rfcString) { + var options = rfcString.split("\n").map(parseLine).filter(function(x) { + return x !== null; + }); + return __assign(__assign({}, options[0]), options[1]); +} +function parseDtstart(line) { + var options = {}; + var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); + if (!dtstartWithZone) { + return options; + } + var _ = dtstartWithZone[0], tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; + if (tzid) { + options.tzid = tzid; + } + options.dtstart = dateutil_default.untilStringToDate(dtstart); + return options; +} +function parseLine(rfcString) { + rfcString = rfcString.replace(/^\s+|\s+$/, ""); + if (!rfcString.length) + return null; + var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); + if (!header) { + return parseRrule(rfcString); + } + var _ = header[0], key = header[1]; + switch (key.toUpperCase()) { + case "RRULE": + case "EXRULE": + return parseRrule(rfcString); + case "DTSTART": + return parseDtstart(rfcString); + default: + throw new Error("Unsupported RFC prop " + key + " in " + rfcString); + } +} +function parseRrule(line) { + var strippedLine = line.replace(/^RRULE:/i, ""); + var options = parseDtstart(strippedLine); + var attrs = line.replace(/^(?:RRULE|EXRULE):/i, "").split(";"); + attrs.forEach(function(attr2) { + var _a = attr2.split("="), key = _a[0], value = _a[1]; + switch (key.toUpperCase()) { + case "FREQ": + options.freq = Frequency[value.toUpperCase()]; + break; + case "WKST": + options.wkst = Days[value.toUpperCase()]; + break; + case "COUNT": + case "INTERVAL": + case "BYSETPOS": + case "BYMONTH": + case "BYMONTHDAY": + case "BYYEARDAY": + case "BYWEEKNO": + case "BYHOUR": + case "BYMINUTE": + case "BYSECOND": + var num = parseNumber(value); + var optionKey = key.toLowerCase(); + options[optionKey] = num; + break; + case "BYWEEKDAY": + case "BYDAY": + options.byweekday = parseWeekday(value); + break; + case "DTSTART": + case "TZID": + var dtstart = parseDtstart(line); + options.tzid = dtstart.tzid; + options.dtstart = dtstart.dtstart; + break; + case "UNTIL": + options.until = dateutil_default.untilStringToDate(value); + break; + case "BYEASTER": + options.byeaster = Number(value); + break; + default: + throw new Error("Unknown RRULE property '" + key + "'"); + } + }); + return options; +} +function parseNumber(value) { + if (value.indexOf(",") !== -1) { + var values = value.split(","); + return values.map(parseIndividualNumber); + } + return parseIndividualNumber(value); +} +function parseIndividualNumber(value) { + if (/^[+-]?\d+$/.test(value)) { + return Number(value); + } + return value; +} +function parseWeekday(value) { + var days = value.split(","); + return days.map(function(day) { + if (day.length === 2) { + return Days[day]; + } + var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); + var n = Number(parts[1]); + var wdaypart = parts[2]; + var wday = Days[wdaypart].weekday; + return new Weekday(wday, n); + }); +} + +// node_modules/rrule/dist/esm/src/datewithzone.js +var import_luxon = __toModule(require_luxon()); +var DateWithZone = function() { + function DateWithZone2(date, tzid) { + this.date = date; + this.tzid = tzid; + } + Object.defineProperty(DateWithZone2.prototype, "isUTC", { + get: function() { + return !this.tzid || this.tzid.toUpperCase() === "UTC"; + }, + enumerable: true, + configurable: true + }); + DateWithZone2.prototype.toString = function() { + var datestr = dateutil_default.timeToUntilString(this.date.getTime(), this.isUTC); + if (!this.isUTC) { + return ";TZID=" + this.tzid + ":" + datestr; + } + return ":" + datestr; + }; + DateWithZone2.prototype.getTime = function() { + return this.date.getTime(); + }; + DateWithZone2.prototype.rezonedDate = function() { + if (this.isUTC) { + return this.date; + } + try { + var datetime = import_luxon.DateTime.fromJSDate(this.date); + var rezoned = datetime.setZone(this.tzid, { keepLocalTime: true }); + return rezoned.toJSDate(); + } catch (e) { + if (e instanceof TypeError) { + console.error("Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone"); + } + return this.date; + } + }; + return DateWithZone2; +}(); + +// node_modules/rrule/dist/esm/src/optionstostring.js +function optionsToString(options) { + var rrule = []; + var dtstart = ""; + var keys = Object.keys(options); + var defaultKeys2 = Object.keys(DEFAULT_OPTIONS); + for (var i = 0; i < keys.length; i++) { + if (keys[i] === "tzid") + continue; + if (!includes(defaultKeys2, keys[i])) + continue; + var key = keys[i].toUpperCase(); + var value = options[keys[i]]; + var outValue = ""; + if (!isPresent(value) || isArray(value) && !value.length) + continue; + switch (key) { + case "FREQ": + outValue = rrule_default.FREQUENCIES[options.freq]; + break; + case "WKST": + if (isNumber(value)) { + outValue = new Weekday(value).toString(); + } else { + outValue = value.toString(); + } + break; + case "BYWEEKDAY": + key = "BYDAY"; + outValue = toArray(value).map(function(wday) { + if (wday instanceof Weekday) { + return wday; + } + if (isArray(wday)) { + return new Weekday(wday[0], wday[1]); + } + return new Weekday(wday); + }).toString(); + break; + case "DTSTART": + dtstart = buildDtstart(value, options.tzid); + break; + case "UNTIL": + outValue = dateutil_default.timeToUntilString(value, !options.tzid); + break; + default: + if (isArray(value)) { + var strValues = []; + for (var j = 0; j < value.length; j++) { + strValues[j] = String(value[j]); + } + outValue = strValues.toString(); + } else { + outValue = String(value); } } - var rules = rrule.map(function (_a) { - var key = _a[0], value = _a[1]; - return key + "=" + value.toString(); - }).join(';'); - var ruleString = ''; - if (rules !== '') { - ruleString = "RRULE:" + rules; + if (outValue) { + rrule.push([key, outValue]); } - return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\n'); + } + var rules = rrule.map(function(_a) { + var key2 = _a[0], value2 = _a[1]; + return key2 + "=" + value2.toString(); + }).join(";"); + var ruleString = ""; + if (rules !== "") { + ruleString = "RRULE:" + rules; + } + return [dtstart, ruleString].filter(function(x) { + return !!x; + }).join("\n"); } function buildDtstart(dtstart, tzid) { - if (!dtstart) { - return ''; - } - return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString(); + if (!dtstart) { + return ""; + } + return "DTSTART" + new DateWithZone(new Date(dtstart), tzid).toString(); } -var Cache$1 = /** @class */ (function () { - function Cache() { - this.all = false; - this.before = []; - this.after = []; - this.between = []; +// node_modules/rrule/dist/esm/src/cache.js +var Cache = function() { + function Cache3() { + this.all = false; + this.before = []; + this.after = []; + this.between = []; + } + Cache3.prototype._cacheAdd = function(what, value, args) { + if (value) { + value = value instanceof Date ? dateutil_default.clone(value) : dateutil_default.cloneDates(value); } - /** - * @param {String} what - all/before/after/between - * @param {Array,Date} value - an array of dates, one date, or null - * @param {Object?} args - _iter arguments - */ - Cache.prototype._cacheAdd = function (what, value, args) { - if (value) { - value = - value instanceof Date - ? dateutil$1.clone(value) - : dateutil$1.cloneDates(value); - } - if (what === 'all') { - this.all = value; - } - else { - args._value = value; - this[what].push(args); + if (what === "all") { + this.all = value; + } else { + args._value = value; + this[what].push(args); + } + }; + Cache3.prototype._cacheGet = function(what, args) { + var cached = false; + var argsKeys = args ? Object.keys(args) : []; + var findCacheDiff = function(item2) { + for (var i2 = 0; i2 < argsKeys.length; i2++) { + var key = argsKeys[i2]; + if (String(args[key]) !== String(item2[key])) { + return true; } + } + return false; }; - /** - * @return false - not in the cache - * null - cached, but zero occurrences (before/after) - * Date - cached (before/after) - * [] - cached, but zero occurrences (all/between) - * [Date1, DateN] - cached (all/between) - */ - Cache.prototype._cacheGet = function (what, args) { - var cached = false; - var argsKeys = args ? Object.keys(args) : []; - var findCacheDiff = function (item) { - for (var i = 0; i < argsKeys.length; i++) { - var key = argsKeys[i]; - if (String(args[key]) !== String(item[key])) { - return true; - } - } - return false; - }; - var cachedObject = this[what]; - if (what === 'all') { - cached = this.all; - } - else if (isArray(cachedObject)) { - // Let's see whether we've already called the - // 'what' method with the same 'args' - for (var i = 0; i < cachedObject.length; i++) { - var item = cachedObject[i]; - if (argsKeys.length && findCacheDiff(item)) - continue; - cached = item._value; - break; - } - } - if (!cached && this.all) { - // Not in the cache, but we already know all the occurrences, - // so we can find the correct dates from the cached ones. - var iterResult = new IterResult(what, args); - for (var i = 0; i < this.all.length; i++) { - if (!iterResult.accept(this.all[i])) - break; - } - cached = iterResult.getValue(); - this._cacheAdd(what, cached, args); - } - return isArray(cached) - ? dateutil$1.cloneDates(cached) - : cached instanceof Date - ? dateutil$1.clone(cached) - : cached; - }; - return Cache; -}()); + var cachedObject = this[what]; + if (what === "all") { + cached = this.all; + } else if (isArray(cachedObject)) { + for (var i = 0; i < cachedObject.length; i++) { + var item = cachedObject[i]; + if (argsKeys.length && findCacheDiff(item)) + continue; + cached = item._value; + break; + } + } + if (!cached && this.all) { + var iterResult = new iterresult_default(what, args); + for (var i = 0; i < this.all.length; i++) { + if (!iterResult.accept(this.all[i])) + break; + } + cached = iterResult.getValue(); + this._cacheAdd(what, cached, args); + } + return isArray(cached) ? dateutil_default.cloneDates(cached) : cached instanceof Date ? dateutil_default.clone(cached) : cached; + }; + return Cache3; +}(); -// ============================================================================= -// Date masks -// ============================================================================= -// Every mask is 7 days longer to handle cross-year weekly periods. +// node_modules/rrule/dist/esm/src/masks.js var M365MASK = __spreadArrays(repeat(1, 31), repeat(2, 28), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7)); var M366MASK = __spreadArrays(repeat(1, 31), repeat(2, 29), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7)); var M28 = range(1, 29); @@ -11084,9156 +12998,4023 @@ var NMDAY366MASK = __spreadArrays(NM31, NM29, NM31, NM30, NM31, NM30, NM31, NM31 var NMDAY365MASK = __spreadArrays(NM31, NM28, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7)); var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; -var WDAYMASK = (function () { - var wdaymask = []; - for (var i = 0; i < 55; i++) - wdaymask = wdaymask.concat(range(7)); - return wdaymask; -})(); +var WDAYMASK = function() { + var wdaymask = []; + for (var i = 0; i < 55; i++) + wdaymask = wdaymask.concat(range(7)); + return wdaymask; +}(); +// node_modules/rrule/dist/esm/src/iterinfo/yearinfo.js function rebuildYear(year, options) { - var firstyday = new Date(Date.UTC(year, 0, 1)); - var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365; - var nextyearlen = dateutil$1.isLeapYear(year + 1) ? 366 : 365; - var yearordinal = dateutil$1.toOrdinal(firstyday); - var yearweekday = dateutil$1.getWeekday(firstyday); - var result = __assign(__assign({ yearlen: yearlen, - nextyearlen: nextyearlen, - yearordinal: yearordinal, - yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null }); - if (empty(options.byweekno)) { - return result; - } - result.wnomask = repeat(0, yearlen + 7); - var firstwkst; - var wyearlen; - var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7); - if (no1wkst >= 4) { - no1wkst = 0; - // Number of days in the year, plus the days we got - // from last year. - wyearlen = - result.yearlen + pymod(yearweekday - options.wkst, 7); - } - else { - // Number of days in the year, minus the days we - // left in last year. - wyearlen = yearlen - no1wkst; - } - var div = Math.floor(wyearlen / 7); - var mod = pymod(wyearlen, 7); - var numweeks = Math.floor(div + mod / 4); - for (var j = 0; j < options.byweekno.length; j++) { - var n = options.byweekno[j]; - if (n < 0) { - n += numweeks + 1; - } - if (!(n > 0 && n <= numweeks)) { - continue; - } - var i = void 0; - if (n > 1) { - i = no1wkst + (n - 1) * 7; - if (no1wkst !== firstwkst) { - i -= 7 - firstwkst; - } - } - else { - i = no1wkst; - } - for (var k = 0; k < 7; k++) { - result.wnomask[i] = 1; - i++; - if (result.wdaymask[i] === options.wkst) - break; - } - } - if (includes(options.byweekno, 1)) { - // Check week number 1 of next year as well - // orig-TODO : Check -numweeks for next year. - var i = no1wkst + numweeks * 7; - if (no1wkst !== firstwkst) - i -= 7 - firstwkst; - if (i < yearlen) { - // If week starts in next year, we - // don't care about it. - for (var j = 0; j < 7; j++) { - result.wnomask[i] = 1; - i += 1; - if (result.wdaymask[i] === options.wkst) - break; - } - } - } - if (no1wkst) { - // Check last week number of last year as - // well. If no1wkst is 0, either the year - // started on week start, or week number 1 - // got days from last year, so there are no - // days from last year's last week number in - // this year. - var lnumweeks = void 0; - if (!includes(options.byweekno, -1)) { - var lyearweekday = dateutil$1.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); - var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); - var lyearlen = dateutil$1.isLeapYear(year - 1) ? 366 : 365; - var weekst = void 0; - if (lno1wkst >= 4) { - lno1wkst = 0; - weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); - } - else { - weekst = yearlen - no1wkst; - } - lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); - } - else { - lnumweeks = -1; - } - if (includes(options.byweekno, lnumweeks)) { - for (var i = 0; i < no1wkst; i++) - result.wnomask[i] = 1; - } - } + var firstyday = new Date(Date.UTC(year, 0, 1)); + var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; + var nextyearlen = dateutil_default.isLeapYear(year + 1) ? 366 : 365; + var yearordinal = dateutil_default.toOrdinal(firstyday); + var yearweekday = dateutil_default.getWeekday(firstyday); + var result = __assign(__assign({ + yearlen, + nextyearlen, + yearordinal, + yearweekday + }, baseYearMasks(year)), { wnomask: null }); + if (empty(options.byweekno)) { return result; + } + result.wnomask = repeat(0, yearlen + 7); + var firstwkst; + var wyearlen; + var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7); + if (no1wkst >= 4) { + no1wkst = 0; + wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7); + } else { + wyearlen = yearlen - no1wkst; + } + var div = Math.floor(wyearlen / 7); + var mod = pymod(wyearlen, 7); + var numweeks = Math.floor(div + mod / 4); + for (var j = 0; j < options.byweekno.length; j++) { + var n = options.byweekno[j]; + if (n < 0) { + n += numweeks + 1; + } + if (!(n > 0 && n <= numweeks)) { + continue; + } + var i = void 0; + if (n > 1) { + i = no1wkst + (n - 1) * 7; + if (no1wkst !== firstwkst) { + i -= 7 - firstwkst; + } + } else { + i = no1wkst; + } + for (var k = 0; k < 7; k++) { + result.wnomask[i] = 1; + i++; + if (result.wdaymask[i] === options.wkst) + break; + } + } + if (includes(options.byweekno, 1)) { + var i = no1wkst + numweeks * 7; + if (no1wkst !== firstwkst) + i -= 7 - firstwkst; + if (i < yearlen) { + for (var j = 0; j < 7; j++) { + result.wnomask[i] = 1; + i += 1; + if (result.wdaymask[i] === options.wkst) + break; + } + } + } + if (no1wkst) { + var lnumweeks = void 0; + if (!includes(options.byweekno, -1)) { + var lyearweekday = dateutil_default.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); + var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); + var lyearlen = dateutil_default.isLeapYear(year - 1) ? 366 : 365; + var weekst = void 0; + if (lno1wkst >= 4) { + lno1wkst = 0; + weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); + } else { + weekst = yearlen - no1wkst; + } + lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); + } else { + lnumweeks = -1; + } + if (includes(options.byweekno, lnumweeks)) { + for (var i = 0; i < no1wkst; i++) + result.wnomask[i] = 1; + } + } + return result; } function baseYearMasks(year) { - var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365; - var firstyday = new Date(Date.UTC(year, 0, 1)); - var wday = dateutil$1.getWeekday(firstyday); - if (yearlen === 365) { - return { - mmask: M365MASK, - mdaymask: MDAY365MASK, - nmdaymask: NMDAY365MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M365RANGE - }; - } + var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; + var firstyday = new Date(Date.UTC(year, 0, 1)); + var wday = dateutil_default.getWeekday(firstyday); + if (yearlen === 365) { return { - mmask: M366MASK, - mdaymask: MDAY366MASK, - nmdaymask: NMDAY366MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M366RANGE + mmask: M365MASK, + mdaymask: MDAY365MASK, + nmdaymask: NMDAY365MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M365RANGE }; + } + return { + mmask: M366MASK, + mdaymask: MDAY366MASK, + nmdaymask: NMDAY366MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M366RANGE + }; } +// node_modules/rrule/dist/esm/src/iterinfo/monthinfo.js function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { - var result = { - lastyear: year, - lastmonth: month, - nwdaymask: [] - }; - var ranges = []; - if (options.freq === RRule.YEARLY) { - if (empty(options.bymonth)) { - ranges = [[0, yearlen]]; - } - else { - for (var j = 0; j < options.bymonth.length; j++) { - month = options.bymonth[j]; - ranges.push(mrange.slice(month - 1, month + 1)); - } - } - } - else if (options.freq === RRule.MONTHLY) { - ranges = [mrange.slice(month - 1, month + 1)]; - } - if (empty(ranges)) { - return result; - } - // Weekly frequency won't get here, so we may not - // care about cross-year weekly periods. - result.nwdaymask = repeat(0, yearlen); - for (var j = 0; j < ranges.length; j++) { - var rang = ranges[j]; - var first = rang[0]; - var last = rang[1] - 1; - for (var k = 0; k < options.bynweekday.length; k++) { - var i = void 0; - var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; - if (n < 0) { - i = last + (n + 1) * 7; - i -= pymod(wdaymask[i] - wday, 7); - } - else { - i = first + (n - 1) * 7; - i += pymod(7 - wdaymask[i] + wday, 7); - } - if (first <= i && i <= last) - result.nwdaymask[i] = 1; - } + var result = { + lastyear: year, + lastmonth: month, + nwdaymask: [] + }; + var ranges = []; + if (options.freq === rrule_default.YEARLY) { + if (empty(options.bymonth)) { + ranges = [[0, yearlen]]; + } else { + for (var j = 0; j < options.bymonth.length; j++) { + month = options.bymonth[j]; + ranges.push(mrange.slice(month - 1, month + 1)); + } } + } else if (options.freq === rrule_default.MONTHLY) { + ranges = [mrange.slice(month - 1, month + 1)]; + } + if (empty(ranges)) { return result; + } + result.nwdaymask = repeat(0, yearlen); + for (var j = 0; j < ranges.length; j++) { + var rang = ranges[j]; + var first = rang[0]; + var last = rang[1] - 1; + for (var k = 0; k < options.bynweekday.length; k++) { + var i = void 0; + var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; + if (n < 0) { + i = last + (n + 1) * 7; + i -= pymod(wdaymask[i] - wday, 7); + } else { + i = first + (n - 1) * 7; + i += pymod(7 - wdaymask[i] + wday, 7); + } + if (first <= i && i <= last) + result.nwdaymask[i] = 1; + } + } + return result; } +// node_modules/rrule/dist/esm/src/iterinfo/easter.js function easter(y, offset) { - if (offset === void 0) { offset = 0; } - var a = y % 19; - var b = Math.floor(y / 100); - var c = y % 100; - var d = Math.floor(b / 4); - var e = b % 4; - var f = Math.floor((b + 8) / 25); - var g = Math.floor((b - f + 1) / 3); - var h = Math.floor(19 * a + b - d - g + 15) % 30; - var i = Math.floor(c / 4); - var k = c % 4; - var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; - var m = Math.floor((a + 11 * h + 22 * l) / 451); - var month = Math.floor((h + l - 7 * m + 114) / 31); - var day = ((h + l - 7 * m + 114) % 31) + 1; - var date = Date.UTC(y, month - 1, day + offset); - var yearStart = Date.UTC(y, 0, 1); - return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))]; + if (offset === void 0) { + offset = 0; + } + var a = y % 19; + var b = Math.floor(y / 100); + var c = y % 100; + var d = Math.floor(b / 4); + var e = b % 4; + var f = Math.floor((b + 8) / 25); + var g = Math.floor((b - f + 1) / 3); + var h = Math.floor(19 * a + b - d - g + 15) % 30; + var i = Math.floor(c / 4); + var k = c % 4; + var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; + var m = Math.floor((a + 11 * h + 22 * l) / 451); + var month = Math.floor((h + l - 7 * m + 114) / 31); + var day = (h + l - 7 * m + 114) % 31 + 1; + var date = Date.UTC(y, month - 1, day + offset); + var yearStart = Date.UTC(y, 0, 1); + return [Math.ceil((date - yearStart) / (1e3 * 60 * 60 * 24))]; } -// ============================================================================= -// Iterinfo -// ============================================================================= -var Iterinfo = /** @class */ (function () { - function Iterinfo(options) { - this.options = options; +// node_modules/rrule/dist/esm/src/iterinfo/index.js +var Iterinfo = function() { + function Iterinfo2(options) { + this.options = options; + } + Iterinfo2.prototype.rebuild = function(year, month) { + var options = this.options; + if (year !== this.lastyear) { + this.yearinfo = rebuildYear(year, options); } - Iterinfo.prototype.rebuild = function (year, month) { - var options = this.options; - if (year !== this.lastyear) { - this.yearinfo = rebuildYear(year, options); - } - if (notEmpty(options.bynweekday) && - (month !== this.lastmonth || year !== this.lastyear)) { - var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; - this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); - } - if (isPresent(options.byeaster)) { - this.eastermask = easter(year, options.byeaster); - } - }; - Object.defineProperty(Iterinfo.prototype, "lastyear", { - get: function () { - return this.monthinfo ? this.monthinfo.lastyear : null; - }, - enumerable: true, - configurable: true + if (notEmpty(options.bynweekday) && (month !== this.lastmonth || year !== this.lastyear)) { + var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; + this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); + } + if (isPresent(options.byeaster)) { + this.eastermask = easter(year, options.byeaster); + } + }; + Object.defineProperty(Iterinfo2.prototype, "lastyear", { + get: function() { + return this.monthinfo ? this.monthinfo.lastyear : null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "lastmonth", { + get: function() { + return this.monthinfo ? this.monthinfo.lastmonth : null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "yearlen", { + get: function() { + return this.yearinfo.yearlen; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "yearordinal", { + get: function() { + return this.yearinfo.yearordinal; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mrange", { + get: function() { + return this.yearinfo.mrange; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "wdaymask", { + get: function() { + return this.yearinfo.wdaymask; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mmask", { + get: function() { + return this.yearinfo.mmask; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "wnomask", { + get: function() { + return this.yearinfo.wnomask; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nwdaymask", { + get: function() { + return this.monthinfo ? this.monthinfo.nwdaymask : []; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nextyearlen", { + get: function() { + return this.yearinfo.nextyearlen; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mdaymask", { + get: function() { + return this.yearinfo.mdaymask; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nmdaymask", { + get: function() { + return this.yearinfo.nmdaymask; + }, + enumerable: true, + configurable: true + }); + Iterinfo2.prototype.ydayset = function() { + return [range(this.yearlen), 0, this.yearlen]; + }; + Iterinfo2.prototype.mdayset = function(_, month, __) { + var start = this.mrange[month - 1]; + var end = this.mrange[month]; + var set = repeat(null, this.yearlen); + for (var i = start; i < end; i++) + set[i] = i; + return [set, start, end]; + }; + Iterinfo2.prototype.wdayset = function(year, month, day) { + var set = repeat(null, this.yearlen + 7); + var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; + var start = i; + for (var j = 0; j < 7; j++) { + set[i] = i; + ++i; + if (this.wdaymask[i] === this.options.wkst) + break; + } + return [set, start, i]; + }; + Iterinfo2.prototype.ddayset = function(year, month, day) { + var set = repeat(null, this.yearlen); + var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; + set[i] = i; + return [set, i, i + 1]; + }; + Iterinfo2.prototype.htimeset = function(hour, _, second, millisecond) { + var _this = this; + var set = []; + this.options.byminute.forEach(function(minute) { + set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); }); - Object.defineProperty(Iterinfo.prototype, "lastmonth", { - get: function () { - return this.monthinfo ? this.monthinfo.lastmonth : null; - }, - enumerable: true, - configurable: true + dateutil_default.sort(set); + return set; + }; + Iterinfo2.prototype.mtimeset = function(hour, minute, _, millisecond) { + var set = this.options.bysecond.map(function(second) { + return new Time(hour, minute, second, millisecond); }); - Object.defineProperty(Iterinfo.prototype, "yearlen", { - get: function () { - return this.yearinfo.yearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "yearordinal", { - get: function () { - return this.yearinfo.yearordinal; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mrange", { - get: function () { - return this.yearinfo.mrange; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wdaymask", { - get: function () { - return this.yearinfo.wdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mmask", { - get: function () { - return this.yearinfo.mmask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wnomask", { - get: function () { - return this.yearinfo.wnomask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nwdaymask", { - get: function () { - return this.monthinfo ? this.monthinfo.nwdaymask : []; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nextyearlen", { - get: function () { - return this.yearinfo.nextyearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mdaymask", { - get: function () { - return this.yearinfo.mdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nmdaymask", { - get: function () { - return this.yearinfo.nmdaymask; - }, - enumerable: true, - configurable: true - }); - Iterinfo.prototype.ydayset = function () { - return [range(this.yearlen), 0, this.yearlen]; - }; - Iterinfo.prototype.mdayset = function (_, month, __) { - var start = this.mrange[month - 1]; - var end = this.mrange[month]; - var set = repeat(null, this.yearlen); - for (var i = start; i < end; i++) - set[i] = i; - return [set, start, end]; - }; - Iterinfo.prototype.wdayset = function (year, month, day) { - // We need to handle cross-year weeks here. - var set = repeat(null, this.yearlen + 7); - var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - var start = i; - for (var j = 0; j < 7; j++) { - set[i] = i; - ++i; - if (this.wdaymask[i] === this.options.wkst) - break; - } - return [set, start, i]; - }; - Iterinfo.prototype.ddayset = function (year, month, day) { - var set = repeat(null, this.yearlen); - var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - set[i] = i; - return [set, i, i + 1]; - }; - Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) { - var _this = this; - var set = []; - this.options.byminute.forEach(function (minute) { - set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); - }); - dateutil$1.sort(set); - return set; - }; - Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) { - var set = this.options.bysecond.map(function (second) { - return new Time(hour, minute, second, millisecond); - }); - dateutil$1.sort(set); - return set; - }; - Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) { - return [new Time(hour, minute, second, millisecond)]; - }; - Iterinfo.prototype.getdayset = function (freq) { - switch (freq) { - case Frequency.YEARLY: return this.ydayset.bind(this); - case Frequency.MONTHLY: return this.mdayset.bind(this); - case Frequency.WEEKLY: return this.wdayset.bind(this); - case Frequency.DAILY: return this.ddayset.bind(this); - default: return this.ddayset.bind(this); - } - }; - Iterinfo.prototype.gettimeset = function (freq) { - switch (freq) { - case Frequency.HOURLY: return this.htimeset.bind(this); - case Frequency.MINUTELY: return this.mtimeset.bind(this); - case Frequency.SECONDLY: return this.stimeset.bind(this); - } - }; - return Iterinfo; -}()); + dateutil_default.sort(set); + return set; + }; + Iterinfo2.prototype.stimeset = function(hour, minute, second, millisecond) { + return [new Time(hour, minute, second, millisecond)]; + }; + Iterinfo2.prototype.getdayset = function(freq) { + switch (freq) { + case Frequency.YEARLY: + return this.ydayset.bind(this); + case Frequency.MONTHLY: + return this.mdayset.bind(this); + case Frequency.WEEKLY: + return this.wdayset.bind(this); + case Frequency.DAILY: + return this.ddayset.bind(this); + default: + return this.ddayset.bind(this); + } + }; + Iterinfo2.prototype.gettimeset = function(freq) { + switch (freq) { + case Frequency.HOURLY: + return this.htimeset.bind(this); + case Frequency.MINUTELY: + return this.mtimeset.bind(this); + case Frequency.SECONDLY: + return this.stimeset.bind(this); + } + }; + return Iterinfo2; +}(); +var iterinfo_default = Iterinfo; +// node_modules/rrule/dist/esm/src/iter/poslist.js function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { - var poslist = []; - for (var j = 0; j < bysetpos.length; j++) { - var daypos = void 0; - var timepos = void 0; - var pos = bysetpos[j]; - if (pos < 0) { - daypos = Math.floor(pos / timeset.length); - timepos = pymod(pos, timeset.length); - } - else { - daypos = Math.floor((pos - 1) / timeset.length); - timepos = pymod(pos - 1, timeset.length); - } - var tmp = []; - for (var k = start; k < end; k++) { - var val = dayset[k]; - if (!isPresent(val)) - continue; - tmp.push(val); - } - var i = void 0; - if (daypos < 0) { - i = tmp.slice(daypos)[0]; - } - else { - i = tmp[daypos]; - } - var time = timeset[timepos]; - var date = dateutil$1.fromOrdinal(ii.yearordinal + i); - var res = dateutil$1.combine(date, time); - // XXX: can this ever be in the array? - // - compare the actual date instead? - if (!includes(poslist, res)) - poslist.push(res); + var poslist = []; + for (var j = 0; j < bysetpos.length; j++) { + var daypos = void 0; + var timepos = void 0; + var pos = bysetpos[j]; + if (pos < 0) { + daypos = Math.floor(pos / timeset.length); + timepos = pymod(pos, timeset.length); + } else { + daypos = Math.floor((pos - 1) / timeset.length); + timepos = pymod(pos - 1, timeset.length); } - dateutil$1.sort(poslist); - return poslist; + var tmp = []; + for (var k = start; k < end; k++) { + var val = dayset[k]; + if (!isPresent(val)) + continue; + tmp.push(val); + } + var i = void 0; + if (daypos < 0) { + i = tmp.slice(daypos)[0]; + } else { + i = tmp[daypos]; + } + var time = timeset[timepos]; + var date = dateutil_default.fromOrdinal(ii.yearordinal + i); + var res = dateutil_default.combine(date, time); + if (!includes(poslist, res)) + poslist.push(res); + } + dateutil_default.sort(poslist); + return poslist; } +// node_modules/rrule/dist/esm/src/iter/index.js function iter(iterResult, options) { - var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; - var count = options.count; - if (count === 0 || interval === 0) { - return emitResult(iterResult); + var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; + var count = options.count; + if (count === 0 || interval === 0) { + return emitResult(iterResult); + } + var counterDate = DateTime.fromDate(dtstart); + var ii = new iterinfo_default(options); + ii.rebuild(counterDate.year, counterDate.month); + var timeset = makeTimeset(ii, counterDate, options); + while (true) { + var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; + var filtered = removeFilteredDays(dayset, start, end, ii, options); + if (notEmpty(bysetpos)) { + var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); + for (var j = 0; j < poslist.length; j++) { + var res = poslist[j]; + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } else { + for (var j = start; j < end; j++) { + var currentDay = dayset[j]; + if (!isPresent(currentDay)) { + continue; + } + var date = dateutil_default.fromOrdinal(ii.yearordinal + currentDay); + for (var k = 0; k < timeset.length; k++) { + var time = timeset[k]; + var res = dateutil_default.combine(date, time); + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } + } + if (options.interval === 0) { + return emitResult(iterResult); + } + counterDate.add(options, filtered); + if (counterDate.year > dateutil_default.MAXYEAR) { + return emitResult(iterResult); + } + if (!freqIsDailyOrGreater(freq)) { + timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); } - var counterDate = DateTime.fromDate(dtstart); - var ii = new Iterinfo(options); ii.rebuild(counterDate.year, counterDate.month); - var timeset = makeTimeset(ii, counterDate, options); - while (true) { - var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; - var filtered = removeFilteredDays(dayset, start, end, ii, options); - if (notEmpty(bysetpos)) { - var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); - for (var j = 0; j < poslist.length; j++) { - var res = poslist[j]; - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - else { - for (var j = start; j < end; j++) { - var currentDay = dayset[j]; - if (!isPresent(currentDay)) { - continue; - } - var date = dateutil$1.fromOrdinal(ii.yearordinal + currentDay); - for (var k = 0; k < timeset.length; k++) { - var time = timeset[k]; - var res = dateutil$1.combine(date, time); - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - } - if (options.interval === 0) { - return emitResult(iterResult); - } - // Handle frequency and interval - counterDate.add(options, filtered); - if (counterDate.year > dateutil$1.MAXYEAR) { - return emitResult(iterResult); - } - if (!freqIsDailyOrGreater(freq)) { - timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); - } - ii.rebuild(counterDate.year, counterDate.month); - } + } } function isFiltered(ii, currentDay, options) { - var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; - return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) || - (notEmpty(byweekno) && !ii.wnomask[currentDay]) || - (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) || - (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) || - (byeaster !== null && !includes(ii.eastermask, currentDay)) || - ((notEmpty(bymonthday) || notEmpty(bynmonthday)) && - !includes(bymonthday, ii.mdaymask[currentDay]) && - !includes(bynmonthday, ii.nmdaymask[currentDay])) || - (notEmpty(byyearday) && - ((currentDay < ii.yearlen && - !includes(byyearday, currentDay + 1) && - !includes(byyearday, -ii.yearlen + currentDay)) || - (currentDay >= ii.yearlen && - !includes(byyearday, currentDay + 1 - ii.yearlen) && - !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen))))); + var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; + return notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay]) || notEmpty(byweekno) && !ii.wnomask[currentDay] || notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay]) || notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay] || byeaster !== null && !includes(ii.eastermask, currentDay) || (notEmpty(bymonthday) || notEmpty(bynmonthday)) && !includes(bymonthday, ii.mdaymask[currentDay]) && !includes(bynmonthday, ii.nmdaymask[currentDay]) || notEmpty(byyearday) && (currentDay < ii.yearlen && !includes(byyearday, currentDay + 1) && !includes(byyearday, -ii.yearlen + currentDay) || currentDay >= ii.yearlen && !includes(byyearday, currentDay + 1 - ii.yearlen) && !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)); } function rezoneIfNeeded(date, options) { - return new DateWithZone(date, options.tzid).rezonedDate(); + return new DateWithZone(date, options.tzid).rezonedDate(); } function emitResult(iterResult) { - return iterResult.getValue(); + return iterResult.getValue(); } function removeFilteredDays(dayset, start, end, ii, options) { - var filtered = false; - for (var dayCounter = start; dayCounter < end; dayCounter++) { - var currentDay = dayset[dayCounter]; - filtered = isFiltered(ii, currentDay, options); - if (filtered) - dayset[currentDay] = null; - } - return filtered; + var filtered = false; + for (var dayCounter = start; dayCounter < end; dayCounter++) { + var currentDay = dayset[dayCounter]; + filtered = isFiltered(ii, currentDay, options); + if (filtered) + dayset[currentDay] = null; + } + return filtered; } function makeTimeset(ii, counterDate, options) { - var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - if (freqIsDailyOrGreater(freq)) { - return buildTimeset(options); - } - if ((freq >= RRule.HOURLY && - notEmpty(byhour) && - !includes(byhour, counterDate.hour)) || - (freq >= RRule.MINUTELY && - notEmpty(byminute) && - !includes(byminute, counterDate.minute)) || - (freq >= RRule.SECONDLY && - notEmpty(bysecond) && - !includes(bysecond, counterDate.second))) { - return []; - } - return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); + var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + if (freqIsDailyOrGreater(freq)) { + return buildTimeset(options); + } + if (freq >= rrule_default.HOURLY && notEmpty(byhour) && !includes(byhour, counterDate.hour) || freq >= rrule_default.MINUTELY && notEmpty(byminute) && !includes(byminute, counterDate.minute) || freq >= rrule_default.SECONDLY && notEmpty(bysecond) && !includes(bysecond, counterDate.second)) { + return []; + } + return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); } -// ============================================================================= -// RRule -// ============================================================================= +// node_modules/rrule/dist/esm/src/rrule.js var Days = { - MO: new Weekday(0), - TU: new Weekday(1), - WE: new Weekday(2), - TH: new Weekday(3), - FR: new Weekday(4), - SA: new Weekday(5), - SU: new Weekday(6) + MO: new Weekday(0), + TU: new Weekday(1), + WE: new Weekday(2), + TH: new Weekday(3), + FR: new Weekday(4), + SA: new Weekday(5), + SU: new Weekday(6) }; -var DEFAULT_OPTIONS$1 = { - freq: Frequency.YEARLY, - dtstart: null, - interval: 1, - wkst: Days.MO, - count: null, - until: null, - tzid: null, - bysetpos: null, - bymonth: null, - bymonthday: null, - bynmonthday: null, - byyearday: null, - byweekno: null, - byweekday: null, - bynweekday: null, - byhour: null, - byminute: null, - bysecond: null, - byeaster: null +var DEFAULT_OPTIONS = { + freq: Frequency.YEARLY, + dtstart: null, + interval: 1, + wkst: Days.MO, + count: null, + until: null, + tzid: null, + bysetpos: null, + bymonth: null, + bymonthday: null, + bynmonthday: null, + byyearday: null, + byweekno: null, + byweekday: null, + bynweekday: null, + byhour: null, + byminute: null, + bysecond: null, + byeaster: null }; -var defaultKeys = Object.keys(DEFAULT_OPTIONS$1); -/** - * - * @param {Options?} options - see - * The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... - * @constructor - */ -var RRule = /** @class */ (function () { - function RRule(options, noCache) { - if (options === void 0) { options = {}; } - if (noCache === void 0) { noCache = false; } - // RFC string - this._cache = noCache ? null : new Cache$1(); - // used by toString() - this.origOptions = initializeOptions$1(options); - var parsedOptions = parseOptions(options).parsedOptions; - this.options = parsedOptions; +var defaultKeys = Object.keys(DEFAULT_OPTIONS); +var RRule = function() { + function RRule2(options, noCache) { + if (options === void 0) { + options = {}; } - RRule.parseText = function (text, language) { - return parseText(text, language); + if (noCache === void 0) { + noCache = false; + } + this._cache = noCache ? null : new Cache(); + this.origOptions = initializeOptions(options); + var parsedOptions = parseOptions(options).parsedOptions; + this.options = parsedOptions; + } + RRule2.parseText = function(text2, language) { + return parseText(text2, language); + }; + RRule2.fromText = function(text2, language) { + return fromText(text2, language); + }; + RRule2.fromString = function(str) { + return new RRule2(RRule2.parseString(str) || void 0); + }; + RRule2.prototype._iter = function(iterResult) { + return iter(iterResult, this.options); + }; + RRule2.prototype._cacheGet = function(what, args) { + if (!this._cache) + return false; + return this._cache._cacheGet(what, args); + }; + RRule2.prototype._cacheAdd = function(what, value, args) { + if (!this._cache) + return; + return this._cache._cacheAdd(what, value, args); + }; + RRule2.prototype.all = function(iterator) { + if (iterator) { + return this._iter(new callbackiterresult_default("all", {}, iterator)); + } + var result = this._cacheGet("all"); + if (result === false) { + result = this._iter(new iterresult_default("all", {})); + this._cacheAdd("all", result); + } + return result; + }; + RRule2.prototype.between = function(after, before, inc, iterator) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(after) || !dateutil_default.isValidDate(before)) + throw new Error("Invalid date passed in to RRule.between"); + var args = { + before, + after, + inc }; - RRule.fromText = function (text, language) { - return fromText(text, language); - }; - RRule.fromString = function (str) { - return new RRule(RRule.parseString(str) || undefined); - }; - RRule.prototype._iter = function (iterResult) { - return iter(iterResult, this.options); - }; - RRule.prototype._cacheGet = function (what, args) { - if (!this._cache) - return false; - return this._cache._cacheGet(what, args); - }; - RRule.prototype._cacheAdd = function (what, value, args) { - if (!this._cache) - return; - return this._cache._cacheAdd(what, value, args); - }; - /** - * @param {Function} iterator - optional function that will be called - * on each date that is added. It can return false - * to stop the iteration. - * @return Array containing all recurrences. - */ - RRule.prototype.all = function (iterator) { - if (iterator) { - return this._iter(new CallbackIterResult('all', {}, iterator)); - } - var result = this._cacheGet('all'); - if (result === false) { - result = this._iter(new IterResult('all', {})); - this._cacheAdd('all', result); - } - return result; - }; - /** - * Returns all the occurrences of the rrule between after and before. - * The inc keyword defines what happens if after and/or before are - * themselves occurrences. With inc == True, they will be included in the - * list, if they are found in the recurrence set. - * @return Array - */ - RRule.prototype.between = function (after, before, inc, iterator) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(after) || !dateutil$1.isValidDate(before)) - throw new Error('Invalid date passed in to RRule.between'); - var args = { - before: before, - after: after, - inc: inc - }; - if (iterator) { - return this._iter(new CallbackIterResult('between', args, iterator)); - } - var result = this._cacheGet('between', args); - if (result === false) { - result = this._iter(new IterResult('between', args)); - this._cacheAdd('between', result, args); - } - return result; - }; - /** - * Returns the last recurrence before the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.before = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.before'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('before', args); - if (result === false) { - result = this._iter(new IterResult('before', args)); - this._cacheAdd('before', result, args); - } - return result; - }; - /** - * Returns the first recurrence after the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.after = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.after'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('after', args); - if (result === false) { - result = this._iter(new IterResult('after', args)); - this._cacheAdd('after', result, args); - } - return result; - }; - /** - * Returns the number of recurrences in this set. It will have go trough - * the whole recurrence, if this hasn't been done before. - */ - RRule.prototype.count = function () { - return this.all().length; - }; - /** - * Converts the rrule into its string representation - * @see - * @return String - */ - RRule.prototype.toString = function () { - return optionsToString(this.origOptions); - }; - /** - * Will convert all rules described in nlp:ToText - * to text. - */ - RRule.prototype.toText = function (gettext, language, dateFormatter) { - return toText(this, gettext, language, dateFormatter); - }; - RRule.prototype.isFullyConvertibleToText = function () { - return isFullyConvertible(this); - }; - /** - * @return a RRule instance with the same freq and options - * as this one (cache is not cloned) - */ - RRule.prototype.clone = function () { - return new RRule(this.origOptions); - }; - // RRule class 'constants' - RRule.FREQUENCIES = [ - 'YEARLY', - 'MONTHLY', - 'WEEKLY', - 'DAILY', - 'HOURLY', - 'MINUTELY', - 'SECONDLY' - ]; - RRule.YEARLY = Frequency.YEARLY; - RRule.MONTHLY = Frequency.MONTHLY; - RRule.WEEKLY = Frequency.WEEKLY; - RRule.DAILY = Frequency.DAILY; - RRule.HOURLY = Frequency.HOURLY; - RRule.MINUTELY = Frequency.MINUTELY; - RRule.SECONDLY = Frequency.SECONDLY; - RRule.MO = Days.MO; - RRule.TU = Days.TU; - RRule.WE = Days.WE; - RRule.TH = Days.TH; - RRule.FR = Days.FR; - RRule.SA = Days.SA; - RRule.SU = Days.SU; - RRule.parseString = parseString; - RRule.optionsToString = optionsToString; - return RRule; -}()); + if (iterator) { + return this._iter(new callbackiterresult_default("between", args, iterator)); + } + var result = this._cacheGet("between", args); + if (result === false) { + result = this._iter(new iterresult_default("between", args)); + this._cacheAdd("between", result, args); + } + return result; + }; + RRule2.prototype.before = function(dt, inc) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(dt)) + throw new Error("Invalid date passed in to RRule.before"); + var args = { dt, inc }; + var result = this._cacheGet("before", args); + if (result === false) { + result = this._iter(new iterresult_default("before", args)); + this._cacheAdd("before", result, args); + } + return result; + }; + RRule2.prototype.after = function(dt, inc) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(dt)) + throw new Error("Invalid date passed in to RRule.after"); + var args = { dt, inc }; + var result = this._cacheGet("after", args); + if (result === false) { + result = this._iter(new iterresult_default("after", args)); + this._cacheAdd("after", result, args); + } + return result; + }; + RRule2.prototype.count = function() { + return this.all().length; + }; + RRule2.prototype.toString = function() { + return optionsToString(this.origOptions); + }; + RRule2.prototype.toText = function(gettext, language, dateFormatter) { + return toText(this, gettext, language, dateFormatter); + }; + RRule2.prototype.isFullyConvertibleToText = function() { + return isFullyConvertible(this); + }; + RRule2.prototype.clone = function() { + return new RRule2(this.origOptions); + }; + RRule2.FREQUENCIES = [ + "YEARLY", + "MONTHLY", + "WEEKLY", + "DAILY", + "HOURLY", + "MINUTELY", + "SECONDLY" + ]; + RRule2.YEARLY = Frequency.YEARLY; + RRule2.MONTHLY = Frequency.MONTHLY; + RRule2.WEEKLY = Frequency.WEEKLY; + RRule2.DAILY = Frequency.DAILY; + RRule2.HOURLY = Frequency.HOURLY; + RRule2.MINUTELY = Frequency.MINUTELY; + RRule2.SECONDLY = Frequency.SECONDLY; + RRule2.MO = Days.MO; + RRule2.TU = Days.TU; + RRule2.WE = Days.WE; + RRule2.TH = Days.TH; + RRule2.FR = Days.FR; + RRule2.SA = Days.SA; + RRule2.SU = Days.SU; + RRule2.parseString = parseString; + RRule2.optionsToString = optionsToString; + return RRule2; +}(); +var rrule_default = RRule; +// node_modules/rrule/dist/esm/src/iterset.js function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { - var _exdateHash = {}; - var _accept = iterResult.accept; - function evalExdate(after, before) { - _exrule.forEach(function (rrule) { - rrule.between(after, before, true).forEach(function (date) { - _exdateHash[Number(date)] = true; - }); - }); - } - _exdate.forEach(function (date) { - var zonedDate = new DateWithZone(date, tzid).rezonedDate(); - _exdateHash[Number(zonedDate)] = true; + var _exdateHash = {}; + var _accept = iterResult.accept; + function evalExdate(after, before) { + _exrule.forEach(function(rrule) { + rrule.between(after, before, true).forEach(function(date) { + _exdateHash[Number(date)] = true; + }); }); - iterResult.accept = function (date) { - var dt = Number(date); - if (isNaN(dt)) - return _accept.call(this, date); - if (!_exdateHash[dt]) { - evalExdate(new Date(dt - 1), new Date(dt + 1)); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - } - return true; + } + _exdate.forEach(function(date) { + var zonedDate2 = new DateWithZone(date, tzid).rezonedDate(); + _exdateHash[Number(zonedDate2)] = true; + }); + iterResult.accept = function(date) { + var dt = Number(date); + if (isNaN(dt)) + return _accept.call(this, date); + if (!_exdateHash[dt]) { + evalExdate(new Date(dt - 1), new Date(dt + 1)); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + } + return true; + }; + if (iterResult.method === "between") { + evalExdate(iterResult.args.after, iterResult.args.before); + iterResult.accept = function(date) { + var dt = Number(date); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + return true; }; - if (iterResult.method === 'between') { - evalExdate(iterResult.args.after, iterResult.args.before); - iterResult.accept = function (date) { - var dt = Number(date); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - return true; - }; - } - for (var i = 0; i < _rdate.length; i++) { - var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); - if (!iterResult.accept(new Date(zonedDate.getTime()))) - break; - } - _rrule.forEach(function (rrule) { - iter(iterResult, rrule.options); - }); - var res = iterResult._result; - dateutil$1.sort(res); - switch (iterResult.method) { - case 'all': - case 'between': - return res; - case 'before': - return ((res.length && res[res.length - 1]) || null); - case 'after': - default: - return ((res.length && res[0]) || null); - } + } + for (var i = 0; i < _rdate.length; i++) { + var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); + if (!iterResult.accept(new Date(zonedDate.getTime()))) + break; + } + _rrule.forEach(function(rrule) { + iter(iterResult, rrule.options); + }); + var res = iterResult._result; + dateutil_default.sort(res); + switch (iterResult.method) { + case "all": + case "between": + return res; + case "before": + return res.length && res[res.length - 1] || null; + case "after": + default: + return res.length && res[0] || null; + } } -/** - * RRuleStr - * To parse a set of rrule strings - */ -var DEFAULT_OPTIONS = { - dtstart: null, - cache: false, - unfold: false, - forceset: false, - compatible: false, - tzid: null +// node_modules/rrule/dist/esm/src/rrulestr.js +var DEFAULT_OPTIONS2 = { + dtstart: null, + cache: false, + unfold: false, + forceset: false, + compatible: false, + tzid: null }; function parseInput(s, options) { - var rrulevals = []; - var rdatevals = []; - var exrulevals = []; - var exdatevals = []; - var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid; - var lines = splitIntoLines(s, options.unfold); - lines.forEach(function (line) { - if (!line) - return; - var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value; - switch (name.toUpperCase()) { - case 'RRULE': - if (parms.length) { - throw new Error("unsupported RRULE parm: " + parms.join(',')); - } - rrulevals.push(parseString(line)); - break; - case 'RDATE': - var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line); _b[0]; var rdateTzid = _b[1]; - if (rdateTzid && !tzid) { - tzid = rdateTzid; - } - rdatevals = rdatevals.concat(parseRDate(value, parms)); - break; - case 'EXRULE': - if (parms.length) { - throw new Error("unsupported EXRULE parm: " + parms.join(',')); - } - exrulevals.push(parseString(value)); - break; - case 'EXDATE': - exdatevals = exdatevals.concat(parseRDate(value, parms)); - break; - case 'DTSTART': - break; - default: - throw new Error('unsupported property: ' + name); + var rrulevals = []; + var rdatevals = []; + var exrulevals = []; + var exdatevals = []; + var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid; + var lines = splitIntoLines(s, options.unfold); + lines.forEach(function(line) { + if (!line) + return; + var _a2 = breakDownLine(line), name = _a2.name, parms = _a2.parms, value = _a2.value; + switch (name.toUpperCase()) { + case "RRULE": + if (parms.length) { + throw new Error("unsupported RRULE parm: " + parms.join(",")); } - }); - return { - dtstart: dtstart, - tzid: tzid, - rrulevals: rrulevals, - rdatevals: rdatevals, - exrulevals: exrulevals, - exdatevals: exdatevals - }; + rrulevals.push(parseString(line)); + break; + case "RDATE": + var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line), _ = _b[0], rdateTzid = _b[1]; + if (rdateTzid && !tzid) { + tzid = rdateTzid; + } + rdatevals = rdatevals.concat(parseRDate(value, parms)); + break; + case "EXRULE": + if (parms.length) { + throw new Error("unsupported EXRULE parm: " + parms.join(",")); + } + exrulevals.push(parseString(value)); + break; + case "EXDATE": + exdatevals = exdatevals.concat(parseRDate(value, parms)); + break; + case "DTSTART": + break; + default: + throw new Error("unsupported property: " + name); + } + }); + return { + dtstart, + tzid, + rrulevals, + rdatevals, + exrulevals, + exdatevals + }; } function buildRule(s, options) { - var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; - var noCache = options.cache === false; - if (options.compatible) { - options.forceset = true; - options.unfold = true; - } - if (options.forceset || - rrulevals.length > 1 || - rdatevals.length || - exrulevals.length || - exdatevals.length) { - var rset_1 = new RRuleSet(noCache); - rset_1.dtstart(dtstart); - rset_1.tzid(tzid || undefined); - rrulevals.forEach(function (val) { - rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - rdatevals.forEach(function (date) { - rset_1.rdate(date); - }); - exrulevals.forEach(function (val) { - rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - exdatevals.forEach(function (date) { - rset_1.exdate(date); - }); - if (options.compatible && options.dtstart) - rset_1.rdate(dtstart); - return rset_1; - } - var val = rrulevals[0] || {}; - return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); + var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; + var noCache = options.cache === false; + if (options.compatible) { + options.forceset = true; + options.unfold = true; + } + if (options.forceset || rrulevals.length > 1 || rdatevals.length || exrulevals.length || exdatevals.length) { + var rset_1 = new rruleset_default(noCache); + rset_1.dtstart(dtstart); + rset_1.tzid(tzid || void 0); + rrulevals.forEach(function(val2) { + rset_1.rrule(new rrule_default(groomRruleOptions(val2, dtstart, tzid), noCache)); + }); + rdatevals.forEach(function(date) { + rset_1.rdate(date); + }); + exrulevals.forEach(function(val2) { + rset_1.exrule(new rrule_default(groomRruleOptions(val2, dtstart, tzid), noCache)); + }); + exdatevals.forEach(function(date) { + rset_1.exdate(date); + }); + if (options.compatible && options.dtstart) + rset_1.rdate(dtstart); + return rset_1; + } + var val = rrulevals[0] || {}; + return new rrule_default(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); } function rrulestr(s, options) { - if (options === void 0) { options = {}; } - return buildRule(s, initializeOptions(options)); + if (options === void 0) { + options = {}; + } + return buildRule(s, initializeOptions2(options)); } function groomRruleOptions(val, dtstart, tzid) { - return __assign(__assign({}, val), { dtstart: dtstart, - tzid: tzid }); + return __assign(__assign({}, val), { + dtstart, + tzid + }); } -function initializeOptions(options) { - var invalid = []; - var keys = Object.keys(options); - var defaultKeys = Object.keys(DEFAULT_OPTIONS); - keys.forEach(function (key) { - if (!includes(defaultKeys, key)) - invalid.push(key); - }); - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign(__assign({}, DEFAULT_OPTIONS), options); +function initializeOptions2(options) { + var invalid = []; + var keys = Object.keys(options); + var defaultKeys2 = Object.keys(DEFAULT_OPTIONS2); + keys.forEach(function(key) { + if (!includes(defaultKeys2, key)) + invalid.push(key); + }); + if (invalid.length) { + throw new Error("Invalid options: " + invalid.join(", ")); + } + return __assign(__assign({}, DEFAULT_OPTIONS2), options); } function extractName(line) { - if (line.indexOf(':') === -1) { - return { - name: 'RRULE', - value: line - }; - } - var _a = split(line, ':', 1), name = _a[0], value = _a[1]; + if (line.indexOf(":") === -1) { return { - name: name, - value: value + name: "RRULE", + value: line }; + } + var _a = split(line, ":", 1), name = _a[0], value = _a[1]; + return { + name, + value + }; } function breakDownLine(line) { - var _a = extractName(line), name = _a.name, value = _a.value; - var parms = name.split(';'); - if (!parms) - throw new Error('empty property name'); - return { - name: parms[0].toUpperCase(), - parms: parms.slice(1), - value: value - }; + var _a = extractName(line), name = _a.name, value = _a.value; + var parms = name.split(";"); + if (!parms) + throw new Error("empty property name"); + return { + name: parms[0].toUpperCase(), + parms: parms.slice(1), + value + }; } function splitIntoLines(s, unfold) { - if (unfold === void 0) { unfold = false; } - s = s && s.trim(); - if (!s) - throw new Error('Invalid empty string'); - // More info about 'unfold' option - // Go head to http://www.ietf.org/rfc/rfc2445.txt - if (!unfold) { - return s.split(/\s/); + if (unfold === void 0) { + unfold = false; + } + s = s && s.trim(); + if (!s) + throw new Error("Invalid empty string"); + if (!unfold) { + return s.split(/\s/); + } + var lines = s.split("\n"); + var i = 0; + while (i < lines.length) { + var line = lines[i] = lines[i].replace(/\s+$/g, ""); + if (!line) { + lines.splice(i, 1); + } else if (i > 0 && line[0] === " ") { + lines[i - 1] += line.slice(1); + lines.splice(i, 1); + } else { + i += 1; } - var lines = s.split('\n'); - var i = 0; - while (i < lines.length) { - // TODO - var line = (lines[i] = lines[i].replace(/\s+$/g, '')); - if (!line) { - lines.splice(i, 1); - } - else if (i > 0 && line[0] === ' ') { - lines[i - 1] += line.slice(1); - lines.splice(i, 1); - } - else { - i += 1; - } - } - return lines; + } + return lines; } function validateDateParm(parms) { - parms.forEach(function (parm) { - if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { - throw new Error('unsupported RDATE/EXDATE parm: ' + parm); - } - }); + parms.forEach(function(parm) { + if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { + throw new Error("unsupported RDATE/EXDATE parm: " + parm); + } + }); } function parseRDate(rdateval, parms) { - validateDateParm(parms); - return rdateval - .split(',') - .map(function (datestr) { return dateutil$1.untilStringToDate(datestr); }); + validateDateParm(parms); + return rdateval.split(",").map(function(datestr) { + return dateutil_default.untilStringToDate(datestr); + }); } +// node_modules/rrule/dist/esm/src/rruleset.js function createGetterSetter(fieldName) { - var _this = this; - return function (field) { - if (field !== undefined) { - _this["_" + fieldName] = field; - } - if (_this["_" + fieldName] !== undefined) { - return _this["_" + fieldName]; - } - for (var i = 0; i < _this._rrule.length; i++) { - var field_1 = _this._rrule[i].origOptions[fieldName]; - if (field_1) { - return field_1; - } - } - }; + var _this = this; + return function(field) { + if (field !== void 0) { + _this["_" + fieldName] = field; + } + if (_this["_" + fieldName] !== void 0) { + return _this["_" + fieldName]; + } + for (var i = 0; i < _this._rrule.length; i++) { + var field_1 = _this._rrule[i].origOptions[fieldName]; + if (field_1) { + return field_1; + } + } + }; } -var RRuleSet = /** @class */ (function (_super) { - __extends(RRuleSet, _super); - /** - * - * @param {Boolean?} noCache - * The same stratagy as RRule on cache, default to false - * @constructor - */ - function RRuleSet(noCache) { - if (noCache === void 0) { noCache = false; } - var _this = _super.call(this, {}, noCache) || this; - _this.dtstart = createGetterSetter.apply(_this, ['dtstart']); - _this.tzid = createGetterSetter.apply(_this, ['tzid']); - _this._rrule = []; - _this._rdate = []; - _this._exrule = []; - _this._exdate = []; - return _this; +var RRuleSet = function(_super) { + __extends(RRuleSet2, _super); + function RRuleSet2(noCache) { + if (noCache === void 0) { + noCache = false; } - RRuleSet.prototype._iter = function (iterResult) { - return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); - }; - /** - * Adds an RRule to the set - * - * @param {RRule} - */ - RRuleSet.prototype.rrule = function (rrule) { - _addRule(rrule, this._rrule); - }; - /** - * Adds an EXRULE to the set - * - * @param {RRule} - */ - RRuleSet.prototype.exrule = function (rrule) { - _addRule(rrule, this._exrule); - }; - /** - * Adds an RDate to the set - * - * @param {Date} - */ - RRuleSet.prototype.rdate = function (date) { - _addDate(date, this._rdate); - }; - /** - * Adds an EXDATE to the set - * - * @param {Date} - */ - RRuleSet.prototype.exdate = function (date) { - _addDate(date, this._exdate); - }; - /** - * Get list of included rrules in this recurrence set. - * - * @return List of rrules - */ - RRuleSet.prototype.rrules = function () { - return this._rrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of excluded rrules in this recurrence set. - * - * @return List of exrules - */ - RRuleSet.prototype.exrules = function () { - return this._exrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of rdates - */ - RRuleSet.prototype.rdates = function () { - return this._rdate.map(function (e) { return new Date(e.getTime()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of exdates - */ - RRuleSet.prototype.exdates = function () { - return this._exdate.map(function (e) { return new Date(e.getTime()); }); - }; - RRuleSet.prototype.valueOf = function () { - var result = []; - if (!this._rrule.length && this._dtstart) { - result = result.concat(optionsToString({ dtstart: this._dtstart })); - } - this._rrule.forEach(function (rrule) { - result = result.concat(rrule.toString().split('\n')); - }); - this._exrule.forEach(function (exrule) { - result = result.concat(exrule.toString().split('\n') - .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); }) - .filter(function (line) { return !/^DTSTART/.test(line); })); - }); - if (this._rdate.length) { - result.push(rdatesToString('RDATE', this._rdate, this.tzid())); - } - if (this._exdate.length) { - result.push(rdatesToString('EXDATE', this._exdate, this.tzid())); - } - return result; - }; - /** - * to generate recurrence field such as: - * DTSTART:19970902T010000Z - * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU - * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH - */ - RRuleSet.prototype.toString = function () { - return this.valueOf().join('\n'); - }; - /** - * Create a new RRuleSet Object completely base on current instance - */ - RRuleSet.prototype.clone = function () { - var rrs = new RRuleSet(!!this._cache); - this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); }); - this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); }); - this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); }); - this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); }); - return rrs; - }; - return RRuleSet; -}(RRule)); + var _this = _super.call(this, {}, noCache) || this; + _this.dtstart = createGetterSetter.apply(_this, ["dtstart"]); + _this.tzid = createGetterSetter.apply(_this, ["tzid"]); + _this._rrule = []; + _this._rdate = []; + _this._exrule = []; + _this._exdate = []; + return _this; + } + RRuleSet2.prototype._iter = function(iterResult) { + return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); + }; + RRuleSet2.prototype.rrule = function(rrule) { + _addRule(rrule, this._rrule); + }; + RRuleSet2.prototype.exrule = function(rrule) { + _addRule(rrule, this._exrule); + }; + RRuleSet2.prototype.rdate = function(date) { + _addDate(date, this._rdate); + }; + RRuleSet2.prototype.exdate = function(date) { + _addDate(date, this._exdate); + }; + RRuleSet2.prototype.rrules = function() { + return this._rrule.map(function(e) { + return rrulestr(e.toString()); + }); + }; + RRuleSet2.prototype.exrules = function() { + return this._exrule.map(function(e) { + return rrulestr(e.toString()); + }); + }; + RRuleSet2.prototype.rdates = function() { + return this._rdate.map(function(e) { + return new Date(e.getTime()); + }); + }; + RRuleSet2.prototype.exdates = function() { + return this._exdate.map(function(e) { + return new Date(e.getTime()); + }); + }; + RRuleSet2.prototype.valueOf = function() { + var result = []; + if (!this._rrule.length && this._dtstart) { + result = result.concat(optionsToString({ dtstart: this._dtstart })); + } + this._rrule.forEach(function(rrule) { + result = result.concat(rrule.toString().split("\n")); + }); + this._exrule.forEach(function(exrule) { + result = result.concat(exrule.toString().split("\n").map(function(line) { + return line.replace(/^RRULE:/, "EXRULE:"); + }).filter(function(line) { + return !/^DTSTART/.test(line); + })); + }); + if (this._rdate.length) { + result.push(rdatesToString("RDATE", this._rdate, this.tzid())); + } + if (this._exdate.length) { + result.push(rdatesToString("EXDATE", this._exdate, this.tzid())); + } + return result; + }; + RRuleSet2.prototype.toString = function() { + return this.valueOf().join("\n"); + }; + RRuleSet2.prototype.clone = function() { + var rrs = new RRuleSet2(!!this._cache); + this._rrule.forEach(function(rule) { + return rrs.rrule(rule.clone()); + }); + this._exrule.forEach(function(rule) { + return rrs.exrule(rule.clone()); + }); + this._rdate.forEach(function(date) { + return rrs.rdate(new Date(date.getTime())); + }); + this._exdate.forEach(function(date) { + return rrs.exdate(new Date(date.getTime())); + }); + return rrs; + }; + return RRuleSet2; +}(rrule_default); +var rruleset_default = RRuleSet; function _addRule(rrule, collection) { - if (!(rrule instanceof RRule)) { - throw new TypeError(String(rrule) + ' is not RRule instance'); - } - if (!includes(collection.map(String), String(rrule))) { - collection.push(rrule); - } + if (!(rrule instanceof rrule_default)) { + throw new TypeError(String(rrule) + " is not RRule instance"); + } + if (!includes(collection.map(String), String(rrule))) { + collection.push(rrule); + } } function _addDate(date, collection) { - if (!(date instanceof Date)) { - throw new TypeError(String(date) + ' is not Date instance'); - } - if (!includes(collection.map(Number), Number(date))) { - collection.push(date); - dateutil$1.sort(collection); - } + if (!(date instanceof Date)) { + throw new TypeError(String(date) + " is not Date instance"); + } + if (!includes(collection.map(Number), Number(date))) { + collection.push(date); + dateutil_default.sort(collection); + } } function rdatesToString(param, rdates, tzid) { - var isUTC = !tzid || tzid.toUpperCase() === 'UTC'; - var header = isUTC ? param + ":" : param + ";TZID=" + tzid + ":"; - var dateString = rdates - .map(function (rdate) { return dateutil$1.timeToUntilString(rdate.valueOf(), isUTC); }) - .join(','); - return "" + header + dateString; + var isUTC = !tzid || tzid.toUpperCase() === "UTC"; + var header = isUTC ? param + ":" : param + ";TZID=" + tzid + ":"; + var dateString = rdates.map(function(rdate) { + return dateutil_default.timeToUntilString(rdate.valueOf(), isUTC); + }).join(","); + return "" + header + dateString; } -class Recurrence { - constructor({ rrule, referenceDate, startDate, scheduledDate, dueDate, }) { - this.rrule = rrule; - this.referenceDate = referenceDate; - this.startDate = startDate; - this.scheduledDate = scheduledDate; - this.dueDate = dueDate; - } - static fromText({ recurrenceRuleText, startDate, scheduledDate, dueDate, }) { - try { - const options = RRule.parseText(recurrenceRuleText); - if (options !== null) { - // Pick the reference date for recurrence based on importance. - // Assuming due date has the highest priority. - let referenceDate = null; - // Clone the moment objects. - if (dueDate) { - referenceDate = window.moment(dueDate); - } - else if (scheduledDate) { - referenceDate = window.moment(scheduledDate); - } - else if (startDate) { - referenceDate = window.moment(startDate); - } - if (referenceDate !== null) { - options.dtstart = window - .moment(referenceDate) - .startOf('day') - .utc(true) - .toDate(); - } - const rrule = new RRule(options); - return new Recurrence({ - rrule, - referenceDate, - startDate, - scheduledDate, - dueDate, - }); - } - } - catch (error) { - // Could not read recurrence rule. User possibly not done typing. - } +// node_modules/rrule/dist/esm/src/index.js +var src_default = rrule_default; + +// src/Recurrence.ts +var Recurrence = class { + constructor({ + rrule, + baseOnToday, + referenceDate, + startDate, + scheduledDate, + dueDate + }) { + this.rrule = rrule; + this.baseOnToday = baseOnToday; + this.referenceDate = referenceDate; + this.startDate = startDate; + this.scheduledDate = scheduledDate; + this.dueDate = dueDate; + } + static fromText({ + recurrenceRuleText, + startDate, + scheduledDate, + dueDate + }) { + try { + const match = recurrenceRuleText.match(/^([a-zA-Z0-9, !]+?)( when done)?$/i); + if (match == null) { return null; - } - toText() { - return this.rrule.toText(); - } - /** - * Returns the dates of the next occurrence or null if there is no next occurrence. - */ - next() { - // The next occurrence should happen based on the original reference - // date if possible. Otherwise, base it on today. - let after; - if (this.referenceDate !== null) { - // Clone to not alter the original reference date. - after = window.moment(this.referenceDate); + } + const isolatedRuleText = match[1].trim(); + const baseOnToday = match[2] !== void 0; + const options = rrule_default.parseText(isolatedRuleText); + if (options !== null) { + let referenceDate = null; + if (dueDate) { + referenceDate = window.moment(dueDate); + } else if (scheduledDate) { + referenceDate = window.moment(scheduledDate); + } else if (startDate) { + referenceDate = window.moment(startDate); } - else { - after = window.moment(); + if (!baseOnToday && referenceDate !== null) { + options.dtstart = window.moment(referenceDate).startOf("day").utc(true).toDate(); + } else { + options.dtstart = window.moment().startOf("day").utc(true).toDate(); } - after.endOf('day'); - after.utc(true); - const next = this.rrule.after(after.toDate()); - if (next !== null) { - // Re-add the timezone that RRule disregarded: - const localTimeZone = window.moment.utc(next).local(true); - const nextOccurrence = localTimeZone.startOf('day'); - // Keep the relative difference between the reference date and - // start/scheduled/due. - let startDate = null; - let scheduledDate = null; - let dueDate = null; - // Only if a reference date is given. A reference date will exist if at - // least one of the other dates is set. - if (this.referenceDate) { - if (this.startDate) { - const originalDifference = window.moment.duration(this.startDate.diff(this.referenceDate)); - // Cloning so that original won't be manipulated: - startDate = window.moment(nextOccurrence); - // Rounding days to handle cross daylight-savings-time recurrences. - startDate.add(Math.round(originalDifference.asDays()), 'days'); - } - if (this.scheduledDate) { - const originalDifference = window.moment.duration(this.scheduledDate.diff(this.referenceDate)); - // Cloning so that original won't be manipulated: - scheduledDate = window.moment(nextOccurrence); - // Rounding days to handle cross daylight-savings-time recurrences. - scheduledDate.add(Math.round(originalDifference.asDays()), 'days'); - } - if (this.dueDate) { - const originalDifference = window.moment.duration(this.dueDate.diff(this.referenceDate)); - // Cloning so that original won't be manipulated: - dueDate = window.moment(nextOccurrence); - // Rounding days to handle cross daylight-savings-time recurrences. - dueDate.add(Math.round(originalDifference.asDays()), 'days'); - } - } - return { - startDate, - scheduledDate, - dueDate, - }; - } - return null; + const rrule = new rrule_default(options); + return new Recurrence({ + rrule, + baseOnToday, + referenceDate, + startDate, + scheduledDate, + dueDate + }); + } + } catch (error) { } -} + return null; + } + toText() { + let text2 = this.rrule.toText(); + if (this.baseOnToday) { + text2 += " when done"; + } + return text2; + } + next() { + let next; + if (this.baseOnToday) { + const today = window.moment(); + const ruleBasedOnToday = new rrule_default(__spreadProps(__spreadValues({}, this.rrule.origOptions), { + dtstart: today.startOf("day").utc(true).toDate() + })); + next = ruleBasedOnToday.after(today.endOf("day").utc(true).toDate()); + } else { + const after = window.moment(this.referenceDate).endOf("day").utc(true); + next = this.rrule.after(after.toDate()); + } + if (next !== null) { + const localTimeZone = window.moment.utc(next).local(true); + const nextOccurrence = localTimeZone.startOf("day"); + let startDate = null; + let scheduledDate = null; + let dueDate = null; + if (this.referenceDate) { + if (this.startDate) { + const originalDifference = window.moment.duration(this.startDate.diff(this.referenceDate)); + startDate = window.moment(nextOccurrence); + startDate.add(Math.round(originalDifference.asDays()), "days"); + } + if (this.scheduledDate) { + const originalDifference = window.moment.duration(this.scheduledDate.diff(this.referenceDate)); + scheduledDate = window.moment(nextOccurrence); + scheduledDate.add(Math.round(originalDifference.asDays()), "days"); + } + if (this.dueDate) { + const originalDifference = window.moment.duration(this.dueDate.diff(this.referenceDate)); + dueDate = window.moment(nextOccurrence); + dueDate.add(Math.round(originalDifference.asDays()), "days"); + } + } + return { + startDate, + scheduledDate, + dueDate + }; + } + return null; + } +}; -class Urgency { - static calculate(task) { - let urgency = 0.0; - if (task.dueDate !== null) { - // Map a range of 21 days to the value 0.2 - 1.0 - const daysOverdue = window.moment().diff(task.dueDate) / Urgency.milliSecondsPerDay; - let dueMultiplier; - if (daysOverdue >= 7.0) { - dueMultiplier = 1.0; // < 1 wk ago - } - else if (daysOverdue >= -14.0) { - // Due between 7 days (+7) ago and in 14 days (-14) - dueMultiplier = ((daysOverdue + 14.0) * 0.8) / 21.0 + 0.2; - } - else { - dueMultiplier = 0.2; // > 2 wks - } - urgency += dueMultiplier * Urgency.dueCoefficient; - } - if (task.scheduledDate !== null) { - if (window.moment().isSameOrAfter(task.scheduledDate)) { - urgency += 1 * Urgency.scheduledCoefficient; - } - } - if (task.startDate !== null) { - if (window.moment().isBefore(task.startDate)) { - urgency += 1 * Urgency.startedCoefficient; - } - } - switch (task.priority) { - // High - case '1': - urgency += 1.0 * Urgency.priorityCoefficient; - break; - // Medium - case '2': - urgency += 0.65 * Urgency.priorityCoefficient; - break; - // None - case '3': - urgency += 0.325 * Urgency.priorityCoefficient; - break; - } - return urgency; +// src/Urgency.ts +var _Urgency = class { + static calculate(task) { + let urgency = 0; + if (task.dueDate !== null) { + const daysOverdue = window.moment().diff(task.dueDate) / _Urgency.milliSecondsPerDay; + let dueMultiplier; + if (daysOverdue >= 7) { + dueMultiplier = 1; + } else if (daysOverdue >= -14) { + dueMultiplier = (daysOverdue + 14) * 0.8 / 21 + 0.2; + } else { + dueMultiplier = 0.2; + } + urgency += dueMultiplier * _Urgency.dueCoefficient; } -} -Urgency.dueCoefficient = 12.0; -Urgency.scheduledCoefficient = 5.0; -Urgency.startedCoefficient = -3.0; -Urgency.priorityCoefficient = 6.0; -Urgency.milliSecondsPerDay = 1000 * 60 * 60 * 24; + if (task.scheduledDate !== null) { + if (window.moment().isSameOrAfter(task.scheduledDate)) { + urgency += 1 * _Urgency.scheduledCoefficient; + } + } + if (task.startDate !== null) { + if (window.moment().isBefore(task.startDate)) { + urgency += 1 * _Urgency.startedCoefficient; + } + } + switch (task.priority) { + case "1": + urgency += 1 * _Urgency.priorityCoefficient; + break; + case "2": + urgency += 0.65 * _Urgency.priorityCoefficient; + break; + case "3": + urgency += 0.325 * _Urgency.priorityCoefficient; + break; + } + return urgency; + } +}; +var Urgency = _Urgency; +Urgency.dueCoefficient = 12; +Urgency.scheduledCoefficient = 5; +Urgency.startedCoefficient = -3; +Urgency.priorityCoefficient = 6; +Urgency.milliSecondsPerDay = 1e3 * 60 * 60 * 24; +// src/Task.ts var Status; -(function (Status) { - Status["Todo"] = "Todo"; - Status["Done"] = "Done"; +(function(Status2) { + Status2["Todo"] = "Todo"; + Status2["Done"] = "Done"; })(Status || (Status = {})); -// Sort low below none. var Priority; -(function (Priority) { - Priority["High"] = "1"; - Priority["Medium"] = "2"; - Priority["None"] = "3"; - Priority["Low"] = "4"; +(function(Priority2) { + Priority2["High"] = "1"; + Priority2["Medium"] = "2"; + Priority2["None"] = "3"; + Priority2["Low"] = "4"; })(Priority || (Priority = {})); -class Task { - constructor({ status, description, path, indentation, sectionStart, sectionIndex, originalStatusCharacter, precedingHeader, priority, startDate, scheduledDate, dueDate, doneDate, recurrence, blockLink, }) { - this._urgency = null; - this.status = status; - this.description = description; - this.path = path; - this.indentation = indentation; - this.sectionStart = sectionStart; - this.sectionIndex = sectionIndex; - this.originalStatusCharacter = originalStatusCharacter; - this.precedingHeader = precedingHeader; - this.priority = priority; - this.startDate = startDate; - this.scheduledDate = scheduledDate; - this.dueDate = dueDate; - this.doneDate = doneDate; - this.recurrence = recurrence; - this.blockLink = blockLink; +var _Task = class { + constructor({ + status, + description, + path, + indentation, + sectionStart, + sectionIndex, + originalStatusCharacter, + precedingHeader, + priority, + startDate, + scheduledDate, + dueDate, + doneDate, + recurrence, + blockLink + }) { + this._urgency = null; + this.status = status; + this.description = description; + this.path = path; + this.indentation = indentation; + this.sectionStart = sectionStart; + this.sectionIndex = sectionIndex; + this.originalStatusCharacter = originalStatusCharacter; + this.precedingHeader = precedingHeader; + this.priority = priority; + this.startDate = startDate; + this.scheduledDate = scheduledDate; + this.dueDate = dueDate; + this.doneDate = doneDate; + this.recurrence = recurrence; + this.blockLink = blockLink; + } + static fromLine({ + line, + path, + sectionStart, + sectionIndex, + precedingHeader + }) { + const regexMatch = line.match(_Task.taskRegex); + if (regexMatch === null) { + return null; } - static fromLine({ line, path, sectionStart, sectionIndex, precedingHeader, }) { - const regexMatch = line.match(Task.taskRegex); - if (regexMatch === null) { - return null; + const indentation = regexMatch[1]; + const statusString = regexMatch[2].toLowerCase(); + let status; + switch (statusString) { + case " ": + status = Status.Todo; + break; + default: + status = Status.Done; + } + const body = regexMatch[3].trim(); + const { globalFilter } = getSettings(); + if (!body.includes(globalFilter)) { + return null; + } + let description = body; + const blockLinkMatch = description.match(this.blockLinkRegex); + const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; + if (blockLink !== "") { + description = description.replace(this.blockLinkRegex, "").trim(); + } + let matched; + let priority = Priority.None; + let startDate = null; + let scheduledDate = null; + let dueDate = null; + let doneDate = null; + let recurrence = null; + const maxRuns = 7; + let runs = 0; + do { + matched = false; + const priorityMatch = description.match(_Task.priorityRegex); + if (priorityMatch !== null) { + switch (priorityMatch[1]) { + case "\u{1F53D}": + priority = Priority.Low; + break; + case "\u{1F53C}": + priority = Priority.Medium; + break; + case "\u23EB": + priority = Priority.High; + break; } - const indentation = regexMatch[1]; - const statusString = regexMatch[2].toLowerCase(); - let status; - switch (statusString) { - case ' ': - status = Status.Todo; - break; - default: - status = Status.Done; - } - // match[3] includes the whole body of the task after the brackets. - const body = regexMatch[3].trim(); - const { globalFilter } = getSettings(); - if (!body.includes(globalFilter)) { - return null; - } - let description = body; - const blockLinkMatch = description.match(this.blockLinkRegex); - const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ''; - if (blockLink !== '') { - description = description.replace(this.blockLinkRegex, '').trim(); - } - // Keep matching and removing special strings from the end of the - // description in any order. The loop should only run once if the - // strings are in the expected order after the description. - let matched; - let priority = Priority.None; - let startDate = null; - let scheduledDate = null; - let dueDate = null; - let doneDate = null; - let recurrence = null; - // Add a "max runs" failsafe to never end in an endless loop: - const maxRuns = 7; - let runs = 0; - do { - matched = false; - const priorityMatch = description.match(Task.priorityRegex); - if (priorityMatch !== null) { - switch (priorityMatch[1]) { - case '🔽': - priority = Priority.Low; - break; - case '🔼': - priority = Priority.Medium; - break; - case '⏫': - priority = Priority.High; - break; - } - description = description - .replace(Task.priorityRegex, '') - .trim(); - matched = true; - } - const doneDateMatch = description.match(Task.doneDateRegex); - if (doneDateMatch !== null) { - doneDate = window.moment(doneDateMatch[1], Task.dateFormat); - description = description - .replace(Task.doneDateRegex, '') - .trim(); - matched = true; - } - const dueDateMatch = description.match(Task.dueDateRegex); - if (dueDateMatch !== null) { - dueDate = window.moment(dueDateMatch[1], Task.dateFormat); - description = description.replace(Task.dueDateRegex, '').trim(); - matched = true; - } - const scheduledDateMatch = description.match(Task.scheduledDateRegex); - if (scheduledDateMatch !== null) { - scheduledDate = window.moment(scheduledDateMatch[1], Task.dateFormat); - description = description - .replace(Task.scheduledDateRegex, '') - .trim(); - matched = true; - } - const startDateMatch = description.match(Task.startDateRegex); - if (startDateMatch !== null) { - startDate = window.moment(startDateMatch[1], Task.dateFormat); - description = description - .replace(Task.startDateRegex, '') - .trim(); - matched = true; - } - const recurrenceMatch = description.match(Task.recurrenceRegex); - if (recurrenceMatch !== null) { - recurrence = Recurrence.fromText({ - recurrenceRuleText: recurrenceMatch[1].trim(), - startDate, - scheduledDate, - dueDate, - }); - description = description - .replace(Task.recurrenceRegex, '') - .trim(); - matched = true; - } - runs++; - } while (matched && runs <= maxRuns); - const task = new Task({ - status, - description, - path, - indentation, - sectionStart, - sectionIndex, - originalStatusCharacter: statusString, - precedingHeader, - priority, - startDate, - scheduledDate, - dueDate, - doneDate, - recurrence, - blockLink, + description = description.replace(_Task.priorityRegex, "").trim(); + matched = true; + } + const doneDateMatch = description.match(_Task.doneDateRegex); + if (doneDateMatch !== null) { + doneDate = window.moment(doneDateMatch[1], _Task.dateFormat); + description = description.replace(_Task.doneDateRegex, "").trim(); + matched = true; + } + const dueDateMatch = description.match(_Task.dueDateRegex); + if (dueDateMatch !== null) { + dueDate = window.moment(dueDateMatch[1], _Task.dateFormat); + description = description.replace(_Task.dueDateRegex, "").trim(); + matched = true; + } + const scheduledDateMatch = description.match(_Task.scheduledDateRegex); + if (scheduledDateMatch !== null) { + scheduledDate = window.moment(scheduledDateMatch[1], _Task.dateFormat); + description = description.replace(_Task.scheduledDateRegex, "").trim(); + matched = true; + } + const startDateMatch = description.match(_Task.startDateRegex); + if (startDateMatch !== null) { + startDate = window.moment(startDateMatch[1], _Task.dateFormat); + description = description.replace(_Task.startDateRegex, "").trim(); + matched = true; + } + const recurrenceMatch = description.match(_Task.recurrenceRegex); + if (recurrenceMatch !== null) { + recurrence = Recurrence.fromText({ + recurrenceRuleText: recurrenceMatch[1].trim(), + startDate, + scheduledDate, + dueDate }); - return task; - } - toLi({ parentUlElement, listIndex, layoutOptions, }) { - return __awaiter(this, void 0, void 0, function* () { - const li = parentUlElement.createEl('li'); - li.addClasses(['task-list-item', 'plugin-tasks-list-item']); - let taskAsString = this.toString(layoutOptions); - const { globalFilter, removeGlobalFilter } = getSettings(); - if (removeGlobalFilter) { - taskAsString = taskAsString.replace(globalFilter, '').trim(); - } - const textSpan = li.createSpan(); - textSpan.addClass('tasks-list-text'); - yield obsidian.MarkdownRenderer.renderMarkdown(taskAsString, textSpan, this.path, null); - // Unwrap the p-tag that was created by the MarkdownRenderer: - const pElement = textSpan.querySelector('p'); - if (pElement !== null) { - while (pElement.firstChild) { - textSpan.insertBefore(pElement.firstChild, pElement); - } - pElement.remove(); - } - // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: - textSpan.findAll('p').forEach((pElement) => { - if (!pElement.hasChildNodes()) { - pElement.remove(); - } - }); - // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: - textSpan.findAll('.footnotes').forEach((footnoteElement) => { - footnoteElement.remove(); - }); - const checkbox = li.createEl('input'); - checkbox.addClass('task-list-item-checkbox'); - checkbox.type = 'checkbox'; - if (this.status !== Status.Todo) { - checkbox.checked = true; - li.addClass('is-checked'); - } - checkbox.onClickEvent((event) => { - event.preventDefault(); - // It is required to stop propagation so that obsidian won't write the file with the - // checkbox (un)checked. Obsidian would write after us and overwrite our change. - event.stopPropagation(); - // Should be re-rendered as enabled after update in file. - checkbox.disabled = true; - const toggledTasks = this.toggle(); - replaceTaskWithTasks({ - originalTask: this, - newTasks: toggledTasks, - }); - }); - li.prepend(checkbox); - // Set these to be compatible with stock obsidian lists: - li.setAttr('data-task', this.originalStatusCharacter.trim()); // Trim to ensure empty attribute for space. Same way as obsidian. - li.setAttr('data-line', listIndex); - checkbox.setAttr('data-line', listIndex); - if (layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.shortMode) { - this.addTooltip({ element: textSpan }); - } - return li; + description = description.replace(_Task.recurrenceRegex, "").trim(); + matched = true; + } + runs++; + } while (matched && runs <= maxRuns); + const task = new _Task({ + status, + description, + path, + indentation, + sectionStart, + sectionIndex, + originalStatusCharacter: statusString, + precedingHeader, + priority, + startDate, + scheduledDate, + dueDate, + doneDate, + recurrence, + blockLink + }); + return task; + } + toLi(_0) { + return __async(this, arguments, function* ({ + parentUlElement, + listIndex, + layoutOptions, + isFilenameUnique + }) { + const li = parentUlElement.createEl("li"); + li.addClasses(["task-list-item", "plugin-tasks-list-item"]); + let taskAsString = this.toString(layoutOptions); + const { globalFilter, removeGlobalFilter } = getSettings(); + if (removeGlobalFilter) { + taskAsString = taskAsString.replace(globalFilter, "").trim(); + } + const textSpan = li.createSpan(); + textSpan.addClass("tasks-list-text"); + yield import_obsidian2.MarkdownRenderer.renderMarkdown(taskAsString, textSpan, this.path, null); + const pElement = textSpan.querySelector("p"); + if (pElement !== null) { + while (pElement.firstChild) { + textSpan.insertBefore(pElement.firstChild, pElement); + } + pElement.remove(); + } + textSpan.findAll("p").forEach((pElement2) => { + if (!pElement2.hasChildNodes()) { + pElement2.remove(); + } + }); + textSpan.findAll(".footnotes").forEach((footnoteElement) => { + footnoteElement.remove(); + }); + const checkbox = li.createEl("input"); + checkbox.addClass("task-list-item-checkbox"); + checkbox.type = "checkbox"; + if (this.status !== Status.Todo) { + checkbox.checked = true; + li.addClass("is-checked"); + } + checkbox.onClickEvent((event) => { + event.preventDefault(); + event.stopPropagation(); + checkbox.disabled = true; + const toggledTasks = this.toggle(); + replaceTaskWithTasks({ + originalTask: this, + newTasks: toggledTasks }); + }); + li.prepend(checkbox); + li.setAttr("data-task", this.originalStatusCharacter.trim()); + li.setAttr("data-line", listIndex); + checkbox.setAttr("data-line", listIndex); + if (layoutOptions == null ? void 0 : layoutOptions.shortMode) { + this.addTooltip({ element: textSpan, isFilenameUnique }); + } + return li; + }); + } + toString(layoutOptions) { + var _a; + layoutOptions = layoutOptions != null ? layoutOptions : new LayoutOptions(); + let taskString = this.description; + if (!layoutOptions.hidePriority) { + let priority = ""; + if (this.priority === Priority.High) { + priority = " \u23EB"; + } else if (this.priority === Priority.Medium) { + priority = " \u{1F53C}"; + } else if (this.priority === Priority.Low) { + priority = " \u{1F53D}"; + } + taskString += priority; } - toString(layoutOptions) { - var _a; - layoutOptions = layoutOptions !== null && layoutOptions !== void 0 ? layoutOptions : new LayoutOptions(); - let taskString = this.description; - if (!layoutOptions.hidePriority) { - let priority = ''; - if (this.priority === Priority.High) { - priority = ' ⏫'; - } - else if (this.priority === Priority.Medium) { - priority = ' 🔼'; - } - else if (this.priority === Priority.Low) { - priority = ' 🔽'; - } - taskString += priority; - } - if (!layoutOptions.hideRecurrenceRule && this.recurrence) { - const recurrenceRule = layoutOptions.shortMode - ? ' 🔁' - : ` 🔁 ${this.recurrence.toText()}`; - taskString += recurrenceRule; - } - if (!layoutOptions.hideStartDate && this.startDate) { - const startDate = layoutOptions.shortMode - ? ' 🛫' - : ` 🛫 ${this.startDate.format(Task.dateFormat)}`; - taskString += startDate; - } - if (!layoutOptions.hideScheduledDate && this.scheduledDate) { - const scheduledDate = layoutOptions.shortMode - ? ' ⏳' - : ` ⏳ ${this.scheduledDate.format(Task.dateFormat)}`; - taskString += scheduledDate; - } - if (!layoutOptions.hideDueDate && this.dueDate) { - const dueDate = layoutOptions.shortMode - ? ' 📅' - : ` 📅 ${this.dueDate.format(Task.dateFormat)}`; - taskString += dueDate; - } - if (!layoutOptions.hideDoneDate && this.doneDate) { - const doneDate = layoutOptions.shortMode - ? ' ✅' - : ` ✅ ${this.doneDate.format(Task.dateFormat)}`; - taskString += doneDate; - } - const blockLink = (_a = this.blockLink) !== null && _a !== void 0 ? _a : ''; - taskString += blockLink; - return taskString; + if (!layoutOptions.hideRecurrenceRule && this.recurrence) { + const recurrenceRule = layoutOptions.shortMode ? " \u{1F501}" : ` \u{1F501} ${this.recurrence.toText()}`; + taskString += recurrenceRule; } - toFileLineString() { - return `${this.indentation}- [${this.originalStatusCharacter}] ${this.toString()}`; + if (!layoutOptions.hideStartDate && this.startDate) { + const startDate = layoutOptions.shortMode ? " \u{1F6EB}" : ` \u{1F6EB} ${this.startDate.format(_Task.dateFormat)}`; + taskString += startDate; } - /** - * Toggles this task and returns the resulting tasks. - * - * Toggling can result in more than one returned task in the case of - * recurrence. If it is a recurring task, the toggled task will be returned - * together with the next occurrence in the order `[next, toggled]`. If the - * task is not recurring, it will return `[toggled]`. - */ - toggle() { - const newStatus = this.status === Status.Todo ? Status.Done : Status.Todo; - let newDoneDate = null; - let nextOccurrence = null; - if (newStatus !== Status.Todo) { - newDoneDate = window.moment(); - // If this task is no longer todo, we need to check if it is recurring: - if (this.recurrence !== null) { - nextOccurrence = this.recurrence.next(); - } - } - const toggledTask = new Task(Object.assign(Object.assign({}, this), { status: newStatus, doneDate: newDoneDate, originalStatusCharacter: newStatus === Status.Done ? 'x' : ' ' })); - const newTasks = []; - if (nextOccurrence !== null) { - const nextTask = new Task(Object.assign(Object.assign(Object.assign({}, this), nextOccurrence), { - // New occurrences cannot have the same block link. - // And random block links don't help. - blockLink: '' })); - newTasks.push(nextTask); - } - // Write next occurrence before previous occurrence. - newTasks.push(toggledTask); - return newTasks; + if (!layoutOptions.hideScheduledDate && this.scheduledDate) { + const scheduledDate = layoutOptions.shortMode ? " \u23F3" : ` \u23F3 ${this.scheduledDate.format(_Task.dateFormat)}`; + taskString += scheduledDate; } - get urgency() { - if (this._urgency === null) { - this._urgency = Urgency.calculate(this); - } - return this._urgency; + if (!layoutOptions.hideDueDate && this.dueDate) { + const dueDate = layoutOptions.shortMode ? " \u{1F4C5}" : ` \u{1F4C5} ${this.dueDate.format(_Task.dateFormat)}`; + taskString += dueDate; } - addTooltip({ element }) { - if (this.recurrence || - this.startDate || - this.scheduledDate || - this.dueDate || - this.doneDate) { - element.addEventListener('mouseenter', () => { - const tooltip = element.createDiv(); - tooltip.addClasses(['tooltip', 'mod-right']); - if (this.recurrence) { - const recurrenceDiv = tooltip.createDiv(); - recurrenceDiv.setText(`🔁 ${this.recurrence.toText()}`); - } - if (this.startDate) { - const startDateDiv = tooltip.createDiv(); - startDateDiv.setText(Task.toTooltipDate({ - signifier: '🛫', - date: this.startDate, - })); - } - if (this.scheduledDate) { - const scheduledDateDiv = tooltip.createDiv(); - scheduledDateDiv.setText(Task.toTooltipDate({ - signifier: '⏳', - date: this.scheduledDate, - })); - } - if (this.dueDate) { - const dueDateDiv = tooltip.createDiv(); - dueDateDiv.setText(Task.toTooltipDate({ - signifier: '📅', - date: this.dueDate, - })); - } - if (this.doneDate) { - const doneDateDiv = tooltip.createDiv(); - doneDateDiv.setText(Task.toTooltipDate({ - signifier: '✅', - date: this.doneDate, - })); - } - element.addEventListener('mouseleave', () => { - tooltip.remove(); - }); - }); - } + if (!layoutOptions.hideDoneDate && this.doneDate) { + const doneDate = layoutOptions.shortMode ? " \u2705" : ` \u2705 ${this.doneDate.format(_Task.dateFormat)}`; + taskString += doneDate; } - static toTooltipDate({ signifier, date, }) { - return `${signifier} ${date.format(Task.dateFormat)} (${date.from(window.moment().startOf('day'))})`; + const blockLink = (_a = this.blockLink) != null ? _a : ""; + taskString += blockLink; + return taskString; + } + toFileLineString() { + return `${this.indentation}- [${this.originalStatusCharacter}] ${this.toString()}`; + } + toggle() { + const newStatus = this.status === Status.Todo ? Status.Done : Status.Todo; + let newDoneDate = null; + let nextOccurrence = null; + if (newStatus !== Status.Todo) { + const { setDoneDate } = getSettings(); + if (setDoneDate) { + newDoneDate = window.moment(); + } + if (this.recurrence !== null) { + nextOccurrence = this.recurrence.next(); + } } -} -Task.dateFormat = 'YYYY-MM-DD'; + const toggledTask = new _Task(__spreadProps(__spreadValues({}, this), { + status: newStatus, + doneDate: newDoneDate, + originalStatusCharacter: newStatus === Status.Done ? "x" : " " + })); + const newTasks = []; + if (nextOccurrence !== null) { + const nextTask = new _Task(__spreadProps(__spreadValues(__spreadValues({}, this), nextOccurrence), { + blockLink: "" + })); + newTasks.push(nextTask); + } + newTasks.push(toggledTask); + return newTasks; + } + get urgency() { + if (this._urgency === null) { + this._urgency = Urgency.calculate(this); + } + return this._urgency; + } + get filename() { + const fileNameMatch = this.path.match(/([^/]+)\.md$/); + if (fileNameMatch !== null) { + return fileNameMatch[1]; + } else { + return null; + } + } + getLinkText({ + isFilenameUnique + }) { + let linkText; + if (isFilenameUnique) { + linkText = this.filename; + } else { + linkText = "/" + this.path; + } + if (linkText === null) { + return null; + } + if (this.precedingHeader !== null && this.precedingHeader !== linkText) { + linkText = linkText + " > " + this.precedingHeader; + } + return linkText; + } + addTooltip({ + element: element2, + isFilenameUnique + }) { + element2.addEventListener("mouseenter", () => { + const tooltip = element2.createDiv(); + tooltip.addClasses(["tooltip", "mod-right"]); + if (this.recurrence) { + const recurrenceDiv = tooltip.createDiv(); + recurrenceDiv.setText(`\u{1F501} ${this.recurrence.toText()}`); + } + if (this.startDate) { + const startDateDiv = tooltip.createDiv(); + startDateDiv.setText(_Task.toTooltipDate({ + signifier: "\u{1F6EB}", + date: this.startDate + })); + } + if (this.scheduledDate) { + const scheduledDateDiv = tooltip.createDiv(); + scheduledDateDiv.setText(_Task.toTooltipDate({ + signifier: "\u23F3", + date: this.scheduledDate + })); + } + if (this.dueDate) { + const dueDateDiv = tooltip.createDiv(); + dueDateDiv.setText(_Task.toTooltipDate({ + signifier: "\u{1F4C5}", + date: this.dueDate + })); + } + if (this.doneDate) { + const doneDateDiv = tooltip.createDiv(); + doneDateDiv.setText(_Task.toTooltipDate({ + signifier: "\u2705", + date: this.doneDate + })); + } + const linkText = this.getLinkText({ isFilenameUnique }); + if (linkText) { + const backlinkDiv = tooltip.createDiv(); + backlinkDiv.setText(`\u{1F517} ${linkText}`); + } + element2.addEventListener("mouseleave", () => { + tooltip.remove(); + }); + }); + } + static toTooltipDate({ + signifier, + date + }) { + return `${signifier} ${date.format(_Task.dateFormat)} (${date.from(window.moment().startOf("day"))})`; + } +}; +var Task = _Task; +Task.dateFormat = "YYYY-MM-DD"; Task.taskRegex = /^([\s\t]*)[-*] +\[(.)\] *(.*)/u; -// The following regexes end with `$` because they will be matched and -// removed from the end until none are left. Task.priorityRegex = /([⏫🔼🔽])$/u; Task.startDateRegex = /🛫 ?(\d{4}-\d{2}-\d{2})$/u; Task.scheduledDateRegex = /[⏳⌛] ?(\d{4}-\d{2}-\d{2})$/u; Task.dueDateRegex = /[📅📆🗓] ?(\d{4}-\d{2}-\d{2})$/u; Task.doneDateRegex = /✅ ?(\d{4}-\d{2}-\d{2})$/u; -Task.recurrenceRegex = /🔁([a-zA-Z0-9, !]+)$/u; +Task.recurrenceRegex = /🔁 ?([a-zA-Z0-9, !]+)$/iu; Task.blockLinkRegex = / \^[a-zA-Z0-9-]+$/u; +// src/Cache.ts var State; -(function (State) { - State["Cold"] = "Cold"; - State["Initializing"] = "Initializing"; - State["Warm"] = "Warm"; +(function(State2) { + State2["Cold"] = "Cold"; + State2["Initializing"] = "Initializing"; + State2["Warm"] = "Warm"; })(State || (State = {})); -class Cache { - constructor({ metadataCache, vault, events, }) { - this.metadataCache = metadataCache; - this.metadataCacheEventReferences = []; - this.vault = vault; - this.vaultEventReferences = []; - this.events = events; - this.eventsEventReferences = []; - this.tasksMutex = new Mutex(); - this.state = State.Cold; - this.tasks = []; - this.loadedAfterFirstResolve = false; - this.subscribeToCache(); - this.subscribeToVault(); - this.subscribeToEvents(); +var Cache2 = class { + constructor({ + metadataCache: metadataCache2, + vault: vault2, + events + }) { + this.metadataCache = metadataCache2; + this.metadataCacheEventReferences = []; + this.vault = vault2; + this.vaultEventReferences = []; + this.events = events; + this.eventsEventReferences = []; + this.tasksMutex = new Mutex(); + this.state = State.Cold; + this.tasks = []; + this.loadedAfterFirstResolve = false; + this.subscribeToCache(); + this.subscribeToVault(); + this.subscribeToEvents(); + this.loadVault(); + } + unload() { + for (const eventReference of this.metadataCacheEventReferences) { + this.metadataCache.offref(eventReference); + } + for (const eventReference of this.vaultEventReferences) { + this.vault.offref(eventReference); + } + for (const eventReference of this.eventsEventReferences) { + this.events.off(eventReference); + } + } + getTasks() { + return this.tasks; + } + getState() { + return this.state; + } + notifySubscribers() { + this.events.triggerCacheUpdate({ + tasks: this.tasks, + state: this.state + }); + } + subscribeToCache() { + const resolvedEventeReference = this.metadataCache.on("resolved", () => __async(this, null, function* () { + if (!this.loadedAfterFirstResolve) { + this.loadedAfterFirstResolve = true; this.loadVault(); - } - unload() { - for (const eventReference of this.metadataCacheEventReferences) { - this.metadataCache.offref(eventReference); - } - for (const eventReference of this.vaultEventReferences) { - this.vault.offref(eventReference); - } - for (const eventReference of this.eventsEventReferences) { - this.events.off(eventReference); - } - } - getTasks() { - return this.tasks; - } - getState() { - return this.state; - } - notifySubscribers() { - this.events.triggerCacheUpdate({ - tasks: this.tasks, - state: this.state, + } + })); + this.metadataCacheEventReferences.push(resolvedEventeReference); + const changedEventReference = this.metadataCache.on("changed", (file) => { + this.tasksMutex.runExclusive(() => { + this.indexFile(file); + }); + }); + this.metadataCacheEventReferences.push(changedEventReference); + } + subscribeToVault() { + const createdEventReference = this.vault.on("create", (file) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + this.indexFile(file); + }); + }); + this.vaultEventReferences.push(createdEventReference); + const deletedEventReference = this.vault.on("delete", (file) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + this.tasks = this.tasks.filter((task) => { + return task.path !== file.path; }); - } - subscribeToCache() { - const resolvedEventeReference = this.metadataCache.on('resolved', () => __awaiter(this, void 0, void 0, function* () { - // Resolved fires on every change. - // We only want to initialize if we haven't already. - if (!this.loadedAfterFirstResolve) { - this.loadedAfterFirstResolve = true; - this.loadVault(); - } - })); - this.metadataCacheEventReferences.push(resolvedEventeReference); - // Does not fire when starting up obsidian and only works for changes. - const changedEventReference = this.metadataCache.on('changed', (file) => { - this.tasksMutex.runExclusive(() => { - this.indexFile(file); + this.notifySubscribers(); + }); + }); + this.vaultEventReferences.push(deletedEventReference); + const renamedEventReference = this.vault.on("rename", (file, oldPath) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + this.tasks = this.tasks.map((task) => { + if (task.path === oldPath) { + return new Task(__spreadProps(__spreadValues({}, task), { path: file.path })); + } else { + return task; + } + }); + this.notifySubscribers(); + }); + }); + this.vaultEventReferences.push(renamedEventReference); + } + subscribeToEvents() { + const requestReference = this.events.onRequestCacheUpdate((handler) => { + handler({ tasks: this.tasks, state: this.state }); + }); + this.eventsEventReferences.push(requestReference); + } + loadVault() { + return this.tasksMutex.runExclusive(() => __async(this, null, function* () { + this.state = State.Initializing; + yield Promise.all(this.vault.getMarkdownFiles().map((file) => { + return this.indexFile(file); + })); + this.state = State.Warm; + this.notifySubscribers(); + })); + } + indexFile(file) { + return __async(this, null, function* () { + const fileCache = this.metadataCache.getFileCache(file); + if (fileCache === null || fileCache === void 0) { + return; + } + let listItems = fileCache.listItems; + if (listItems === void 0) { + listItems = []; + } + const fileContent = yield this.vault.cachedRead(file); + const fileLines = fileContent.split("\n"); + this.tasks = this.tasks.filter((task) => { + return task.path !== file.path; + }); + let currentSection = null; + let sectionIndex = 0; + for (const listItem of listItems) { + if (listItem.task !== void 0) { + if (currentSection === null || currentSection.position.end.line < listItem.position.start.line) { + currentSection = this.getSection({ + lineNumberTask: listItem.position.start.line, + sections: fileCache.sections }); - }); - this.metadataCacheEventReferences.push(changedEventReference); - } - subscribeToVault() { - const createdEventReference = this.vault.on('create', (file) => { - if (!(file instanceof obsidian.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - this.indexFile(file); - }); - }); - this.vaultEventReferences.push(createdEventReference); - const deletedEventReference = this.vault.on('delete', (file) => { - if (!(file instanceof obsidian.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - this.tasks = this.tasks.filter((task) => { - return task.path !== file.path; - }); - this.notifySubscribers(); - }); - }); - this.vaultEventReferences.push(deletedEventReference); - const renamedEventReference = this.vault.on('rename', (file, oldPath) => { - if (!(file instanceof obsidian.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - this.tasks = this.tasks.map((task) => { - if (task.path === oldPath) { - return new Task(Object.assign(Object.assign({}, task), { path: file.path })); - } - else { - return task; - } - }); - this.notifySubscribers(); - }); - }); - this.vaultEventReferences.push(renamedEventReference); - } - subscribeToEvents() { - const requestReference = this.events.onRequestCacheUpdate((handler) => { - handler({ tasks: this.tasks, state: this.state }); - }); - this.eventsEventReferences.push(requestReference); - } - loadVault() { - return this.tasksMutex.runExclusive(() => __awaiter(this, void 0, void 0, function* () { - this.state = State.Initializing; - yield Promise.all(this.vault.getMarkdownFiles().map((file) => { - return this.indexFile(file); - })); - this.state = State.Warm; - // Notify that the cache is now warm: - this.notifySubscribers(); - })); - } - indexFile(file) { - return __awaiter(this, void 0, void 0, function* () { - const fileCache = this.metadataCache.getFileCache(file); - if (fileCache === null || fileCache === undefined) { - return; - } - let listItems = fileCache.listItems; - if (listItems === undefined) { - // When there is no list items cache, there are no tasks. - // Still continue to notify watchers of removal. - listItems = []; - } - const fileContent = yield this.vault.cachedRead(file); - const fileLines = fileContent.split('\n'); - // Remove all tasks from this file from the cache before - // adding the ones that are currently in the file. - this.tasks = this.tasks.filter((task) => { - return task.path !== file.path; - }); - // We want to store section information with every task so - // that we can use that when we post process the markdown - // rendered lists. - let currentSection = null; - let sectionIndex = 0; - for (const listItem of listItems) { - if (listItem.task !== undefined) { - if (currentSection === null || - currentSection.position.end.line < - listItem.position.start.line) { - // We went past the current section (or this is the first task). - // Find the section that is relevant for this task and the following of the same section. - currentSection = this.getSection({ - lineNumberTask: listItem.position.start.line, - sections: fileCache.sections, - }); - sectionIndex = 0; - } - if (currentSection === null) { - // Cannot process a task without a section. - continue; - } - const line = fileLines[listItem.position.start.line]; - const task = Task.fromLine({ - line, - path: file.path, - sectionStart: currentSection.position.start.line, - sectionIndex, - precedingHeader: this.getPrecedingHeader({ - lineNumberTask: listItem.position.start.line, - sections: fileCache.sections, - fileLines, - }), - }); - if (task !== null) { - sectionIndex++; - this.tasks.push(task); - } - } - } - // All updated, inform our subscribers. - this.notifySubscribers(); - }); - } - getSection({ lineNumberTask, sections, }) { - if (sections === undefined) { - return null; + sectionIndex = 0; + } + if (currentSection === null) { + continue; + } + const line = fileLines[listItem.position.start.line]; + const task = Task.fromLine({ + line, + path: file.path, + sectionStart: currentSection.position.start.line, + sectionIndex, + precedingHeader: this.getPrecedingHeader({ + lineNumberTask: listItem.position.start.line, + sections: fileCache.sections, + fileLines + }) + }); + if (task !== null) { + sectionIndex++; + this.tasks.push(task); + } } - for (const section of sections) { - if (section.type === 'list' && - section.position.start.line <= lineNumberTask && - section.position.end.line >= lineNumberTask) { - return section; - } - } - return null; + } + this.notifySubscribers(); + }); + } + getSection({ + lineNumberTask, + sections + }) { + if (sections === void 0) { + return null; } - getPrecedingHeader({ lineNumberTask, sections, fileLines, }) { - if (sections === undefined) { - return null; - } - let precedingHeaderSection; - for (const section of sections) { - if (section.type === 'heading') { - if (section.position.start.line > lineNumberTask) { - // Break out of the loop as the last header was the preceding one. - break; - } - precedingHeaderSection = section; - } - } - if (precedingHeaderSection === undefined) { - return null; - } - const lineNumberPrecedingHeader = precedingHeaderSection.position.start.line; - const linePrecedingHeader = fileLines[lineNumberPrecedingHeader]; - const headerRegex = /^#+ +(.*)/u; - const headerMatch = linePrecedingHeader.match(headerRegex); - if (headerMatch === null) { - return null; - } - else { - return headerMatch[1]; - } + for (const section of sections) { + if (section.type === "list" && section.position.start.line <= lineNumberTask && section.position.end.line >= lineNumberTask) { + return section; + } } -} + return null; + } + getPrecedingHeader({ + lineNumberTask, + sections, + fileLines + }) { + if (sections === void 0) { + return null; + } + let precedingHeaderSection; + for (const section of sections) { + if (section.type === "heading") { + if (section.position.start.line > lineNumberTask) { + break; + } + precedingHeaderSection = section; + } + } + if (precedingHeaderSection === void 0) { + return null; + } + const lineNumberPrecedingHeader = precedingHeaderSection.position.start.line; + const linePrecedingHeader = fileLines[lineNumberPrecedingHeader]; + const headerRegex = /^#+ +(.*)/u; + const headerMatch = linePrecedingHeader.match(headerRegex); + if (headerMatch === null) { + return null; + } else { + return headerMatch[1]; + } + } +}; -function noop() { } +// src/Commands/CreateOrEdit.ts +var import_obsidian5 = __toModule(require("obsidian")); + +// src/TaskModal.ts +var import_obsidian4 = __toModule(require("obsidian")); + +// node_modules/svelte/internal/index.mjs +function noop() { +} function run(fn) { - return fn(); + return fn(); } function blank_object() { - return Object.create(null); + return Object.create(null); } function run_all(fns) { - fns.forEach(run); + fns.forEach(run); } function is_function(thing) { - return typeof thing === 'function'; + return typeof thing === "function"; } function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); + return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function"); } function is_empty(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0; +} +var tasks = new Set(); +var is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; } function append(target, node) { - target.appendChild(node); + target.appendChild(node); } function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); + target.insertBefore(node, anchor || null); } function detach(node) { - node.parentNode.removeChild(node); + node.parentNode.removeChild(node); } function element(name) { - return document.createElement(name); + return document.createElement(name); } function text(data) { - return document.createTextNode(data); + return document.createTextNode(data); } function space() { - return text(' '); + return text(" "); } function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); } function prevent_default(fn) { - return function (event) { - event.preventDefault(); - // @ts-ignore - return fn.call(this, event); - }; + return function(event) { + event.preventDefault(); + return fn.call(this, event); + }; } function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); } -function children(element) { - return Array.from(element.childNodes); +function children(element2) { + return Array.from(element2.childNodes); } -function set_data(text, data) { - data = '' + data; - if (text.wholeText !== data) - text.data = data; +function set_data(text2, data) { + data = "" + data; + if (text2.wholeText !== data) + text2.data = data; } function set_input_value(input, value) { - input.value = value == null ? '' : value; + input.value = value == null ? "" : value; } function select_option(select, value) { - for (let i = 0; i < select.options.length; i += 1) { - const option = select.options[i]; - if (option.__value === value) { - option.selected = true; - return; - } + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; } - select.selectedIndex = -1; // no option should be selected + } + select.selectedIndex = -1; } function select_value(select) { - const selected_option = select.querySelector(':checked') || select.options[0]; - return selected_option && selected_option.__value; + const selected_option = select.querySelector(":checked") || select.options[0]; + return selected_option && selected_option.__value; } -class HtmlTag { - constructor() { - this.e = this.n = null; +var HtmlTag = class { + constructor() { + this.e = this.n = null; + } + c(html) { + this.h(html); + } + m(html, target, anchor = null) { + if (!this.e) { + this.e = element(target.nodeName); + this.t = target; + this.c(html); } - c(html) { - this.h(html); + this.i(anchor); + } + h(html) { + this.e.innerHTML = html; + this.n = Array.from(this.e.childNodes); + } + i(anchor) { + for (let i = 0; i < this.n.length; i += 1) { + insert(this.t, this.n[i], anchor); } - m(html, target, anchor = null) { - if (!this.e) { - this.e = element(target.nodeName); - this.t = target; - this.c(html); - } - this.i(anchor); - } - h(html) { - this.e.innerHTML = html; - this.n = Array.from(this.e.childNodes); - } - i(anchor) { - for (let i = 0; i < this.n.length; i += 1) { - insert(this.t, this.n[i], anchor); - } - } - p(html) { - this.d(); - this.h(html); - this.i(this.a); - } - d() { - this.n.forEach(detach); - } -} - -let current_component; + } + p(html) { + this.d(); + this.h(html); + this.i(this.a); + } + d() { + this.n.forEach(detach); + } +}; +var active_docs = new Set(); +var current_component; function set_current_component(component) { - current_component = component; + current_component = component; } function get_current_component() { - if (!current_component) - throw new Error('Function called outside component initialization'); - return current_component; + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; } function onMount(fn) { - get_current_component().$$.on_mount.push(fn); + get_current_component().$$.on_mount.push(fn); } - -const dirty_components = []; -const binding_callbacks = []; -const render_callbacks = []; -const flush_callbacks = []; -const resolved_promise = Promise.resolve(); -let update_scheduled = false; +var dirty_components = []; +var binding_callbacks = []; +var render_callbacks = []; +var flush_callbacks = []; +var resolved_promise = Promise.resolve(); +var update_scheduled = false; function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } } function add_render_callback(fn) { - render_callbacks.push(fn); + render_callbacks.push(fn); } -let flushing = false; -const seen_callbacks = new Set(); +var flushing = false; +var seen_callbacks = new Set(); function flush() { - if (flushing) - return; - flushing = true; - do { - // first, call beforeUpdate functions - // and update components - for (let i = 0; i < dirty_components.length; i += 1) { - const component = dirty_components[i]; - set_current_component(component); - update(component.$$); - } - set_current_component(null); - dirty_components.length = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - // ...so guard against infinite loops - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); + if (flushing) + return; + flushing = true; + do { + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); } - update_scheduled = false; - flushing = false; - seen_callbacks.clear(); + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); } function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } } -const outroing = new Set(); +var outroing = new Set(); function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } + if (block && block.i) { + outroing.delete(block); + block.i(local); + } } +var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; +var boolean_attributes = new Set([ + "allowfullscreen", + "allowpaymentrequest", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "defer", + "disabled", + "formnovalidate", + "hidden", + "ismap", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "selected" +]); function mount_component(component, target, anchor, customElement) { - const { fragment, on_mount, on_destroy, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - // onMount happens before the initial afterUpdate - add_render_callback(() => { - const new_on_destroy = on_mount.map(run).filter(is_function); - if (on_destroy) { - on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); } function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } } function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i / 31 | 0] |= 1 << i % 31; } -function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: null, - // state - props, - update: noop, - not_equal, - bound: blank_object(), - // lifecycle - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), - // everything else - callbacks: blank_object(), - dirty, - skip_bound: false, - root: options.target || parent_component.$$.root - }; - append_styles && append_styles($$.root); - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); - } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - flush(); +function init(component, options, instance2, create_fragment2, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: null, + props, + update: noop, + not_equal, + bound: blank_object(), + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); } - set_current_component(parent_component); + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + end_hydrating(); + flush(); + } + set_current_component(parent_component); } -/** - * Base class for Svelte components. Used when dev=false. - */ -class SvelteComponent { +var SvelteElement; +if (typeof HTMLElement === "function") { + SvelteElement = class extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + connectedCallback() { + const { on_mount } = this.$$; + this.$$.on_disconnect = on_mount.map(run).filter(is_function); + for (const key in this.$$.slotted) { + this.appendChild(this.$$.slotted[key]); + } + } + attributeChangedCallback(attr2, _oldValue, newValue) { + this[attr2] = newValue; + } + disconnectedCallback() { + run_all(this.$$.on_disconnect); + } $destroy() { - destroy_component(this, 1); - this.$destroy = noop; + destroy_component(this, 1); + this.$destroy = noop; } $on(type, callback) { - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; } $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } -} - -var pattern = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0; -function repeatedTimeunitPattern(prefix, singleTimeunitPattern) { - const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:"); - return `${prefix}${singleTimeunitPatternNoCapture}\\s*(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`; -} -exports.repeatedTimeunitPattern = repeatedTimeunitPattern; -function extractTerms(dictionary) { - let keys; - if (dictionary instanceof Array) { - keys = [...dictionary]; - } - else if (dictionary instanceof Map) { - keys = Array.from(dictionary.keys()); - } - else { - keys = Object.keys(dictionary); - } - return keys; -} -exports.extractTerms = extractTerms; -function matchAnyPattern(dictionary) { - const joinedTerms = extractTerms(dictionary) - .sort((a, b) => b.length - a.length) - .join("|") - .replace(/\./g, "\\."); - return `(?:${joinedTerms})`; -} -exports.matchAnyPattern = matchAnyPattern; -}); - -var dayjs_min = createCommonjsModule(function (module, exports) { -!function(t,e){module.exports=e();}(commonjsGlobal,(function(){var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",$="Invalid Date",l=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},m=function(t,e,n){var r=String(t);return !r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},g={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return (e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date() 50) { - yearNumber = yearNumber + 1900; - } - else { - yearNumber = yearNumber + 2000; - } - } - return yearNumber; -} -exports.findMostLikelyADYear = findMostLikelyADYear; -function findYearClosestToRef(refDate, day, month) { - const refMoment = dayjs_1.default(refDate); - let dateMoment = refMoment; - dateMoment = dateMoment.month(month - 1); - dateMoment = dateMoment.date(day); - dateMoment = dateMoment.year(refMoment.year()); - const nextYear = dateMoment.add(1, "y"); - const lastYear = dateMoment.add(-1, "y"); - if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { - dateMoment = nextYear; - } - else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { - dateMoment = lastYear; - } - return dateMoment.year(); -} -exports.findYearClosestToRef = findYearClosestToRef; -}); - -var constants$5 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - - -exports.WEEKDAY_DICTIONARY = { - sunday: 0, - sun: 0, - "sun.": 0, - monday: 1, - mon: 1, - "mon.": 1, - tuesday: 2, - tue: 2, - "tue.": 2, - wednesday: 3, - wed: 3, - "wed.": 3, - thursday: 4, - thurs: 4, - "thurs.": 4, - thur: 4, - "thur.": 4, - thu: 4, - "thu.": 4, - friday: 5, - fri: 5, - "fri.": 5, - saturday: 6, - sat: 6, - "sat.": 6, -}; -exports.FULL_MONTH_NAME_DICTIONARY = { - january: 1, - february: 2, - march: 3, - april: 4, - may: 5, - june: 6, - july: 7, - august: 8, - september: 9, - october: 10, - november: 11, - december: 12, -}; -exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, dec: 12, "dec.": 12 }); -exports.INTEGER_WORD_DICTIONARY = { - one: 1, - two: 2, - three: 3, - four: 4, - five: 5, - six: 6, - seven: 7, - eight: 8, - nine: 9, - ten: 10, - eleven: 11, - twelve: 12, -}; -exports.ORDINAL_WORD_DICTIONARY = { - first: 1, - second: 2, - third: 3, - fourth: 4, - fifth: 5, - sixth: 6, - seventh: 7, - eighth: 8, - ninth: 9, - tenth: 10, - eleventh: 11, - twelfth: 12, - thirteenth: 13, - fourteenth: 14, - fifteenth: 15, - sixteenth: 16, - seventeenth: 17, - eighteenth: 18, - nineteenth: 19, - twentieth: 20, - "twenty first": 21, - "twenty-first": 21, - "twenty second": 22, - "twenty-second": 22, - "twenty third": 23, - "twenty-third": 23, - "twenty fourth": 24, - "twenty-fourth": 24, - "twenty fifth": 25, - "twenty-fifth": 25, - "twenty sixth": 26, - "twenty-sixth": 26, - "twenty seventh": 27, - "twenty-seventh": 27, - "twenty eighth": 28, - "twenty-eighth": 28, - "twenty ninth": 29, - "twenty-ninth": 29, - "thirtieth": 30, - "thirty first": 31, - "thirty-first": 31, -}; -exports.TIME_UNIT_DICTIONARY = { - sec: "second", - second: "second", - seconds: "second", - min: "minute", - mins: "minute", - minute: "minute", - minutes: "minute", - h: "hour", - hr: "hour", - hrs: "hour", - hour: "hour", - hours: "hour", - day: "d", - days: "d", - week: "week", - weeks: "week", - month: "month", - months: "month", - y: "year", - yr: "year", - year: "year", - years: "year", -}; -exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; -function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } - else if (num === "a" || num === "an") { - return 1; - } - else if (num.match(/few/)) { - return 3; - } - else if (num.match(/half/)) { - return 0.5; - } - else if (num.match(/couple/)) { - return 2; - } - else if (num.match(/several/)) { - return 7; - } - return parseFloat(num); -} -exports.parseNumberPattern = parseNumberPattern; -exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`; -function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) { - return exports.ORDINAL_WORD_DICTIONARY[num]; - } - num = num.replace(/(?:st|nd|rd|th)$/i, ""); - return parseInt(num); -} -exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; -exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|[1-2][0-9]{3}|[5-9][0-9])`; -function parseYear(match) { - if (/BE/i.test(match)) { - match = match.replace(/BE/i, ""); - return parseInt(match) - 543; - } - if (/BC/i.test(match)) { - match = match.replace(/BC/i, ""); - return -parseInt(match); - } - if (/AD/i.test(match)) { - match = match.replace(/AD/i, ""); - return parseInt(match); - } - const rawYearNumber = parseInt(match); - return years.findMostLikelyADYear(rawYearNumber); -} -exports.parseYear = parseYear; -const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; -const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); -exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern(`(?:(?:about|around)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); -function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; -} -exports.parseTimeUnits = parseTimeUnits; -function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; -} -}); - -var quarterOfYear = createCommonjsModule(function (module, exports) { -!function(t,n){module.exports=n();}(commonjsGlobal,(function(){var t="month",n="quarter";return function(e,i){var r=i.prototype;r.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var s=r.add;r.add=function(e,i){return e=Number(e),this.$utils().p(i)===n?this.add(3*e,t):s.bind(this)(e,i)};var u=r.startOf;r.startOf=function(e,i){var r=this.$utils(),s=!!r.u(i)||i;if(r.p(e)===n){var o=this.quarter()-1;return s?this.month(3*o).startOf(t).startOf("day"):this.month(3*o+2).endOf(t).endOf("day")}return u.bind(this)(e,i)};}})); -}); - -var dayjs = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0; -function assignTheNextDay(component, targetDayJs) { - targetDayJs = targetDayJs.add(1, "day"); - assignSimilarDate(component, targetDayJs); - implySimilarTime(component, targetDayJs); -} -exports.assignTheNextDay = assignTheNextDay; -function assignSimilarDate(component, targetDayJs) { - component.assign("day", targetDayJs.date()); - component.assign("month", targetDayJs.month() + 1); - component.assign("year", targetDayJs.year()); -} -exports.assignSimilarDate = assignSimilarDate; -function assignSimilarTime(component, targetDayJs) { - component.assign("hour", targetDayJs.hour()); - component.assign("minute", targetDayJs.minute()); - component.assign("second", targetDayJs.second()); - component.assign("millisecond", targetDayJs.millisecond()); - component.assign("timezoneOffset", targetDayJs.utcOffset()); -} -exports.assignSimilarTime = assignSimilarTime; -function implySimilarTime(component, targetDayJs) { - component.imply("hour", targetDayJs.hour()); - component.imply("minute", targetDayJs.minute()); - component.imply("second", targetDayJs.second()); - component.imply("millisecond", targetDayJs.millisecond()); - component.imply("timezoneOffset", targetDayJs.utcOffset()); -} -exports.implySimilarTime = implySimilarTime; -}); - -var results = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ParsingResult = exports.ParsingComponents = void 0; -const quarterOfYear_1 = __importDefault(quarterOfYear); -const dayjs_1 = __importDefault(dayjs_min); - -dayjs_1.default.extend(quarterOfYear_1.default); -class ParsingComponents { - constructor(refDate, knownComponents) { - this.knownValues = {}; - this.impliedValues = {}; - if (knownComponents) { - for (const key in knownComponents) { - this.knownValues[key] = knownComponents[key]; - } - } - const refDayJs = dayjs_1.default(refDate); - this.imply("day", refDayJs.date()); - this.imply("month", refDayJs.month() + 1); - this.imply("year", refDayJs.year()); - this.imply("hour", 12); - this.imply("minute", 0); - this.imply("second", 0); - this.imply("millisecond", 0); - } - get(component) { - if (component in this.knownValues) { - return this.knownValues[component]; - } - if (component in this.impliedValues) { - return this.impliedValues[component]; - } - return null; - } - isCertain(component) { - return component in this.knownValues; - } - getCertainComponents() { - return Object.keys(this.knownValues); - } - imply(component, value) { - if (component in this.knownValues) { - return this; - } - this.impliedValues[component] = value; - return this; - } - assign(component, value) { - this.knownValues[component] = value; - delete this.impliedValues[component]; - return this; - } - delete(component) { - delete this.knownValues[component]; - delete this.impliedValues[component]; - } - clone() { - const component = new ParsingComponents(new Date()); - component.knownValues = {}; - component.impliedValues = {}; - for (const key in this.knownValues) { - component.knownValues[key] = this.knownValues[key]; - } - for (const key in this.impliedValues) { - component.impliedValues[key] = this.impliedValues[key]; - } - return component; - } - isOnlyDate() { - return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second"); - } - isOnlyTime() { - return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); - } - isOnlyWeekdayComponent() { - return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); - } - isOnlyDayMonthComponent() { - return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year"); - } - isValidDate() { - const date = this.isCertain("timezoneOffset") ? this.dateWithoutTimezoneAdjustment() : this.date(); - if (date.getFullYear() !== this.get("year")) - return false; - if (date.getMonth() !== this.get("month") - 1) - return false; - if (date.getDate() !== this.get("day")) - return false; - if (this.get("hour") != null && date.getHours() != this.get("hour")) - return false; - if (this.get("minute") != null && date.getMinutes() != this.get("minute")) - return false; - return true; - } - toString() { - return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}]`; - } - dayjs() { - return dayjs_1.default(this.date()); - } - date() { - const date = this.dateWithoutTimezoneAdjustment(); - return new Date(date.getTime() + this.getTimezoneAdjustmentMinute(date) * 60000); - } - dateWithoutTimezoneAdjustment() { - const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond")); - date.setFullYear(this.get("year")); - return date; - } - getTimezoneAdjustmentMinute(date) { - var _a; - date = date !== null && date !== void 0 ? date : new Date(); - const currentTimezoneOffset = -date.getTimezoneOffset(); - const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : currentTimezoneOffset; - return currentTimezoneOffset - targetTimezoneOffset; - } - static createRelativeFromRefDate(refDate, fragments) { - let date = dayjs_1.default(refDate); - for (const key in fragments) { - date = date.add(fragments[key], key); - } - const components = new ParsingComponents(refDate); - if (fragments["hour"] || fragments["minute"] || fragments["second"]) { - dayjs.assignSimilarTime(components, date); - dayjs.assignSimilarDate(components, date); - } - else { - dayjs.implySimilarTime(components, date); - if (fragments["d"]) { - components.assign("day", date.date()); - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - } - else { - if (fragments["week"]) { - components.imply("weekday", date.day()); - } - components.imply("day", date.date()); - if (fragments["month"]) { - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - } - else { - components.imply("month", date.month() + 1); - if (fragments["year"]) { - components.assign("year", date.year()); - } - else { - components.imply("year", date.year()); - } - } - } - } - return components; - } -} -exports.ParsingComponents = ParsingComponents; -class ParsingResult { - constructor(refDate, index, text, start, end) { - this.refDate = refDate; - this.index = index; - this.text = text; - this.start = start || new ParsingComponents(this.refDate); - this.end = end; - } - clone() { - const result = new ParsingResult(this.refDate, this.index, this.text); - result.start = this.start ? this.start.clone() : null; - result.end = this.end ? this.end.clone() : null; - return result; - } - date() { - return this.start.date(); - } - toString() { - return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`; - } -} -exports.ParsingResult = ParsingResult; -}); - -var AbstractParserWithWordBoundary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractParserWithWordBoundaryChecking = void 0; -class AbstractParserWithWordBoundaryChecking { - constructor() { - this.cachedInnerPattern = null; - this.cachedPattern = null; - } - pattern(context) { - const innerPattern = this.innerPattern(context); - if (innerPattern == this.cachedInnerPattern) { - return this.cachedPattern; - } - this.cachedPattern = new RegExp(`(\\W|^)${innerPattern.source}`, innerPattern.flags); - this.cachedInnerPattern = innerPattern; - return this.cachedPattern; - } - extract(context, match) { - const header = match[1]; - match.index = match.index + header.length; - match[0] = match[0].substring(header.length); - for (let i = 2; i < match.length; i++) { - match[i - 1] = match[i]; - } - return this.innerExtract(context, match); - } -} -exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking; -}); - -var ENTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*` + - `(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); -const PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); -class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; - } - innerExtract(context, match) { - const timeUnits = constants$5.parseTimeUnits(match[1]); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } -} -exports.default = ENTimeUnitWithinFormatParser; -}); - -var ENMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants$5; -const constants_3 = constants$5; - - -const PATTERN = new RegExp("(?:on\\s*?)?" + - `(${constants_3.ORDINAL_NUMBER_PATTERN})` + - "(?:\\s*" + - "(?:to|\\-|\\–|until|through|till|\\s)\\s*" + - `(${constants_3.ORDINAL_NUMBER_PATTERN})` + - ")?" + - "(?:-|/|\\s*(?:of)?\\s*)" + - "(" + - pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY) + - ")" + - "(?:" + - "(?:-|/|,?\\s*)" + - `(${constants_2.YEAR_PATTERN}(?![^\\s]\\d))` + - ")?" + - "(?=\\W|$)", "i"); -const DATE_GROUP = 1; -const DATE_TO_GROUP = 2; -const MONTH_NAME_GROUP = 3; -const YEAR_GROUP = 4; -class ENMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } -} -exports.default = ENMonthNameLittleEndianParser; -}); - -var ENMonthNameMiddleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants$5; -const constants_3 = constants$5; - - -const PATTERN = new RegExp(`(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})` + - "(?:-|/|\\s*,?\\s*)" + - `(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*` + - "(?:" + - "(?:to|\\-)\\s*" + - `(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*` + - ")?" + - "(?:" + - "(?:-|/|\\s*,?\\s*)" + - `(${constants_3.YEAR_PATTERN})` + - ")?" + - "(?=\\W|$)(?!\\:\\d)", "i"); -const MONTH_NAME_GROUP = 1; -const DATE_GROUP = 2; -const DATE_TO_GROUP = 3; -const YEAR_GROUP = 4; -class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - return null; - } - const components = context.createParsingComponents({ - day: day, - month: month, - }); - if (match[YEAR_GROUP]) { - const year = constants_3.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - if (!match[DATE_TO_GROUP]) { - return components; - } - const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - const result = context.createParsingResult(match.index, match[0]); - result.start = components; - result.end = components.clone(); - result.end.assign("day", endDate); - return result; - } -} -exports.default = ENMonthNameMiddleEndianParser; -}); - -var ENMonthNameParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const constants_2 = constants$5; - -const PATTERN = new RegExp(`((?:in)\\s*)?` + - `(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})` + - `\\s*` + - `(?:` + - `[,-]?\\s*(${constants_2.YEAR_PATTERN})?` + - ")?" + - "(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i"); -const PREFIX_GROUP = 1; -const MONTH_NAME_GROUP = 2; -const YEAR_GROUP = 3; -class ENMonthNameParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const monthName = match[MONTH_NAME_GROUP].toLowerCase(); - if (match[0].length <= 3 && !constants$5.FULL_MONTH_NAME_DICTIONARY[monthName]) { - return null; - } - const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length); - result.start.imply("day", 1); - const month = constants$5.MONTH_DICTIONARY[monthName]; - result.start.assign("month", month); - if (match[YEAR_GROUP]) { - const year = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, 1, month); - result.start.imply("year", year); - } - return result; - } -} -exports.default = ENMonthNameParser; -}); - -var ENCasualYearMonthDayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` + - `(?:(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` + - `([0-9]{1,2})` + - "(?=\\W|$)", "i"); -const YEAR_NUMBER_GROUP = 1; -const MONTH_NAME_GROUP = 2; -const MONTH_NUMBER_GROUP = 3; -const DATE_NUMBER_GROUP = 4; -class ENCasualYearMonthDayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = match[MONTH_NUMBER_GROUP] - ? parseInt(match[MONTH_NUMBER_GROUP]) - : constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - if (month < 1 || month > 12) { - return null; - } - const year = parseInt(match[YEAR_NUMBER_GROUP]); - const day = parseInt(match[DATE_NUMBER_GROUP]); - return { - day: day, - month: month, - year: year, - }; - } -} -exports.default = ENCasualYearMonthDayParser; -}); - -var ENSlashMonthFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i"); -const MONTH_GROUP = 1; -const YEAR_GROUP = 2; -class ENSlashMonthFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const year = parseInt(match[YEAR_GROUP]); - const month = parseInt(match[MONTH_GROUP]); - return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); - } -} -exports.default = ENSlashMonthFormatParser; -}); - -var AbstractTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractTimeExpressionParser = void 0; - -function primaryTimePattern(primaryPrefix, primarySuffix) { - return new RegExp("(^|\\s|T|\\b)" + - `${primaryPrefix}` + - "(\\d{1,4})" + - "(?:" + - "(?:\\.|\\:|\\:)" + - "(\\d{1,2})" + - "(?:" + - "(?:\\:|\\:)" + - "(\\d{2})" + - "(?:\\.(\\d{1,6}))?" + - ")?" + - ")?" + - "(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" + - `${primarySuffix}`, "i"); -} -function followingTimePatten(followingPhase, followingSuffix) { - return new RegExp(`^(${followingPhase})` + - "(\\d{1,4})" + - "(?:" + - "(?:\\.|\\:|\\:)" + - "(\\d{1,2})" + - "(?:" + - "(?:\\.|\\:|\\:)" + - "(\\d{1,2})(?:\\.(\\d{1,6}))?" + - ")?" + - ")?" + - "(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" + - `${followingSuffix}`, "i"); -} -const HOUR_GROUP = 2; -const MINUTE_GROUP = 3; -const SECOND_GROUP = 4; -const MILLI_SECOND_GROUP = 5; -const AM_PM_HOUR_GROUP = 6; -class AbstractTimeExpressionParser { - constructor(strictMode = false) { - this.cachedPrimaryPrefix = null; - this.cachedPrimarySuffix = null; - this.cachedPrimaryTimePattern = null; - this.cachedFollowingPhase = null; - this.cachedFollowingSuffix = null; - this.cachedFollowingTimePatten = null; - this.strictMode = strictMode; - } - primarySuffix() { - return "(?=\\W|$)"; - } - followingSuffix() { - return "(?=\\W|$)"; - } - pattern(context) { - return this.getPrimaryTimePatternThroughCache(); - } - extract(context, match) { - const startComponents = this.extractPrimaryTimeComponents(context, match); - if (!startComponents) { - match.index += match[0].length; - return null; - } - const index = match.index + match[1].length; - const text = match[0].substring(match[1].length); - const result = context.createParsingResult(index, text, startComponents); - match.index += match[0].length; - const remainingText = context.text.substring(match.index); - const followingPattern = this.getFollowingTimePatternThroughCache(); - const followingMatch = followingPattern.exec(remainingText); - if (!followingMatch || - followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) { - return this.checkAndReturnWithoutFollowingPattern(result); - } - result.end = this.extractFollowingTimeComponents(context, followingMatch, result); - if (result.end) { - result.text += followingMatch[0]; - } - return this.checkAndReturnWithFollowingPattern(result); - } - extractPrimaryTimeComponents(context, match, strict = false) { - const components = context.createParsingComponents(); - let minute = 0; - let meridiem = null; - let hour = parseInt(match[HOUR_GROUP]); - if (hour > 100) { - if (this.strictMode || match[MINUTE_GROUP] != null) { - return null; - } - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (hour > 24) { - return null; - } - if (match[MINUTE_GROUP] != null) { - if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) { - return null; - } - minute = parseInt(match[MINUTE_GROUP]); - } - if (minute >= 60) { - return null; - } - if (hour > 12) { - meridiem = dist.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = dist.Meridiem.AM; - if (hour == 12) { - hour = 0; - } - } - if (ampm == "p") { - meridiem = dist.Meridiem.PM; - if (hour != 12) { - hour += 12; - } - } - } - components.assign("hour", hour); - components.assign("minute", minute); - if (meridiem !== null) { - components.assign("meridiem", meridiem); - } - else { - if (hour < 12) { - components.imply("meridiem", dist.Meridiem.AM); - } - else { - components.imply("meridiem", dist.Meridiem.PM); - } - } - if (match[MILLI_SECOND_GROUP] != null) { - const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); - if (millisecond >= 1000) - return null; - components.assign("millisecond", millisecond); - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - components.assign("second", second); - } - return components; - } - extractFollowingTimeComponents(context, match, result) { - const components = context.createParsingComponents(); - if (match[MILLI_SECOND_GROUP] != null) { - const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); - if (millisecond >= 1000) - return null; - components.assign("millisecond", millisecond); - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - components.assign("second", second); - } - let hour = parseInt(match[HOUR_GROUP]); - let minute = 0; - let meridiem = -1; - if (match[MINUTE_GROUP] != null) { - minute = parseInt(match[MINUTE_GROUP]); - } - else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60 || hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = dist.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) { - return null; - } - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = dist.Meridiem.AM; - if (hour == 12) { - hour = 0; - if (!components.isCertain("day")) { - components.imply("day", components.get("day") + 1); - } - } - } - if (ampm == "p") { - meridiem = dist.Meridiem.PM; - if (hour != 12) - hour += 12; - } - if (!result.start.isCertain("meridiem")) { - if (meridiem == dist.Meridiem.AM) { - result.start.imply("meridiem", dist.Meridiem.AM); - if (result.start.get("hour") == 12) { - result.start.assign("hour", 0); - } - } - else { - result.start.imply("meridiem", dist.Meridiem.PM); - if (result.start.get("hour") != 12) { - result.start.assign("hour", result.start.get("hour") + 12); - } - } - } - } - components.assign("hour", hour); - components.assign("minute", minute); - if (meridiem >= 0) { - components.assign("meridiem", meridiem); - } - else { - const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; - if (startAtPM) { - if (result.start.get("hour") - 12 > hour) { - components.imply("meridiem", dist.Meridiem.AM); - } - else if (hour <= 12) { - components.assign("hour", hour + 12); - components.assign("meridiem", dist.Meridiem.PM); - } - } - else if (hour > 12) { - components.imply("meridiem", dist.Meridiem.PM); - } - else if (hour <= 12) { - components.imply("meridiem", dist.Meridiem.AM); - } - } - if (components.date().getTime() < result.start.date().getTime()) { - components.imply("day", components.get("day") + 1); - } - return components; - } - checkAndReturnWithoutFollowingPattern(result) { - if (result.text.match(/^\d$/)) { - return null; - } - const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); - if (endingWithNumbers) { - const endingNumbers = endingWithNumbers[1]; - if (this.strictMode) { - return null; - } - if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { - return null; - } - const endingNumberVal = parseInt(endingNumbers); - if (endingNumberVal > 24) { - return null; - } - } - return result; - } - checkAndReturnWithFollowingPattern(result) { - if (result.text.match(/^\d+-\d+$/)) { - return null; - } - const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/); - if (endingWithNumbers) { - if (this.strictMode) { - return null; - } - const startingNumbers = endingWithNumbers[1]; - const endingNumbers = endingWithNumbers[2]; - if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { - return null; - } - const endingNumberVal = parseInt(endingNumbers); - const startingNumberVal = parseInt(startingNumbers); - if (endingNumberVal > 24 || startingNumberVal > 24) { - return null; - } - } - return result; - } - getPrimaryTimePatternThroughCache() { - const primaryPrefix = this.primaryPrefix(); - const primarySuffix = this.primarySuffix(); - if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) { - return this.cachedPrimaryTimePattern; - } - this.cachedPrimaryTimePattern = primaryTimePattern(primaryPrefix, primarySuffix); - this.cachedPrimaryPrefix = primaryPrefix; - this.cachedPrimarySuffix = primarySuffix; - return this.cachedPrimaryTimePattern; - } - getFollowingTimePatternThroughCache() { - const followingPhase = this.followingPhase(); - const followingSuffix = this.followingSuffix(); - if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) { - return this.cachedFollowingTimePatten; - } - this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix); - this.cachedFollowingPhase = followingPhase; - this.cachedFollowingSuffix = followingSuffix; - return this.cachedFollowingTimePatten; - } -} -exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; -}); - -var ENTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -class ENTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - constructor(strictMode) { - super(strictMode); - } - followingPhase() { - return "\\s*(?:\\-|\\–|\\~|\\〜|to|\\?)\\s*"; - } - primaryPrefix() { - return "(?:(?:at|from)\\s*)??"; - } - primarySuffix() { - return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"; - } - extractPrimaryTimeComponents(context, match) { - const components = super.extractPrimaryTimeComponents(context, match); - if (components) { - if (match[0].endsWith("night")) { - const hour = components.get("hour"); - if (hour >= 6 && hour < 12) { - components.assign("hour", components.get("hour") + 12); - components.assign("meridiem", dist.Meridiem.PM); - } - else if (hour < 6) { - components.assign("meridiem", dist.Meridiem.AM); - } - } - if (match[0].endsWith("afternoon")) { - components.assign("meridiem", dist.Meridiem.PM); - const hour = components.get("hour"); - if (hour >= 0 && hour <= 6) { - components.assign("hour", components.get("hour") + 12); - } - } - if (match[0].endsWith("morning")) { - components.assign("meridiem", dist.Meridiem.AM); - const hour = components.get("hour"); - if (hour < 12) { - components.assign("hour", components.get("hour")); - } - } - } - return components; - } -} -exports.default = ENTimeExpressionParser; -}); - -var timeunits = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0; -function reverseTimeUnits(timeUnits) { - const reversed = {}; - for (const key in timeUnits) { - reversed[key] = -timeUnits[key]; - } - return reversed; -} -exports.reverseTimeUnits = reverseTimeUnits; -function addImpliedTimeUnits(components, timeUnits) { - const output = components.clone(); - let date = components.dayjs(); - for (const key in timeUnits) { - date = date.add(timeUnits[key], key); - } - if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) { - output.imply("day", date.date()); - output.imply("month", date.month() + 1); - output.imply("year", date.year()); - } - if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) { - output.imply("second", date.second()); - output.imply("minute", date.minute()); - output.imply("hour", date.hour()); - } - return output; -} -exports.addImpliedTimeUnits = addImpliedTimeUnits; -}); - -var ENTimeUnitAgoFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(?:ago|before|earlier)(?=(?:\\W|$))", "i"); -const STRICT_PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "ago(?=(?:\\W|$))", "i"); -class ENTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const timeUnits = constants$5.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits.reverseTimeUnits(timeUnits); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits); - } -} -exports.default = ENTimeUnitAgoFormatParser; -}); - -var ENTimeUnitLaterFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(later|after|from now|henceforth|forward|out)" + "(?=(?:\\W|$))", "i"); -const STRICT_PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(later|from now)" + "(?=(?:\\W|$))", "i"); -const GROUP_NUM_TIMEUNITS = 1; -class ENTimeUnitLaterFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const fragments = constants$5.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, fragments); - } -} -exports.default = ENTimeUnitLaterFormatParser; -}); - -var abstractRefiners = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MergingRefiner = exports.Filter = void 0; -class Filter { - refine(context, results) { - return results.filter((r) => this.isValid(context, r)); - } -} -exports.Filter = Filter; -class MergingRefiner { - refine(context, results) { - if (results.length < 2) { - return results; - } - const mergedResults = []; - let curResult = results[0]; - let nextResult = null; - for (let i = 1; i < results.length; i++) { - nextResult = results[i]; - const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index); - if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) { - mergedResults.push(curResult); - curResult = nextResult; - } - else { - const left = curResult; - const right = nextResult; - const mergedResult = this.mergeResults(textBetween, left, right, context); - context.debug(() => { - console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`); - }); - curResult = mergedResult; - } - } - if (curResult != null) { - mergedResults.push(curResult); - } - return mergedResults; - } -} -exports.MergingRefiner = MergingRefiner; -}); - -var AbstractMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class AbstractMergeDateRangeRefiner extends abstractRefiners.MergingRefiner { - shouldMergeResults(textBetween, currentResult, nextResult) { - return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null; - } - mergeResults(textBetween, fromResult, toResult) { - if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) { - toResult.start.getCertainComponents().forEach((key) => { - if (!fromResult.start.isCertain(key)) { - fromResult.start.assign(key, toResult.start.get(key)); - } - }); - fromResult.start.getCertainComponents().forEach((key) => { - if (!toResult.start.isCertain(key)) { - toResult.start.assign(key, fromResult.start.get(key)); - } - }); - } - if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { - let fromMoment = fromResult.start.dayjs(); - let toMoment = toResult.start.dayjs(); - if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) { - fromMoment = fromMoment.add(-7, "days"); - fromResult.start.imply("day", fromMoment.date()); - fromResult.start.imply("month", fromMoment.month() + 1); - fromResult.start.imply("year", fromMoment.year()); - } - else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) { - toMoment = toMoment.add(7, "days"); - toResult.start.imply("day", toMoment.date()); - toResult.start.imply("month", toMoment.month() + 1); - toResult.start.imply("year", toMoment.year()); - } - else { - [toResult, fromResult] = [fromResult, toResult]; - } - } - const result = fromResult.clone(); - result.start = fromResult.start; - result.end = toResult.start; - result.index = Math.min(fromResult.index, toResult.index); - if (fromResult.index < toResult.index) { - result.text = fromResult.text + textBetween + toResult.text; - } - else { - result.text = toResult.text + textBetween + fromResult.text; - } - return result; - } -} -exports.default = AbstractMergeDateRangeRefiner; -}); - -var ENMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class ENMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(to|-)\s*$/i; - } -} -exports.default = ENMergeDateRangeRefiner; -}); - -var mergingCalculation = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0; - -function mergeDateTimeResult(dateResult, timeResult) { - const result = dateResult.clone(); - const beginDate = dateResult.start; - const beginTime = timeResult.start; - result.start = mergeDateTimeComponent(beginDate, beginTime); - if (dateResult.end != null || timeResult.end != null) { - const endDate = dateResult.end == null ? dateResult.start : dateResult.end; - const endTime = timeResult.end == null ? timeResult.start : timeResult.end; - const endDateTime = mergeDateTimeComponent(endDate, endTime); - if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { - if (endDateTime.isCertain("day")) { - endDateTime.assign("day", endDateTime.get("day") + 1); - } - else { - endDateTime.imply("day", endDateTime.get("day") + 1); - } - } - result.end = endDateTime; - } - return result; -} -exports.mergeDateTimeResult = mergeDateTimeResult; -function mergeDateTimeComponent(dateComponent, timeComponent) { - const dateTimeComponent = dateComponent.clone(); - if (timeComponent.isCertain("hour")) { - dateTimeComponent.assign("hour", timeComponent.get("hour")); - dateTimeComponent.assign("minute", timeComponent.get("minute")); - if (timeComponent.isCertain("second")) { - dateTimeComponent.assign("second", timeComponent.get("second")); - if (timeComponent.isCertain("millisecond")) { - dateTimeComponent.assign("millisecond", timeComponent.get("millisecond")); - } - else { - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - } - else { - dateTimeComponent.imply("second", timeComponent.get("second")); - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - } - else { - dateTimeComponent.imply("hour", timeComponent.get("hour")); - dateTimeComponent.imply("minute", timeComponent.get("minute")); - dateTimeComponent.imply("second", timeComponent.get("second")); - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - if (timeComponent.isCertain("timezoneOffset")) { - dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset")); - } - if (timeComponent.isCertain("meridiem")) { - dateTimeComponent.assign("meridiem", timeComponent.get("meridiem")); - } - else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) { - dateTimeComponent.imply("meridiem", timeComponent.get("meridiem")); - } - if (dateTimeComponent.get("meridiem") == dist.Meridiem.PM && dateTimeComponent.get("hour") < 12) { - if (timeComponent.isCertain("hour")) { - dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12); - } - else { - dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12); - } - } - return dateTimeComponent; -} -exports.mergeDateTimeComponent = mergeDateTimeComponent; -}); - -var AbstractMergeDateTimeRefiner = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -class ENMergeDateTimeRefiner extends abstractRefiners.MergingRefiner { - shouldMergeResults(textBetween, currentResult, nextResult) { - return (((currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime()) || - (nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime())) && - textBetween.match(this.patternBetween()) != null); - } - mergeResults(textBetween, currentResult, nextResult) { - const result = currentResult.start.isOnlyDate() - ? mergingCalculation.mergeDateTimeResult(currentResult, nextResult) - : mergingCalculation.mergeDateTimeResult(nextResult, currentResult); - result.index = currentResult.index; - result.text = currentResult.text + textBetween + nextResult.text; - return result; - } -} -exports.default = ENMergeDateTimeRefiner; -}); - -var ENMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner); -class ENMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$"); - } -} -exports.default = ENMergeDateTimeRefiner; -}); - -var ExtractTimezoneAbbrRefiner_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -const TIMEZONE_NAME_PATTERN = new RegExp("^\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i"); -const DEFAULT_TIMEZONE_ABBR_MAP = { - ACDT: 630, - ACST: 570, - ADT: -180, - AEDT: 660, - AEST: 600, - AFT: 270, - AKDT: -480, - AKST: -540, - ALMT: 360, - AMST: -180, - AMT: -240, - ANAST: 720, - ANAT: 720, - AQTT: 300, - ART: -180, - AST: -240, - AWDT: 540, - AWST: 480, - AZOST: 0, - AZOT: -60, - AZST: 300, - AZT: 240, - BNT: 480, - BOT: -240, - BRST: -120, - BRT: -180, - BST: 60, - BTT: 360, - CAST: 480, - CAT: 120, - CCT: 390, - CDT: -300, - CEST: 120, - CET: 60, - CHADT: 825, - CHAST: 765, - CKT: -600, - CLST: -180, - CLT: -240, - COT: -300, - CST: -360, - CVT: -60, - CXT: 420, - ChST: 600, - DAVT: 420, - EASST: -300, - EAST: -360, - EAT: 180, - ECT: -300, - EDT: -240, - EEST: 180, - EET: 120, - EGST: 0, - EGT: -60, - EST: -300, - ET: -300, - FJST: 780, - FJT: 720, - FKST: -180, - FKT: -240, - FNT: -120, - GALT: -360, - GAMT: -540, - GET: 240, - GFT: -180, - GILT: 720, - GMT: 0, - GST: 240, - GYT: -240, - HAA: -180, - HAC: -300, - HADT: -540, - HAE: -240, - HAP: -420, - HAR: -360, - HAST: -600, - HAT: -90, - HAY: -480, - HKT: 480, - HLV: -210, - HNA: -240, - HNC: -360, - HNE: -300, - HNP: -480, - HNR: -420, - HNT: -150, - HNY: -540, - HOVT: 420, - ICT: 420, - IDT: 180, - IOT: 360, - IRDT: 270, - IRKST: 540, - IRKT: 540, - IRST: 210, - IST: 330, - JST: 540, - KGT: 360, - KRAST: 480, - KRAT: 480, - KST: 540, - KUYT: 240, - LHDT: 660, - LHST: 630, - LINT: 840, - MAGST: 720, - MAGT: 720, - MART: -510, - MAWT: 300, - MDT: -360, - MESZ: 120, - MEZ: 60, - MHT: 720, - MMT: 390, - MSD: 240, - MSK: 240, - MST: -420, - MUT: 240, - MVT: 300, - MYT: 480, - NCT: 660, - NDT: -90, - NFT: 690, - NOVST: 420, - NOVT: 360, - NPT: 345, - NST: -150, - NUT: -660, - NZDT: 780, - NZST: 720, - OMSST: 420, - OMST: 420, - PDT: -420, - PET: -300, - PETST: 720, - PETT: 720, - PGT: 600, - PHOT: 780, - PHT: 480, - PKT: 300, - PMDT: -120, - PMST: -180, - PONT: 660, - PST: -480, - PT: -480, - PWT: 540, - PYST: -180, - PYT: -240, - RET: 240, - SAMT: 240, - SAST: 120, - SBT: 660, - SCT: 240, - SGT: 480, - SRT: -180, - SST: -660, - TAHT: -600, - TFT: 300, - TJT: 300, - TKT: 780, - TLT: 540, - TMT: 300, - TVT: 720, - ULAT: 480, - UTC: 0, - UYST: -120, - UYT: -180, - UZT: 300, - VET: -210, - VLAST: 660, - VLAT: 660, - VUT: 660, - WAST: 120, - WAT: 60, - WEST: 60, - WESZ: 60, - WET: 0, - WEZ: 0, - WFT: 720, - WGST: -120, - WGT: -180, - WIB: 420, - WIT: 540, - WITA: 480, - WST: 780, - WT: 0, - YAKST: 600, - YAKT: 600, - YAPT: 600, - YEKST: 360, - YEKT: 360, -}; -class ExtractTimezoneAbbrRefiner { - constructor(timezoneOverrides) { - this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides); - } - refine(context, results) { - var _a; - const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {}; - results.forEach((result) => { - var _a, _b; - const suffix = context.text.substring(result.index + result.text.length); - const match = TIMEZONE_NAME_PATTERN.exec(suffix); - if (!match) { - return; - } - const timezoneAbbr = match[1].toUpperCase(); - const extractedTimezoneOffset = (_b = (_a = timezoneOverrides[timezoneAbbr]) !== null && _a !== void 0 ? _a : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null; - if (extractedTimezoneOffset === null) { - return; - } - context.debug(() => { - console.log(`Extracting timezone: '${timezoneAbbr}' into : ${extractedTimezoneOffset}`); - }); - const currentTimezoneOffset = result.start.get("timezoneOffset"); - if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) { - return; - } - result.text += match[0]; - if (!result.start.isCertain("timezoneOffset")) { - result.start.assign("timezoneOffset", extractedTimezoneOffset); - } - if (result.end != null && !result.end.isCertain("timezoneOffset")) { - result.end.assign("timezoneOffset", extractedTimezoneOffset); - } - }); - return results; - } -} -exports.default = ExtractTimezoneAbbrRefiner; -}); - -var ExtractTimezoneOffsetRefiner_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -const TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?", "i"); -const TIMEZONE_OFFSET_SIGN_GROUP = 1; -const TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2; -const TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3; -class ExtractTimezoneOffsetRefiner { - refine(context, results) { - results.forEach(function (result) { - if (result.start.isCertain("timezoneOffset")) { - return; - } - const suffix = context.text.substring(result.index + result.text.length); - const match = TIMEZONE_OFFSET_PATTERN.exec(suffix); - if (!match) { - return; - } - context.debug(() => { - console.log(`Extracting timezone: '${match[0]}' into : ${result}`); - }); - const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]); - const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0"); - let timezoneOffset = hourOffset * 60 + minuteOffset; - if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") { - timezoneOffset = -timezoneOffset; - } - if (result.end != null) { - result.end.assign("timezoneOffset", timezoneOffset); - } - result.start.assign("timezoneOffset", timezoneOffset); - result.text += match[0]; - }); - return results; - } -} -exports.default = ExtractTimezoneOffsetRefiner; -}); - -var OverlapRemovalRefiner_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -class OverlapRemovalRefiner { - refine(context, results) { - if (results.length < 2) { - return results; - } - const filteredResults = []; - let prevResult = results[0]; - for (let i = 1; i < results.length; i++) { - const result = results[i]; - if (result.index < prevResult.index + prevResult.text.length) { - if (result.text.length > prevResult.text.length) { - prevResult = result; - } - } - else { - filteredResults.push(prevResult); - prevResult = result; - } - } - if (prevResult != null) { - filteredResults.push(prevResult); - } - return filteredResults; - } -} -exports.default = OverlapRemovalRefiner; -}); - -var ForwardDateRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); -class ForwardDateRefiner { - refine(context, results) { - if (!context.option.forwardDate) { - return results; - } - results.forEach(function (result) { - let refMoment = dayjs_1.default(context.refDate); - if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) { - for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) { - result.start.imply("year", result.start.get("year") + 1); - context.debug(() => { - console.log(`Forward yearly adjusted for ${result} (${result.start})`); - }); - if (result.end && !result.end.isCertain("year")) { - result.end.imply("year", result.end.get("year") + 1); - context.debug(() => { - console.log(`Forward yearly adjusted for ${result} (${result.end})`); - }); - } - } - } - if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) { - if (refMoment.day() > result.start.get("weekday")) { - refMoment = refMoment.day(result.start.get("weekday") + 7); - } - else { - refMoment = refMoment.day(result.start.get("weekday")); - } - result.start.imply("day", refMoment.date()); - result.start.imply("month", refMoment.month() + 1); - result.start.imply("year", refMoment.year()); - context.debug(() => { - console.log(`Forward weekly adjusted for ${result} (${result.start})`); - }); - if (result.end && result.end.isOnlyWeekdayComponent()) { - if (refMoment.day() > result.end.get("weekday")) { - refMoment = refMoment.day(result.end.get("weekday") + 7); - } - else { - refMoment = refMoment.day(result.end.get("weekday")); - } - result.end.imply("day", refMoment.date()); - result.end.imply("month", refMoment.month() + 1); - result.end.imply("year", refMoment.year()); - context.debug(() => { - console.log(`Forward weekly adjusted for ${result} (${result.end})`); - }); - } - } - }); - return results; - } -} -exports.default = ForwardDateRefiner; -}); - -var UnlikelyFormatFilter_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class UnlikelyFormatFilter extends abstractRefiners.Filter { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - isValid(context, result) { - if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) { - context.debug(() => { - console.log(`Removing unlikely result '${result.text}'`); - }); - return false; - } - if (!result.start.isValidDate()) { - context.debug(() => { - console.log(`Removing invalid result: ${result} (${result.start})`); - }); - return false; - } - if (result.end && !result.end.isValidDate()) { - context.debug(() => { - console.log(`Removing invalid result: ${result} (${result.end})`); - }); - return false; - } - if (this.strictMode) { - return this.isStrictModeValid(context, result); - } - return true; - } - isStrictModeValid(context, result) { - if (result.start.isOnlyWeekdayComponent()) { - context.debug(() => { - console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`); - }); - return false; - } - if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { - context.debug(() => { - console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); - }); - return false; - } - return true; - } -} -exports.default = UnlikelyFormatFilter; -}); - -var ISOFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -const PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})" + - "(?:T" + - "([0-9]{1,2}):([0-9]{1,2})" + - "(?:" + - ":([0-9]{1,2})(?:\\.(\\d{1,4}))?" + - ")?" + - "(?:" + - "Z|([+-]\\d{2}):?(\\d{2})?" + - ")?" + - ")?" + - "(?=\\W|$)", "i"); -const YEAR_NUMBER_GROUP = 1; -const MONTH_NUMBER_GROUP = 2; -const DATE_NUMBER_GROUP = 3; -const HOUR_NUMBER_GROUP = 4; -const MINUTE_NUMBER_GROUP = 5; -const SECOND_NUMBER_GROUP = 6; -const MILLISECOND_NUMBER_GROUP = 7; -const TZD_HOUR_OFFSET_GROUP = 8; -const TZD_MINUTE_OFFSET_GROUP = 9; -class ISOFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const components = {}; - components["year"] = parseInt(match[YEAR_NUMBER_GROUP]); - components["month"] = parseInt(match[MONTH_NUMBER_GROUP]); - components["day"] = parseInt(match[DATE_NUMBER_GROUP]); - if (match[HOUR_NUMBER_GROUP] != null) { - components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]); - components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]); - if (match[SECOND_NUMBER_GROUP] != null) { - components["second"] = parseInt(match[SECOND_NUMBER_GROUP]); - } - if (match[MILLISECOND_NUMBER_GROUP] != null) { - components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]); - } - if (match[TZD_HOUR_OFFSET_GROUP] == null) { - components["timezoneOffset"] = 0; - } - else { - const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]); - let minuteOffset = 0; - if (match[TZD_MINUTE_OFFSET_GROUP] != null) { - minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]); - } - let offset = hourOffset * 60; - if (offset < 0) { - offset -= minuteOffset; - } - else { - offset += minuteOffset; - } - components["timezoneOffset"] = offset; - } - } - return components; - } -} -exports.default = ISOFormatParser; -}); - -var MergeWeekdayComponentRefiner_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class MergeWeekdayComponentRefiner extends abstractRefiners.MergingRefiner { - mergeResults(textBetween, currentResult, nextResult) { - const newResult = nextResult.clone(); - newResult.index = currentResult.index; - newResult.text = currentResult.text + textBetween + newResult.text; - newResult.start.assign("weekday", currentResult.start.get("weekday")); - if (newResult.end) { - newResult.end.assign("weekday", currentResult.start.get("weekday")); - } - return newResult; - } - shouldMergeResults(textBetween, currentResult, nextResult) { - const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && - !currentResult.start.isCertain("hour") && - nextResult.start.isCertain("day"); - return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null; - } -} -exports.default = MergeWeekdayComponentRefiner; -}); - -var configurations = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.includeCommonConfiguration = void 0; -const ExtractTimezoneAbbrRefiner_1$1 = __importDefault(ExtractTimezoneAbbrRefiner_1); -const ExtractTimezoneOffsetRefiner_1$1 = __importDefault(ExtractTimezoneOffsetRefiner_1); -const OverlapRemovalRefiner_1$1 = __importDefault(OverlapRemovalRefiner_1); -const ForwardDateRefiner_1$1 = __importDefault(ForwardDateRefiner_1); -const UnlikelyFormatFilter_1$1 = __importDefault(UnlikelyFormatFilter_1); -const ISOFormatParser_1$1 = __importDefault(ISOFormatParser_1); -const MergeWeekdayComponentRefiner_1$1 = __importDefault(MergeWeekdayComponentRefiner_1); -function includeCommonConfiguration(configuration, strictMode = false) { - configuration.parsers.unshift(new ISOFormatParser_1$1.default()); - configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1$1.default()); - configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1$1.default()); - configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1$1.default()); - configuration.refiners.unshift(new OverlapRemovalRefiner_1$1.default()); - configuration.refiners.push(new OverlapRemovalRefiner_1$1.default()); - configuration.refiners.push(new ForwardDateRefiner_1$1.default()); - configuration.refiners.push(new UnlikelyFormatFilter_1$1.default(strictMode)); - return configuration; -} -exports.includeCommonConfiguration = includeCommonConfiguration; -}); - -var casualReferences = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.tonight = exports.tomorrow = exports.yesterday = exports.today = exports.now = void 0; - -const dayjs_1 = __importDefault(dayjs_min); - - -function now(refDate) { - const targetDate = dayjs_1.default(refDate); - const component = new results.ParsingComponents(refDate, {}); - dayjs.assignSimilarDate(component, targetDate); - dayjs.assignSimilarTime(component, targetDate); - return component; -} -exports.now = now; -function today(refDate) { - const targetDate = dayjs_1.default(refDate); - const component = new results.ParsingComponents(refDate, {}); - dayjs.assignSimilarDate(component, targetDate); - dayjs.implySimilarTime(component, targetDate); - return component; -} -exports.today = today; -function yesterday(refDate) { - let targetDate = dayjs_1.default(refDate); - const component = new results.ParsingComponents(refDate, {}); - targetDate = targetDate.add(-1, "day"); - dayjs.assignSimilarDate(component, targetDate); - dayjs.implySimilarTime(component, targetDate); - return component; -} -exports.yesterday = yesterday; -function tomorrow(refDate) { - const targetDate = dayjs_1.default(refDate); - const component = new results.ParsingComponents(refDate, {}); - dayjs.assignTheNextDay(component, targetDate); - return component; -} -exports.tomorrow = tomorrow; -function tonight(refDate, implyHour = 22) { - const targetDate = dayjs_1.default(refDate); - const component = new results.ParsingComponents(refDate, {}); - component.imply("hour", implyHour); - component.imply("meridiem", dist.Meridiem.PM); - dayjs.assignSimilarDate(component, targetDate); - return component; -} -exports.tonight = tonight; -}); - -var ENCasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); - - -const references = __importStar(casualReferences); -const PATTERN = /(now|today|tonight|tomorrow|tmr|yesterday|last\s*night)(?=\W|$)/i; -class ENCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return PATTERN; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "now": - return references.now(context.refDate); - case "today": - return references.today(context.refDate); - case "yesterday": - return references.yesterday(context.refDate); - case "tomorrow": - case "tmr": - return references.tomorrow(context.refDate); - case "tonight": - return references.tonight(context.refDate); - default: - if (lowerText.match(/last\s*night/)) { - if (targetDate.hour() > 6) { - targetDate = targetDate.add(-1, "day"); - } - dayjs.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - break; - } - return component; - } -} -exports.default = ENCasualDateParser; -}); - -var ENCasualTimeParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - -const dayjs_1 = __importDefault(dayjs_min); - -const PATTERN = /(?:this)?\s*(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i; -class ENCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const component = context.createParsingComponents(); - switch (match[1].toLowerCase()) { - case "afternoon": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 15); - break; - case "evening": - case "night": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 20); - break; - case "midnight": - dayjs.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "morning": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 6); - break; - case "noon": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } -} -exports.default = ENCasualTimeParser; -}); - -var weeks = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0; -const dayjs_1 = __importDefault(dayjs_min); -function toDayJSWeekday(refDate, offset, modifier) { - if (!modifier) { - return toDayJSClosestWeekday(refDate, offset); - } - let date = dayjs_1.default(refDate); - switch (modifier) { - case "this": - date = date.day(offset); - break; - case "next": - date = date.day(offset + 7); - break; - case "last": - date = date.day(offset - 7); - break; - } - return date; -} -exports.toDayJSWeekday = toDayJSWeekday; -function toDayJSClosestWeekday(refDate, offset) { - let date = dayjs_1.default(refDate); - const refOffset = date.day(); - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - date = date.day(offset - 7); - } - else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - date = date.day(offset + 7); - } - else { - date = date.day(offset); - } - return date; -} -exports.toDayJSClosestWeekday = toDayJSClosestWeekday; -}); - -var ENWeekdayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:on\\s*?)?" + - "(?:(this|last|past|next)\\s*)?" + - `(${pattern.matchAnyPattern(constants$5.WEEKDAY_DICTIONARY)})` + - "(?:\\s*(?:\\,|\\)|\\)))?" + - "(?:\\s*(this|last|past|next)\\s*week)?" + - "(?=\\W|$)", "i"); -const PREFIX_GROUP = 1; -const WEEKDAY_GROUP = 2; -const POSTFIX_GROUP = 3; -class ENWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants$5.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord == "last" || modifierWord == "past") { - modifier = "last"; - } - else if (modifierWord == "next") { - modifier = "next"; - } - else if (modifierWord == "this") { - modifier = "this"; - } - const date = weeks.toDayJSWeekday(context.refDate, offset, modifier); - return context - .createParsingComponents() - .assign("weekday", offset) - .imply("day", date.date()) - .imply("month", date.month() + 1) - .imply("year", date.year()); - } -} -exports.default = ENWeekdayParser; -}); - -var ENRelativeDateFormatParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - -const dayjs_1 = __importDefault(dayjs_min); - - -const PATTERN = new RegExp(`(this|next|last|past)\\s*(${pattern.matchAnyPattern(constants$5.TIME_UNIT_DICTIONARY)})(?=\\s*)` + "(?=\\W|$)", "i"); -const MODIFIER_WORD_GROUP = 1; -const RELATIVE_WORD_GROUP = 2; -class ENRelativeDateFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); - const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); - const timeunit = constants$5.TIME_UNIT_DICTIONARY[unitWord]; - if (modifier == "next") { - const timeUnits = {}; - timeUnits[timeunit] = 1; - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } - if (modifier == "last" || modifier == "past") { - const timeUnits = {}; - timeUnits[timeunit] = -1; - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } - const components = context.createParsingComponents(); - let date = dayjs_1.default(context.refDate); - if (unitWord.match(/week/i)) { - date = date.add(-date.get("d"), "d"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.imply("year", date.year()); - } - else if (unitWord.match(/month/i)) { - date = date.add(-date.date() + 1, "d"); - components.imply("day", date.date()); - components.assign("year", date.year()); - components.assign("month", date.month() + 1); - } - else if (unitWord.match(/year/i)) { - date = date.add(-date.date() + 1, "d"); - date = date.add(-date.month(), "month"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.assign("year", date.year()); - } - return components; - } -} -exports.default = ENRelativeDateFormatParser; -}); - -var chrono$1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ParsingContext = exports.Chrono = void 0; - - -class Chrono { - constructor(configuration) { - configuration = configuration || en.createCasualConfiguration(); - this.parsers = [...configuration.parsers]; - this.refiners = [...configuration.refiners]; - } - clone() { - return new Chrono({ - parsers: [...this.parsers], - refiners: [...this.refiners], - }); - } - parseDate(text, referenceDate, option) { - const results = this.parse(text, referenceDate, option); - return results.length > 0 ? results[0].start.date() : null; - } - parse(text, referenceDate, option) { - const context = new ParsingContext(text, referenceDate || new Date(), option || {}); - let results = []; - this.parsers.forEach((parser) => { - const parsedResults = Chrono.executeParser(context, parser); - results = results.concat(parsedResults); - }); - results.sort((a, b) => { - return a.index - b.index; - }); - this.refiners.forEach(function (refiner) { - results = refiner.refine(context, results); - }); - return results; - } - static executeParser(context, parser) { - const results$1 = []; - const pattern = parser.pattern(context); - const originalText = context.text; - let remainingText = context.text; - let match = pattern.exec(remainingText); - while (match) { - const index = match.index + originalText.length - remainingText.length; - match.index = index; - const result = parser.extract(context, match); - if (!result) { - remainingText = originalText.substring(match.index + 1); - match = pattern.exec(remainingText); - continue; - } - let parsedResult = null; - if (result instanceof results.ParsingResult) { - parsedResult = result; - } - else if (result instanceof results.ParsingComponents) { - parsedResult = context.createParsingResult(match.index, match[0]); - parsedResult.start = result; - } - else { - parsedResult = context.createParsingResult(match.index, match[0], result); - } - context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`)); - results$1.push(parsedResult); - remainingText = originalText.substring(index + parsedResult.text.length); - match = pattern.exec(remainingText); - } - return results$1; - } -} -exports.Chrono = Chrono; -class ParsingContext { - constructor(text, refDate, option) { - this.text = text; - this.refDate = refDate; - this.option = option; - } - createParsingComponents(components) { - if (components instanceof results.ParsingComponents) { - return components; - } - return new results.ParsingComponents(this.refDate, components); - } - createParsingResult(index, textOrEndIndex, startComponents, endComponents) { - const text = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex); - const start = startComponents ? this.createParsingComponents(startComponents) : null; - const end = endComponents ? this.createParsingComponents(endComponents) : null; - return new results.ParsingResult(this.refDate, index, text, start, end); - } - debug(block) { - if (this.option.debug) { - if (this.option.debug instanceof Function) { - this.option.debug(block); - } - else { - const handler = this.option.debug; - handler.debug(block); - } - } - } -} -exports.ParsingContext = ParsingContext; -}); - -var SlashDateFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -const PATTERN = new RegExp("([^\\d]|^)" + - "([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})" + - "(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?" + - "(\\W|$)", "i"); -const OPENING_GROUP = 1; -const ENDING_GROUP = 5; -const FIRST_NUMBERS_GROUP = 2; -const SECOND_NUMBERS_GROUP = 3; -const YEAR_GROUP = 4; -class SlashDateFormatParser { - constructor(littleEndian) { - this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP; - this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP; - } - pattern() { - return PATTERN; - } - extract(context, match) { - if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") { - match.index += match[0].length; - return; - } - const index = match.index + match[OPENING_GROUP].length; - const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); - if (text.match(/^\d\.\d$/) || text.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { - return; - } - if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) { - return; - } - const result = context.createParsingResult(index, text); - let month = parseInt(match[this.groupNumberMonth]); - let day = parseInt(match[this.groupNumberDay]); - if (month < 1 || month > 12) { - if (month > 12) { - if (day >= 1 && day <= 12 && month <= 31) { - [day, month] = [month, day]; - } - else { - return null; - } - } - } - if (day < 1 || day > 31) { - return null; - } - result.start.assign("day", day); - result.start.assign("month", month); - if (match[YEAR_GROUP]) { - const rawYearNumber = parseInt(match[YEAR_GROUP]); - const year = years.findMostLikelyADYear(rawYearNumber); - result.start.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - return result; - } -} -exports.default = SlashDateFormatParser; -}); - -var ENTimeUnitCasualRelativeFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp(`(this|last|past|next|\\+|-)\\s*(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); -class ENTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const prefix = match[1].toLowerCase(); - let timeUnits = constants$5.parseTimeUnits(match[2]); - switch (prefix) { - case "last": - case "past": - case "-": - timeUnits = timeunits.reverseTimeUnits(timeUnits); - break; - } - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } -} -exports.default = ENTimeUnitCasualRelativeFormatParser; -}); - -var en = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0; -const ENTimeUnitWithinFormatParser_1$1 = __importDefault(ENTimeUnitWithinFormatParser_1); -const ENMonthNameLittleEndianParser_1$1 = __importDefault(ENMonthNameLittleEndianParser_1); -const ENMonthNameMiddleEndianParser_1$1 = __importDefault(ENMonthNameMiddleEndianParser_1); -const ENMonthNameParser_1$1 = __importDefault(ENMonthNameParser_1); -const ENCasualYearMonthDayParser_1$1 = __importDefault(ENCasualYearMonthDayParser_1); -const ENSlashMonthFormatParser_1$1 = __importDefault(ENSlashMonthFormatParser_1); -const ENTimeExpressionParser_1$1 = __importDefault(ENTimeExpressionParser_1); -const ENTimeUnitAgoFormatParser_1$1 = __importDefault(ENTimeUnitAgoFormatParser_1); -const ENTimeUnitLaterFormatParser_1$1 = __importDefault(ENTimeUnitLaterFormatParser_1); -const ENMergeDateRangeRefiner_1$1 = __importDefault(ENMergeDateRangeRefiner_1); -const ENMergeDateTimeRefiner_1$1 = __importDefault(ENMergeDateTimeRefiner_1); - -const ENCasualDateParser_1$1 = __importDefault(ENCasualDateParser_1); -const ENCasualTimeParser_1$1 = __importDefault(ENCasualTimeParser_1); -const ENWeekdayParser_1$1 = __importDefault(ENWeekdayParser_1); -const ENRelativeDateFormatParser_1$1 = __importDefault(ENRelativeDateFormatParser_1); - -const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1); -const ENTimeUnitCasualRelativeFormatParser_1$1 = __importDefault(ENTimeUnitCasualRelativeFormatParser_1); -exports.casual = new chrono$1.Chrono(createCasualConfiguration(false)); -exports.strict = new chrono$1.Chrono(createConfiguration(true, false)); -exports.GB = new chrono$1.Chrono(createConfiguration(false, true)); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration(littleEndian = false) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new ENCasualDateParser_1$1.default()); - option.parsers.unshift(new ENCasualTimeParser_1$1.default()); - option.parsers.unshift(new ENMonthNameParser_1$1.default()); - option.parsers.unshift(new ENRelativeDateFormatParser_1$1.default()); - option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1$1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration(strictMode = true, littleEndian = false) { - return configurations.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1$1.default(littleEndian), - new ENTimeUnitWithinFormatParser_1$1.default(), - new ENMonthNameLittleEndianParser_1$1.default(), - new ENMonthNameMiddleEndianParser_1$1.default(), - new ENWeekdayParser_1$1.default(), - new ENCasualYearMonthDayParser_1$1.default(), - new ENSlashMonthFormatParser_1$1.default(), - new ENTimeExpressionParser_1$1.default(strictMode), - new ENTimeUnitAgoFormatParser_1$1.default(strictMode), - new ENTimeUnitLaterFormatParser_1$1.default(strictMode), - ], - refiners: [new ENMergeDateTimeRefiner_1$1.default(), new ENMergeDateRangeRefiner_1$1.default()], - }, strictMode); -} -exports.createConfiguration = createConfiguration; -}); - -var DETimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -class DETimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:um|von)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\–|\\~|\\〜|bis)\\s*"; - } - primarySuffix() { - return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)"; - } - extractPrimaryTimeComponents(context, match) { - const components = super.extractPrimaryTimeComponents(context, match); - if (components) { - if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) { - components.assign("meridiem", dist.Meridiem.AM); - const hour = components.get("hour"); - if (hour < 12) { - components.assign("hour", components.get("hour")); - } - } - if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) { - components.assign("meridiem", dist.Meridiem.PM); - const hour = components.get("hour"); - if (hour < 12) { - components.assign("hour", components.get("hour") + 12); - } - } - } - return components; - } -} -exports.default = DETimeExpressionParser; -}); - -var constants$4 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - - -exports.WEEKDAY_DICTIONARY = { - "sonntag": 0, - "so": 0, - "montag": 1, - "mo": 1, - "dienstag": 2, - "di": 2, - "mittwoch": 3, - "mi": 3, - "donnerstag": 4, - "do": 4, - "freitag": 5, - "fr": 5, - "samstag": 6, - "sa": 6, -}; -exports.MONTH_DICTIONARY = { - "januar": 1, - "jan": 1, - "jan.": 1, - "februar": 2, - "feb": 2, - "feb.": 2, - "märz": 3, - "maerz": 3, - "mär": 3, - "mär.": 3, - "mrz": 3, - "mrz.": 3, - "april": 4, - "apr": 4, - "apr.": 4, - "mai": 5, - "juni": 6, - "jun": 6, - "jun.": 6, - "juli": 7, - "jul": 7, - "jul.": 7, - "august": 8, - "aug": 8, - "aug.": 8, - "september": 9, - "sep": 9, - "sep.": 9, - "sept": 9, - "sept.": 9, - "oktober": 10, - "okt": 10, - "okt.": 10, - "november": 11, - "nov": 11, - "nov.": 11, - "dezember": 12, - "dez": 12, - "dez.": 12, -}; -exports.INTEGER_WORD_DICTIONARY = { - "eins": 1, - "zwei": 2, - "drei": 3, - "vier": 4, - "fünf": 5, - "fuenf": 5, - "sechs": 6, - "sieben": 7, - "acht": 8, - "neun": 9, - "zehn": 10, - "elf": 11, - "zwölf": 12, - "zwoelf": 12, -}; -exports.TIME_UNIT_DICTIONARY = { - sec: "second", - second: "second", - seconds: "second", - min: "minute", - mins: "minute", - minute: "minute", - minutes: "minute", - h: "hour", - hr: "hour", - hrs: "hour", - hour: "hour", - hours: "hour", - day: "d", - days: "d", - week: "week", - weeks: "week", - month: "month", - months: "month", - y: "year", - yr: "year", - year: "year", - years: "year", -}; -exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; -function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } - else if (num === "a" || num === "an") { - return 1; - } - else if (num.match(/few/)) { - return 3; - } - else if (num.match(/half/)) { - return 0.5; - } - else if (num.match(/couple/)) { - return 2; - } - else if (num.match(/several/)) { - return 7; - } - return parseFloat(num); -} -exports.parseNumberPattern = parseNumberPattern; -exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)`; -function parseYear(match) { - if (/v/i.test(match)) { - return -parseInt(match.replace(/[^0-9]+/gi, "")); - } - if (/n/i.test(match)) { - return parseInt(match.replace(/[^0-9]+/gi, "")); - } - const rawYearNumber = parseInt(match); - return years.findMostLikelyADYear(rawYearNumber); -} -exports.parseYear = parseYear; -const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; -const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); -exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); -function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; -} -exports.parseTimeUnits = parseTimeUnits; -function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; -} -}); - -var DEWeekdayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:a[mn]\\s*?)?" + - "(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\s*)?" + - `(${pattern.matchAnyPattern(constants$4.WEEKDAY_DICTIONARY)})` + - "(?:\\s*(?:\\,|\\)|\\)))?" + - "(?:\\s*(diese|letzte|n(?:ä|ae)chste)\\s*woche)?" + - "(?=\\W|$)", "i"); -const PREFIX_GROUP = 1; -const SUFFIX_GROUP = 3; -const WEEKDAY_GROUP = 2; -class DEWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants$4.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[SUFFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord.match(/letzte/)) { - modifier = "last"; - } - else if (modifierWord.match(/chste/)) { - modifier = "next"; - } - else if (modifierWord.match(/diese/)) { - modifier = "this"; - } - const date = weeks.toDayJSWeekday(context.refDate, offset, modifier); - return context - .createParsingComponents() - .assign("weekday", offset) - .imply("day", date.date()) - .imply("month", date.month() + 1) - .imply("year", date.year()); - } -} -exports.default = DEWeekdayParser; -}); - -var DEMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class DEMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i; - } -} -exports.default = DEMergeDateRangeRefiner; -}); - -var DEMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner); -class DEMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|um|am|,|-)?\\s*$"); - } -} -exports.default = DEMergeDateTimeRefiner; -}); - -var DECasualTimeParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); - - - - -class DECasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const timeKeywordPattern = match[2].toLowerCase(); - const component = context.createParsingComponents(); - dayjs.implySimilarTime(component, targetDate); - return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern); - } - static extractTimeComponents(component, timeKeywordPattern) { - switch (timeKeywordPattern) { - case "morgen": - component.imply("hour", 6); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - case "vormittag": - component.imply("hour", 9); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - case "mittag": - case "mittags": - component.imply("hour", 12); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - case "nachmittag": - component.imply("hour", 15); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.PM); - break; - case "abend": - component.imply("hour", 18); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.PM); - break; - case "nacht": - component.imply("hour", 22); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.PM); - break; - case "mitternacht": - if (component.get("hour") > 1) { - component = timeunits.addImpliedTimeUnits(component, { "day": 1 }); - } - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - } - return component; - } -} -exports.default = DECasualTimeParser; -}); - -var DECasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); - - -const DECasualTimeParser_1$1 = __importDefault(DECasualTimeParser_1); -const references = __importStar(casualReferences); -const PATTERN = new RegExp(`(jetzt|heute|morgen|übermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)` + - `(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?` + - `(?=\\W|$)`, "i"); -const DATE_GROUP = 1; -const TIME_GROUP = 2; -class DECasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return PATTERN; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const dateKeyword = (match[DATE_GROUP] || "").toLowerCase(); - const timeKeyword = (match[TIME_GROUP] || "").toLowerCase(); - let component = context.createParsingComponents(); - switch (dateKeyword) { - case "jetzt": - component = references.now(context.refDate); - break; - case "heute": - component = references.today(context.refDate); - break; - case "morgen": - dayjs.assignTheNextDay(component, targetDate); - break; - case "übermorgen": - case "uebermorgen": - targetDate = targetDate.add(1, "day"); - dayjs.assignTheNextDay(component, targetDate); - break; - case "gestern": - targetDate = targetDate.add(-1, "day"); - dayjs.assignSimilarDate(component, targetDate); - dayjs.implySimilarTime(component, targetDate); - break; - case "vorgestern": - targetDate = targetDate.add(-2, "day"); - dayjs.assignSimilarDate(component, targetDate); - dayjs.implySimilarTime(component, targetDate); - break; - default: - if (dateKeyword.match(/letzte\s*nacht/)) { - if (targetDate.hour() > 6) { - targetDate = targetDate.add(-1, "day"); - } - dayjs.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - break; - } - if (timeKeyword) { - component = DECasualTimeParser_1$1.default.extractTimeComponents(component, timeKeyword); - } - return component; - } -} -exports.default = DECasualDateParser; -}); - -var DEMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants$4; - - -const PATTERN = new RegExp("(?:am\\s*?)?" + - "(?:den\\s*?)?" + - `([0-9]{1,2})\\.` + - `(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\–|\\s)\\s*([0-9]{1,2})\\.?)?\\s*` + - `(${pattern.matchAnyPattern(constants$4.MONTH_DICTIONARY)})` + - `(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` + - `(?=\\W|$)`, "i"); -const DATE_GROUP = 1; -const DATE_TO_GROUP = 2; -const MONTH_NAME_GROUP = 3; -const YEAR_GROUP = 4; -class DEMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants$4.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = parseInt(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = parseInt(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } -} -exports.default = DEMonthNameLittleEndianParser; -}); - -var de = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - - -const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1); -const ISOFormatParser_1$1 = __importDefault(ISOFormatParser_1); -const DETimeExpressionParser_1$1 = __importDefault(DETimeExpressionParser_1); -const DEWeekdayParser_1$1 = __importDefault(DEWeekdayParser_1); -const DEMergeDateRangeRefiner_1$1 = __importDefault(DEMergeDateRangeRefiner_1); -const DEMergeDateTimeRefiner_1$1 = __importDefault(DEMergeDateTimeRefiner_1); -const DECasualDateParser_1$1 = __importDefault(DECasualDateParser_1); -const DECasualTimeParser_1$1 = __importDefault(DECasualTimeParser_1); -const DEMonthNameLittleEndianParser_1$1 = __importDefault(DEMonthNameLittleEndianParser_1); -exports.casual = new chrono$1.Chrono(createCasualConfiguration()); -exports.strict = new chrono$1.Chrono(createConfiguration(true)); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new DECasualTimeParser_1$1.default()); - option.parsers.unshift(new DECasualDateParser_1$1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration(strictMode = true, littleEndian = true) { - return configurations.includeCommonConfiguration({ - parsers: [ - new ISOFormatParser_1$1.default(), - new SlashDateFormatParser_1$1.default(littleEndian), - new DETimeExpressionParser_1$1.default(), - new DEMonthNameLittleEndianParser_1$1.default(), - new DEWeekdayParser_1$1.default(), - ], - refiners: [new DEMergeDateRangeRefiner_1$1.default(), new DEMergeDateTimeRefiner_1$1.default()], - }, strictMode); -} -exports.createConfiguration = createConfiguration; -}); - -var FRCasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); - - - -const references = __importStar(casualReferences); -class FRCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "maintenant": - return references.now(context.refDate); - case "aujourd'hui": - return references.today(context.refDate); - case "hier": - return references.yesterday(context.refDate); - case "demain": - return references.tomorrow(context.refDate); - default: - if (lowerText.match(/cette\s*nuit/)) { - dayjs.assignSimilarDate(component, targetDate); - component.imply("hour", 22); - component.imply("meridiem", dist.Meridiem.PM); - } - else if (lowerText.match(/la\s*veille/)) { - targetDate = targetDate.add(-1, "day"); - dayjs.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - } - return component; - } -} -exports.default = FRCasualDateParser; -}); - -var FRCasualTimeParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -class FRCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; - } - innerExtract(context, match) { - const suffixLower = match[2].toLowerCase(); - const component = context.createParsingComponents(); - switch (suffixLower) { - case "après-midi": - case "aprem": - component.imply("hour", 14); - component.imply("minute", 0); - component.imply("meridiem", dist.Meridiem.PM); - break; - case "soir": - component.imply("hour", 18); - component.imply("minute", 0); - component.imply("meridiem", dist.Meridiem.PM); - break; - case "matin": - component.imply("hour", 8); - component.imply("minute", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - case "a midi": - component.imply("hour", 12); - component.imply("minute", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - case "à minuit": - component.imply("hour", 0); - component.imply("meridiem", dist.Meridiem.AM); - break; - } - return component; - } -} -exports.default = FRCasualTimeParser; -}); - -var FRTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class FRTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:[àa])\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\–|\\~|\\〜|[àa]|\\?)\\s*"; - } - extractPrimaryTimeComponents(context, match) { - if (match[0].match(/^\s*\d{4}\s*$/)) { - return null; - } - return super.extractPrimaryTimeComponents(context, match); - } -} -exports.default = FRTimeExpressionParser; -}); - -var FRMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner); -class FRMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|à|a|vers|de|,|-)?\\s*$"); - } -} -exports.default = FRMergeDateTimeRefiner; -}); - -var FRMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class FRMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(à|a|-)\s*$/i; - } -} -exports.default = FRMergeDateRangeRefiner; -}); - -var constants$3 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - -exports.WEEKDAY_DICTIONARY = { - "dimanche": 0, - "dim": 0, - "lundi": 1, - "lun": 1, - "mardi": 2, - "mar": 2, - "mercredi": 3, - "mer": 3, - "jeudi": 4, - "jeu": 4, - "vendredi": 5, - "ven": 5, - "samedi": 6, - "sam": 6, -}; -exports.MONTH_DICTIONARY = { - "janvier": 1, - "jan": 1, - "jan.": 1, - "février": 2, - "fév": 2, - "fév.": 2, - "fevrier": 2, - "fev": 2, - "fev.": 2, - "mars": 3, - "mar": 3, - "mar.": 3, - "avril": 4, - "avr": 4, - "avr.": 4, - "mai": 5, - "juin": 6, - "jun": 6, - "juillet": 7, - "juil": 7, - "jul": 7, - "jul.": 7, - "août": 8, - "aout": 8, - "septembre": 9, - "sep": 9, - "sep.": 9, - "sept": 9, - "sept.": 9, - "octobre": 10, - "oct": 10, - "oct.": 10, - "novembre": 11, - "nov": 11, - "nov.": 11, - "décembre": 12, - "decembre": 12, - "dec": 12, - "dec.": 12, -}; -exports.INTEGER_WORD_DICTIONARY = { - "un": 1, - "deux": 2, - "trois": 3, - "quatre": 4, - "cinq": 5, - "six": 6, - "sept": 7, - "huit": 8, - "neuf": 9, - "dix": 10, - "onze": 11, - "douze": 12, - "treize": 13, -}; -exports.TIME_UNIT_DICTIONARY = { - "sec": "second", - "seconde": "second", - "secondes": "second", - "min": "minute", - "mins": "minute", - "minute": "minute", - "minutes": "minute", - "h": "hour", - "hr": "hour", - "hrs": "hour", - "heure": "hour", - "heures": "hour", - "jour": "d", - "jours": "d", - "semaine": "week", - "semaines": "week", - "mois": "month", - "trimestre": "quarter", - "trimestres": "quarter", - "ans": "year", - "année": "year", - "années": "year", -}; -exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?|quelques?|demi-?)`; -function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } - else if (num === "une" || num === "un") { - return 1; - } - else if (num.match(/quelques?/)) { - return 3; - } - else if (num.match(/demi-?/)) { - return 0.5; - } - return parseFloat(num); -} -exports.parseNumberPattern = parseNumberPattern; -exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; -function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - num = num.replace(/(?:er)$/i, ""); - return parseInt(num); -} -exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; -exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; -function parseYear(match) { - if (/AC/i.test(match)) { - match = match.replace(/BC/i, ""); - return -parseInt(match); - } - if (/AD/i.test(match) || /C/i.test(match)) { - match = match.replace(/[^\d]+/i, ""); - return parseInt(match); - } - let yearNumber = parseInt(match); - if (yearNumber < 100) { - if (yearNumber > 50) { - yearNumber = yearNumber + 1900; - } - else { - yearNumber = yearNumber + 2000; - } - } - return yearNumber; -} -exports.parseYear = parseYear; -const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; -const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); -exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); -function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; -} -exports.parseTimeUnits = parseTimeUnits; -function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; -} -}); - -var FRWeekdayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:(?:ce)\\s*)?" + - `(${pattern.matchAnyPattern(constants$3.WEEKDAY_DICTIONARY)})` + - "(?:\\s*(?:\\,|\\)|\\)))?" + - "(?:\\s*(dernier|prochain)\\s*)?" + - "(?=\\W|\\d|$)", "i"); -const WEEKDAY_GROUP = 1; -const POSTFIX_GROUP = 2; -class FRWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants$3.WEEKDAY_DICTIONARY[dayOfWeek]; - if (offset === undefined) { - return null; - } - let suffix = match[POSTFIX_GROUP]; - suffix = suffix || ""; - suffix = suffix.toLowerCase(); - let modifier = null; - if (suffix == "dernier") { - modifier = "last"; - } - else if (suffix == "prochain") { - modifier = "next"; - } - const date = weeks.toDayJSWeekday(context.refDate, offset, modifier); - return context - .createParsingComponents() - .assign("weekday", offset) - .imply("day", date.date()) - .imply("month", date.month() + 1) - .imply("year", date.year()); - } -} -exports.default = FRWeekdayParser; -}); - -var FRSpecificTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -const FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" + - "(?:(?:[àa])\\s*)?" + - "(\\d{1,2})(?:h|:)?" + - "(?:(\\d{1,2})(?:m|:)?)?" + - "(?:(\\d{1,2})(?:s|:)?)?" + - "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" + - "(?=\\W|$)", "i"); -const SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\–|\\~|\\〜|[àa]|\\?)\\s*" + - "(\\d{1,2})(?:h|:)?" + - "(?:(\\d{1,2})(?:m|:)?)?" + - "(?:(\\d{1,2})(?:s|:)?)?" + - "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" + - "(?=\\W|$)", "i"); -const HOUR_GROUP = 2; -const MINUTE_GROUP = 3; -const SECOND_GROUP = 4; -const AM_PM_HOUR_GROUP = 5; -class FRSpecificTimeExpressionParser { - pattern(context) { - return FIRST_REG_PATTERN; - } - extract(context, match) { - const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); - if (result.text.match(/^\d{4}$/)) { - match.index += match[0].length; - return null; - } - result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); - if (!result.start) { - match.index += match[0].length; - return null; - } - const remainingText = context.text.substring(match.index + match[0].length); - const secondMatch = SECOND_REG_PATTERN.exec(remainingText); - if (secondMatch) { - result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); - if (result.end) { - result.text += secondMatch[0]; - } - } - return result; - } - static extractTimeComponent(extractingComponents, match) { - let hour = 0; - let minute = 0; - let meridiem = null; - hour = parseInt(match[HOUR_GROUP]); - if (match[MINUTE_GROUP] != null) { - minute = parseInt(match[MINUTE_GROUP]); - } - if (minute >= 60 || hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = dist.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = dist.Meridiem.AM; - if (hour == 12) { - hour = 0; - } - } - if (ampm == "p") { - meridiem = dist.Meridiem.PM; - if (hour != 12) { - hour += 12; - } - } - } - extractingComponents.assign("hour", hour); - extractingComponents.assign("minute", minute); - if (meridiem !== null) { - extractingComponents.assign("meridiem", meridiem); - } - else { - if (hour < 12) { - extractingComponents.imply("meridiem", dist.Meridiem.AM); - } - else { - extractingComponents.imply("meridiem", dist.Meridiem.PM); - } - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - extractingComponents.assign("second", second); - } - return extractingComponents; - } -} -exports.default = FRSpecificTimeExpressionParser; -}); - -var FRMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants$3; -const constants_3 = constants$3; - - -const PATTERN = new RegExp("(?:on\\s*?)?" + - `(${constants_3.ORDINAL_NUMBER_PATTERN})` + - `(?:\\s*(?:au|\\-|\\–|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?` + - `(?:-|/|\\s*(?:de)?\\s*)` + - `(${pattern.matchAnyPattern(constants$3.MONTH_DICTIONARY)})` + - `(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` + - `(?=\\W|$)`, "i"); -const DATE_GROUP = 1; -const DATE_TO_GROUP = 2; -const MONTH_NAME_GROUP = 3; -const YEAR_GROUP = 4; -class FRMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants$3.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } -} -exports.default = FRMonthNameLittleEndianParser; -}); - -var FRTimeUnitAgoFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - constructor() { - super(); - } - innerPattern() { - return new RegExp(`il y a\\s*(${constants$3.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants$3.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits.reverseTimeUnits(timeUnits); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits); - } -} -exports.default = FRTimeUnitAgoFormatParser; -}); - -var FRTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -class FRTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp(`(?:dans|en|pour|pendant)\\s*(${constants$3.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants$3.parseTimeUnits(match[1]); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } -} -exports.default = FRTimeUnitWithinFormatParser; -}); - -var FRTimeUnitRelativeFormatParser = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - - -class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - constructor() { - super(); - } - innerPattern() { - return new RegExp(`(?:les?|la|l'|du|des?)\\s*` + - `(${constants$3.NUMBER_PATTERN})?` + - `(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?` + - `\\s*(${pattern.matchAnyPattern(constants$3.TIME_UNIT_DICTIONARY)})` + - `(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?`, "i"); - } - innerExtract(context, match) { - const num = match[1] ? constants$3.parseNumberPattern(match[1]) : 1; - const unit = constants$3.TIME_UNIT_DICTIONARY[match[3].toLowerCase()]; - let timeUnits = {}; - timeUnits[unit] = num; - let modifier = match[2] || match[4] || ""; - modifier = modifier.toLowerCase(); - if (!modifier) { - return; - } - if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) { - timeUnits = timeunits.reverseTimeUnits(timeUnits); - } - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } -} -exports.default = FRTimeUnitAgoFormatParser; -}); - -var fr = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - - -const FRCasualDateParser_1$1 = __importDefault(FRCasualDateParser_1); -const FRCasualTimeParser_1$1 = __importDefault(FRCasualTimeParser_1); -const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1); -const FRTimeExpressionParser_1$1 = __importDefault(FRTimeExpressionParser_1); -const FRMergeDateTimeRefiner_1$1 = __importDefault(FRMergeDateTimeRefiner_1); -const FRMergeDateRangeRefiner_1$1 = __importDefault(FRMergeDateRangeRefiner_1); -const FRWeekdayParser_1$1 = __importDefault(FRWeekdayParser_1); -const FRSpecificTimeExpressionParser_1$1 = __importDefault(FRSpecificTimeExpressionParser_1); -const FRMonthNameLittleEndianParser_1$1 = __importDefault(FRMonthNameLittleEndianParser_1); -const FRTimeUnitAgoFormatParser_1$1 = __importDefault(FRTimeUnitAgoFormatParser_1); -const FRTimeUnitWithinFormatParser_1$1 = __importDefault(FRTimeUnitWithinFormatParser_1); -const FRTimeUnitRelativeFormatParser_1 = __importDefault(FRTimeUnitRelativeFormatParser); -exports.casual = new chrono$1.Chrono(createCasualConfiguration()); -exports.strict = new chrono$1.Chrono(createConfiguration(true)); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new FRCasualDateParser_1$1.default()); - option.parsers.unshift(new FRCasualTimeParser_1$1.default()); - option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration(strictMode = true, littleEndian = true) { - return configurations.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1$1.default(littleEndian), - new FRMonthNameLittleEndianParser_1$1.default(), - new FRTimeExpressionParser_1$1.default(), - new FRSpecificTimeExpressionParser_1$1.default(), - new FRTimeUnitAgoFormatParser_1$1.default(), - new FRTimeUnitWithinFormatParser_1$1.default(), - new FRWeekdayParser_1$1.default(), - ], - refiners: [new FRMergeDateTimeRefiner_1$1.default(), new FRMergeDateRangeRefiner_1$1.default()], - }, strictMode); -} -exports.createConfiguration = createConfiguration; -}); - -var constants$2 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toHankaku = void 0; -function toHankaku(text) { - return String(text) - .replace(/\u2019/g, "\u0027") - .replace(/\u201D/g, "\u0022") - .replace(/\u3000/g, "\u0020") - .replace(/\uFFE5/g, "\u00A5") - .replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum); -} -exports.toHankaku = toHankaku; -function alphaNum(token) { - return String.fromCharCode(token.charCodeAt(0) - 65248); -} -}); - -var JPStandardParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - -const dayjs_1 = __importDefault(dayjs_min); -const PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; -const SPECIAL_YEAR_GROUP = 1; -const TYPICAL_YEAR_GROUP = 2; -const ERA_GROUP = 3; -const YEAR_NUMBER_GROUP = 4; -const MONTH_GROUP = 5; -const DAY_GROUP = 6; -class JPStandardParser { - pattern() { - return PATTERN; - } - extract(context, match) { - const month = parseInt(constants$2.toHankaku(match[MONTH_GROUP])); - const day = parseInt(constants$2.toHankaku(match[DAY_GROUP])); - const components = context.createParsingComponents({ - day: day, - month: month, - }); - if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("同|今|本")) { - const moment = dayjs_1.default(context.refDate); - components.assign("year", moment.year()); - } - if (match[TYPICAL_YEAR_GROUP]) { - const yearNumText = match[YEAR_NUMBER_GROUP]; - let year = yearNumText == "元" ? 1 : parseInt(constants$2.toHankaku(yearNumText)); - if (match[ERA_GROUP] == "令和") { - year += 2018; - } - else if (match[ERA_GROUP] == "平成") { - year += 1988; - } - else if (match[ERA_GROUP] == "昭和") { - year += 1925; - } - components.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - return components; - } -} -exports.default = JPStandardParser; -}); - -var JPMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class JPMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(から|ー|-)\s*$/i; - } -} -exports.default = JPMergeDateRangeRefiner; -}); - -var JPCasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const dayjs_1 = __importDefault(dayjs_min); - -const references = __importStar(casualReferences); -const PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; -class JPCasualDateParser { - pattern() { - return PATTERN; - } - extract(context, match) { - const text = match[0]; - const date = dayjs_1.default(context.refDate); - const components = context.createParsingComponents(); - switch (text) { - case "昨日": - return references.yesterday(context.refDate); - case "明日": - return references.tomorrow(context.refDate); - case "今日": - case "当日": - return references.today(context.refDate); - } - if (text == "今夜" || text == "今夕" || text == "今晩") { - components.imply("hour", 22); - components.assign("meridiem", dist.Meridiem.PM); - } - else if (text.match("今朝")) { - components.imply("hour", 6); - components.assign("meridiem", dist.Meridiem.AM); - } - components.assign("day", date.date()); - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - return components; - } -} -exports.default = JPCasualDateParser; -}); - -var ja = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; -const JPStandardParser_1$1 = __importDefault(JPStandardParser_1); -const JPMergeDateRangeRefiner_1$1 = __importDefault(JPMergeDateRangeRefiner_1); -const JPCasualDateParser_1$1 = __importDefault(JPCasualDateParser_1); - -exports.casual = new chrono$1.Chrono(createCasualConfiguration()); -exports.strict = new chrono$1.Chrono(createConfiguration()); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration() { - const option = createConfiguration(); - option.parsers.unshift(new JPCasualDateParser_1$1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration() { - return { - parsers: [new JPStandardParser_1$1.default()], - refiners: [new JPMergeDateRangeRefiner_1$1.default()], + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + }; +} +var SvelteComponent = class { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); }; -} -exports.createConfiguration = createConfiguration; -}); - -var constants$1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; -exports.WEEKDAY_DICTIONARY = { - "domingo": 0, - "dom": 0, - "segunda": 1, - "segunda-feira": 1, - "seg": 1, - "terça": 2, - "terça-feira": 2, - "ter": 2, - "quarta": 3, - "quarta-feira": 3, - "qua": 3, - "quinta": 4, - "quinta-feira": 4, - "qui": 4, - "sexta": 5, - "sexta-feira": 5, - "sex": 5, - "sábado": 6, - "sabado": 6, - "sab": 6, + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } }; -exports.MONTH_DICTIONARY = { - "janeiro": 1, - "jan": 1, - "jan.": 1, - "fevereiro": 2, - "fev": 2, - "fev.": 2, - "março": 3, - "mar": 3, - "mar.": 3, - "abril": 4, - "abr": 4, - "abr.": 4, - "maio": 5, - "mai": 5, - "mai.": 5, - "junho": 6, - "jun": 6, - "jun.": 6, - "julho": 7, - "jul": 7, - "jul.": 7, - "agosto": 8, - "ago": 8, - "ago.": 8, - "setembro": 9, - "set": 9, - "set.": 9, - "outubro": 10, - "out": 10, - "out.": 10, - "novembro": 11, - "nov": 11, - "nov.": 11, - "dezembro": 12, - "dez": 12, - "dez.": 12, -}; -exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?"; -function parseYear(match) { - if (match.match(/^[0-9]{1,4}$/)) { - let yearNumber = parseInt(match); - if (yearNumber < 100) { - if (yearNumber > 50) { - yearNumber = yearNumber + 1900; - } - else { - yearNumber = yearNumber + 2000; - } - } - return yearNumber; - } - if (match.match(/a\.?\s*c\.?/i)) { - match = match.replace(/a\.?\s*c\.?/i, ""); - return -parseInt(match); - } - return parseInt(match); -} -exports.parseYear = parseYear; -}); - -var PTWeekdayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:(este|esta|passado|pr[oó]ximo)\\s*)?" + - `(${pattern.matchAnyPattern(constants$1.WEEKDAY_DICTIONARY)})` + - "(?:\\s*(?:\\,|\\)|\\)))?" + - "(?:\\s*(este|esta|passado|pr[óo]ximo)\\s*semana)?" + - "(?=\\W|\\d|$)", "i"); -const PREFIX_GROUP = 1; -const WEEKDAY_GROUP = 2; -const POSTFIX_GROUP = 3; -class PTWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants$1.WEEKDAY_DICTIONARY[dayOfWeek]; - if (offset === undefined) { - return null; - } - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let norm = prefix || postfix || ""; - norm = norm.toLowerCase(); - let modifier = null; - if (norm == "passado") { - modifier = "this"; - } - else if (norm == "próximo" || norm == "proximo") { - modifier = "next"; - } - else if (norm == "este") { - modifier = "this"; - } - const date = weeks.toDayJSWeekday(context.refDate, offset, modifier); - return context - .createParsingComponents() - .assign("weekday", offset) - .imply("day", date.date()) - .imply("month", date.month() + 1) - .imply("year", date.year()); - } -} -exports.default = PTWeekdayParser; -}); - -var PTTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class PTTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:ao?|às?|das|da|de|do)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\–|\\~|\\〜|a(?:o)?|\\?)\\s*"; - } -} -exports.default = PTTimeExpressionParser; -}); - -var PTMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner); -class PTMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(?:,|à)?\\s*$"); - } -} -exports.default = PTMergeDateTimeRefiner; -}); - -var PTMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class PTMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(?:-)\s*$/i; - } -} -exports.default = PTMergeDateRangeRefiner; -}); - -var PTMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants$1; - - -const PATTERN = new RegExp(`([0-9]{1,2})(?:º|ª|°)?` + - "(?:\\s*(?:desde|de|\\-|\\–|ao?|\\s)\\s*([0-9]{1,2})(?:º|ª|°)?)?\\s*(?:de)?\\s*" + - `(?:-|/|\\s*(?:de|,)?\\s*)` + - `(${pattern.matchAnyPattern(constants$1.MONTH_DICTIONARY)})` + - `(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?` + - `(?=\\W|$)`, "i"); -const DATE_GROUP = 1; -const DATE_TO_GROUP = 2; -const MONTH_NAME_GROUP = 3; -const YEAR_GROUP = 4; -class PTMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants$1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = parseInt(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = parseInt(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } -} -exports.default = PTMonthNameLittleEndianParser; -}); - -var PTCasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - -const references = __importStar(casualReferences); -class PTCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i; - } - innerExtract(context, match) { - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "agora": - return references.now(context.refDate); - case "hoje": - return references.today(context.refDate); - case "amanha": - case "amanhã": - return references.tomorrow(context.refDate); - case "ontem": - return references.yesterday(context.refDate); - } - return component; - } -} -exports.default = PTCasualDateParser; -}); - -var PTCasualTimeParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const dayjs_2 = __importDefault(dayjs_min); -class PTCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_2.default(context.refDate); - const component = context.createParsingComponents(); - switch (match[1].toLowerCase()) { - case "tarde": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 15); - break; - case "noite": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 22); - break; - case "manha": - case "manhã": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 6); - break; - case "meia-noite": - dayjs.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "meio-dia": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } -} -exports.default = PTCasualTimeParser; -}); - -var pt = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - - -const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1); -const PTWeekdayParser_1$1 = __importDefault(PTWeekdayParser_1); -const PTTimeExpressionParser_1$1 = __importDefault(PTTimeExpressionParser_1); -const PTMergeDateTimeRefiner_1$1 = __importDefault(PTMergeDateTimeRefiner_1); -const PTMergeDateRangeRefiner_1$1 = __importDefault(PTMergeDateRangeRefiner_1); -const PTMonthNameLittleEndianParser_1$1 = __importDefault(PTMonthNameLittleEndianParser_1); -const PTCasualDateParser_1$1 = __importDefault(PTCasualDateParser_1); -const PTCasualTimeParser_1$1 = __importDefault(PTCasualTimeParser_1); -exports.casual = new chrono$1.Chrono(createCasualConfiguration()); -exports.strict = new chrono$1.Chrono(createConfiguration(true)); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.push(new PTCasualDateParser_1$1.default()); - option.parsers.push(new PTCasualTimeParser_1$1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration(strictMode = true, littleEndian = true) { - return configurations.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1$1.default(littleEndian), - new PTWeekdayParser_1$1.default(), - new PTTimeExpressionParser_1$1.default(), - new PTMonthNameLittleEndianParser_1$1.default(), - ], - refiners: [new PTMergeDateTimeRefiner_1$1.default(), new PTMergeDateRangeRefiner_1$1.default()], - }, strictMode); -} -exports.createConfiguration = createConfiguration; -}); - -var NLMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1); -class NLMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default { - patternBetween() { - return /^\s*(tot|-)\s*$/i; - } -} -exports.default = NLMergeDateRangeRefiner; -}); - -var NLMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner); -class NLMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); - } -} -exports.default = NLMergeDateTimeRefiner; -}); - -var NLCasualDateParser_1 = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - -const references = __importStar(casualReferences); -class NLCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; - } - innerExtract(context, match) { - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "nu": - return references.now(context.refDate); - case "vandaag": - return references.today(context.refDate); - case "morgen": - case "morgend": - return references.tomorrow(context.refDate); - case "gisteren": - return references.yesterday(context.refDate); - } - return component; - } -} -exports.default = NLCasualDateParser; -}); - -var NLCasualTimeParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - -const dayjs_1 = __importDefault(dayjs_min); - -const DAY_GROUP = 1; -const MOMENT_GROUP = 2; -class NLCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const component = context.createParsingComponents(); - if (match[DAY_GROUP] === "deze") { - component.assign("day", context.refDate.getDate()); - component.assign("month", context.refDate.getMonth() + 1); - component.assign("year", context.refDate.getFullYear()); - } - switch (match[MOMENT_GROUP].toLowerCase()) { - case "namiddag": - case "'s namiddags": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 15); - break; - case "avond": - case "'s avonds'": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 20); - break; - case "middernacht": - dayjs.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "ochtend": - case "'s ochtends": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 6); - break; - case "middag": - case "'s middags": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } -} -exports.default = NLCasualTimeParser; -}); - -var constants = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - - -exports.WEEKDAY_DICTIONARY = { - zondag: 0, - zon: 0, - "zon.": 0, - zo: 0, - "zo.": 0, - maandag: 1, - ma: 1, - "ma.": 1, - dinsdag: 2, - din: 2, - "din.": 2, - di: 2, - "di.": 2, - woensdag: 3, - woe: 3, - "woe.": 3, - wo: 3, - "wo.": 3, - donderdag: 4, - dond: 4, - "dond.": 4, - do: 4, - "do.": 4, - vrijdag: 5, - vrij: 5, - "vrij.": 5, - vr: 5, - "vr.": 5, - zaterdag: 6, - zat: 6, - "zat.": 6, - "za": 6, - "za.": 6, -}; -exports.MONTH_DICTIONARY = { - januari: 1, - jan: 1, - "jan.": 1, - februari: 2, - feb: 2, - "feb.": 2, - maart: 3, - mar: 3, - "mar.": 3, - april: 4, - apr: 4, - "apr.": 4, - mei: 5, - juni: 6, - jun: 6, - "jun.": 6, - juli: 7, - jul: 7, - "jul.": 7, - augustus: 8, - aug: 8, - "aug.": 8, - september: 9, - sep: 9, - "sep.": 9, - sept: 9, - "sept.": 9, - oktober: 10, - okt: 10, - "okt.": 10, - november: 11, - nov: 11, - "nov.": 11, - december: 12, - dec: 12, - "dec.": 12, -}; -exports.INTEGER_WORD_DICTIONARY = { - een: 1, - twee: 2, - drie: 3, - vier: 4, - vijf: 5, - zes: 6, - zeven: 7, - acht: 8, - negen: 9, - tien: 10, - elf: 11, - twaalf: 12, -}; -exports.ORDINAL_WORD_DICTIONARY = { - eerste: 1, - tweede: 2, - derde: 3, - vierde: 4, - vijfde: 5, - zesde: 6, - zevende: 7, - achtste: 8, - negende: 9, - tiende: 10, - elfde: 11, - twaalfde: 12, - dertiende: 13, - veertiende: 14, - vijftiende: 15, - zestiende: 16, - zeventiende: 17, - achttiende: 18, - negentiende: 19, - twintigste: 20, - "eenentwintigste": 21, - "tweeëntwintigste": 22, - "drieentwintigste": 23, - "vierentwintigste": 24, - "vijfentwintigste": 25, - "zesentwintigste": 26, - "zevenentwintigste": 27, - "achtentwintig": 28, - "negenentwintig": 29, - "dertigste": 30, - "eenendertigste": 31, -}; -exports.TIME_UNIT_DICTIONARY = { - sec: "second", - second: "second", - seconden: "second", - min: "minute", - mins: "minute", - minute: "minute", - minuten: "minute", - h: "hour", - hr: "hour", - hrs: "hour", - uur: "hour", - uren: "hour", - dag: "d", - dagen: "d", - week: "week", - weken: "week", - maand: "month", - maanden: "month", - jaar: "year", - jr: "year", - jaren: "year", -}; -exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|een?|halve?)`; -function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } - else if (num === "een") { - return 1; - } - else if (num.match(/halve?/)) { - return 0.5; - } - return parseFloat(num); -} -exports.parseNumberPattern = parseNumberPattern; -exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`; -function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) { - return exports.ORDINAL_WORD_DICTIONARY[num]; - } - num = num.replace(/(?:ste|de)$/i, ""); - return parseInt(num); -} -exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; -exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`; -function parseYear(match) { - if (/voor Christus/i.test(match)) { - match = match.replace(/voor Christus/i, ""); - return -parseInt(match); - } - if (/na Christus/i.test(match)) { - match = match.replace(/na Christus/i, ""); - return parseInt(match); - } - const rawYearNumber = parseInt(match); - return years.findMostLikelyADYear(rawYearNumber); -} -exports.parseYear = parseYear; -const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; -const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); -exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); -function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; -} -exports.parseTimeUnits = parseTimeUnits; -function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; -} -}); - -var NLTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + constants.TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants.parseTimeUnits(match[1]); - return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits); - } -} -exports.default = NLTimeUnitWithinFormatParser; -}); - -var NLWeekdayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - -const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:op\\s*?)?" + - "(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" + - `(${pattern.matchAnyPattern(constants.WEEKDAY_DICTIONARY)})` + - "(?=\\W|$)", "i"); -const PREFIX_GROUP = 1; -const WEEKDAY_GROUP = 2; -const POSTFIX_GROUP = 3; -class NLWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord == "vorige") { - modifier = "last"; - } - else if (modifierWord == "volgende") { - modifier = "next"; - } - else if (modifierWord == "deze") { - modifier = "this"; - } - const date = weeks.toDayJSWeekday(context.refDate, offset, modifier); - return context - .createParsingComponents() - .assign("weekday", offset) - .imply("day", date.date()) - .imply("month", date.month() + 1) - .imply("year", date.year()); - } -} -exports.default = NLWeekdayParser; -}); - -var NLMonthNameMiddleEndianParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - -const constants_2 = constants; -const constants_3 = constants; - - -const PATTERN = new RegExp("(?:on\\s*?)?" + - `(${constants_2.ORDINAL_NUMBER_PATTERN})` + - "(?:\\s*" + - "(?:tot|\\-|\\–|until|through|till|\\s)\\s*" + - `(${constants_2.ORDINAL_NUMBER_PATTERN})` + - ")?" + - "(?:-|/|\\s*(?:of)?\\s*)" + - "(" + - pattern.matchAnyPattern(constants.MONTH_DICTIONARY) + - ")" + - "(?:" + - "(?:-|/|,?\\s*)" + - `(${constants_3.YEAR_PATTERN}(?![^\\s]\\d))` + - ")?" + - "(?=\\W|$)", "i"); -const MONTH_NAME_GROUP = 3; -const DATE_GROUP = 1; -const DATE_TO_GROUP = 2; -const YEAR_GROUP = 4; -class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = constants.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - const components = context.createParsingComponents({ - day: day, - month: month, - }); - if (match[YEAR_GROUP]) { - const year = constants_3.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - if (!match[DATE_TO_GROUP]) { - return components; - } - const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - const result = context.createParsingResult(match.index, match[0]); - result.start = components; - result.end = components.clone(); - result.end.assign("day", endDate); - return result; - } -} -exports.default = NLMonthNameMiddleEndianParser; -}); - -var NLMonthNameParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const constants_2 = constants; - -const PATTERN = new RegExp(`(${pattern.matchAnyPattern(constants.MONTH_DICTIONARY)})` + - `\\s*` + - `(?:` + - `[,-]?\\s*(${constants_2.YEAR_PATTERN})?` + - ")?" + - "(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i"); -const MONTH_NAME_GROUP = 1; -const YEAR_GROUP = 2; -class NLMonthNameParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const components = context.createParsingComponents(); - components.imply("day", 1); - const monthName = match[MONTH_NAME_GROUP]; - const month = constants.MONTH_DICTIONARY[monthName.toLowerCase()]; - components.assign("month", month); - if (match[YEAR_GROUP]) { - const year = constants_2.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } - else { - const year = years.findYearClosestToRef(context.refDate, 1, month); - components.imply("year", year); - } - return components; - } -} -exports.default = NLMonthNameParser; -}); - -var NLSlashMonthFormatParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i"); -const MONTH_GROUP = 1; -const YEAR_GROUP = 2; -class NLSlashMonthFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const year = parseInt(match[YEAR_GROUP]); - const month = parseInt(match[MONTH_GROUP]); - return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); - } -} -exports.default = NLSlashMonthFormatParser; -}); - -var NLTimeExpressionParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - -class NLTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:om)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\–|\\~|\\〜|om|\\?)\\s*"; - } - extractPrimaryTimeComponents(context, match) { - if (match[0].match(/^\s*\d{4}\s*$/)) { - return null; - } - return super.extractPrimaryTimeComponents(context, match); - } -} -exports.default = NLTimeExpressionParser; -}); - -var NLCasualYearMonthDayParser_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` + - `(?:(${pattern.matchAnyPattern(constants.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` + - `([0-9]{1,2})` + - "(?=\\W|$)", "i"); -const YEAR_NUMBER_GROUP = 1; -const MONTH_NAME_GROUP = 2; -const MONTH_NUMBER_GROUP = 3; -const DATE_NUMBER_GROUP = 4; -class NLCasualYearMonthDayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = match[MONTH_NUMBER_GROUP] - ? parseInt(match[MONTH_NUMBER_GROUP]) - : constants.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - if (month < 1 || month > 12) { - return null; - } - const year = parseInt(match[YEAR_NUMBER_GROUP]); - const day = parseInt(match[DATE_NUMBER_GROUP]); - return { - day: day, - month: month, - year: year, - }; - } -} -exports.default = NLCasualYearMonthDayParser; -}); - -var NLCasualDateTimeParser_1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - - - -const dayjs_2 = __importDefault(dayjs_min); -const DATE_GROUP = 1; -const TIME_OF_DAY_GROUP = 2; -class NLCasualDateTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; - } - innerExtract(context, match) { - const dateText = match[DATE_GROUP].toLowerCase(); - const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); - const component = context.createParsingComponents(); - const targetDate = dayjs_2.default(context.refDate); - switch (dateText) { - case "gisteren": - dayjs.assignSimilarDate(component, targetDate.add(-1, "day")); - break; - case "van": - dayjs.assignSimilarDate(component, targetDate); - break; - case "morgen": - dayjs.assignTheNextDay(component, targetDate); - break; - } - switch (timeText) { - case "ochtend": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 6); - break; - case "middag": - component.imply("meridiem", dist.Meridiem.AM); - component.imply("hour", 12); - break; - case "namiddag": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 15); - break; - case "avond": - component.imply("meridiem", dist.Meridiem.PM); - component.imply("hour", 20); - break; - } - return component; - } -} -exports.default = NLCasualDateTimeParser; -}); - -var nl = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - - -const NLMergeDateRangeRefiner_1$1 = __importDefault(NLMergeDateRangeRefiner_1); -const NLMergeDateTimeRefiner_1$1 = __importDefault(NLMergeDateTimeRefiner_1); -const NLCasualDateParser_1$1 = __importDefault(NLCasualDateParser_1); -const NLCasualTimeParser_1$1 = __importDefault(NLCasualTimeParser_1); -const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1); -const NLTimeUnitWithinFormatParser_1$1 = __importDefault(NLTimeUnitWithinFormatParser_1); -const NLWeekdayParser_1$1 = __importDefault(NLWeekdayParser_1); -const NLMonthNameMiddleEndianParser_1$1 = __importDefault(NLMonthNameMiddleEndianParser_1); -const NLMonthNameParser_1$1 = __importDefault(NLMonthNameParser_1); -const NLSlashMonthFormatParser_1$1 = __importDefault(NLSlashMonthFormatParser_1); -const NLTimeExpressionParser_1$1 = __importDefault(NLTimeExpressionParser_1); -const NLCasualYearMonthDayParser_1$1 = __importDefault(NLCasualYearMonthDayParser_1); -const NLCasualDateTimeParser_1$1 = __importDefault(NLCasualDateTimeParser_1); -exports.casual = new chrono$1.Chrono(createCasualConfiguration()); -exports.strict = new chrono$1.Chrono(createConfiguration(true)); -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new NLCasualDateParser_1$1.default()); - option.parsers.unshift(new NLCasualTimeParser_1$1.default()); - option.parsers.unshift(new NLCasualDateTimeParser_1$1.default()); - return option; -} -exports.createCasualConfiguration = createCasualConfiguration; -function createConfiguration(strictMode = true, littleEndian = true) { - return configurations.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1$1.default(littleEndian), - new NLMonthNameMiddleEndianParser_1$1.default(), - new NLMonthNameParser_1$1.default(), - new NLTimeExpressionParser_1$1.default(), - new NLTimeUnitWithinFormatParser_1$1.default(), - new NLSlashMonthFormatParser_1$1.default(), - new NLWeekdayParser_1$1.default(), - new NLCasualYearMonthDayParser_1$1.default(), - ], - refiners: [new NLMergeDateTimeRefiner_1$1.default(), new NLMergeDateRangeRefiner_1$1.default()], - }, strictMode); -} -exports.createConfiguration = createConfiguration; -}); - -var dist = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseDate = exports.parse = exports.casual = exports.strict = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0; -const en$1 = __importStar(en); -exports.en = en$1; - -Object.defineProperty(exports, "Chrono", { enumerable: true, get: function () { return chrono$1.Chrono; } }); -(function (Meridiem) { - Meridiem[Meridiem["AM"] = 0] = "AM"; - Meridiem[Meridiem["PM"] = 1] = "PM"; -})(exports.Meridiem || (exports.Meridiem = {})); -const de$1 = __importStar(de); -exports.de = de$1; -const fr$1 = __importStar(fr); -exports.fr = fr$1; -const ja$1 = __importStar(ja); -exports.ja = ja$1; -const pt$1 = __importStar(pt); -exports.pt = pt$1; -const nl$1 = __importStar(nl); -exports.nl = nl$1; -exports.strict = en$1.strict; -exports.casual = en$1.casual; -function parse(text, ref, option) { - return exports.casual.parse(text, ref, option); -} -exports.parse = parse; -function parseDate(text, ref, option) { - return exports.casual.parseDate(text, ref, option); -} -exports.parseDate = parseDate; -}); - -var chrono = /*@__PURE__*/getDefaultExportFromCjs(dist); - -/* src/ui/EditTask.svelte generated by Svelte v3.44.0 */ +// src/ui/EditTask.svelte +var import_chrono_node = __toModule(require_dist()); function create_fragment(ctx) { - let div12; - let form; - let div0; - let label0; - let t1; - let input0; - let t2; - let hr0; - let t3; - let div1; - let label1; - let t5; - let select; - let option0; - let option1; - let option2; - let option3; - let t10; - let hr1; - let t11; - let div2; - let label2; - let t13; - let input1; - let t14; - let code0; - let t15; - let html_tag; - let t16; - let hr2; - let t17; - let div6; - let div3; - let label3; - let t19; - let input2; - let t20; - let code1; - let t21; - let html_tag_1; - let t22; - let div4; - let label4; - let t24; - let input3; - let t25; - let code2; - let t26; - let html_tag_2; - let t27; - let div5; - let label5; - let t29; - let input4; - let t30; - let code3; - let t31; - let html_tag_3; - let t32; - let hr3; - let t33; - let div9; - let div7; - let t34; - let input5; - let input5_checked_value; - let t35; - let code4; - let t36_value = /*editableTask*/ ctx[0].status + ""; - let t36; - let t37; - let div8; - let t38; - let code5; - let t39; - let hr4; - let t40; - let div10; - let t41; - let div11; - let mounted; - let dispose; - - return { - c() { - div12 = element("div"); - form = element("form"); - div0 = element("div"); - label0 = element("label"); - label0.textContent = "Description"; - t1 = space(); - input0 = element("input"); - t2 = space(); - hr0 = element("hr"); - t3 = space(); - div1 = element("div"); - label1 = element("label"); - label1.textContent = "Priority"; - t5 = space(); - select = element("select"); - option0 = element("option"); - option0.textContent = "None"; - option1 = element("option"); - option1.textContent = "⏫ High"; - option2 = element("option"); - option2.textContent = "🔼 Medium"; - option3 = element("option"); - option3.textContent = "🔽 Low"; - t10 = space(); - hr1 = element("hr"); - t11 = space(); - div2 = element("div"); - label2 = element("label"); - label2.textContent = "Recurrence"; - t13 = space(); - input1 = element("input"); - t14 = space(); - code0 = element("code"); - t15 = text("🔁 "); - html_tag = new HtmlTag(); - t16 = space(); - hr2 = element("hr"); - t17 = space(); - div6 = element("div"); - div3 = element("div"); - label3 = element("label"); - label3.textContent = "Due"; - t19 = space(); - input2 = element("input"); - t20 = space(); - code1 = element("code"); - t21 = text("📅 "); - html_tag_1 = new HtmlTag(); - t22 = space(); - div4 = element("div"); - label4 = element("label"); - label4.textContent = "Scheduled"; - t24 = space(); - input3 = element("input"); - t25 = space(); - code2 = element("code"); - t26 = text("⏳ "); - html_tag_2 = new HtmlTag(); - t27 = space(); - div5 = element("div"); - label5 = element("label"); - label5.textContent = "Start"; - t29 = space(); - input4 = element("input"); - t30 = space(); - code3 = element("code"); - t31 = text("🛫 "); - html_tag_3 = new HtmlTag(); - t32 = space(); - hr3 = element("hr"); - t33 = space(); - div9 = element("div"); - div7 = element("div"); - t34 = text("Status:\n "); - input5 = element("input"); - t35 = space(); - code4 = element("code"); - t36 = text(t36_value); - t37 = space(); - div8 = element("div"); - t38 = text("Done on:\n "); - code5 = element("code"); - t39 = space(); - hr4 = element("hr"); - t40 = space(); - div10 = element("div"); - t41 = space(); - div11 = element("div"); - div11.innerHTML = ``; - attr(label0, "for", "description"); - attr(input0, "id", "description"); - attr(input0, "type", "text"); - attr(input0, "class", "tasks-modal-description"); - attr(input0, "placeholder", "Take out the trash"); - attr(div0, "class", "tasks-modal-section"); - attr(label1, "for", "priority"); - option0.__value = "none"; - option0.value = option0.__value; - option1.__value = "high"; - option1.value = option1.__value; - option2.__value = "medium"; - option2.value = option2.__value; - option3.__value = "low"; - option3.value = option3.__value; - attr(select, "id", "priority"); - attr(select, "class", "dropdown"); - if (/*editableTask*/ ctx[0].priority === void 0) add_render_callback(() => /*select_change_handler*/ ctx[14].call(select)); - attr(div1, "class", "tasks-modal-section"); - attr(label2, "for", "recurrence"); - attr(input1, "id", "description"); - attr(input1, "type", "text"); - attr(input1, "placeholder", "Try 'every 2 weeks on Thursday'."); - html_tag.a = null; - attr(div2, "class", "tasks-modal-section"); - attr(label3, "for", "due"); - attr(input2, "id", "due"); - attr(input2, "type", "text"); - attr(input2, "placeholder", "Try 'Monday' or 'tomorrow'."); - html_tag_1.a = null; - attr(div3, "class", "tasks-modal-date"); - attr(label4, "for", "scheduled"); - attr(input3, "id", "scheduled"); - attr(input3, "type", "text"); - attr(input3, "placeholder", "Try 'Monday' or 'tomorrow'."); - html_tag_2.a = null; - attr(div4, "class", "tasks-modal-date"); - attr(label5, "for", "start"); - attr(input4, "id", "start"); - attr(input4, "type", "text"); - attr(input4, "placeholder", "Try 'Monday' or 'tomorrow'."); - html_tag_3.a = null; - attr(div5, "class", "tasks-modal-date"); - attr(div6, "class", "tasks-modal-section"); - attr(input5, "type", "checkbox"); - attr(input5, "class", "task-list-item-checkbox tasks-modal-checkbox"); - input5.checked = input5_checked_value = /*editableTask*/ ctx[0].status === Status.Done; - input5.disabled = true; - attr(div9, "class", "tasks-modal-section"); - attr(div10, "class", "tasks-modal-section"); - attr(div11, "class", "tasks-modal-section"); - attr(div12, "class", "tasks-modal"); - }, - m(target, anchor) { - insert(target, div12, anchor); - append(div12, form); - append(form, div0); - append(div0, label0); - append(div0, t1); - append(div0, input0); - set_input_value(input0, /*editableTask*/ ctx[0].description); - /*input0_binding*/ ctx[13](input0); - append(form, t2); - append(form, hr0); - append(form, t3); - append(form, div1); - append(div1, label1); - append(div1, t5); - append(div1, select); - append(select, option0); - append(select, option1); - append(select, option2); - append(select, option3); - select_option(select, /*editableTask*/ ctx[0].priority); - append(form, t10); - append(form, hr1); - append(form, t11); - append(form, div2); - append(div2, label2); - append(div2, t13); - append(div2, input1); - set_input_value(input1, /*editableTask*/ ctx[0].recurrenceRule); - append(div2, t14); - append(div2, code0); - append(code0, t15); - html_tag.m(/*parsedRecurrence*/ ctx[5], code0); - append(form, t16); - append(form, hr2); - append(form, t17); - append(form, div6); - append(div6, div3); - append(div3, label3); - append(div3, t19); - append(div3, input2); - set_input_value(input2, /*editableTask*/ ctx[0].dueDate); - append(div3, t20); - append(div3, code1); - append(code1, t21); - html_tag_1.m(/*parsedDueDate*/ ctx[4], code1); - append(div6, t22); - append(div6, div4); - append(div4, label4); - append(div4, t24); - append(div4, input3); - set_input_value(input3, /*editableTask*/ ctx[0].scheduledDate); - append(div4, t25); - append(div4, code2); - append(code2, t26); - html_tag_2.m(/*parsedScheduledDate*/ ctx[3], code2); - append(div6, t27); - append(div6, div5); - append(div5, label5); - append(div5, t29); - append(div5, input4); - set_input_value(input4, /*editableTask*/ ctx[0].startDate); - append(div5, t30); - append(div5, code3); - append(code3, t31); - html_tag_3.m(/*parsedStartDate*/ ctx[2], code3); - append(form, t32); - append(form, hr3); - append(form, t33); - append(form, div9); - append(div9, div7); - append(div7, t34); - append(div7, input5); - append(div7, t35); - append(div7, code4); - append(code4, t36); - append(div9, t37); - append(div9, div8); - append(div8, t38); - append(div8, code5); - code5.innerHTML = /*parsedDone*/ ctx[6]; - append(form, t39); - append(form, hr4); - append(form, t40); - append(form, div10); - append(form, t41); - append(form, div11); - - if (!mounted) { - dispose = [ - listen(input0, "input", /*input0_input_handler*/ ctx[12]), - listen(select, "change", /*select_change_handler*/ ctx[14]), - listen(input1, "input", /*input1_input_handler*/ ctx[15]), - listen(input2, "input", /*input2_input_handler*/ ctx[16]), - listen(input3, "input", /*input3_input_handler*/ ctx[17]), - listen(input4, "input", /*input4_input_handler*/ ctx[18]), - listen(form, "submit", prevent_default(/*_onSubmit*/ ctx[7])) - ]; - - mounted = true; - } - }, - p(ctx, [dirty]) { - if (dirty & /*editableTask*/ 1 && input0.value !== /*editableTask*/ ctx[0].description) { - set_input_value(input0, /*editableTask*/ ctx[0].description); - } - - if (dirty & /*editableTask*/ 1) { - select_option(select, /*editableTask*/ ctx[0].priority); - } - - if (dirty & /*editableTask*/ 1 && input1.value !== /*editableTask*/ ctx[0].recurrenceRule) { - set_input_value(input1, /*editableTask*/ ctx[0].recurrenceRule); - } - - if (dirty & /*parsedRecurrence*/ 32) html_tag.p(/*parsedRecurrence*/ ctx[5]); - - if (dirty & /*editableTask*/ 1 && input2.value !== /*editableTask*/ ctx[0].dueDate) { - set_input_value(input2, /*editableTask*/ ctx[0].dueDate); - } - - if (dirty & /*parsedDueDate*/ 16) html_tag_1.p(/*parsedDueDate*/ ctx[4]); - - if (dirty & /*editableTask*/ 1 && input3.value !== /*editableTask*/ ctx[0].scheduledDate) { - set_input_value(input3, /*editableTask*/ ctx[0].scheduledDate); - } - - if (dirty & /*parsedScheduledDate*/ 8) html_tag_2.p(/*parsedScheduledDate*/ ctx[3]); - - if (dirty & /*editableTask*/ 1 && input4.value !== /*editableTask*/ ctx[0].startDate) { - set_input_value(input4, /*editableTask*/ ctx[0].startDate); - } - - if (dirty & /*parsedStartDate*/ 4) html_tag_3.p(/*parsedStartDate*/ ctx[2]); - - if (dirty & /*editableTask*/ 1 && input5_checked_value !== (input5_checked_value = /*editableTask*/ ctx[0].status === Status.Done)) { - input5.checked = input5_checked_value; - } - - if (dirty & /*editableTask*/ 1 && t36_value !== (t36_value = /*editableTask*/ ctx[0].status + "")) set_data(t36, t36_value); - if (dirty & /*parsedDone*/ 64) code5.innerHTML = /*parsedDone*/ ctx[6]; }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(div12); - /*input0_binding*/ ctx[13](null); - mounted = false; - run_all(dispose); - } - }; + let div12; + let form; + let div0; + let label0; + let t1; + let input0; + let t2; + let hr0; + let t3; + let div1; + let label1; + let t5; + let select; + let option0; + let option1; + let option2; + let option3; + let t10; + let hr1; + let t11; + let div2; + let label2; + let t13; + let input1; + let t14; + let code0; + let t15; + let html_tag; + let t16; + let hr2; + let t17; + let div6; + let div3; + let label3; + let t19; + let input2; + let t20; + let code1; + let t21; + let html_tag_1; + let t22; + let div4; + let label4; + let t24; + let input3; + let t25; + let code2; + let t26; + let html_tag_2; + let t27; + let div5; + let label5; + let t29; + let input4; + let t30; + let code3; + let t31; + let html_tag_3; + let t32; + let hr3; + let t33; + let div9; + let div7; + let t34; + let input5; + let input5_checked_value; + let t35; + let code4; + let t36_value = ctx[0].status + ""; + let t36; + let t37; + let div8; + let t38; + let code5; + let t39; + let hr4; + let t40; + let div10; + let t41; + let div11; + let mounted; + let dispose; + return { + c() { + div12 = element("div"); + form = element("form"); + div0 = element("div"); + label0 = element("label"); + label0.textContent = "Description"; + t1 = space(); + input0 = element("input"); + t2 = space(); + hr0 = element("hr"); + t3 = space(); + div1 = element("div"); + label1 = element("label"); + label1.textContent = "Priority"; + t5 = space(); + select = element("select"); + option0 = element("option"); + option0.textContent = "None"; + option1 = element("option"); + option1.textContent = "\u23EB High"; + option2 = element("option"); + option2.textContent = "\u{1F53C} Medium"; + option3 = element("option"); + option3.textContent = "\u{1F53D} Low"; + t10 = space(); + hr1 = element("hr"); + t11 = space(); + div2 = element("div"); + label2 = element("label"); + label2.textContent = "Recurrence"; + t13 = space(); + input1 = element("input"); + t14 = space(); + code0 = element("code"); + t15 = text("\u{1F501} "); + html_tag = new HtmlTag(); + t16 = space(); + hr2 = element("hr"); + t17 = space(); + div6 = element("div"); + div3 = element("div"); + label3 = element("label"); + label3.textContent = "Due"; + t19 = space(); + input2 = element("input"); + t20 = space(); + code1 = element("code"); + t21 = text("\u{1F4C5} "); + html_tag_1 = new HtmlTag(); + t22 = space(); + div4 = element("div"); + label4 = element("label"); + label4.textContent = "Scheduled"; + t24 = space(); + input3 = element("input"); + t25 = space(); + code2 = element("code"); + t26 = text("\u23F3 "); + html_tag_2 = new HtmlTag(); + t27 = space(); + div5 = element("div"); + label5 = element("label"); + label5.textContent = "Start"; + t29 = space(); + input4 = element("input"); + t30 = space(); + code3 = element("code"); + t31 = text("\u{1F6EB} "); + html_tag_3 = new HtmlTag(); + t32 = space(); + hr3 = element("hr"); + t33 = space(); + div9 = element("div"); + div7 = element("div"); + t34 = text("Status:\n "); + input5 = element("input"); + t35 = space(); + code4 = element("code"); + t36 = text(t36_value); + t37 = space(); + div8 = element("div"); + t38 = text("Done on:\n "); + code5 = element("code"); + t39 = space(); + hr4 = element("hr"); + t40 = space(); + div10 = element("div"); + t41 = space(); + div11 = element("div"); + div11.innerHTML = ``; + attr(label0, "for", "description"); + attr(input0, "id", "description"); + attr(input0, "type", "text"); + attr(input0, "class", "tasks-modal-description"); + attr(input0, "placeholder", "Take out the trash"); + attr(div0, "class", "tasks-modal-section"); + attr(label1, "for", "priority"); + option0.__value = "none"; + option0.value = option0.__value; + option1.__value = "high"; + option1.value = option1.__value; + option2.__value = "medium"; + option2.value = option2.__value; + option3.__value = "low"; + option3.value = option3.__value; + attr(select, "id", "priority"); + attr(select, "class", "dropdown"); + if (ctx[0].priority === void 0) + add_render_callback(() => ctx[14].call(select)); + attr(div1, "class", "tasks-modal-section"); + attr(label2, "for", "recurrence"); + attr(input1, "id", "description"); + attr(input1, "type", "text"); + attr(input1, "placeholder", "Try 'every 2 weeks on Thursday'."); + html_tag.a = null; + attr(div2, "class", "tasks-modal-section"); + attr(label3, "for", "due"); + attr(input2, "id", "due"); + attr(input2, "type", "text"); + attr(input2, "placeholder", "Try 'Monday' or 'tomorrow'."); + html_tag_1.a = null; + attr(div3, "class", "tasks-modal-date"); + attr(label4, "for", "scheduled"); + attr(input3, "id", "scheduled"); + attr(input3, "type", "text"); + attr(input3, "placeholder", "Try 'Monday' or 'tomorrow'."); + html_tag_2.a = null; + attr(div4, "class", "tasks-modal-date"); + attr(label5, "for", "start"); + attr(input4, "id", "start"); + attr(input4, "type", "text"); + attr(input4, "placeholder", "Try 'Monday' or 'tomorrow'."); + html_tag_3.a = null; + attr(div5, "class", "tasks-modal-date"); + attr(div6, "class", "tasks-modal-section"); + attr(input5, "type", "checkbox"); + attr(input5, "class", "task-list-item-checkbox tasks-modal-checkbox"); + input5.checked = input5_checked_value = ctx[0].status === Status.Done; + input5.disabled = true; + attr(div9, "class", "tasks-modal-section"); + attr(div10, "class", "tasks-modal-section"); + attr(div11, "class", "tasks-modal-section"); + attr(div12, "class", "tasks-modal"); + }, + m(target, anchor) { + insert(target, div12, anchor); + append(div12, form); + append(form, div0); + append(div0, label0); + append(div0, t1); + append(div0, input0); + set_input_value(input0, ctx[0].description); + ctx[13](input0); + append(form, t2); + append(form, hr0); + append(form, t3); + append(form, div1); + append(div1, label1); + append(div1, t5); + append(div1, select); + append(select, option0); + append(select, option1); + append(select, option2); + append(select, option3); + select_option(select, ctx[0].priority); + append(form, t10); + append(form, hr1); + append(form, t11); + append(form, div2); + append(div2, label2); + append(div2, t13); + append(div2, input1); + set_input_value(input1, ctx[0].recurrenceRule); + append(div2, t14); + append(div2, code0); + append(code0, t15); + html_tag.m(ctx[5], code0); + append(form, t16); + append(form, hr2); + append(form, t17); + append(form, div6); + append(div6, div3); + append(div3, label3); + append(div3, t19); + append(div3, input2); + set_input_value(input2, ctx[0].dueDate); + append(div3, t20); + append(div3, code1); + append(code1, t21); + html_tag_1.m(ctx[4], code1); + append(div6, t22); + append(div6, div4); + append(div4, label4); + append(div4, t24); + append(div4, input3); + set_input_value(input3, ctx[0].scheduledDate); + append(div4, t25); + append(div4, code2); + append(code2, t26); + html_tag_2.m(ctx[3], code2); + append(div6, t27); + append(div6, div5); + append(div5, label5); + append(div5, t29); + append(div5, input4); + set_input_value(input4, ctx[0].startDate); + append(div5, t30); + append(div5, code3); + append(code3, t31); + html_tag_3.m(ctx[2], code3); + append(form, t32); + append(form, hr3); + append(form, t33); + append(form, div9); + append(div9, div7); + append(div7, t34); + append(div7, input5); + append(div7, t35); + append(div7, code4); + append(code4, t36); + append(div9, t37); + append(div9, div8); + append(div8, t38); + append(div8, code5); + code5.innerHTML = ctx[6]; + append(form, t39); + append(form, hr4); + append(form, t40); + append(form, div10); + append(form, t41); + append(form, div11); + if (!mounted) { + dispose = [ + listen(input0, "input", ctx[12]), + listen(select, "change", ctx[14]), + listen(input1, "input", ctx[15]), + listen(input2, "input", ctx[16]), + listen(input3, "input", ctx[17]), + listen(input4, "input", ctx[18]), + listen(form, "submit", prevent_default(ctx[7])) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 1 && input0.value !== ctx2[0].description) { + set_input_value(input0, ctx2[0].description); + } + if (dirty & 1) { + select_option(select, ctx2[0].priority); + } + if (dirty & 1 && input1.value !== ctx2[0].recurrenceRule) { + set_input_value(input1, ctx2[0].recurrenceRule); + } + if (dirty & 32) + html_tag.p(ctx2[5]); + if (dirty & 1 && input2.value !== ctx2[0].dueDate) { + set_input_value(input2, ctx2[0].dueDate); + } + if (dirty & 16) + html_tag_1.p(ctx2[4]); + if (dirty & 1 && input3.value !== ctx2[0].scheduledDate) { + set_input_value(input3, ctx2[0].scheduledDate); + } + if (dirty & 8) + html_tag_2.p(ctx2[3]); + if (dirty & 1 && input4.value !== ctx2[0].startDate) { + set_input_value(input4, ctx2[0].startDate); + } + if (dirty & 4) + html_tag_3.p(ctx2[2]); + if (dirty & 1 && input5_checked_value !== (input5_checked_value = ctx2[0].status === Status.Done)) { + input5.checked = input5_checked_value; + } + if (dirty & 1 && t36_value !== (t36_value = ctx2[0].status + "")) + set_data(t36, t36_value); + if (dirty & 64) + code5.innerHTML = ctx2[6]; + ; + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div12); + ctx[13](null); + mounted = false; + run_all(dispose); + } + }; } - function instance($$self, $$props, $$invalidate) { - var _a, _b; - let { task } = $$props; - let { onSubmit } = $$props; - let descriptionInput; - - let editableTask = { - description: '', - status: Status.Todo, - priority: 'none', - recurrenceRule: '', - startDate: '', - scheduledDate: '', - dueDate: '', - doneDate: '' - }; - - let parsedStartDate = ''; - let parsedScheduledDate = ''; - let parsedDueDate = ''; - let parsedRecurrence = ''; - let parsedDone = ''; - - onMount(() => { - const { globalFilter } = getSettings(); - const description = task.description.replace(globalFilter, '').replace(' ', ' ').trim(); - let priority = 'none'; - - if (task.priority === Priority.Low) { - priority = 'low'; - } else if (task.priority === Priority.Medium) { - priority = 'medium'; - } else if (task.priority === Priority.High) { - priority = 'high'; - } - - $$invalidate(0, editableTask = { - description, - status: task.status, - priority, - recurrenceRule: task.recurrence ? task.recurrence.toText() : '', - startDate: task.startDate - ? task.startDate.format('YYYY-MM-DD') - : '', - scheduledDate: task.scheduledDate - ? task.scheduledDate.format('YYYY-MM-DD') - : '', - dueDate: task.dueDate ? task.dueDate.format('YYYY-MM-DD') : '', - doneDate: task.doneDate ? task.doneDate.format('YYYY-MM-DD') : '' - }); - - setTimeout( - () => { - descriptionInput.focus(); - }, - 10 - ); - }); - - const _onSubmit = () => { - const { globalFilter } = getSettings(); - let description = editableTask.description.trim(); - - if (!description.includes(globalFilter)) { - description = globalFilter + ' ' + description; - } - - let startDate = null; - const parsedStartDate = chrono.parseDate(editableTask.startDate, new Date(), { forwardDate: true }); - - if (parsedStartDate !== null) { - startDate = window.moment(parsedStartDate); - } - - let scheduledDate = null; - const parsedScheduledDate = chrono.parseDate(editableTask.scheduledDate, new Date(), { forwardDate: true }); - - if (parsedScheduledDate !== null) { - scheduledDate = window.moment(parsedScheduledDate); - } - - let dueDate = null; - const parsedDueDate = chrono.parseDate(editableTask.dueDate, new Date(), { forwardDate: true }); - - if (parsedDueDate !== null) { - dueDate = window.moment(parsedDueDate); - } - - let recurrence = null; - - if (editableTask.recurrenceRule) { - recurrence = Recurrence.fromText({ - recurrenceRuleText: editableTask.recurrenceRule, - startDate, - scheduledDate, - dueDate - }); - } - - let parsedPriority; - - switch (editableTask.priority) { - case 'low': - parsedPriority = Priority.Low; - break; - case 'medium': - parsedPriority = Priority.Medium; - break; - case 'high': - parsedPriority = Priority.High; - break; - default: - parsedPriority = Priority.None; - } - - const updatedTask = new Task(Object.assign(Object.assign({}, task), { - description, - status: editableTask.status, - priority: parsedPriority, - recurrence, - startDate, - scheduledDate, - dueDate, - doneDate: window.moment(editableTask.doneDate, 'YYYY-MM-DD').isValid() - ? window.moment(editableTask.doneDate, 'YYYY-MM-DD') - : null - })); - - onSubmit([updatedTask]); - }; - - function input0_input_handler() { - editableTask.description = this.value; - $$invalidate(0, editableTask); - } - - function input0_binding($$value) { - binding_callbacks[$$value ? 'unshift' : 'push'](() => { - descriptionInput = $$value; - $$invalidate(1, descriptionInput); - }); - } - - function select_change_handler() { - editableTask.priority = select_value(this); - $$invalidate(0, editableTask); - } - - function input1_input_handler() { - editableTask.recurrenceRule = this.value; - $$invalidate(0, editableTask); - } - - function input2_input_handler() { - editableTask.dueDate = this.value; - $$invalidate(0, editableTask); - } - - function input3_input_handler() { - editableTask.scheduledDate = this.value; - $$invalidate(0, editableTask); - } - - function input4_input_handler() { - editableTask.startDate = this.value; - $$invalidate(0, editableTask); - } - - $$self.$$set = $$props => { - if ('task' in $$props) $$invalidate(8, task = $$props.task); - if ('onSubmit' in $$props) $$invalidate(9, onSubmit = $$props.onSubmit); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*editableTask*/ 1) { - { - if (!editableTask.startDate) { - $$invalidate(2, parsedStartDate = 'no start date'); - } else { - const parsed = chrono.parseDate(editableTask.startDate, new Date(), { forwardDate: true }); - - if (parsed !== null) { - $$invalidate(2, parsedStartDate = window.moment(parsed).format('YYYY-MM-DD')); - } else { - $$invalidate(2, parsedStartDate = 'invalid start date'); - } - } - } - } - - if ($$self.$$.dirty & /*editableTask*/ 1) { - { - if (!editableTask.scheduledDate) { - $$invalidate(3, parsedScheduledDate = 'no scheduled date'); - } else { - const parsed = chrono.parseDate(editableTask.scheduledDate, new Date(), { forwardDate: true }); - - if (parsed !== null) { - $$invalidate(3, parsedScheduledDate = window.moment(parsed).format('YYYY-MM-DD')); - } else { - $$invalidate(3, parsedScheduledDate = 'invalid scheduled date'); - } - } - } - } - - if ($$self.$$.dirty & /*editableTask*/ 1) { - { - if (!editableTask.dueDate) { - $$invalidate(4, parsedDueDate = 'no due date'); - } else { - const parsed = chrono.parseDate(editableTask.dueDate, new Date(), { forwardDate: true }); - - if (parsed !== null) { - $$invalidate(4, parsedDueDate = window.moment(parsed).format('YYYY-MM-DD')); - } else { - $$invalidate(4, parsedDueDate = 'invalid due date'); - } - } - } - } - - if ($$self.$$.dirty & /*editableTask, _a, _b*/ 3073) { - { - if (!editableTask.recurrenceRule) { - $$invalidate(5, parsedRecurrence = 'not recurring'); - } else { - $$invalidate(5, parsedRecurrence = $$invalidate(11, _b = $$invalidate(10, _a = Recurrence.fromText({ - recurrenceRuleText: editableTask.recurrenceRule, - // Only for representation in the modal, no dates required. - startDate: null, - scheduledDate: null, - dueDate: null - })) === null || _a === void 0 - ? void 0 - : _a.toText()) !== null && _b !== void 0 - ? _b - : 'invalid recurrence rule'); - } - } - } - - if ($$self.$$.dirty & /*editableTask*/ 1) { - { - if (!editableTask.doneDate) { - $$invalidate(6, parsedDone = 'no done date'); - } else { - const parsed = chrono.parseDate(editableTask.doneDate); - - if (parsed !== null) { - $$invalidate(6, parsedDone = window.moment(parsed).format('YYYY-MM-DD')); - } else { - $$invalidate(6, parsedDone = 'invalid done date'); - } - } - } - } - }; - - return [ - editableTask, - descriptionInput, - parsedStartDate, - parsedScheduledDate, - parsedDueDate, - parsedRecurrence, - parsedDone, - _onSubmit, - task, - onSubmit, - _a, - _b, - input0_input_handler, - input0_binding, - select_change_handler, - input1_input_handler, - input2_input_handler, - input3_input_handler, - input4_input_handler - ]; -} - -class EditTask extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance, create_fragment, safe_not_equal, { task: 8, onSubmit: 9 }); - } -} - -class TaskModal extends obsidian.Modal { - constructor({ app, task, onSubmit, }) { - super(app); - this.task = task; - this.onSubmit = (updatedTasks) => { - onSubmit(updatedTasks); - this.close(); - }; + var _a, _b; + let { task } = $$props; + let { onSubmit } = $$props; + let descriptionInput; + let editableTask = { + description: "", + status: Status.Todo, + priority: "none", + recurrenceRule: "", + startDate: "", + scheduledDate: "", + dueDate: "", + doneDate: "" + }; + let parsedStartDate = ""; + let parsedScheduledDate = ""; + let parsedDueDate = ""; + let parsedRecurrence = ""; + let parsedDone = ""; + onMount(() => { + const { globalFilter } = getSettings(); + const description = task.description.replace(globalFilter, "").replace(" ", " ").trim(); + let priority = "none"; + if (task.priority === Priority.Low) { + priority = "low"; + } else if (task.priority === Priority.Medium) { + priority = "medium"; + } else if (task.priority === Priority.High) { + priority = "high"; } - onOpen() { - this.titleEl.setText('Create or edit Task'); - const { contentEl } = this; - new EditTask({ - target: contentEl, - props: { task: this.task, onSubmit: this.onSubmit }, - }); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} - -const createOrEdit = (checking, editor, view, app) => { - var _a; - if (checking) { - return view instanceof obsidian.MarkdownView; - } - if (!(view instanceof obsidian.MarkdownView)) { - // Should never happen due to check above. - return; - } - const path = (_a = view.file) === null || _a === void 0 ? void 0 : _a.path; - if (path === undefined) { - return; - } - const cursorPosition = editor.getCursor(); - const lineNumber = cursorPosition.line; - const line = editor.getLine(lineNumber); - const task = taskFromLine({ line, path }); - const onSubmit = (updatedTasks) => { - const serialized = updatedTasks - .map((task) => task.toFileLineString()) - .join('\n'); - editor.setLine(lineNumber, serialized); - }; - // Need to create a new instance every time, as cursor/task can change. - const taskModal = new TaskModal({ - app, - task, - onSubmit, + $$invalidate(0, editableTask = { + description, + status: task.status, + priority, + recurrenceRule: task.recurrence ? task.recurrence.toText() : "", + startDate: task.startDate ? task.startDate.format("YYYY-MM-DD") : "", + scheduledDate: task.scheduledDate ? task.scheduledDate.format("YYYY-MM-DD") : "", + dueDate: task.dueDate ? task.dueDate.format("YYYY-MM-DD") : "", + doneDate: task.doneDate ? task.doneDate.format("YYYY-MM-DD") : "" }); - taskModal.open(); -}; -const taskFromLine = ({ line, path }) => { - var _a; - const task = Task.fromLine({ - line, - path, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, // We don't need this to toggle it here in the editor. - }); - if (task !== null) { - return task; + setTimeout(() => { + descriptionInput.focus(); + }, 10); + }); + const _onSubmit = () => { + const { globalFilter } = getSettings(); + let description = editableTask.description.trim(); + if (!description.includes(globalFilter)) { + description = globalFilter + " " + description; } - // If we are not on a line of a task, we take what we have. - // The non-task line can still be a checklist, for example if it is lacking the global filter. - const nonTaskRegex = /^([\s\t]*)[-*]? *(\[(.)\])? *(.*)/u; - const nonTaskMatch = line.match(nonTaskRegex); - if (nonTaskMatch === null) { - // Should never happen; everything in the regex is optional. - console.error('Tasks: Cannot create task on line:', line); - return new Task({ - status: Status.Todo, - description: '', - path, - indentation: '', - originalStatusCharacter: ' ', - priority: Priority.None, + let startDate = null; + const parsedStartDate2 = import_chrono_node.default.parseDate(editableTask.startDate, new Date(), { forwardDate: true }); + if (parsedStartDate2 !== null) { + startDate = window.moment(parsedStartDate2); + } + let scheduledDate = null; + const parsedScheduledDate2 = import_chrono_node.default.parseDate(editableTask.scheduledDate, new Date(), { forwardDate: true }); + if (parsedScheduledDate2 !== null) { + scheduledDate = window.moment(parsedScheduledDate2); + } + let dueDate = null; + const parsedDueDate2 = import_chrono_node.default.parseDate(editableTask.dueDate, new Date(), { forwardDate: true }); + if (parsedDueDate2 !== null) { + dueDate = window.moment(parsedDueDate2); + } + let recurrence = null; + if (editableTask.recurrenceRule) { + recurrence = Recurrence.fromText({ + recurrenceRuleText: editableTask.recurrenceRule, + startDate, + scheduledDate, + dueDate + }); + } + let parsedPriority; + switch (editableTask.priority) { + case "low": + parsedPriority = Priority.Low; + break; + case "medium": + parsedPriority = Priority.Medium; + break; + case "high": + parsedPriority = Priority.High; + break; + default: + parsedPriority = Priority.None; + } + const updatedTask = new Task(Object.assign(Object.assign({}, task), { + description, + status: editableTask.status, + priority: parsedPriority, + recurrence, + startDate, + scheduledDate, + dueDate, + doneDate: window.moment(editableTask.doneDate, "YYYY-MM-DD").isValid() ? window.moment(editableTask.doneDate, "YYYY-MM-DD") : null + })); + onSubmit([updatedTask]); + }; + function input0_input_handler() { + editableTask.description = this.value; + $$invalidate(0, editableTask); + } + function input0_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + descriptionInput = $$value; + $$invalidate(1, descriptionInput); + }); + } + function select_change_handler() { + editableTask.priority = select_value(this); + $$invalidate(0, editableTask); + } + function input1_input_handler() { + editableTask.recurrenceRule = this.value; + $$invalidate(0, editableTask); + } + function input2_input_handler() { + editableTask.dueDate = this.value; + $$invalidate(0, editableTask); + } + function input3_input_handler() { + editableTask.scheduledDate = this.value; + $$invalidate(0, editableTask); + } + function input4_input_handler() { + editableTask.startDate = this.value; + $$invalidate(0, editableTask); + } + $$self.$$set = ($$props2) => { + if ("task" in $$props2) + $$invalidate(8, task = $$props2.task); + if ("onSubmit" in $$props2) + $$invalidate(9, onSubmit = $$props2.onSubmit); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 1) { + $: { + if (!editableTask.startDate) { + $$invalidate(2, parsedStartDate = "no start date"); + } else { + const parsed = import_chrono_node.default.parseDate(editableTask.startDate, new Date(), { forwardDate: true }); + if (parsed !== null) { + $$invalidate(2, parsedStartDate = window.moment(parsed).format("YYYY-MM-DD")); + } else { + $$invalidate(2, parsedStartDate = "invalid start date"); + } + } + } + } + if ($$self.$$.dirty & 1) { + $: { + if (!editableTask.scheduledDate) { + $$invalidate(3, parsedScheduledDate = "no scheduled date"); + } else { + const parsed = import_chrono_node.default.parseDate(editableTask.scheduledDate, new Date(), { forwardDate: true }); + if (parsed !== null) { + $$invalidate(3, parsedScheduledDate = window.moment(parsed).format("YYYY-MM-DD")); + } else { + $$invalidate(3, parsedScheduledDate = "invalid scheduled date"); + } + } + } + } + if ($$self.$$.dirty & 1) { + $: { + if (!editableTask.dueDate) { + $$invalidate(4, parsedDueDate = "no due date"); + } else { + const parsed = import_chrono_node.default.parseDate(editableTask.dueDate, new Date(), { forwardDate: true }); + if (parsed !== null) { + $$invalidate(4, parsedDueDate = window.moment(parsed).format("YYYY-MM-DD")); + } else { + $$invalidate(4, parsedDueDate = "invalid due date"); + } + } + } + } + if ($$self.$$.dirty & 3073) { + $: { + if (!editableTask.recurrenceRule) { + $$invalidate(5, parsedRecurrence = "not recurring"); + } else { + $$invalidate(5, parsedRecurrence = $$invalidate(11, _b = $$invalidate(10, _a = Recurrence.fromText({ + recurrenceRuleText: editableTask.recurrenceRule, startDate: null, scheduledDate: null, - dueDate: null, - doneDate: null, - recurrence: null, - // We don't need the following fields to edit here in the editor. - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - blockLink: '', - }); + dueDate: null + })) === null || _a === void 0 ? void 0 : _a.toText()) !== null && _b !== void 0 ? _b : "invalid recurrence rule"); + } + } } - const indentation = nonTaskMatch[1]; - const statusString = (_a = nonTaskMatch[3]) !== null && _a !== void 0 ? _a : ' '; - const status = statusString === ' ' ? Status.Todo : Status.Done; - let description = nonTaskMatch[4]; - const blockLinkMatch = line.match(Task.blockLinkRegex); - const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ''; - if (blockLink !== '') { - description = description.replace(Task.blockLinkRegex, ''); + if ($$self.$$.dirty & 1) { + $: { + if (!editableTask.doneDate) { + $$invalidate(6, parsedDone = "no done date"); + } else { + const parsed = import_chrono_node.default.parseDate(editableTask.doneDate); + if (parsed !== null) { + $$invalidate(6, parsedDone = window.moment(parsed).format("YYYY-MM-DD")); + } else { + $$invalidate(6, parsedDone = "invalid done date"); + } + } + } } + }; + return [ + editableTask, + descriptionInput, + parsedStartDate, + parsedScheduledDate, + parsedDueDate, + parsedRecurrence, + parsedDone, + _onSubmit, + task, + onSubmit, + _a, + _b, + input0_input_handler, + input0_binding, + select_change_handler, + input1_input_handler, + input2_input_handler, + input3_input_handler, + input4_input_handler + ]; +} +var EditTask = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { task: 8, onSubmit: 9 }); + } +}; +var EditTask_default = EditTask; + +// src/TaskModal.ts +var TaskModal = class extends import_obsidian4.Modal { + constructor({ + app, + task, + onSubmit + }) { + super(app); + this.task = task; + this.onSubmit = (updatedTasks) => { + onSubmit(updatedTasks); + this.close(); + }; + } + onOpen() { + this.titleEl.setText("Create or edit Task"); + const { contentEl } = this; + new EditTask_default({ + target: contentEl, + props: { task: this.task, onSubmit: this.onSubmit } + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/Commands/CreateOrEdit.ts +var createOrEdit = (checking, editor, view, app) => { + var _a; + if (checking) { + return view instanceof import_obsidian5.MarkdownView; + } + if (!(view instanceof import_obsidian5.MarkdownView)) { + return; + } + const path = (_a = view.file) == null ? void 0 : _a.path; + if (path === void 0) { + return; + } + const cursorPosition = editor.getCursor(); + const lineNumber = cursorPosition.line; + const line = editor.getLine(lineNumber); + const task = taskFromLine({ line, path }); + const onSubmit = (updatedTasks) => { + const serialized = updatedTasks.map((task2) => task2.toFileLineString()).join("\n"); + editor.setLine(lineNumber, serialized); + }; + const taskModal = new TaskModal({ + app, + task, + onSubmit + }); + taskModal.open(); +}; +var taskFromLine = ({ line, path }) => { + var _a; + const task = Task.fromLine({ + line, + path, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null + }); + if (task !== null) { + return task; + } + const nonTaskRegex = /^([\s\t]*)[-*]? *(\[(.)\])? *(.*)/u; + const nonTaskMatch = line.match(nonTaskRegex); + if (nonTaskMatch === null) { + console.error("Tasks: Cannot create task on line:", line); return new Task({ - status, - description, - path, - indentation, - originalStatusCharacter: statusString, - blockLink, - priority: Priority.None, - startDate: null, - scheduledDate: null, - dueDate: null, - doneDate: null, - recurrence: null, - // We don't need the following fields to edit here in the editor. - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, + status: Status.Todo, + description: "", + path, + indentation: "", + originalStatusCharacter: " ", + priority: Priority.None, + startDate: null, + scheduledDate: null, + dueDate: null, + doneDate: null, + recurrence: null, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + blockLink: "" }); + } + const indentation = nonTaskMatch[1]; + const statusString = (_a = nonTaskMatch[3]) != null ? _a : " "; + const status = statusString === " " ? Status.Todo : Status.Done; + let description = nonTaskMatch[4]; + const blockLinkMatch = line.match(Task.blockLinkRegex); + const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; + if (blockLink !== "") { + description = description.replace(Task.blockLinkRegex, ""); + } + return new Task({ + status, + description, + path, + indentation, + originalStatusCharacter: statusString, + blockLink, + priority: Priority.None, + startDate: null, + scheduledDate: null, + dueDate: null, + doneDate: null, + recurrence: null, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null + }); }; -const toggleDone = (checking, editor, view) => { - var _a; - if (checking) { - if (!(view instanceof obsidian.MarkdownView)) { - // If we are not in a markdown view, the command shouldn't be shown. - return false; - } - // The command should always trigger in a markdown view: - // - Convert lines to list items. - // - Convert list items to tasks. - // - Toggle tasks' status. - return true; +// src/Commands/ToggleDone.ts +var import_obsidian6 = __toModule(require("obsidian")); +var toggleDone = (checking, editor, view) => { + var _a; + if (checking) { + if (!(view instanceof import_obsidian6.MarkdownView)) { + return false; } - if (!(view instanceof obsidian.MarkdownView)) { - // Should never happen due to check above. - return; - } - // We are certain we are in the editor due to the check above. - const path = (_a = view.file) === null || _a === void 0 ? void 0 : _a.path; - if (path === undefined) { - return; - } - const cursorPosition = editor.getCursor(); - const lineNumber = cursorPosition.line; - const line = editor.getLine(lineNumber); - const toggledLine = toggleLine({ line, path }); - editor.setLine(lineNumber, toggledLine); - // The cursor is moved to the end of the line by default. - // If there is text on the line, put the cursor back where it was on the line. - if (/[^ [\]*-]/.test(toggledLine)) { - editor.setCursor({ - line: cursorPosition.line, - // Need to move the cursor by the distance we added to the beginning. - ch: cursorPosition.ch + toggledLine.length - line.length, - }); - } -}; -const toggleLine = ({ line, path }) => { - let toggledLine = line; - const task = Task.fromLine({ - line, - path, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, // We don't need this to toggle it here in the editor. + return true; + } + if (!(view instanceof import_obsidian6.MarkdownView)) { + return; + } + const path = (_a = view.file) == null ? void 0 : _a.path; + if (path === void 0) { + return; + } + const cursorPosition = editor.getCursor(); + const lineNumber = cursorPosition.line; + const line = editor.getLine(lineNumber); + const toggledLine = toggleLine({ line, path }); + editor.setLine(lineNumber, toggledLine); + if (/[^ [\]*-]/.test(toggledLine)) { + editor.setCursor({ + line: cursorPosition.line, + ch: cursorPosition.ch + toggledLine.length - line.length }); - if (task !== null) { - toggledLine = toggleTask({ task }); - } - else { - // If the task is null this means that we have one of: - // 1. a regular checklist item - // 2. a list item - // 3. a simple text line - // The task regex will match checklist items. - const regexMatch = line.match(Task.taskRegex); - if (regexMatch !== null) { - toggledLine = toggleChecklistItem({ regexMatch }); - } - else { - // This is not a checklist item. It is one of: - // 1. a list item - // 2. a simple text line - const listItemRegex = /^([\s\t]*)([-*])/; - if (listItemRegex.test(line)) { - // Let's convert the list item to a checklist item. - toggledLine = line.replace(listItemRegex, '$1$2 [ ]'); - } - else { - // Let's convert the line to a list item. - toggledLine = line.replace(/^([\s\t]*)/, '$1- '); - } - } - } - return toggledLine; + } }; -const toggleTask = ({ task }) => { - // Toggle a regular task. - const toggledTasks = task.toggle(); - const serialized = toggledTasks - .map((task) => task.toFileLineString()) - .join('\n'); - return serialized; +var toggleLine = ({ line, path }) => { + let toggledLine = line; + const task = Task.fromLine({ + line, + path, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null + }); + if (task !== null) { + toggledLine = toggleTask({ task }); + } else { + const regexMatch = line.match(Task.taskRegex); + if (regexMatch !== null) { + toggledLine = toggleChecklistItem({ regexMatch }); + } else { + const listItemRegex = /^([\s\t]*)([-*])/; + if (listItemRegex.test(line)) { + toggledLine = line.replace(listItemRegex, "$1$2 [ ]"); + } else { + toggledLine = line.replace(/^([\s\t]*)/, "$1- "); + } + } + } + return toggledLine; }; -const toggleChecklistItem = ({ regexMatch, }) => { - // It's a checklist item, let's toggle it. - const indentation = regexMatch[1]; - const statusString = regexMatch[2].toLowerCase(); - const body = regexMatch[3]; - const toggledStatusString = statusString === ' ' ? 'x' : ' '; - const toggledLine = `${indentation}- [${toggledStatusString}] ${body}`; - return toggledLine; +var toggleTask = ({ task }) => { + const toggledTasks = task.toggle(); + const serialized = toggledTasks.map((task2) => task2.toFileLineString()).join("\n"); + return serialized; +}; +var toggleChecklistItem = ({ + regexMatch +}) => { + const indentation = regexMatch[1]; + const statusString = regexMatch[2].toLowerCase(); + const body = regexMatch[3]; + const toggledStatusString = statusString === " " ? "x" : " "; + const toggledLine = `${indentation}- [${toggledStatusString}] ${body}`; + return toggledLine; }; -class Commands { - constructor({ plugin }) { - this.plugin = plugin; - plugin.addCommand({ - id: 'edit-task', - name: 'Create or edit task', - icon: 'pencil', - editorCheckCallback: (checking, editor, view) => { - return createOrEdit(checking, editor, view, this.app); - }, - }); - plugin.addCommand({ - id: 'toggle-done', - name: 'Toggle task done', - icon: 'check-in-circle', - editorCheckCallback: toggleDone, - }); - } - get app() { - return this.plugin.app; - } -} +// src/Commands/index.ts +var Commands = class { + get app() { + return this.plugin.app; + } + constructor({ plugin }) { + this.plugin = plugin; + plugin.addCommand({ + id: "edit-task", + name: "Create or edit task", + icon: "pencil", + editorCheckCallback: (checking, editor, view) => { + return createOrEdit(checking, editor, view, this.app); + } + }); + plugin.addCommand({ + id: "toggle-done", + name: "Toggle task done", + icon: "check-in-circle", + editorCheckCallback: toggleDone + }); + } +}; +// src/Events.ts var Event; -(function (Event) { - Event["CacheUpdate"] = "obsidian-tasks-plugin:cache-update"; - Event["RequestCacheUpdate"] = "obsidian-tasks-plugin:request-cache-update"; +(function(Event2) { + Event2["CacheUpdate"] = "obsidian-tasks-plugin:cache-update"; + Event2["RequestCacheUpdate"] = "obsidian-tasks-plugin:request-cache-update"; })(Event || (Event = {})); -class Events { - constructor({ obsidianEents }) { - this.obsidianEvents = obsidianEents; - } - onCacheUpdate(handler) { - return this.obsidianEvents.on(Event.CacheUpdate, handler); - } - triggerCacheUpdate(cacheData) { - this.obsidianEvents.trigger(Event.CacheUpdate, cacheData); - } - onRequestCacheUpdate(handler) { - return this.obsidianEvents.on(Event.RequestCacheUpdate, handler); - } - triggerRequestCacheUpdate(fn) { - this.obsidianEvents.trigger(Event.RequestCacheUpdate, fn); - } - off(eventRef) { - this.obsidianEvents.offref(eventRef); - } -} - -class InlineRenderer { - constructor({ plugin }) { - this.markdownPostProcessor = this._markdownPostProcessor.bind(this); - plugin.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this)); - } - _markdownPostProcessor(element, context) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const { globalFilter } = getSettings(); - const renderedElements = element - .findAll('.task-list-item') - .filter((taskItem) => { - var _a; - const linesText = (_a = taskItem.textContent) === null || _a === void 0 ? void 0 : _a.split('\n'); - if (linesText === undefined) { - return false; - } - // Only the first line. Can be multiple lines if an LI element contains an UL. - // Want to match the top level LI independently from its children. - // There was a false positive, when the LI wasn't a task itself, but contained the - // global filter in child LIs. - let firstLineText = null; - // The first line is the first line that is not empty. Empty lines can exist when - // the checklist in markdown includes blank lines (see #313). - for (let i = 0; i < linesText.length; i = i + 1) { - if (linesText[i] !== '') { - firstLineText = linesText[i]; - break; - } - } - if (firstLineText === null) { - return false; - } - return firstLineText.includes(globalFilter); - }); - if (renderedElements.length === 0) { - // No tasks means nothing to do. - return; - } - const path = context.sourcePath; - const section = context.getSectionInfo(element); - if (section === null) { - // We cannot process the render without the section info. - return; - } - const fileLines = section.text.split('\n'); - let sectionIndex = 0; - const fileTasks = []; - for (let lineNumber = section.lineStart; lineNumber <= section.lineEnd; lineNumber++) { - const line = fileLines[lineNumber]; - if (line === undefined) { - // If we end up outside the range of the file, - // we cannot process this task. - continue; - } - const task = Task.fromLine({ - line, - path, - sectionStart: section.lineStart, - sectionIndex, - precedingHeader: null, // We don't need the preceding header for in-line rendering. - }); - if (task !== null) { - fileTasks.push(task); - sectionIndex++; - } - } - // The section index is the nth task within this section. - for (let sectionIndex = 0; sectionIndex < renderedElements.length; sectionIndex++) { - const task = fileTasks[sectionIndex]; - const renderedElement = renderedElements[sectionIndex]; - if (task === undefined || renderedElement === undefined) { - // Assuming match of tasks in file and render preview. - // If there is a mis-match in the numbers, we still process - // what we can. - continue; - } - const dataLine = (_a = renderedElement.getAttr('data-line')) !== null && _a !== void 0 ? _a : '0'; - const listIndex = Number.parseInt(dataLine, 10); - const taskElement = yield task.toLi({ - parentUlElement: element, - listIndex, - }); - // If the rendered element contains a sub-list or sub-div (e.g. the - // folding arrow), we need to keep it. - const renderedChildren = renderedElement.childNodes; - for (let i = 0; i < renderedChildren.length; i = i + 1) { - const renderedChild = renderedChildren[i]; - if (renderedChild.nodeName.toLowerCase() === 'div') { - taskElement.prepend(renderedChild); - } - else if (renderedChild.nodeName.toLowerCase() === 'ul') { - taskElement.append(renderedChild); - } - } - // Re-set the original footnotes. - // The newly rendered HTML won't have the correct indexes and links - // from the original document. - const originalFootnotes = renderedElement.querySelectorAll('[data-footnote-id]'); - const newFootnotes = taskElement.querySelectorAll('[data-footnote-id]'); - if (originalFootnotes.length === newFootnotes.length) { - for (let i = 0; i < originalFootnotes.length; i++) { - newFootnotes[i].replaceWith(originalFootnotes[i]); - } - } - renderedElement.replaceWith(taskElement); - } - }); - } -} - -class Query { - constructor({ source }) { - this._limit = undefined; - this._layoutOptions = new LayoutOptions(); - this._filters = []; - this._error = undefined; - this._sorting = []; - this.priorityRegexp = /^priority (is )?(above|below)? ?(low|none|medium|high)/; - this.noStartString = 'no start date'; - this.startRegexp = /^starts (before|after|on)? ?(.*)/; - this.noScheduledString = 'no scheduled date'; - this.scheduledRegexp = /^scheduled (before|after|on)? ?(.*)/; - this.noDueString = 'no due date'; - this.dueRegexp = /^due (before|after|on)? ?(.*)/; - this.doneString = 'done'; - this.notDoneString = 'not done'; - this.doneRegexp = /^done (before|after|on)? ?(.*)/; - this.pathRegexp = /^path (includes|does not include) (.*)/; - this.descriptionRegexp = /^description (includes|does not include) (.*)/; - this.sortByRegexp = /^sort by (urgency|status|priority|start|scheduled|due|done|path|description)( reverse)?/; - this.headingRegexp = /^heading (includes|does not include) (.*)/; - this.hideOptionsRegexp = /^hide (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button)/; - this.shortModeRegexp = /^short/; - this.recurringString = 'is recurring'; - this.notRecurringString = 'is not recurring'; - this.limitRegexp = /^limit (to )?(\d+)( tasks?)?/; - this.excludeSubItemsString = 'exclude sub-items'; - source - .split('\n') - .map((line) => line.trim()) - .forEach((line) => { - switch (true) { - case line === '': - break; - case line === this.doneString: - this._filters.push((task) => task.status === Status.Done); - break; - case line === this.notDoneString: - this._filters.push((task) => task.status !== Status.Done); - break; - case line === this.recurringString: - this._filters.push((task) => task.recurrence !== null); - break; - case line === this.notRecurringString: - this._filters.push((task) => task.recurrence === null); - break; - case line === this.excludeSubItemsString: - this._filters.push((task) => task.indentation === ''); - break; - case line === this.noStartString: - this._filters.push((task) => task.startDate === null); - break; - case line === this.noScheduledString: - this._filters.push((task) => task.scheduledDate === null); - break; - case line === this.noDueString: - this._filters.push((task) => task.dueDate === null); - break; - case this.shortModeRegexp.test(line): - this._layoutOptions.shortMode = true; - break; - case this.priorityRegexp.test(line): - this.parsePriorityFilter({ line }); - break; - case this.startRegexp.test(line): - this.parseStartFilter({ line }); - break; - case this.scheduledRegexp.test(line): - this.parseScheduledFilter({ line }); - break; - case this.dueRegexp.test(line): - this.parseDueFilter({ line }); - break; - case this.doneRegexp.test(line): - this.parseDoneFilter({ line }); - break; - case this.pathRegexp.test(line): - this.parsePathFilter({ line }); - break; - case this.descriptionRegexp.test(line): - this.parseDescriptionFilter({ line }); - break; - case this.headingRegexp.test(line): - this.parseHeadingFilter({ line }); - break; - case this.limitRegexp.test(line): - this.parseLimit({ line }); - break; - case this.sortByRegexp.test(line): - this.parseSortBy({ line }); - break; - case this.hideOptionsRegexp.test(line): - this.parseHideOptions({ line }); - break; - default: - this._error = 'do not understand query'; - } - }); - } - get limit() { - return this._limit; - } - get layoutOptions() { - return this._layoutOptions; - } - get filters() { - return this._filters; - } - get sorting() { - return this._sorting; - } - get error() { - return this._error; - } - parseHideOptions({ line }) { - const hideOptionsMatch = line.match(this.hideOptionsRegexp); - if (hideOptionsMatch !== null) { - const option = hideOptionsMatch[1].trim().toLowerCase(); - switch (option) { - case 'task count': - this._layoutOptions.hideTaskCount = true; - break; - case 'backlink': - this._layoutOptions.hideBacklinks = true; - break; - case 'priority': - this._layoutOptions.hidePriority = true; - break; - case 'start date': - this._layoutOptions.hideStartDate = true; - break; - case 'scheduled date': - this._layoutOptions.hideScheduledDate = true; - break; - case 'due date': - this._layoutOptions.hideDueDate = true; - break; - case 'done date': - this._layoutOptions.hideDoneDate = true; - break; - case 'recurrence rule': - this._layoutOptions.hideRecurrenceRule = true; - break; - case 'edit button': - this._layoutOptions.hideEditButton = true; - break; - default: - this._error = 'do not understand hide option'; - } - } - } - parsePriorityFilter({ line }) { - const priorityMatch = line.match(this.priorityRegexp); - if (priorityMatch !== null) { - const filterPriorityString = priorityMatch[3]; - let filterPriority = null; - switch (filterPriorityString) { - case 'low': - filterPriority = Priority.Low; - break; - case 'none': - filterPriority = Priority.None; - break; - case 'medium': - filterPriority = Priority.Medium; - break; - case 'high': - filterPriority = Priority.High; - break; - } - if (filterPriority === null) { - this._error = 'do not understand priority'; - return; - } - let filter; - if (priorityMatch[2] === 'above') { - filter = (task) => task.priority - ? task.priority.localeCompare(filterPriority) < 0 - : false; - } - else if (priorityMatch[2] === 'below') { - filter = (task) => task.priority - ? task.priority.localeCompare(filterPriority) > 0 - : false; - } - else { - filter = (task) => task.priority ? task.priority === filterPriority : false; - } - this._filters.push(filter); - } - else { - this._error = 'do not understand query filter (priority date)'; - } - } - parseStartFilter({ line }) { - const startMatch = line.match(this.startRegexp); - if (startMatch !== null) { - const filterDate = this.parseDate(startMatch[2]); - if (!filterDate.isValid()) { - this._error = 'do not understand start date'; - return; - } - let filter; - if (startMatch[1] === 'before') { - filter = (task) => task.startDate ? task.startDate.isBefore(filterDate) : true; - } - else if (startMatch[1] === 'after') { - filter = (task) => task.startDate ? task.startDate.isAfter(filterDate) : true; - } - else { - filter = (task) => task.startDate ? task.startDate.isSame(filterDate) : true; - } - this._filters.push(filter); - } - else { - this._error = 'do not understand query filter (start date)'; - } - } - parseScheduledFilter({ line }) { - const scheduledMatch = line.match(this.scheduledRegexp); - if (scheduledMatch !== null) { - const filterDate = this.parseDate(scheduledMatch[2]); - if (!filterDate.isValid()) { - this._error = 'do not understand scheduled date'; - } - let filter; - if (scheduledMatch[1] === 'before') { - filter = (task) => task.scheduledDate - ? task.scheduledDate.isBefore(filterDate) - : false; - } - else if (scheduledMatch[1] === 'after') { - filter = (task) => task.scheduledDate - ? task.scheduledDate.isAfter(filterDate) - : false; - } - else { - filter = (task) => task.scheduledDate - ? task.scheduledDate.isSame(filterDate) - : false; - } - this._filters.push(filter); - } - else { - this._error = 'do not understand query filter (scheduled date)'; - } - } - parseDueFilter({ line }) { - const dueMatch = line.match(this.dueRegexp); - if (dueMatch !== null) { - const filterDate = this.parseDate(dueMatch[2]); - if (!filterDate.isValid()) { - this._error = 'do not understand due date'; - return; - } - let filter; - if (dueMatch[1] === 'before') { - filter = (task) => task.dueDate ? task.dueDate.isBefore(filterDate) : false; - } - else if (dueMatch[1] === 'after') { - filter = (task) => task.dueDate ? task.dueDate.isAfter(filterDate) : false; - } - else { - filter = (task) => task.dueDate ? task.dueDate.isSame(filterDate) : false; - } - this._filters.push(filter); - } - else { - this._error = 'do not understand query filter (due date)'; - } - } - parseDoneFilter({ line }) { - const doneMatch = line.match(this.doneRegexp); - if (doneMatch !== null) { - const filterDate = this.parseDate(doneMatch[2]); - if (!filterDate.isValid()) { - this._error = 'do not understand done date'; - return; - } - let filter; - if (doneMatch[1] === 'before') { - filter = (task) => task.doneDate ? task.doneDate.isBefore(filterDate) : false; - } - else if (doneMatch[1] === 'after') { - filter = (task) => task.doneDate ? task.doneDate.isAfter(filterDate) : false; - } - else { - filter = (task) => task.doneDate ? task.doneDate.isSame(filterDate) : false; - } - this._filters.push(filter); - } - } - parsePathFilter({ line }) { - const pathMatch = line.match(this.pathRegexp); - if (pathMatch !== null) { - const filterMethod = pathMatch[1]; - if (filterMethod === 'includes') { - this._filters.push((task) => this.stringIncludesCaseInsensitive(task.path, pathMatch[2])); - } - else if (pathMatch[1] === 'does not include') { - this._filters.push((task) => !this.stringIncludesCaseInsensitive(task.path, pathMatch[2])); - } - else { - this._error = 'do not understand query filter (path)'; - } - } - else { - this._error = 'do not understand query filter (path)'; - } - } - parseDescriptionFilter({ line }) { - const descriptionMatch = line.match(this.descriptionRegexp); - if (descriptionMatch !== null) { - const filterMethod = descriptionMatch[1]; - const globalFilter = getSettings().globalFilter; - if (filterMethod === 'includes') { - this._filters.push((task) => this.stringIncludesCaseInsensitive( - // Remove global filter from description match if present. - // This is necessary to match only on the content of the task, not - // the global filter. - task.description.replace(globalFilter, '').trim(), descriptionMatch[2])); - } - else if (descriptionMatch[1] === 'does not include') { - this._filters.push((task) => !this.stringIncludesCaseInsensitive( - // Remove global filter from description match if present. - // This is necessary to match only on the content of the task, not - // the global filter. - task.description.replace(globalFilter, '').trim(), descriptionMatch[2])); - } - else { - this._error = 'do not understand query filter (description)'; - } - } - else { - this._error = 'do not understand query filter (description)'; - } - } - parseHeadingFilter({ line }) { - const headingMatch = line.match(this.headingRegexp); - if (headingMatch !== null) { - const filterMethod = headingMatch[1].toLowerCase(); - if (filterMethod === 'includes') { - this._filters.push((task) => task.precedingHeader !== null && - this.stringIncludesCaseInsensitive(task.precedingHeader, headingMatch[2])); - } - else if (headingMatch[1] === 'does not include') { - this._filters.push((task) => task.precedingHeader === null || - !this.stringIncludesCaseInsensitive(task.precedingHeader, headingMatch[2])); - } - else { - this._error = 'do not understand query filter (heading)'; - } - } - else { - this._error = 'do not understand query filter (heading)'; - } - } - parseLimit({ line }) { - const limitMatch = line.match(this.limitRegexp); - if (limitMatch !== null) { - // limitMatch[2] is per regex always digits and therefore parsable. - const limit = Number.parseInt(limitMatch[2], 10); - this._limit = limit; - } - else { - this._error = 'do not understand query limit'; - } - } - parseSortBy({ line }) { - const fieldMatch = line.match(this.sortByRegexp); - if (fieldMatch !== null) { - this._sorting.push({ - property: fieldMatch[1], - reverse: !!fieldMatch[2], - }); - } - else { - this._error = 'do not understand query sorting'; - } - } - parseDate(input) { - // Using start of day to correctly match on comparison with other dates (like equality). - return window.moment(chrono.parseDate(input)).startOf('day'); - } - stringIncludesCaseInsensitive(haystack, needle) { - return haystack - .toLocaleLowerCase() - .includes(needle.toLocaleLowerCase()); - } -} - -class Sort { - static by(query, tasks) { - const defaultComparators = [ - Sort.compareByUrgency, - Sort.compareByStatus, - Sort.compareByDueDate, - Sort.compareByPriority, - Sort.compareByPath, - ]; - const userComparators = []; - for (const { property, reverse } of query.sorting) { - const comparator = Sort.comparators[property]; - userComparators.push(reverse ? Sort.makeReversedComparator(comparator) : comparator); - } - return tasks.sort(Sort.makeCompositeComparator([ - ...userComparators, - ...defaultComparators, - ])); - } - static makeReversedComparator(comparator) { - return (a, b) => (comparator(a, b) * -1); - } - static makeCompositeComparator(comparators) { - return (a, b) => { - for (const comparator of comparators) { - const result = comparator(a, b); - if (result !== 0) { - return result; - } - } - return 0; - }; - } - static compareByUrgency(a, b) { - // Higher urgency should be sorted earlier. - return b.urgency - a.urgency; - } - static compareByStatus(a, b) { - if (a.status < b.status) { - return 1; - } - else if (a.status > b.status) { - return -1; - } - else { - return 0; - } - } - static compareByPriority(a, b) { - return a.priority.localeCompare(b.priority); - } - static compareByStartDate(a, b) { - return Sort.compareByDate(a.startDate, b.startDate); - } - static compareByScheduledDate(a, b) { - return Sort.compareByDate(a.scheduledDate, b.scheduledDate); - } - static compareByDueDate(a, b) { - return Sort.compareByDate(a.dueDate, b.dueDate); - } - static compareByDoneDate(a, b) { - return Sort.compareByDate(a.doneDate, b.doneDate); - } - static compareByDate(a, b) { - if (a !== null && b === null) { - return -1; - } - else if (a === null && b !== null) { - return 1; - } - else if (a !== null && b !== null) { - if (a.isAfter(b)) { - return 1; - } - else if (a.isBefore(b)) { - return -1; - } - else { - return 0; - } - } - else { - return 0; - } - } - static compareByPath(a, b) { - if (a.path < b.path) { - return -1; - } - else if (a.path > b.path) { - return 1; - } - else { - return 0; - } - } - /** - * Compare the description by how it is rendered in markdown. - * - * Does not use the MarkdownRenderer, but tries to match regexes instead - * in order to be simpler, faster, and not async. - */ - static compareByDescription(a, b) { - return Sort.cleanDescription(a.description).localeCompare(Sort.cleanDescription(b.description)); - } - /** - * Removes `*`, `=`, and `[` from the beginning of the description. - * - * Will remove them only if they are closing. - * Properly reads links [[like this|one]] (note pipe). - */ - static cleanDescription(description) { - const globalFilter = getSettings().globalFilter; - description = description.replace(globalFilter, '').trim(); - const startsWithLinkRegex = /^\[\[?([^\]]*)\]/; - const linkRegexMatch = description.match(startsWithLinkRegex); - if (linkRegexMatch !== null) { - const innerLinkText = linkRegexMatch[1]; - // For a link, we have to check whether it has another visible name set. - // For example `[[this is the link|but this is actually shown]]`. - description = - innerLinkText.substring(innerLinkText.indexOf('|') + 1) + - description.replace(startsWithLinkRegex, ''); - } - const startsWithItalicOrBoldRegex = /^\*\*?([^*]*)\*/; - const italicBoldRegexMatch = description.match(startsWithItalicOrBoldRegex); - if (italicBoldRegexMatch !== null) { - const innerItalicBoldText = italicBoldRegexMatch[1]; - description = - innerItalicBoldText + - description.replace(startsWithLinkRegex, ''); - } - const startsWithHighlightRegex = /^==?([^=]*)==/; - const highlightRegexMatch = description.match(startsWithHighlightRegex); - if (highlightRegexMatch !== null) { - const innerHighlightsText = highlightRegexMatch[1]; - description = - innerHighlightsText + - description.replace(startsWithHighlightRegex, ''); - } - return description; - } -} -Sort.comparators = { - urgency: Sort.compareByUrgency, - description: Sort.compareByDescription, - priority: Sort.compareByPriority, - start: Sort.compareByStartDate, - scheduled: Sort.compareByScheduledDate, - due: Sort.compareByDueDate, - done: Sort.compareByDoneDate, - path: Sort.compareByPath, - status: Sort.compareByStatus, +var Events = class { + constructor({ obsidianEents }) { + this.obsidianEvents = obsidianEents; + } + onCacheUpdate(handler) { + return this.obsidianEvents.on(Event.CacheUpdate, handler); + } + triggerCacheUpdate(cacheData) { + this.obsidianEvents.trigger(Event.CacheUpdate, cacheData); + } + onRequestCacheUpdate(handler) { + return this.obsidianEvents.on(Event.RequestCacheUpdate, handler); + } + triggerRequestCacheUpdate(fn) { + this.obsidianEvents.trigger(Event.RequestCacheUpdate, fn); + } + off(eventRef) { + this.obsidianEvents.offref(eventRef); + } }; -class QueryRenderer { - constructor({ plugin, events }) { - this.addQueryRenderChild = this._addQueryRenderChild.bind(this); - this.app = plugin.app; - this.events = events; - plugin.registerMarkdownCodeBlockProcessor('tasks', this._addQueryRenderChild.bind(this)); - } - _addQueryRenderChild(source, element, context) { - return __awaiter(this, void 0, void 0, function* () { - context.addChild(new QueryRenderChild({ - app: this.app, - events: this.events, - container: element, - source, - })); - }); - } -} -class QueryRenderChild extends obsidian.MarkdownRenderChild { - constructor({ app, events, container, source, }) { - super(container); - this.app = app; - this.events = events; - this.source = source; - this.query = new Query({ source }); - } - onload() { - // Process the current cache state: - this.events.triggerRequestCacheUpdate(this.render.bind(this)); - // Listen to future cache changes: - this.renderEventRef = this.events.onCacheUpdate(this.render.bind(this)); - this.reloadQueryAtMidnight(); - } - onunload() { - if (this.renderEventRef !== undefined) { - this.events.off(this.renderEventRef); +// src/InlineRenderer.ts +var InlineRenderer = class { + constructor({ plugin }) { + this.markdownPostProcessor = this._markdownPostProcessor.bind(this); + plugin.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this)); + } + _markdownPostProcessor(element2, context) { + return __async(this, null, function* () { + var _a; + const { globalFilter } = getSettings(); + const renderedElements = element2.findAll(".task-list-item").filter((taskItem) => { + var _a2; + const linesText = (_a2 = taskItem.textContent) == null ? void 0 : _a2.split("\n"); + if (linesText === void 0) { + return false; } - if (this.queryReloadTimeout !== undefined) { - clearTimeout(this.queryReloadTimeout); + let firstLineText = null; + for (let i = 0; i < linesText.length; i = i + 1) { + if (linesText[i] !== "") { + firstLineText = linesText[i]; + break; + } } - } - /** - * Reloads the query after midnight to update results from relative date queries. - * - * For example, the query `due today` changes every day. This makes sure that all query results - * are re-rendered after midnight every day to ensure up-to-date results without having to - * reload obsidian. Creating a new query object from the source re-applies the relative dates - * to "now". - */ - reloadQueryAtMidnight() { - const midnight = new Date(); - midnight.setHours(24, 0, 0, 0); - const now = new Date(); - const millisecondsToMidnight = midnight.getTime() - now.getTime(); - this.queryReloadTimeout = setTimeout(() => { - this.query = new Query({ source: this.source }); - // Process the current cache state: - this.events.triggerRequestCacheUpdate(this.render.bind(this)); - this.reloadQueryAtMidnight(); - }, millisecondsToMidnight + 1000); // Add buffer to be sure to run after midnight. - } - render({ tasks, state }) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const content = this.containerEl.createEl('div'); - if (state === State.Warm && this.query.error === undefined) { - const { taskList, tasksCount } = yield this.createTasksList({ - tasks, - content, - }); - content.appendChild(taskList); - if (!this.query.layoutOptions.hideTaskCount) { - content.createDiv({ - text: `${tasksCount} task${tasksCount !== 1 ? 's' : ''}`, - cls: 'tasks-count', - }); - } - } - else if (this.query.error !== undefined) { - content.setText(`Tasks query: ${this.query.error}`); - } - else { - content.setText('Loading Tasks ...'); - } - (_a = this.containerEl.firstChild) === null || _a === void 0 ? void 0 : _a.replaceWith(content); - }); - } - createTasksList({ tasks, content, }) { - return __awaiter(this, void 0, void 0, function* () { - this.query.filters.forEach((filter) => { - tasks = tasks.filter(filter); - }); - const tasksSortedLimited = Sort.by(this.query, tasks).slice(0, this.query.limit); - const tasksCount = tasksSortedLimited.length; - const taskList = content.createEl('ul'); - taskList.addClasses([ - 'contains-task-list', - 'plugin-tasks-query-result', - ]); - for (let i = 0; i < tasksCount; i++) { - const task = tasksSortedLimited[i]; - let fileName; - const fileNameMatch = task.path.match(/([^/]+)\.md$/); - if (fileNameMatch !== null) { - fileName = fileNameMatch[1]; - } - const listItem = yield task.toLi({ - parentUlElement: taskList, - listIndex: i, - layoutOptions: this.query.layoutOptions, - }); - // Remove all footnotes. They don't re-appear in another document. - const footnotes = listItem.querySelectorAll('[data-footnote-id]'); - footnotes.forEach((footnote) => footnote.remove()); - const postInfo = listItem.createSpan(); - if (!this.query.layoutOptions.hideBacklinks && - fileName !== undefined) { - this.addBacklinks(postInfo, fileName, task); - } - if (!this.query.layoutOptions.hideEditButton) { - this.addEditButton(postInfo, task); - } - taskList.appendChild(listItem); - } - return { taskList, tasksCount }; - }); - } - addEditButton(postInfo, task) { - const editTaskPencil = postInfo.createEl('a', { - cls: 'tasks-edit', - }); - editTaskPencil.onClickEvent((event) => { - event.preventDefault(); - const onSubmit = (updatedTasks) => { - replaceTaskWithTasks({ - originalTask: task, - newTasks: updatedTasks, - }); - }; - // Need to create a new instance every time, as cursor/task can change. - const taskModal = new TaskModal({ - app: this.app, - task, - onSubmit, - }); - taskModal.open(); - }); - } - addBacklinks(postInfo, fileName, task) { - postInfo.addClass('tasks-backlink'); - postInfo.append(' ('); - const link = postInfo.createEl('a'); - link.href = fileName; - link.setAttribute('data-href', fileName); - link.rel = 'noopener'; - link.target = '_blank'; - link.addClass('internal-link'); - let linkText = fileName; - if (task.precedingHeader !== null) { - link.href = link.href + '#' + task.precedingHeader; - link.setAttribute('data-href', link.getAttribute('data-href') + '#' + task.precedingHeader); - // Otherwise, this wouldn't provide additinoal information and only take up space. - if (task.precedingHeader !== fileName) { - linkText = linkText + ' > ' + task.precedingHeader; - } + if (firstLineText === null) { + return false; } - link.setText(linkText); - postInfo.append(')'); - } -} + return firstLineText.includes(globalFilter); + }); + if (renderedElements.length === 0) { + return; + } + const path = context.sourcePath; + const section = context.getSectionInfo(element2); + if (section === null) { + return; + } + const fileLines = section.text.split("\n"); + let sectionIndex = 0; + const fileTasks = []; + for (let lineNumber = section.lineStart; lineNumber <= section.lineEnd; lineNumber++) { + const line = fileLines[lineNumber]; + if (line === void 0) { + continue; + } + const task = Task.fromLine({ + line, + path, + sectionStart: section.lineStart, + sectionIndex, + precedingHeader: null + }); + if (task !== null) { + fileTasks.push(task); + sectionIndex++; + } + } + for (let sectionIndex2 = 0; sectionIndex2 < renderedElements.length; sectionIndex2++) { + const task = fileTasks[sectionIndex2]; + const renderedElement = renderedElements[sectionIndex2]; + if (task === void 0 || renderedElement === void 0) { + continue; + } + const dataLine = (_a = renderedElement.getAttr("data-line")) != null ? _a : "0"; + const listIndex = Number.parseInt(dataLine, 10); + const taskElement = yield task.toLi({ + parentUlElement: element2, + listIndex + }); + const renderedChildren = renderedElement.childNodes; + for (let i = 0; i < renderedChildren.length; i = i + 1) { + const renderedChild = renderedChildren[i]; + if (renderedChild.nodeName.toLowerCase() === "div") { + taskElement.prepend(renderedChild); + } else if (renderedChild.nodeName.toLowerCase() === "ul") { + taskElement.append(renderedChild); + } + } + const originalFootnotes = renderedElement.querySelectorAll("[data-footnote-id]"); + const newFootnotes = taskElement.querySelectorAll("[data-footnote-id]"); + if (originalFootnotes.length === newFootnotes.length) { + for (let i = 0; i < originalFootnotes.length; i++) { + newFootnotes[i].replaceWith(originalFootnotes[i]); + } + } + renderedElement.replaceWith(taskElement); + } + }); + } +}; -class SettingsTab extends obsidian.PluginSettingTab { - constructor({ plugin }) { - super(plugin.app, plugin); - this.plugin = plugin; +// src/LivePreviewExtension.ts +var import_view = __toModule(require("@codemirror/view")); +var newLivePreviewExtension = () => { + return import_view.ViewPlugin.fromClass(LivePreviewExtension); +}; +var LivePreviewExtension = class { + constructor(view) { + this.view = view; + this.handleClickEvent = this.handleClickEvent.bind(this); + this.view.dom.addEventListener("click", this.handleClickEvent); + } + destroy() { + this.view.dom.removeEventListener("click", this.handleClickEvent); + } + handleClickEvent(event) { + const { target } = event; + if (!target || !(target instanceof HTMLInputElement) || target.type !== "checkbox") { + return false; } - display() { - const { containerEl } = this; - containerEl.empty(); - containerEl.createEl('h2', { text: 'Tasks Settings' }); - containerEl.createEl('p', { - cls: 'tasks-setting-important', - text: 'Changing any settings requires a restart of obsidian.', - }); - new obsidian.Setting(containerEl) - .setName('Global task filter') - .setDesc('The global filter will be applied to all checklist items.') - .addText((text) => { - const settings = getSettings(); - text.setPlaceholder('#task') - .setValue(settings.globalFilter) - .onChange((value) => __awaiter(this, void 0, void 0, function* () { - updateSettings({ globalFilter: value }); - yield this.plugin.saveSettings(); - })); - }); - containerEl.createEl('div', { - cls: 'setting-item-description', - text: 'The global filter will be applied to all checklist items to filter out "non-task" checklist items.\n' + - 'A checklist item must include the specified string in its description in order to be considered a task.\n' + - 'For example, if you set the global filter to `#task`, the Tasks plugin will only handle checklist items tagged with `#task`.\n' + - 'Other checklist items will remain normal checklist items and not appear in queries or get a done date set.\n' + - 'Leave empty if you want all checklist items from your vault to be tasks managed by this plugin.', - }); - new obsidian.Setting(containerEl) - .setName('Remove global filter from description') - .setDesc('Enabling this removes the string that you set as global filter from the task description when displaying a task.') - .addToggle((toggle) => { - const settings = getSettings(); - toggle - .setValue(settings.removeGlobalFilter) - .onChange((value) => __awaiter(this, void 0, void 0, function* () { - updateSettings({ removeGlobalFilter: value }); - yield this.plugin.saveSettings(); - })); - }); + const { state } = this.view; + const position = this.view.posAtDOM(target); + const line = state.doc.lineAt(position); + const task = Task.fromLine({ + line: line.text, + path: "", + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null + }); + if (task === null) { + return false; } -} + event.preventDefault(); + const toggled = task.toggle(); + const toggledString = toggled.map((task2) => task2.toFileLineString()).join(state.lineBreak); + const transaction = state.update({ + changes: { + from: line.from, + to: line.to, + insert: toggledString + } + }); + this.view.dispatch(transaction); + const desiredCheckedStatus = target.checked; + setTimeout(() => { + target.checked = desiredCheckedStatus; + }, 1); + return true; + } +}; -class TasksPlugin extends obsidian.Plugin { - onload() { - return __awaiter(this, void 0, void 0, function* () { - console.log('loading plugin "tasks"'); - yield this.loadSettings(); - this.addSettingTab(new SettingsTab({ plugin: this })); - initializeFile({ - metadataCache: this.app.metadataCache, - vault: this.app.vault, - }); - const events = new Events({ obsidianEents: this.app.workspace }); - this.cache = new Cache({ - metadataCache: this.app.metadataCache, - vault: this.app.vault, - events, - }); - this.inlineRenderer = new InlineRenderer({ plugin: this }); - this.queryRenderer = new QueryRenderer({ plugin: this, events }); - new Commands({ plugin: this }); - }); - } - onunload() { - var _a; - console.log('unloading plugin "tasks"'); - (_a = this.cache) === null || _a === void 0 ? void 0 : _a.unload(); - } - loadSettings() { - return __awaiter(this, void 0, void 0, function* () { - const newSettings = yield this.loadData(); - updateSettings(newSettings); - }); - } - saveSettings() { - return __awaiter(this, void 0, void 0, function* () { - yield this.saveData(getSettings()); - }); - } -} +// src/QueryRenderer.ts +var import_obsidian7 = __toModule(require("obsidian")); -module.exports = TasksPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9hc3luYy1tdXRleC9lczYvZXJyb3JzLmpzIiwibm9kZV9tb2R1bGVzL2FzeW5jLW11dGV4L2VzNi9TZW1hcGhvcmUuanMiLCJub2RlX21vZHVsZXMvYXN5bmMtbXV0ZXgvZXM2L011dGV4LmpzIiwic3JjL1NldHRpbmdzLnRzIiwic3JjL0ZpbGUudHMiLCJzcmMvTGF5b3V0T3B0aW9ucy50cyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvd2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaGVscGVycy5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvZGF0ZXV0aWwuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJyZXN1bHQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvY2FsbGJhY2tpdGVycmVzdWx0LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ubHAvaTE4bi5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbmxwL3RvdGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbmxwL3BhcnNldGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvdHlwZXMuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL25scC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvZGF0ZXRpbWUuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3BhcnNlb3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvcGFyc2VzdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbHV4b24vYnVpbGQvY2pzLWJyb3dzZXIvbHV4b24uanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2RhdGV3aXRoem9uZS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvb3B0aW9uc3Rvc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9jYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbWFza3MuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJpbmZvL3llYXJpbmZvLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyaW5mby9tb250aGluZm8uanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJpbmZvL2Vhc3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaXRlcmluZm8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXIvcG9zbGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaXRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvcnJ1bGUuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJzZXQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3JydWxlc3RyLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ycnVsZXNldC5qcyIsInNyYy9SZWN1cnJlbmNlLnRzIiwic3JjL1VyZ2VuY3kudHMiLCJzcmMvVGFzay50cyIsInNyYy9DYWNoZS50cyIsIm5vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvdXRpbHMvcGF0dGVybi5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9kYXlqcy5taW4uanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jYWxjdWxhdGlvbi95ZWFycy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9xdWFydGVyT2ZZZWFyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvdXRpbHMvZGF5anMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9yZXN1bHRzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5Nb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5Nb250aE5hbWVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5DYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5TbGFzaE1vbnRoRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVFeHByZXNzaW9uUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvdXRpbHMvdGltZXVuaXRzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL2Fic3RyYWN0UmVmaW5lcnMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3JlZmluZXJzL0VOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY2FsY3VsYXRpb24vbWVyZ2luZ0NhbGN1bGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3JlZmluZXJzL0VOTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvRXh0cmFjdFRpbWV6b25lT2Zmc2V0UmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9PdmVybGFwUmVtb3ZhbFJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvRm9yd2FyZERhdGVSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL1VubGlrZWx5Rm9ybWF0RmlsdGVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvSVNPRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL01lcmdlV2Vla2RheUNvbXBvbmVudFJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb25maWd1cmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOQ2FzdWFsRGF0ZVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTkNhc3VhbFRpbWVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jYWxjdWxhdGlvbi93ZWVrcy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTldlZWtkYXlQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jaHJvbm8uanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcGFyc2Vycy9TbGFzaERhdGVGb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvcGFyc2Vycy9ERVRpbWVFeHByZXNzaW9uUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2RlL3BhcnNlcnMvREVXZWVrZGF5UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9yZWZpbmVycy9ERU1lcmdlRGF0ZVJhbmdlUmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvcmVmaW5lcnMvREVNZXJnZURhdGVUaW1lUmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvcGFyc2Vycy9ERUNhc3VhbFRpbWVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2RlL3BhcnNlcnMvREVDYXN1YWxEYXRlUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9wYXJzZXJzL0RFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUkNhc3VhbERhdGVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJDYXN1YWxUaW1lUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSVGltZUV4cHJlc3Npb25QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3JlZmluZXJzL0ZSTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3JlZmluZXJzL0ZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJXZWVrZGF5UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJUaW1lVW5pdFJlbGF0aXZlRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvamEvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9qYS9wYXJzZXJzL0pQU3RhbmRhcmRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2phL3JlZmluZXJzL0pQTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9qYS9wYXJzZXJzL0pQQ2FzdWFsRGF0ZVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvamEvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L2NvbnN0YW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcGFyc2Vycy9QVFdlZWtkYXlQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L3BhcnNlcnMvUFRUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcmVmaW5lcnMvUFRNZXJnZURhdGVUaW1lUmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcmVmaW5lcnMvUFRNZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L3BhcnNlcnMvUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L3BhcnNlcnMvUFRDYXN1YWxEYXRlUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9wdC9wYXJzZXJzL1BUQ2FzdWFsVGltZVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL3JlZmluZXJzL05MTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9yZWZpbmVycy9OTE1lcmdlRGF0ZVRpbWVSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9wYXJzZXJzL05MQ2FzdWFsRGF0ZVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbFRpbWVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL2NvbnN0YW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9wYXJzZXJzL05MV2Vla2RheVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTE1vbnRoTmFtZVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTFNsYXNoTW9udGhGb3JtYXRQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbFllYXJNb250aERheVBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbERhdGVUaW1lUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2luZGV4LmpzIiwic3JjL3VpL0VkaXRUYXNrLnN2ZWx0ZSIsInNyYy9UYXNrTW9kYWwudHMiLCJzcmMvQ29tbWFuZHMvQ3JlYXRlT3JFZGl0LnRzIiwic3JjL0NvbW1hbmRzL1RvZ2dsZURvbmUudHMiLCJzcmMvQ29tbWFuZHMvaW5kZXgudHMiLCJzcmMvRXZlbnRzLnRzIiwic3JjL0lubGluZVJlbmRlcmVyLnRzIiwic3JjL1F1ZXJ5LnRzIiwic3JjL1NvcnQudHMiLCJzcmMvUXVlcnlSZW5kZXJlci50cyIsInNyYy9TZXR0aW5nc1RhYi50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBFX1RJTUVPVVQgPSBuZXcgRXJyb3IoJ3RpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgbXV0ZXggdG8gYmVjb21lIGF2YWlsYWJsZScpO1xuZXhwb3J0IHZhciBFX0FMUkVBRFlfTE9DS0VEID0gbmV3IEVycm9yKCdtdXRleCBhbHJlYWR5IGxvY2tlZCcpO1xuZXhwb3J0IHZhciBFX0NBTkNFTEVEID0gbmV3IEVycm9yKCdyZXF1ZXN0IGZvciBsb2NrIGNhbmNlbGVkJyk7XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBFX0NBTkNFTEVEIH0gZnJvbSAnLi9lcnJvcnMnO1xudmFyIFNlbWFwaG9yZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZW1hcGhvcmUoX21heENvbmN1cnJlbmN5LCBfY2FuY2VsRXJyb3IpIHtcbiAgICAgICAgaWYgKF9jYW5jZWxFcnJvciA9PT0gdm9pZCAwKSB7IF9jYW5jZWxFcnJvciA9IEVfQ0FOQ0VMRUQ7IH1cbiAgICAgICAgdGhpcy5fbWF4Q29uY3VycmVuY3kgPSBfbWF4Q29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMuX2NhbmNlbEVycm9yID0gX2NhbmNlbEVycm9yO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl93YWl0ZXJzID0gW107XG4gICAgICAgIGlmIChfbWF4Q29uY3VycmVuY3kgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZW1hcGhvcmUgbXVzdCBiZSBpbml0aWFsaXplZCB0byBhIHBvc2l0aXZlIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWUgPSBfbWF4Q29uY3VycmVuY3k7XG4gICAgfVxuICAgIFNlbWFwaG9yZS5wcm90b3R5cGUuYWNxdWlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxvY2tlZCA9IHRoaXMuaXNMb2NrZWQoKTtcbiAgICAgICAgdmFyIHRpY2tldFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX3F1ZXVlLnB1c2goeyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghbG9ja2VkKVxuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuIHRpY2tldFByb21pc2U7XG4gICAgfTtcbiAgICBTZW1hcGhvcmUucHJvdG90eXBlLnJ1bkV4Y2x1c2l2ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHZhbHVlLCByZWxlYXNlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFjcXVpcmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpLCB2YWx1ZSA9IF9hWzBdLCByZWxlYXNlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMiwgLCA0LCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBjYWxsYmFjayh2YWx1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBfYi5zZW50KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTZW1hcGhvcmUucHJvdG90eXBlLndhaXRGb3JVbmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB3YWl0UHJvbWlzZTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTG9ja2VkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FpdFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXR1cm4gX3RoaXMuX3dhaXRlcnMucHVzaCh7IHJlc29sdmU6IHJlc29sdmUgfSk7IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB3YWl0UHJvbWlzZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTZW1hcGhvcmUucHJvdG90eXBlLmlzTG9ja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPD0gMDtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICBTZW1hcGhvcmUucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhDb25jdXJyZW5jeSA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBtZXRob2QgaXMgdW5hdmFpbGFibGUgb24gc2VtYXBob3JlcyB3aXRoIGNvbmN1cnJlbmN5ID4gMTsgdXNlIHRoZSBzY29wZWQgcmVsZWFzZSByZXR1cm5lZCBieSBhY3F1aXJlIGluc3RlYWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFJlbGVhc2VyKSB7XG4gICAgICAgICAgICB2YXIgcmVsZWFzZXIgPSB0aGlzLl9jdXJyZW50UmVsZWFzZXI7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UmVsZWFzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZWxlYXNlcigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTZW1hcGhvcmUucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaChmdW5jdGlvbiAodGlja2V0KSB7IHJldHVybiB0aWNrZXQucmVqZWN0KF90aGlzLl9jYW5jZWxFcnJvcik7IH0pO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH07XG4gICAgU2VtYXBob3JlLnByb3RvdHlwZS5fZGlzcGF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBuZXh0VGlja2V0ID0gdGhpcy5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFuZXh0VGlja2V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgcmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlbGVhc2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHJlbGVhc2VkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIF90aGlzLl92YWx1ZSsrO1xuICAgICAgICAgICAgX3RoaXMuX3Jlc29sdmVXYWl0ZXJzKCk7XG4gICAgICAgICAgICBfdGhpcy5fZGlzcGF0Y2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgbmV4dFRpY2tldC5yZXNvbHZlKFt0aGlzLl92YWx1ZS0tLCB0aGlzLl9jdXJyZW50UmVsZWFzZXJdKTtcbiAgICB9O1xuICAgIFNlbWFwaG9yZS5wcm90b3R5cGUuX3Jlc29sdmVXYWl0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl93YWl0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHdhaXRlcikgeyByZXR1cm4gd2FpdGVyLnJlc29sdmUoKTsgfSk7XG4gICAgICAgIHRoaXMuX3dhaXRlcnMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBTZW1hcGhvcmU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgU2VtYXBob3JlO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFNlbWFwaG9yZSBmcm9tICcuL1NlbWFwaG9yZSc7XG52YXIgTXV0ZXggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTXV0ZXgoY2FuY2VsRXJyb3IpIHtcbiAgICAgICAgdGhpcy5fc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxLCBjYW5jZWxFcnJvcik7XG4gICAgfVxuICAgIE11dGV4LnByb3RvdHlwZS5hY3F1aXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHJlbGVhc2VyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCksIHJlbGVhc2VyID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVsZWFzZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE11dGV4LnByb3RvdHlwZS5ydW5FeGNsdXNpdmUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5ydW5FeGNsdXNpdmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FsbGJhY2soKTsgfSk7XG4gICAgfTtcbiAgICBNdXRleC5wcm90b3R5cGUuaXNMb2NrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuaXNMb2NrZWQoKTtcbiAgICB9O1xuICAgIE11dGV4LnByb3RvdHlwZS53YWl0Rm9yVW5sb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLndhaXRGb3JVbmxvY2soKTtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICBNdXRleC5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fc2VtYXBob3JlLnJlbGVhc2UoKTtcbiAgICB9O1xuICAgIE11dGV4LnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuY2FuY2VsKCk7XG4gICAgfTtcbiAgICByZXR1cm4gTXV0ZXg7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgTXV0ZXg7XG4iLCJleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcbiAgICBnbG9iYWxGaWx0ZXI6IHN0cmluZztcbiAgICByZW1vdmVHbG9iYWxGaWx0ZXI6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRTZXR0aW5nczogU2V0dGluZ3MgPSB7XG4gICAgZ2xvYmFsRmlsdGVyOiAnJyxcbiAgICByZW1vdmVHbG9iYWxGaWx0ZXI6IGZhbHNlLFxufTtcblxubGV0IHNldHRpbmdzOiBTZXR0aW5ncyA9IHsgLi4uZGVmYXVsdFNldHRpbmdzIH07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXR0aW5ncyA9ICgpOiBTZXR0aW5ncyA9PiB7XG4gICAgcmV0dXJuIHsgLi4uc2V0dGluZ3MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVTZXR0aW5ncyA9IChuZXdTZXR0aW5nczogUGFydGlhbDxTZXR0aW5ncz4pOiBTZXR0aW5ncyA9PiB7XG4gICAgc2V0dGluZ3MgPSB7IC4uLnNldHRpbmdzLCAuLi5uZXdTZXR0aW5ncyB9O1xuXG4gICAgcmV0dXJuIGdldFNldHRpbmdzKCk7XG59O1xuIiwiaW1wb3J0IHsgTGlzdEl0ZW1DYWNoZSwgTWV0YWRhdGFDYWNoZSwgVEZpbGUsIFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vU2V0dGluZ3MnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxubGV0IG1ldGFkYXRhQ2FjaGU6IE1ldGFkYXRhQ2FjaGUgfCB1bmRlZmluZWQ7XG5sZXQgdmF1bHQ6IFZhdWx0IHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZUZpbGUgPSAoe1xuICAgIG1ldGFkYXRhQ2FjaGU6IG5ld01ldGFkYXRhQ2FjaGUsXG4gICAgdmF1bHQ6IG5ld1ZhdWx0LFxufToge1xuICAgIG1ldGFkYXRhQ2FjaGU6IE1ldGFkYXRhQ2FjaGU7XG4gICAgdmF1bHQ6IFZhdWx0O1xufSkgPT4ge1xuICAgIG1ldGFkYXRhQ2FjaGUgPSBuZXdNZXRhZGF0YUNhY2hlO1xuICAgIHZhdWx0ID0gbmV3VmF1bHQ7XG59O1xuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBvcmlnaW5hbCB0YXNrIHdpdGggb25lIG9yIG1vcmUgbmV3IHRhc3NrLlxuICpcbiAqIElmIHlvdSBwYXNzIG1vcmUgdGhhbiBvbmUgcmVwbGFjZW1lbnQgdGFzaywgYWxsIHN1YnNlcXVlbnQgdGFza3MgaW4gdGhlIHNhbWVcbiAqIHNlY3Rpb24gbXVzdCBiZSByZS1yZW5kZXJlZCwgYXMgdGhlaXIgc2VjdGlvbiBpbmRleGVzIGNoYW5nZS4gQXNzdW1pbmcgdGhhdFxuICogdGhpcyBpcyBkb25lIGZhc3RlciB0aGFuIHVzZXIgaW50ZXJhY3Rpb24gaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCByZXBsYWNlVGFza1dpdGhUYXNrcyA9IGFzeW5jICh7XG4gICAgb3JpZ2luYWxUYXNrLFxuICAgIG5ld1Rhc2tzLFxufToge1xuICAgIG9yaWdpbmFsVGFzazogVGFzaztcbiAgICBuZXdUYXNrczogVGFzayB8IFRhc2tbXTtcbn0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodmF1bHQgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVGFza3M6IGNhbm5vdCB1c2UgRmlsZSBiZWZvcmUgaW5pdGlhbGl6aW5nIGl0LicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1Rhc2tzKSkge1xuICAgICAgICBuZXdUYXNrcyA9IFtuZXdUYXNrc107XG4gICAgfVxuXG4gICAgdHJ5UmVwZXRpdGl2ZSh7XG4gICAgICAgIG9yaWdpbmFsVGFzayxcbiAgICAgICAgbmV3VGFza3MsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICBtZXRhZGF0YUNhY2hlLFxuICAgICAgICBwcmV2aW91c1RyaWVzOiAwLFxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byByZS10cnkgd2hlbiB0aGUgcmV0dXJuZWQgZmlsZSBjYWNoZSBpcyBgdW5kZWZpbmVkYC5cbiAqIFJldHJ5aW5nIGFmdGVyIGEgd2hpbGUgbWF5IHJldHVybiBhIHZhbGlkIGZpbGUgY2FjaGUuXG4gKiBSZXBvcnRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vc2NoZW1hci9vYnNpZGlhbi10YXNrcy9pc3N1ZXMvODdcbiAqL1xuY29uc3QgdHJ5UmVwZXRpdGl2ZSA9IGFzeW5jICh7XG4gICAgb3JpZ2luYWxUYXNrLFxuICAgIG5ld1Rhc2tzLFxuICAgIHZhdWx0LFxuICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgcHJldmlvdXNUcmllcyxcbn06IHtcbiAgICBvcmlnaW5hbFRhc2s6IFRhc2s7XG4gICAgbmV3VGFza3M6IFRhc2tbXTtcbiAgICB2YXVsdDogVmF1bHQ7XG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICBwcmV2aW91c1RyaWVzOiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aW91c1RyaWVzID4gMTApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1Rhc2tzOiBUb28gbWFueSByZXRyaWVzLiBGaWxlIHVwZGF0ZSBub3QgcG9zc2libGUgLi4uJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oTWF0aC5wb3coMTAsIHByZXZpb3VzVHJpZXMpLCAxMDApOyAvLyAxLCAxMCwgMTAwLCAxMDAsIDEwMCwgLi4uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5UmVwZXRpdGl2ZSh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxUYXNrLFxuICAgICAgICAgICAgICAgIG5ld1Rhc2tzLFxuICAgICAgICAgICAgICAgIHZhdWx0LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNUcmllczogcHJldmlvdXNUcmllcyArIDEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbGUgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob3JpZ2luYWxUYXNrLnBhdGgpO1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFRhc2tzOiBObyBmaWxlIGZvdW5kIGZvciB0YXNrICR7b3JpZ2luYWxUYXNrLmRlc2NyaXB0aW9ufS4gUmV0cnlpbmcgLi4uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJldHJ5KCk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZXh0ZW5zaW9uICE9PSAnbWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnVGFza3M6IE9ubHkgc3VwcG9ydGluZyBmaWxlcyB3aXRoIHRoZSAubWQgZmlsZSBleHRlbnNpb24uJyxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDYWNoZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIGlmIChmaWxlQ2FjaGUgPT0gdW5kZWZpbmVkIHx8IGZpbGVDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgVGFza3M6IE5vIGZpbGUgY2FjaGUgZm91bmQgZm9yIGZpbGUgJHtmaWxlLnBhdGh9LiBSZXRyeWluZyAuLi5gLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0SXRlbXNDYWNoZSA9IGZpbGVDYWNoZS5saXN0SXRlbXM7XG4gICAgaWYgKGxpc3RJdGVtc0NhY2hlID09PSB1bmRlZmluZWQgfHwgbGlzdEl0ZW1zQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUYXNrczogTm8gbGlzdCBpdGVtcyBmb3VuZCBpbiBmaWxlIGNhY2hlIG9mICR7ZmlsZS5wYXRofS4gUmV0cnlpbmcgLi4uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJldHJ5KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCB2YXVsdC5yZWFkKGZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGZpbGVDb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgIGNvbnN0IHsgZ2xvYmFsRmlsdGVyIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIGxldCBsaXN0SXRlbTogTGlzdEl0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2VjdGlvbkluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGxpc3RJdGVtQ2FjaGUgb2YgbGlzdEl0ZW1zQ2FjaGUpIHtcbiAgICAgICAgaWYgKGxpc3RJdGVtQ2FjaGUucG9zaXRpb24uc3RhcnQubGluZSA8IG9yaWdpbmFsVGFzay5zZWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RJdGVtQ2FjaGUudGFzayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmUgPSBmaWxlTGluZXNbbGlzdEl0ZW1DYWNoZS5wb3NpdGlvbi5zdGFydC5saW5lXTtcblxuICAgICAgICBpZiAobGluZS5pbmNsdWRlcyhnbG9iYWxGaWx0ZXIpKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID09PSBvcmlnaW5hbFRhc2suc2VjdGlvbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW0gPSBsaXN0SXRlbUNhY2hlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobGlzdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogY291bGQgbm90IGZpbmQgdGFzayB0byB0b2dnbGUgaW4gdGhlIGZpbGUuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkRmlsZUxpbmVzID0gW1xuICAgICAgICAuLi5maWxlTGluZXMuc2xpY2UoMCwgbGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZSksXG4gICAgICAgIC4uLm5ld1Rhc2tzLm1hcCgodGFzazogVGFzaykgPT4gdGFzay50b0ZpbGVMaW5lU3RyaW5nKCkpLFxuICAgICAgICAuLi5maWxlTGluZXMuc2xpY2UobGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZSArIDEpLCAvLyBPbmx5IHN1cHBvcnRzIHNpbmdsZS1saW5lIHRhc2tzLlxuICAgIF07XG5cbiAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZmlsZSwgdXBkYXRlZEZpbGVMaW5lcy5qb2luKCdcXG4nKSk7XG59O1xuIiwiZXhwb3J0IGNsYXNzIExheW91dE9wdGlvbnMge1xuICAgIGhpZGVUYXNrQ291bnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlQmFja2xpbmtzOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZVByaW9yaXR5OiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZVN0YXJ0RGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVTY2hlZHVsZWREYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZURvbmVEYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUR1ZURhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlUmVjdXJyZW5jZVJ1bGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlRWRpdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNob3J0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xufVxuIiwiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFdlZWtkYXlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgdmFyIEFMTF9XRUVLREFZUyA9IFsnTU8nLCAnVFUnLCAnV0UnLCAnVEgnLCAnRlInLCAnU0EnLCAnU1UnXTtcbnZhciBXZWVrZGF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFdlZWtkYXkod2Vla2RheSwgbikge1xuICAgICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSB3ZWVrZGF5IHdpdGggbiA9PSAwXCIpO1xuICAgICAgICB0aGlzLndlZWtkYXkgPSB3ZWVrZGF5O1xuICAgICAgICB0aGlzLm4gPSBuO1xuICAgIH1cbiAgICBXZWVrZGF5LmZyb21TdHIgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2Vla2RheShBTExfV0VFS0RBWVMuaW5kZXhPZihzdHIpKTtcbiAgICB9O1xuICAgIC8vIF9fY2FsbF9fIC0gQ2Fubm90IGNhbGwgdGhlIG9iamVjdCBkaXJlY3RseSwgZG8gaXQgdGhyb3VnaFxuICAgIC8vIGUuZy4gUlJ1bGUuVEgubnRoKC0xKSBpbnN0ZWFkLFxuICAgIFdlZWtkYXkucHJvdG90eXBlLm50aCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm4gPT09IG4gPyB0aGlzIDogbmV3IFdlZWtkYXkodGhpcy53ZWVrZGF5LCBuKTtcbiAgICB9O1xuICAgIC8vIF9fZXFfX1xuICAgIFdlZWtkYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrZGF5ID09PSBvdGhlci53ZWVrZGF5ICYmIHRoaXMubiA9PT0gb3RoZXIubjtcbiAgICB9O1xuICAgIC8vIF9fcmVwcl9fXG4gICAgV2Vla2RheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzID0gQUxMX1dFRUtEQVlTW3RoaXMud2Vla2RheV07XG4gICAgICAgIGlmICh0aGlzLm4pXG4gICAgICAgICAgICBzID0gKHRoaXMubiA+IDAgPyAnKycgOiAnJykgKyBTdHJpbmcodGhpcy5uKSArIHM7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH07XG4gICAgV2Vla2RheS5wcm90b3R5cGUuZ2V0SnNXZWVrZGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrZGF5ID09PSA2ID8gMCA6IHRoaXMud2Vla2RheSArIDE7XG4gICAgfTtcbiAgICByZXR1cm4gV2Vla2RheTtcbn0oKSk7XG5leHBvcnQgeyBXZWVrZGF5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWVrZGF5LmpzLm1hcCIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgZnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuaW1wb3J0IHsgQUxMX1dFRUtEQVlTIH0gZnJvbSAnLi93ZWVrZGF5JztcbmV4cG9ydCB2YXIgaXNQcmVzZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHZhciBpc051bWJlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufTtcbmV4cG9ydCB2YXIgaXNXZWVrZGF5U3RyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIEFMTF9XRUVLREFZUy5pbmRleE9mKHZhbHVlKSA+PSAwO1xufTtcbmV4cG9ydCB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4vKipcbiAqIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBweXRob24ncyByYW5nZSgpXG4gKi9cbmV4cG9ydCB2YXIgcmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIGlmIChlbmQgPT09IHZvaWQgMCkgeyBlbmQgPSBzdGFydDsgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHZhciByYW5nID0gW107XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspXG4gICAgICAgIHJhbmcucHVzaChpKTtcbiAgICByZXR1cm4gcmFuZztcbn07XG5leHBvcnQgdmFyIGNsb25lID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhcnJheSk7XG59O1xuZXhwb3J0IHZhciByZXBlYXQgPSBmdW5jdGlvbiAodmFsdWUsIHRpbWVzKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgICAgICBhcnJheVtpXSA9IFtdLmNvbmNhdCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgICAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59O1xuZXhwb3J0IHZhciB0b0FycmF5ID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcmV0dXJuIFtpdGVtXTtcbn07XG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaXRlbSwgdGFyZ2V0TGVuZ3RoLCBwYWRTdHJpbmcpIHtcbiAgICBpZiAocGFkU3RyaW5nID09PSB2b2lkIDApIHsgcGFkU3RyaW5nID0gJyAnOyB9XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpdGVtKTtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gICAgfVxuICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCAtIHN0ci5sZW5ndGg7XG4gICAgaWYgKHRhcmdldExlbmd0aCA+IHBhZFN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgcGFkU3RyaW5nICs9IHJlcGVhdChwYWRTdHJpbmcsIHRhcmdldExlbmd0aCAvIHBhZFN0cmluZy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFkU3RyaW5nLnNsaWNlKDAsIHRhcmdldExlbmd0aCkgKyBTdHJpbmcoc3RyKTtcbn1cbi8qKlxuICogUHl0aG9uIGxpa2Ugc3BsaXRcbiAqL1xuZXhwb3J0IHZhciBzcGxpdCA9IGZ1bmN0aW9uIChzdHIsIHNlcCwgbnVtKSB7XG4gICAgdmFyIHNwbGl0cyA9IHN0ci5zcGxpdChzZXApO1xuICAgIHJldHVybiBudW1cbiAgICAgICAgPyBzcGxpdHMuc2xpY2UoMCwgbnVtKS5jb25jYXQoW3NwbGl0cy5zbGljZShudW0pLmpvaW4oc2VwKV0pXG4gICAgICAgIDogc3BsaXRzO1xufTtcbi8qKlxuICogY2xvc3VyZS9nb29nL21hdGgvbWF0aC5qczptb2R1bG9cbiAqIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy5cbiAqIFRoZSAlIG9wZXJhdG9yIGluIEphdmFTY3JpcHQgcmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGEgLyBiLCBidXQgZGlmZmVycyBmcm9tXG4gKiBzb21lIG90aGVyIGxhbmd1YWdlcyBpbiB0aGF0IHRoZSByZXN1bHQgd2lsbCBoYXZlIHRoZSBzYW1lIHNpZ24gYXMgdGhlXG4gKiBkaXZpZGVuZC4gRm9yIGV4YW1wbGUsIC0xICUgOCA9PSAtMSwgd2hlcmVhcyBpbiBzb21lIG90aGVyIGxhbmd1YWdlc1xuICogKHN1Y2ggYXMgUHl0aG9uKSB0aGUgcmVzdWx0IHdvdWxkIGJlIDcuIFRoaXMgZnVuY3Rpb24gZW11bGF0ZXMgdGhlIG1vcmVcbiAqIGNvcnJlY3QgbW9kdWxvIGJlaGF2aW9yLCB3aGljaCBpcyB1c2VmdWwgZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zIHN1Y2ggYXNcbiAqIGNhbGN1bGF0aW5nIGFuIG9mZnNldCBpbmRleCBpbiBhIGNpcmN1bGFyIGxpc3QuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIGRpdmlkZW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IGIgVGhlIGRpdmlzb3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGEgJSBiIHdoZXJlIHRoZSByZXN1bHQgaXMgYmV0d2VlbiAwIGFuZCBiIChlaXRoZXIgMCA8PSB4IDwgYlxuICogICAgIG9yIGIgPCB4IDw9IDAsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiBiKS5cbiAqL1xuZXhwb3J0IHZhciBweW1vZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIHIgPSBhICUgYjtcbiAgICAvLyBJZiByIGFuZCBiIGRpZmZlciBpbiBzaWduLCBhZGQgYiB0byB3cmFwIHRoZSByZXN1bHQgdG8gdGhlIGNvcnJlY3Qgc2lnbi5cbiAgICByZXR1cm4gciAqIGIgPCAwID8gciArIGIgOiByO1xufTtcbi8qKlxuICogQHNlZTogPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNkaXZtb2Q+XG4gKi9cbmV4cG9ydCB2YXIgZGl2bW9kID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4geyBkaXY6IE1hdGguZmxvb3IoYSAvIGIpLCBtb2Q6IHB5bW9kKGEsIGIpIH07XG59O1xuZXhwb3J0IHZhciBlbXB0eSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gIWlzUHJlc2VudChvYmopIHx8IG9iai5sZW5ndGggPT09IDA7XG59O1xuLyoqXG4gKiBQeXRob24tbGlrZSBib29sZWFuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB2YWx1ZSBvZiBhbiBvYmplY3QvcHJpbWl0aXZlLCB0YWtpbmcgaW50byBhY2NvdW50XG4gKiB0aGUgZmFjdCB0aGF0IGluIFB5dGhvbiBhbiBlbXB0eSBsaXN0J3MvdHVwbGUnc1xuICogYm9vbGVhbiB2YWx1ZSBpcyBGYWxzZSwgd2hlcmVhcyBpbiBKUyBpdCdzIHRydWVcbiAqL1xuZXhwb3J0IHZhciBub3RFbXB0eSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gIWVtcHR5KG9iaik7XG59O1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhIHZhbHVlIGlzIGluIGFuIGFycmF5XG4gKi9cbmV4cG9ydCB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiAoYXJyLCB2YWwpIHtcbiAgICByZXR1cm4gbm90RW1wdHkoYXJyKSAmJiBhcnIuaW5kZXhPZih2YWwpICE9PSAtMTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCIsImltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSAnLi9oZWxwZXJzJztcbi8qKlxuICogR2VuZXJhbCBkYXRlLXJlbGF0ZWQgdXRpbGl0aWVzLlxuICogQWxzbyBoYW5kbGVzIHNldmVyYWwgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBKYXZhU2NyaXB0IGFuZCBQeXRob25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgZGF0ZXV0aWw7XG4oZnVuY3Rpb24gKGRhdGV1dGlsKSB7XG4gICAgZGF0ZXV0aWwuTU9OVEhfREFZUyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIG9uZSBkYXlcbiAgICAgKi9cbiAgICBkYXRldXRpbC5PTkVfREFZID0gMTAwMCAqIDYwICogNjAgKiAyNDtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuTUFYWUVBUj5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5NQVhZRUFSID0gOTk5OTtcbiAgICAvKipcbiAgICAgKiBQeXRob24gdXNlcyAxLUphbi0xIGFzIHRoZSBiYXNlIGZvciBjYWxjdWxhdGluZyBvcmRpbmFscyBidXQgd2UgZG9uJ3RcbiAgICAgKiB3YW50IHRvIGNvbmZ1c2UgdGhlIEpTIGVuZ2luZSB3aXRoIG1pbGxpc2Vjb25kcyA+IE51bWJlci5NQVhfTlVNQkVSLFxuICAgICAqIHRoZXJlZm9yZSB3ZSB1c2UgMS1KYW4tMTk3MCBpbnN0ZWFkXG4gICAgICovXG4gICAgZGF0ZXV0aWwuT1JESU5BTF9CQVNFID0gbmV3IERhdGUoRGF0ZS5VVEMoMTk3MCwgMCwgMSkpO1xuICAgIC8qKlxuICAgICAqIFB5dGhvbjogTU8tU1U6IDAgLSA2XG4gICAgICogSlM6IFNVLVNBVCAwIC0gNlxuICAgICAqL1xuICAgIGRhdGV1dGlsLlBZX1dFRUtEQVlTID0gWzYsIDAsIDEsIDIsIDMsIDQsIDVdO1xuICAgIC8qKlxuICAgICAqIHB5X2RhdGUudGltZXR1cGxlKClbN11cbiAgICAgKi9cbiAgICBkYXRldXRpbC5nZXRZZWFyRGF5ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIGRhdGVOb1RpbWUgPSBuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSwgZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gKE1hdGguY2VpbCgoZGF0ZU5vVGltZS52YWx1ZU9mKCkgLVxuICAgICAgICAgICAgbmV3IERhdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCAwLCAxKS52YWx1ZU9mKCkpIC9cbiAgICAgICAgICAgIGRhdGV1dGlsLk9ORV9EQVkpICsgMSk7XG4gICAgfTtcbiAgICBkYXRldXRpbC5pc0xlYXBZZWFyID0gZnVuY3Rpb24gKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH07XG4gICAgZGF0ZXV0aWwuaXNEYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfTtcbiAgICBkYXRldXRpbC5pc1ZhbGlkRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZXV0aWwuaXNEYXRlKHZhbHVlKSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIGRhdGUncyB0aW1lem9uZSBvZmZzZXQgaW4gbXNcbiAgICAgKi9cbiAgICBkYXRldXRpbC50ek9mZnNldCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL3d3dy5tY2ZlZHJpZXMuY29tL0phdmFTY3JpcHQvRGF5c0JldHdlZW4uYXNwPlxuICAgICAqL1xuICAgIGRhdGV1dGlsLmRheXNCZXR3ZWVuID0gZnVuY3Rpb24gKGRhdGUxLCBkYXRlMikge1xuICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgZGF5XG4gICAgICAgIC8vIENvbnZlcnQgYm90aCBkYXRlcyB0byBtaWxsaXNlY29uZHNcbiAgICAgICAgdmFyIGRhdGUxbXMgPSBkYXRlMS5nZXRUaW1lKCkgLSBkYXRldXRpbC50ek9mZnNldChkYXRlMSk7XG4gICAgICAgIHZhciBkYXRlMm1zID0gZGF0ZTIuZ2V0VGltZSgpIC0gZGF0ZXV0aWwudHpPZmZzZXQoZGF0ZTIpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIHZhciBkaWZmZXJlbmNlbXMgPSBkYXRlMW1zIC0gZGF0ZTJtcztcbiAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGRheXMgYW5kIHJldHVyblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkaWZmZXJlbmNlbXMgLyBkYXRldXRpbC5PTkVfREFZKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWU6IDxodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZGF0ZXRpbWUuaHRtbCNkYXRldGltZS5kYXRlLnRvb3JkaW5hbD5cbiAgICAgKi9cbiAgICBkYXRldXRpbC50b09yZGluYWwgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZXV0aWwuZGF5c0JldHdlZW4oZGF0ZSwgZGF0ZXV0aWwuT1JESU5BTF9CQVNFKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWUgLSA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuZGF0ZS5mcm9tb3JkaW5hbD5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5mcm9tT3JkaW5hbCA9IGZ1bmN0aW9uIChvcmRpbmFsKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRldXRpbC5PUkRJTkFMX0JBU0UuZ2V0VGltZSgpICsgb3JkaW5hbCAqIGRhdGV1dGlsLk9ORV9EQVkpO1xuICAgIH07XG4gICAgZGF0ZXV0aWwuZ2V0TW9udGhEYXlzID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICByZXR1cm4gbW9udGggPT09IDEgJiYgZGF0ZXV0aWwuaXNMZWFwWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpXG4gICAgICAgICAgICA/IDI5XG4gICAgICAgICAgICA6IGRhdGV1dGlsLk1PTlRIX0RBWVNbbW9udGhdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBweXRob24tbGlrZSB3ZWVrZGF5XG4gICAgICovXG4gICAgZGF0ZXV0aWwuZ2V0V2Vla2RheSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRldXRpbC5QWV9XRUVLREFZU1tkYXRlLmdldFVUQ0RheSgpXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWU6IDxodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvY2FsZW5kYXIuaHRtbCNjYWxlbmRhci5tb250aHJhbmdlPlxuICAgICAqL1xuICAgIGRhdGV1dGlsLm1vbnRoUmFuZ2UgPSBmdW5jdGlvbiAoeWVhciwgbW9udGgpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgMSkpO1xuICAgICAgICByZXR1cm4gW2RhdGV1dGlsLmdldFdlZWtkYXkoZGF0ZSksIGRhdGV1dGlsLmdldE1vbnRoRGF5cyhkYXRlKV07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuZGF0ZXRpbWUuY29tYmluZT5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5jb21iaW5lID0gZnVuY3Rpb24gKGRhdGUsIHRpbWUpIHtcbiAgICAgICAgdGltZSA9IHRpbWUgfHwgZGF0ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpKTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLmNsb25lID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIGRvbGx5ID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICByZXR1cm4gZG9sbHk7XG4gICAgfTtcbiAgICBkYXRldXRpbC5jbG9uZURhdGVzID0gZnVuY3Rpb24gKGRhdGVzKSB7XG4gICAgICAgIHZhciBjbG9uZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2xvbmVzLnB1c2goZGF0ZXV0aWwuY2xvbmUoZGF0ZXNbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU29ydHMgYW4gYXJyYXkgb2YgRGF0ZSBvciBkYXRldXRpbC5UaW1lIG9iamVjdHNcbiAgICAgKi9cbiAgICBkYXRldXRpbC5zb3J0ID0gZnVuY3Rpb24gKGRhdGVzKSB7XG4gICAgICAgIGRhdGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLnRpbWVUb1VudGlsU3RyaW5nID0gZnVuY3Rpb24gKHRpbWUsIHV0Yykge1xuICAgICAgICBpZiAodXRjID09PSB2b2lkIDApIHsgdXRjID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcGFkU3RhcnQoZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIDQsICcwJyksXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyLCAnMCcpLFxuICAgICAgICAgICAgcGFkU3RhcnQoZGF0ZS5nZXRVVENEYXRlKCksIDIsICcwJyksXG4gICAgICAgICAgICAnVCcsXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ0hvdXJzKCksIDIsICcwJyksXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ01pbnV0ZXMoKSwgMiwgJzAnKSxcbiAgICAgICAgICAgIHBhZFN0YXJ0KGRhdGUuZ2V0VVRDU2Vjb25kcygpLCAyLCAnMCcpLFxuICAgICAgICAgICAgdXRjID8gJ1onIDogJydcbiAgICAgICAgXS5qb2luKCcnKTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLnVudGlsU3RyaW5nVG9EYXRlID0gZnVuY3Rpb24gKHVudGlsKSB7XG4gICAgICAgIHZhciByZSA9IC9eKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFQoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSlaPyk/JC87XG4gICAgICAgIHZhciBiaXRzID0gcmUuZXhlYyh1bnRpbCk7XG4gICAgICAgIGlmICghYml0cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgVU5USUwgdmFsdWU6IFwiICsgdW50aWwpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMocGFyc2VJbnQoYml0c1sxXSwgMTApLCBwYXJzZUludChiaXRzWzJdLCAxMCkgLSAxLCBwYXJzZUludChiaXRzWzNdLCAxMCksIHBhcnNlSW50KGJpdHNbNV0sIDEwKSB8fCAwLCBwYXJzZUludChiaXRzWzZdLCAxMCkgfHwgMCwgcGFyc2VJbnQoYml0c1s3XSwgMTApIHx8IDApKTtcbiAgICB9O1xufSkoZGF0ZXV0aWwgfHwgKGRhdGV1dGlsID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IGRhdGV1dGlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZXV0aWwuanMubWFwIiwiLyoqXG4gKiBUaGlzIGNsYXNzIGhlbHBzIHVzIHRvIGVtdWxhdGUgcHl0aG9uJ3MgZ2VuZXJhdG9ycywgc29ydGEuXG4gKi9cbnZhciBJdGVyUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEl0ZXJSZXN1bHQobWV0aG9kLCBhcmdzKSB7XG4gICAgICAgIHRoaXMubWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Jlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIGlmIChtZXRob2QgPT09ICdiZXR3ZWVuJykge1xuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gYXJncy5pbmNcbiAgICAgICAgICAgICAgICA/IGFyZ3MuYmVmb3JlXG4gICAgICAgICAgICAgICAgOiBuZXcgRGF0ZShhcmdzLmJlZm9yZS5nZXRUaW1lKCkgLSAxKTtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IGFyZ3MuaW5jID8gYXJncy5hZnRlciA6IG5ldyBEYXRlKGFyZ3MuYWZ0ZXIuZ2V0VGltZSgpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0aG9kID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gYXJncy5pbmMgPyBhcmdzLmR0IDogbmV3IERhdGUoYXJncy5kdC5nZXRUaW1lKCkgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRob2QgPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IGFyZ3MuaW5jID8gYXJncy5kdCA6IG5ldyBEYXRlKGFyZ3MuZHQuZ2V0VGltZSgpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUG9zc2libHkgYWRkcyBhIGRhdGUgaW50byB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gdGhlIGRhdGUgaXNuJ3QgbmVjZXNzYXJseSBhZGRlZCB0byB0aGUgcmVzdWx0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgbGlzdCAoaWYgaXQgaXMgdG9vIGxhdGUvdG9vIGVhcmx5KVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgaXQgbWFrZXMgc2Vuc2UgdG8gY29udGludWUgdGhlIGl0ZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHdlJ3JlIGRvbmUuXG4gICAgICovXG4gICAgSXRlclJlc3VsdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgKyt0aGlzLnRvdGFsO1xuICAgICAgICB2YXIgdG9vRWFybHkgPSB0aGlzLm1pbkRhdGUgJiYgZGF0ZSA8IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdmFyIHRvb0xhdGUgPSB0aGlzLm1heERhdGUgJiYgZGF0ZSA+IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAnYmV0d2VlbicpIHtcbiAgICAgICAgICAgIGlmICh0b29FYXJseSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0b29MYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGhvZCA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgIGlmICh0b29MYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGhvZCA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgaWYgKHRvb0Vhcmx5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hZGQoZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGRhdGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSByZXN1bHQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBtb3JlIHZhbHVlcy5cbiAgICAgKi9cbiAgICBJdGVyUmVzdWx0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB0aGlzLl9yZXN1bHQucHVzaChkYXRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAnYmVmb3JlJyBhbmQgJ2FmdGVyJyByZXR1cm4gb25seSBvbmUgZGF0ZSwgd2hlcmVhcyAnYWxsJ1xuICAgICAqIGFuZCAnYmV0d2VlbicgYW4gYXJyYXkuXG4gICAgICogQHJldHVybiB7RGF0ZSxBcnJheT99XG4gICAgICovXG4gICAgSXRlclJlc3VsdC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLl9yZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgICAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXMubGVuZ3RoID8gcmVzW3Jlcy5sZW5ndGggLSAxXSA6IG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJdGVyUmVzdWx0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVyUmVzdWx0KHRoaXMubWV0aG9kLCB0aGlzLmFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIEl0ZXJSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgSXRlclJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJyZXN1bHQuanMubWFwIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgSXRlclJlc3VsdCBmcm9tICcuL2l0ZXJyZXN1bHQnO1xuLyoqXG4gKiBJdGVyUmVzdWx0IHN1YmNsYXNzIHRoYXQgY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIGFkZCxcbiAqIGFuZCBzdG9wcyBpdGVyYXRpbmcgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBmYWxzZS5cbiAqL1xudmFyIENhbGxiYWNrSXRlclJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FsbGJhY2tJdGVyUmVzdWx0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGxiYWNrSXRlclJlc3VsdChtZXRob2QsIGFyZ3MsIGl0ZXJhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1ldGhvZCwgYXJncykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYWxsYmFja0l0ZXJSZXN1bHQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdG9yKGRhdGUsIHRoaXMuX3Jlc3VsdC5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHQucHVzaChkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxsYmFja0l0ZXJSZXN1bHQ7XG59KEl0ZXJSZXN1bHQpKTtcbmV4cG9ydCBkZWZhdWx0IENhbGxiYWNrSXRlclJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbGxiYWNraXRlcnJlc3VsdC5qcy5tYXAiLCIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gaTE4blxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBFTkdMSVNIID0ge1xuICAgIGRheU5hbWVzOiBbXG4gICAgICAgICdTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JyxcbiAgICAgICAgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSdcbiAgICBdLFxuICAgIG1vbnRoTmFtZXM6IFtcbiAgICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JyxcbiAgICAgICAgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLFxuICAgICAgICAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gICAgXSxcbiAgICB0b2tlbnM6IHtcbiAgICAgICAgJ1NLSVAnOiAvXlsgXFxyXFxuXFx0XSt8XlxcLiQvLFxuICAgICAgICAnbnVtYmVyJzogL15bMS05XVswLTldKi8sXG4gICAgICAgICdudW1iZXJBc1RleHQnOiAvXihvbmV8dHdvfHRocmVlKS9pLFxuICAgICAgICAnZXZlcnknOiAvXmV2ZXJ5L2ksXG4gICAgICAgICdkYXkocyknOiAvXmRheXM/L2ksXG4gICAgICAgICd3ZWVrZGF5KHMpJzogL153ZWVrZGF5cz8vaSxcbiAgICAgICAgJ3dlZWsocyknOiAvXndlZWtzPy9pLFxuICAgICAgICAnaG91cihzKSc6IC9eaG91cnM/L2ksXG4gICAgICAgICdtaW51dGUocyknOiAvXm1pbnV0ZXM/L2ksXG4gICAgICAgICdtb250aChzKSc6IC9ebW9udGhzPy9pLFxuICAgICAgICAneWVhcihzKSc6IC9eeWVhcnM/L2ksXG4gICAgICAgICdvbic6IC9eKG9ufGluKS9pLFxuICAgICAgICAnYXQnOiAvXihhdCkvaSxcbiAgICAgICAgJ3RoZSc6IC9edGhlL2ksXG4gICAgICAgICdmaXJzdCc6IC9eZmlyc3QvaSxcbiAgICAgICAgJ3NlY29uZCc6IC9ec2Vjb25kL2ksXG4gICAgICAgICd0aGlyZCc6IC9edGhpcmQvaSxcbiAgICAgICAgJ250aCc6IC9eKFsxLTldWzAtOV0qKShcXC58dGh8bmR8cmR8c3QpL2ksXG4gICAgICAgICdsYXN0JzogL15sYXN0L2ksXG4gICAgICAgICdmb3InOiAvXmZvci9pLFxuICAgICAgICAndGltZShzKSc6IC9edGltZXM/L2ksXG4gICAgICAgICd1bnRpbCc6IC9eKHVuKT90aWwvaSxcbiAgICAgICAgJ21vbmRheSc6IC9ebW8obihkYXkpPyk/L2ksXG4gICAgICAgICd0dWVzZGF5JzogL150dShlKHMoZGF5KT8pPyk/L2ksXG4gICAgICAgICd3ZWRuZXNkYXknOiAvXndlKGQobihlc2RheSk/KT8pPy9pLFxuICAgICAgICAndGh1cnNkYXknOiAvXnRoKHUocihzZGF5KT8pPyk/L2ksXG4gICAgICAgICdmcmlkYXknOiAvXmZyKGkoZGF5KT8pPy9pLFxuICAgICAgICAnc2F0dXJkYXknOiAvXnNhKHQodXJkYXkpPyk/L2ksXG4gICAgICAgICdzdW5kYXknOiAvXnN1KG4oZGF5KT8pPy9pLFxuICAgICAgICAnamFudWFyeSc6IC9eamFuKHVhcnkpPy9pLFxuICAgICAgICAnZmVicnVhcnknOiAvXmZlYihydWFyeSk/L2ksXG4gICAgICAgICdtYXJjaCc6IC9ebWFyKGNoKT8vaSxcbiAgICAgICAgJ2FwcmlsJzogL15hcHIoaWwpPy9pLFxuICAgICAgICAnbWF5JzogL15tYXkvaSxcbiAgICAgICAgJ2p1bmUnOiAvXmp1bmU/L2ksXG4gICAgICAgICdqdWx5JzogL15qdWx5Py9pLFxuICAgICAgICAnYXVndXN0JzogL15hdWcodXN0KT8vaSxcbiAgICAgICAgJ3NlcHRlbWJlcic6IC9ec2VwKHQoZW1iZXIpPyk/L2ksXG4gICAgICAgICdvY3RvYmVyJzogL15vY3Qob2Jlcik/L2ksXG4gICAgICAgICdub3ZlbWJlcic6IC9ebm92KGVtYmVyKT8vaSxcbiAgICAgICAgJ2RlY2VtYmVyJzogL15kZWMoZW1iZXIpPy9pLFxuICAgICAgICAnY29tbWEnOiAvXigsXFxzKnwoYW5kfG9yKVxccyopKy9pXG4gICAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IEVOR0xJU0g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pMThuLmpzLm1hcCIsImltcG9ydCBFTkdMSVNIIGZyb20gJy4vaTE4bic7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNOdW1iZXIsIGlzUHJlc2VudCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlciBmdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGEgdmFsdWUgaXMgaW4gYW4gYXJyYXlcbiAqL1xudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gKGFyciwgdmFsKSB7XG4gICAgcmV0dXJuIGFyci5pbmRleE9mKHZhbCkgIT09IC0xO1xufTtcbnZhciBkZWZhdWx0R2V0VGV4dCA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gaWQudG9TdHJpbmcoKTsgfTtcbnZhciBkZWZhdWx0RGF0ZUZvcm1hdHRlciA9IGZ1bmN0aW9uICh5ZWFyLCBtb250aCwgZGF5KSB7IHJldHVybiBtb250aCArIFwiIFwiICsgZGF5ICsgXCIsIFwiICsgeWVhcjsgfTtcbi8qKlxuICpcbiAqIEBwYXJhbSB7UlJ1bGV9IHJydWxlXG4gKiBPcHRpb25hbDpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRleHQgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBsYW5ndWFnZSBkZWZpbml0aW9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xudmFyIFRvVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb1RleHQocnJ1bGUsIGdldHRleHQsIGxhbmd1YWdlLCBkYXRlRm9ybWF0dGVyKSB7XG4gICAgICAgIGlmIChnZXR0ZXh0ID09PSB2b2lkIDApIHsgZ2V0dGV4dCA9IGRlZmF1bHRHZXRUZXh0OyB9XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gdm9pZCAwKSB7IGxhbmd1YWdlID0gRU5HTElTSDsgfVxuICAgICAgICBpZiAoZGF0ZUZvcm1hdHRlciA9PT0gdm9pZCAwKSB7IGRhdGVGb3JtYXR0ZXIgPSBkZWZhdWx0RGF0ZUZvcm1hdHRlcjsgfVxuICAgICAgICB0aGlzLnRleHQgPSBbXTtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlIHx8IEVOR0xJU0g7XG4gICAgICAgIHRoaXMuZ2V0dGV4dCA9IGdldHRleHQ7XG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdHRlciA9IGRhdGVGb3JtYXR0ZXI7XG4gICAgICAgIHRoaXMucnJ1bGUgPSBycnVsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gcnJ1bGUub3B0aW9ucztcbiAgICAgICAgdGhpcy5vcmlnT3B0aW9ucyA9IHJydWxlLm9yaWdPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB2YXIgYnltb250aGRheSA9IFtdLmNvbmNhdCh0aGlzLm9wdGlvbnMuYnltb250aGRheSk7XG4gICAgICAgICAgICB2YXIgYnlubW9udGhkYXkgPSBbXS5jb25jYXQodGhpcy5vcHRpb25zLmJ5bm1vbnRoZGF5KTtcbiAgICAgICAgICAgIGJ5bW9udGhkYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pO1xuICAgICAgICAgICAgYnlubW9udGhkYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH0pO1xuICAgICAgICAgICAgLy8gMSwgMiwgMywgLi4sIC01LCAtNCwgLTMsIC4uXG4gICAgICAgICAgICB0aGlzLmJ5bW9udGhkYXkgPSBieW1vbnRoZGF5LmNvbmNhdChieW5tb250aGRheSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYnltb250aGRheS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5ieW1vbnRoZGF5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5KSkge1xuICAgICAgICAgICAgdmFyIGJ5d2Vla2RheSA9ICFpc0FycmF5KHRoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5KVxuICAgICAgICAgICAgICAgID8gW3RoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5XVxuICAgICAgICAgICAgICAgIDogdGhpcy5vcmlnT3B0aW9ucy5ieXdlZWtkYXk7XG4gICAgICAgICAgICB2YXIgZGF5cyA9IFN0cmluZyhieXdlZWtkYXkpO1xuICAgICAgICAgICAgdGhpcy5ieXdlZWtkYXkgPSB7XG4gICAgICAgICAgICAgICAgYWxsV2Vla3M6IGJ5d2Vla2RheS5maWx0ZXIoZnVuY3Rpb24gKHdlZWtkYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF3ZWVrZGF5Lm47XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc29tZVdlZWtzOiBieXdlZWtkYXkuZmlsdGVyKGZ1bmN0aW9uICh3ZWVrZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHdlZWtkYXkubik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgaXNXZWVrZGF5czogZGF5cy5pbmRleE9mKCdNTycpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1RVJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignV0UnKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdUSCcpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ0ZSJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignU0EnKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdTVScpID09PSAtMSxcbiAgICAgICAgICAgICAgICBpc0V2ZXJ5RGF5OiBkYXlzLmluZGV4T2YoJ01PJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignVFUnKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdXRScpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1RIJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignRlInKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdTQScpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1NVJykgIT09IC0xXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHNvcnRXZWVrRGF5cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEud2Vla2RheSAtIGIud2Vla2RheTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheS5hbGxXZWVrcy5zb3J0KHNvcnRXZWVrRGF5cyk7XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheS5zb21lV2Vla3Muc29ydChzb3J0V2Vla0RheXMpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJ5d2Vla2RheS5hbGxXZWVrcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJ5d2Vla2RheS5zb21lV2Vla3MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMuYnl3ZWVrZGF5LnNvbWVXZWVrcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCB3aGV0aGVyIHRoZSBycnVsZSBjYW4gYmUgZnVsbHkgY29udmVydGVkIHRvIHRleHQuXG4gICAgICogQHBhcmFtIHtSUnVsZX0gcnJ1bGVcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIFRvVGV4dC5pc0Z1bGx5Q29udmVydGlibGUgPSBmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgdmFyIGNhbkNvbnZlcnQgPSB0cnVlO1xuICAgICAgICBpZiAoIShycnVsZS5vcHRpb25zLmZyZXEgaW4gVG9UZXh0LklNUExFTUVOVEVEKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHJydWxlLm9yaWdPcHRpb25zLnVudGlsICYmIHJydWxlLm9yaWdPcHRpb25zLmNvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcnJ1bGUub3JpZ09wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWlucyhbJ2R0c3RhcnQnLCAnd2tzdCcsICdmcmVxJ10sIGtleSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKFRvVGV4dC5JTVBMRU1FTlRFRFtycnVsZS5vcHRpb25zLmZyZXFdLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuQ29udmVydDtcbiAgICB9O1xuICAgIFRvVGV4dC5wcm90b3R5cGUuaXNGdWxseUNvbnZlcnRpYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gVG9UZXh0LmlzRnVsbHlDb252ZXJ0aWJsZSh0aGlzLnJydWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gdGhlIGNvbnZlcnNpb24uIE9ubHkgc29tZSBvZiB0aGUgZnJlcXVlbmNpZXMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBJZiBzb21lIG9mIHRoZSBycnVsZSdzIG9wdGlvbnMgYXJlbid0IHN1cHBvcnRlZCwgdGhleSdsbFxuICAgICAqIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0IGFuIFwiKH4gYXBwcm94aW1hdGUpXCIgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqL1xuICAgIFRvVGV4dC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMuZnJlcSBpbiBUb1RleHQuSU1QTEVNRU5URUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0dGV4dCgnUlJ1bGUgZXJyb3I6IFVuYWJsZSB0byBmdWxseSBjb252ZXJ0IHRoaXMgcnJ1bGUgdG8gdGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IFtnZXR0ZXh0KCdldmVyeScpXTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzW1JSdWxlLkZSRVFVRU5DSUVTW3RoaXMub3B0aW9ucy5mcmVxXV0oKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bnRpbCkge1xuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgndW50aWwnKSk7XG4gICAgICAgICAgICB2YXIgdW50aWwgPSB0aGlzLm9wdGlvbnMudW50aWw7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmRhdGVGb3JtYXR0ZXIodW50aWwuZ2V0VVRDRnVsbFllYXIoKSwgdGhpcy5sYW5ndWFnZS5tb250aE5hbWVzW3VudGlsLmdldFVUQ01vbnRoKCldLCB1bnRpbC5nZXRVVENEYXRlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2ZvcicpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5vcHRpb25zLmNvdW50LnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuY291bnQpID8gZ2V0dGV4dCgndGltZXMnKSA6IGdldHRleHQoJ3RpbWUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzRnVsbHlDb252ZXJ0aWJsZSgpKVxuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnKH4gYXBwcm94aW1hdGUpJykpO1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmpvaW4oJycpO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5IT1VSTFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpID8gZ2V0dGV4dCgnaG91cnMnKSA6IGdldHRleHQoJ2hvdXInKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLk1JTlVURUxZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2V0dGV4dCA9IHRoaXMuZ2V0dGV4dDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCAhPT0gMSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMub3B0aW9ucy5pbnRlcnZhbC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKVxuICAgICAgICAgICAgPyBnZXR0ZXh0KCdtaW51dGVzJylcbiAgICAgICAgICAgIDogZ2V0dGV4dCgnbWludXRlJykpO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5EQUlMWSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdldHRleHQgPSB0aGlzLmdldHRleHQ7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpXG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc1dlZWtkYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpXG4gICAgICAgICAgICAgICAgPyBnZXR0ZXh0KCd3ZWVrZGF5cycpXG4gICAgICAgICAgICAgICAgOiBnZXR0ZXh0KCd3ZWVrZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKSA/IGdldHRleHQoJ2RheXMnKSA6IGdldHRleHQoJ2RheScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdpbicpKTtcbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3JpZ09wdGlvbnMuYnlob3VyKSB7XG4gICAgICAgICAgICB0aGlzLl9ieWhvdXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5XRUVLTFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSkuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkgPyBnZXR0ZXh0KCd3ZWVrcycpIDogZ2V0dGV4dCgnd2VlaycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkgJiYgdGhpcy5ieXdlZWtkYXkuaXNXZWVrZGF5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgICAgPyBnZXR0ZXh0KCd3ZWVrZGF5cycpXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0dGV4dCgnd2Vla2RheScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uJykpLmFkZChnZXR0ZXh0KCd3ZWVrZGF5cycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc0V2ZXJ5RGF5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpID8gZ2V0dGV4dCgnZGF5cycpIDogZ2V0dGV4dCgnZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCA9PT0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCd3ZWVrJykpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ09wdGlvbnMuYnltb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmJ5bW9udGhkYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLk1PTlRITFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpLmFkZChnZXR0ZXh0KCdtb250aHMnKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGQoZ2V0dGV4dCgnTU9OVEgnKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKVxuICAgICAgICAgICAgICAgID8gZ2V0dGV4dCgnbW9udGhzJylcbiAgICAgICAgICAgICAgICA6IGdldHRleHQoJ21vbnRoJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJ5bW9udGhkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGhkYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc1dlZWtkYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbicpKS5hZGQoZ2V0dGV4dCgnd2Vla2RheXMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLllFQVJMWSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdldHRleHQgPSB0aGlzLmdldHRleHQ7XG4gICAgICAgIGlmICh0aGlzLm9yaWdPcHRpb25zLmJ5bW9udGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgneWVhcnMnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZChnZXR0ZXh0KCdZRUFSJykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMub3B0aW9ucy5pbnRlcnZhbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkgPyBnZXR0ZXh0KCd5ZWFycycpIDogZ2V0dGV4dCgneWVhcicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnl5ZWFyZGF5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbiB0aGUnKSlcbiAgICAgICAgICAgICAgICAuYWRkKHRoaXMubGlzdCh0aGlzLm9wdGlvbnMuYnl5ZWFyZGF5LCB0aGlzLm50aCwgZ2V0dGV4dCgnYW5kJykpKVxuICAgICAgICAgICAgICAgIC5hZGQoZ2V0dGV4dCgnZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnl3ZWVrbm8pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpXG4gICAgICAgICAgICAgICAgLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuYnl3ZWVrbm8ubGVuZ3RoKVxuICAgICAgICAgICAgICAgID8gZ2V0dGV4dCgnd2Vla3MnKVxuICAgICAgICAgICAgICAgIDogZ2V0dGV4dCgnd2VlaycpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMub3B0aW9ucy5ieXdlZWtubywgdW5kZWZpbmVkLCBnZXR0ZXh0KCdhbmQnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieW1vbnRoZGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2V0dGV4dCA9IHRoaXMuZ2V0dGV4dDtcbiAgICAgICAgaWYgKHRoaXMuYnl3ZWVrZGF5ICYmIHRoaXMuYnl3ZWVrZGF5LmFsbFdlZWtzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbicpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMuYnl3ZWVrZGF5LmFsbFdlZWtzLCB0aGlzLndlZWtkYXl0ZXh0LCBnZXR0ZXh0KCdvcicpKSlcbiAgICAgICAgICAgICAgICAuYWRkKGdldHRleHQoJ3RoZScpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMuYnltb250aGRheSwgdGhpcy5udGgsIGdldHRleHQoJ29yJykpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uIHRoZScpKS5hZGQodGhpcy5saXN0KHRoaXMuYnltb250aGRheSwgdGhpcy5udGgsIGdldHRleHQoJ2FuZCcpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5hZGQoZ2V0dGV4dCgnREFZJykpXG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieXdlZWtkYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MgJiYgIXRoaXMuYnl3ZWVrZGF5LmlzV2Vla2RheXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uJykpLmFkZCh0aGlzLmxpc3QodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MsIHRoaXMud2Vla2RheXRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuc29tZVdlZWtzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnYW5kJykpO1xuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnb24gdGhlJykpLmFkZCh0aGlzLmxpc3QodGhpcy5ieXdlZWtkYXkuc29tZVdlZWtzLCB0aGlzLndlZWtkYXl0ZXh0LCBnZXR0ZXh0KCdhbmQnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieWhvdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdhdCcpKS5hZGQodGhpcy5saXN0KHRoaXMub3JpZ09wdGlvbnMuYnlob3VyLCB1bmRlZmluZWQsIGdldHRleHQoJ2FuZCcpKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieW1vbnRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFkZCh0aGlzLmxpc3QodGhpcy5vcHRpb25zLmJ5bW9udGgsIHRoaXMubW9udGh0ZXh0LCB0aGlzLmdldHRleHQoJ2FuZCcpKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLm50aCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIG4gPSBwYXJzZUludChuLnRvU3RyaW5nKCksIDEwKTtcbiAgICAgICAgdmFyIG50aDtcbiAgICAgICAgdmFyIG5wb3M7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAobiA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGV4dCgnbGFzdCcpO1xuICAgICAgICBucG9zID0gTWF0aC5hYnMobik7XG4gICAgICAgIHN3aXRjaCAobnBvcykge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgbnRoID0gbnBvcyArIGdldHRleHQoJ3N0Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgIG50aCA9IG5wb3MgKyBnZXR0ZXh0KCduZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICBudGggPSBucG9zICsgZ2V0dGV4dCgncmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbnRoID0gbnBvcyArIGdldHRleHQoJ3RoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG4gPCAwID8gbnRoICsgJyAnICsgZ2V0dGV4dCgnbGFzdCcpIDogbnRoO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5tb250aHRleHQgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZS5tb250aE5hbWVzW20gLSAxXTtcbiAgICB9O1xuICAgIFRvVGV4dC5wcm90b3R5cGUud2Vla2RheXRleHQgPSBmdW5jdGlvbiAod2RheSkge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGlzTnVtYmVyKHdkYXkpID8gKHdkYXkgKyAxKSAlIDcgOiB3ZGF5LmdldEpzV2Vla2RheSgpO1xuICAgICAgICByZXR1cm4gKCh3ZGF5Lm4gPyB0aGlzLm50aCh3ZGF5Lm4pICsgJyAnIDogJycpICsgdGhpcy5sYW5ndWFnZS5kYXlOYW1lc1t3ZWVrZGF5XSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLnBsdXJhbCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuICUgMTAwICE9PSAxO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB0aGlzLnRleHQucHVzaCgnICcpO1xuICAgICAgICB0aGlzLnRleHQucHVzaChzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbiAoYXJyLCBjYWxsYmFjaywgZmluYWxEZWxpbSwgZGVsaW0pIHtcbiAgICAgICAgaWYgKGRlbGltID09PSB2b2lkIDApIHsgZGVsaW0gPSAnLCc7IH1cbiAgICAgICAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICAgICAgICAgIGFyciA9IFthcnJdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWxpbUpvaW4gPSBmdW5jdGlvbiAoYXJyYXksIGRlbGltaXRlciwgZmluYWxEZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gJyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgKz0gJyAnICsgZmluYWxEZWxpbWl0ZXIgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ICs9IGRlbGltaXRlciArICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ICs9IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH07XG4gICAgICAgIGNhbGxiYWNrID1cbiAgICAgICAgICAgIGNhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciByZWFsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbChzZWxmLCBhcmcpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZmluYWxEZWxpbSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGltSm9pbihhcnIubWFwKHJlYWxDYWxsYmFjayksIGRlbGltLCBmaW5hbERlbGltKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhcnIubWFwKHJlYWxDYWxsYmFjaykuam9pbihkZWxpbSArICcgJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUb1RleHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgVG9UZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG90ZXh0LmpzLm1hcCIsImltcG9ydCBFTkdMSVNIIGZyb20gJy4vaTE4bic7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi4vaW5kZXgnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcnNlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VyKHJ1bGVzKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICB9XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0U3ltYm9sKCk7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmlzRG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9uZSAmJiB0aGlzLnN5bWJvbCA9PT0gbnVsbDtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUubmV4dFN5bWJvbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJlc3Q7XG4gICAgICAgIHZhciBiZXN0U3ltYm9sO1xuICAgICAgICB2YXIgcCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3ltYm9sID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdmFyIHJ1bGUgPSB2b2lkIDA7XG4gICAgICAgICAgICBiZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB0aGlzLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgcnVsZSA9IHRoaXMucnVsZXNbbmFtZV8xXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBydWxlLmV4ZWMocC50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3QgPT09IG51bGwgfHwgbWF0Y2hbMF0ubGVuZ3RoID4gYmVzdFswXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTeW1ib2wgPSBuYW1lXzE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cihiZXN0WzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dCA9PT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB9IHdoaWxlIChiZXN0U3ltYm9sID09PSAnU0tJUCcpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc3ltYm9sID0gYmVzdFN5bWJvbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGJlc3Q7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAodGhpcy5zeW1ib2wgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmFjY2VwdE51bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0KCdudW1iZXInKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0KG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgJyArIG5hbWUgKyAnIGJ1dCBmb3VuZCAnICsgdGhpcy5zeW1ib2wpO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVRleHQodGV4dCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAobGFuZ3VhZ2UgPT09IHZvaWQgMCkgeyBsYW5ndWFnZSA9IEVOR0xJU0g7IH1cbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIHZhciB0dHIgPSBuZXcgUGFyc2VyKGxhbmd1YWdlLnRva2Vucyk7XG4gICAgaWYgKCF0dHIuc3RhcnQodGV4dCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIFMoKTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgICBmdW5jdGlvbiBTKCkge1xuICAgICAgICAvLyBldmVyeSBbbl1cbiAgICAgICAgdHRyLmV4cGVjdCgnZXZlcnknKTtcbiAgICAgICAgdmFyIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgIGlmIChuKVxuICAgICAgICAgICAgb3B0aW9ucy5pbnRlcnZhbCA9IHBhcnNlSW50KG5bMF0sIDEwKTtcbiAgICAgICAgaWYgKHR0ci5pc0RvbmUoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQnKTtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdkYXkocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLkRBSUxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEFUKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBGSVhNRSBOb3RlOiBldmVyeSAyIHdlZWtkYXlzICE9IGV2ZXJ5IHR3byB3ZWVrcyBvbiB3ZWVrZGF5cy5cbiAgICAgICAgICAgIC8vIERBSUxZIG9uIHdlZWtkYXlzIGlzIG5vdCBhIHZhbGlkIHJ1bGVcbiAgICAgICAgICAgIGNhc2UgJ3dlZWtkYXkocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLldFRUtMWTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtcbiAgICAgICAgICAgICAgICAgICAgUlJ1bGUuTU8sXG4gICAgICAgICAgICAgICAgICAgIFJSdWxlLlRVLFxuICAgICAgICAgICAgICAgICAgICBSUnVsZS5XRSxcbiAgICAgICAgICAgICAgICAgICAgUlJ1bGUuVEgsXG4gICAgICAgICAgICAgICAgICAgIFJSdWxlLkZSXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLldFRUtMWTtcbiAgICAgICAgICAgICAgICBpZiAodHRyLm5leHRTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cihzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuSE9VUkxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLk1JTlVURUxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aChzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuTU9OVEhMWTtcbiAgICAgICAgICAgICAgICBpZiAodHRyLm5leHRTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneWVhcihzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuWUVBUkxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb25kYXknOlxuICAgICAgICAgICAgY2FzZSAndHVlc2RheSc6XG4gICAgICAgICAgICBjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICAgICAgY2FzZSAndGh1cnNkYXknOlxuICAgICAgICAgICAgY2FzZSAnZnJpZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3N1bmRheSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuV0VFS0xZO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0dHIuc3ltYm9sLnN1YnN0cigwLCAyKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnl3ZWVrZGF5ID0gW1JSdWxlW2tleV1dO1xuICAgICAgICAgICAgICAgIGlmICghdHRyLm5leHRTeW1ib2woKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgZm9yIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHRyLmlzRG9uZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2tkID0gZGVjb2RlV0tEKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2tkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJywgZXhwZWN0ZWQgd2Vla2RheScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkucHVzaChSUnVsZVt3a2RdKTtcbiAgICAgICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTURBWXMoKTtcbiAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdqYW51YXJ5JzpcbiAgICAgICAgICAgIGNhc2UgJ2ZlYnJ1YXJ5JzpcbiAgICAgICAgICAgIGNhc2UgJ21hcmNoJzpcbiAgICAgICAgICAgIGNhc2UgJ2FwcmlsJzpcbiAgICAgICAgICAgIGNhc2UgJ21heSc6XG4gICAgICAgICAgICBjYXNlICdqdW5lJzpcbiAgICAgICAgICAgIGNhc2UgJ2p1bHknOlxuICAgICAgICAgICAgY2FzZSAnYXVndXN0JzpcbiAgICAgICAgICAgIGNhc2UgJ3NlcHRlbWJlcic6XG4gICAgICAgICAgICBjYXNlICdvY3RvYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ25vdmVtYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlY2VtYmVyJzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZyZXEgPSBSUnVsZS5ZRUFSTFk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieW1vbnRoID0gW2RlY29kZU0oKV07XG4gICAgICAgICAgICAgICAgaWYgKCF0dHIubmV4dFN5bWJvbCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayBmb3IgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIHdoaWxlICh0dHIuYWNjZXB0KCdjb21tYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0dHIuaXNEb25lKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gZGVjb2RlTSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgJyArIHR0ci5zeW1ib2wgKyAnLCBleHBlY3RlZCBtb250aCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aC5wdXNoKG0pO1xuICAgICAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHN5bWJvbCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIE9OKCkge1xuICAgICAgICB2YXIgb24gPSB0dHIuYWNjZXB0KCdvbicpO1xuICAgICAgICB2YXIgdGhlID0gdHRyLmFjY2VwdCgndGhlJyk7XG4gICAgICAgIGlmICghKG9uIHx8IHRoZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBudGggPSBkZWNvZGVOVEgoKTtcbiAgICAgICAgICAgIHZhciB3a2QgPSBkZWNvZGVXS0QoKTtcbiAgICAgICAgICAgIHZhciBtID0gZGVjb2RlTSgpO1xuICAgICAgICAgICAgLy8gbnRoIDx3ZWVrZGF5PiB8IDx3ZWVrZGF5PlxuICAgICAgICAgICAgaWYgKG50aCkge1xuICAgICAgICAgICAgICAgIC8vIHR0ci5uZXh0U3ltYm9sKClcbiAgICAgICAgICAgICAgICBpZiAod2tkKSB7XG4gICAgICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5ieXdlZWtkYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnl3ZWVrZGF5LnB1c2goUlJ1bGVbd2tkXS5udGgobnRoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuYnltb250aGRheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheS5wdXNoKG50aCk7XG4gICAgICAgICAgICAgICAgICAgIHR0ci5hY2NlcHQoJ2RheShzKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyA8d2Vla2RheT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdrZCkge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5d2Vla2RheSlcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkucHVzaChSUnVsZVt3a2RdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR0ci5zeW1ib2wgPT09ICd3ZWVrZGF5KHMpJykge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5d2Vla2RheSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJSdWxlLk1PLFxuICAgICAgICAgICAgICAgICAgICAgICAgUlJ1bGUuVFUsXG4gICAgICAgICAgICAgICAgICAgICAgICBSUnVsZS5XRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJSdWxlLlRILFxuICAgICAgICAgICAgICAgICAgICAgICAgUlJ1bGUuRlJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0dHIuc3ltYm9sID09PSAnd2VlayhzKScpIHtcbiAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIHZhciBuID0gdHRyLmFjY2VwdE51bWJlcigpO1xuICAgICAgICAgICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJywgZXhwZWN0ZWQgd2VlayBudW1iZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtubyA9IFtwYXJzZUludChuWzBdLCAxMCldO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0dHIuYWNjZXB0KCdjb21tYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCAnICsgdHRyLnN5bWJvbCArICc7IGV4cGVjdGVkIG1vbnRoZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtuby5wdXNoKHBhcnNlSW50KG5bMF0sIDEwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobSkge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5bW9udGgpXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aCA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJ5bW9udGgucHVzaChtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSB8fCB0dHIuYWNjZXB0KCd0aGUnKSB8fCB0dHIuYWNjZXB0KCdvbicpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQVQoKSB7XG4gICAgICAgIHZhciBhdCA9IHR0ci5hY2NlcHQoJ2F0Jyk7XG4gICAgICAgIGlmICghYXQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBuID0gdHRyLmFjY2VwdE51bWJlcigpO1xuICAgICAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCAnICsgdHRyLnN5bWJvbCArICcsIGV4cGVjdGVkIGhvdXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuYnlob3VyID0gW3BhcnNlSW50KG5bMF0sIDEwKV07XG4gICAgICAgICAgICB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSkge1xuICAgICAgICAgICAgICAgIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgJyArIHR0ci5zeW1ib2wgKyAnOyBleHBlY3RlZCBob3VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnlob3VyLnB1c2gocGFyc2VJbnQoblswXSwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSB8fCB0dHIuYWNjZXB0KCdhdCcpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVjb2RlTSgpIHtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdqYW51YXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIGNhc2UgJ2ZlYnJ1YXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgICAgIGNhc2UgJ21hcmNoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMztcbiAgICAgICAgICAgIGNhc2UgJ2FwcmlsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIGNhc2UgJ21heSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgICAgICBjYXNlICdqdW5lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gNjtcbiAgICAgICAgICAgIGNhc2UgJ2p1bHknOlxuICAgICAgICAgICAgICAgIHJldHVybiA3O1xuICAgICAgICAgICAgY2FzZSAnYXVndXN0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgICAgIGNhc2UgJ3NlcHRlbWJlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDk7XG4gICAgICAgICAgICBjYXNlICdvY3RvYmVyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMTA7XG4gICAgICAgICAgICBjYXNlICdub3ZlbWJlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDExO1xuICAgICAgICAgICAgY2FzZSAnZGVjZW1iZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiAxMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY29kZVdLRCgpIHtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdtb25kYXknOlxuICAgICAgICAgICAgY2FzZSAndHVlc2RheSc6XG4gICAgICAgICAgICBjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICAgICAgY2FzZSAndGh1cnNkYXknOlxuICAgICAgICAgICAgY2FzZSAnZnJpZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3N1bmRheSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR0ci5zeW1ib2wuc3Vic3RyKDAsIDIpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNvZGVOVEgoKSB7XG4gICAgICAgIHN3aXRjaCAodHRyLnN5bWJvbCkge1xuICAgICAgICAgICAgY2FzZSAnbGFzdCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBjYXNlICdmaXJzdCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHRyLmFjY2VwdCgnbGFzdCcpID8gLTIgOiAyO1xuICAgICAgICAgICAgY2FzZSAndGhpcmQnOlxuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR0ci5hY2NlcHQoJ2xhc3QnKSA/IC0zIDogMztcbiAgICAgICAgICAgIGNhc2UgJ250aCc6XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBwYXJzZUludCh0dHIudmFsdWVbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICBpZiAodiA8IC0zNjYgfHwgdiA+IDM2NilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdGggb3V0IG9mIHJhbmdlOiAnICsgdik7XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHRyLmFjY2VwdCgnbGFzdCcpID8gLXYgOiB2O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gTURBWXMoKSB7XG4gICAgICAgIHR0ci5hY2NlcHQoJ29uJyk7XG4gICAgICAgIHR0ci5hY2NlcHQoJ3RoZScpO1xuICAgICAgICB2YXIgbnRoID0gZGVjb2RlTlRIKCk7XG4gICAgICAgIGlmICghbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBvcHRpb25zLmJ5bW9udGhkYXkgPSBbbnRoXTtcbiAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgd2hpbGUgKHR0ci5hY2NlcHQoJ2NvbW1hJykpIHtcbiAgICAgICAgICAgIG50aCA9IGRlY29kZU5USCgpO1xuICAgICAgICAgICAgaWYgKCFudGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJzsgZXhwZWN0ZWQgbW9udGhkYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheS5wdXNoKG50aCk7XG4gICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIEYoKSB7XG4gICAgICAgIGlmICh0dHIuc3ltYm9sID09PSAndW50aWwnKSB7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IERhdGUucGFyc2UodHRyLnRleHQpO1xuICAgICAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIHVudGlsIGRhdGU6JyArIHR0ci50ZXh0KTtcbiAgICAgICAgICAgIG9wdGlvbnMudW50aWwgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0dHIuYWNjZXB0KCdmb3InKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb3VudCA9IHBhcnNlSW50KHR0ci52YWx1ZVswXSwgMTApO1xuICAgICAgICAgICAgdHRyLmV4cGVjdCgnbnVtYmVyJyk7XG4gICAgICAgICAgICAvLyB0dHIuZXhwZWN0KCd0aW1lcycpXG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXRleHQuanMubWFwIiwiZXhwb3J0IHZhciBGcmVxdWVuY3k7XG4oZnVuY3Rpb24gKEZyZXF1ZW5jeSkge1xuICAgIEZyZXF1ZW5jeVtGcmVxdWVuY3lbXCJZRUFSTFlcIl0gPSAwXSA9IFwiWUVBUkxZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIk1PTlRITFlcIl0gPSAxXSA9IFwiTU9OVEhMWVwiO1xuICAgIEZyZXF1ZW5jeVtGcmVxdWVuY3lbXCJXRUVLTFlcIl0gPSAyXSA9IFwiV0VFS0xZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIkRBSUxZXCJdID0gM10gPSBcIkRBSUxZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIkhPVVJMWVwiXSA9IDRdID0gXCJIT1VSTFlcIjtcbiAgICBGcmVxdWVuY3lbRnJlcXVlbmN5W1wiTUlOVVRFTFlcIl0gPSA1XSA9IFwiTUlOVVRFTFlcIjtcbiAgICBGcmVxdWVuY3lbRnJlcXVlbmN5W1wiU0VDT05ETFlcIl0gPSA2XSA9IFwiU0VDT05ETFlcIjtcbn0pKEZyZXF1ZW5jeSB8fCAoRnJlcXVlbmN5ID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBmcmVxSXNEYWlseU9yR3JlYXRlcihmcmVxKSB7XG4gICAgcmV0dXJuIGZyZXEgPCBGcmVxdWVuY3kuSE9VUkxZO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiaW1wb3J0IFRvVGV4dCBmcm9tICcuL3RvdGV4dCc7XG5pbXBvcnQgcGFyc2VUZXh0IGZyb20gJy4vcGFyc2V0ZXh0JztcbmltcG9ydCBSUnVsZSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgRU5HTElTSCBmcm9tICcuL2kxOG4nO1xuLyohXG4qIHJydWxlLmpzIC0gTGlicmFyeSBmb3Igd29ya2luZyB3aXRoIHJlY3VycmVuY2UgcnVsZXMgZm9yIGNhbGVuZGFyIGRhdGVzLlxuKiBodHRwczovL2dpdGh1Yi5jb20vamFrdWJyb3p0b2NpbC9ycnVsZVxuKlxuKiBDb3B5cmlnaHQgMjAxMCwgSmFrdWIgUm96dG9jaWwgYW5kIExhcnMgU2Nob25pbmdcbiogTGljZW5jZWQgdW5kZXIgdGhlIEJTRCBsaWNlbmNlLlxuKiBodHRwczovL2dpdGh1Yi5jb20vamFrdWJyb3p0b2NpbC9ycnVsZS9ibG9iL21hc3Rlci9MSUNFTkNFXG4qXG4qL1xuLyoqXG4gKlxuICogSW1wbGVtZW50YXRpb24gb2YgUlJ1bGUuZnJvbVRleHQoKSBhbmQgUlJ1bGU6OnRvVGV4dCgpLlxuICpcbiAqXG4gKiBPbiB0aGUgY2xpZW50IHNpZGUsIHRoaXMgZmlsZSBuZWVkcyB0byBiZSBpbmNsdWRlZFxuICogd2hlbiB0aG9zZSBmdW5jdGlvbnMgYXJlIHVzZWQuXG4gKlxuICovXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gZnJvbVRleHRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFdpbGwgYmUgYWJsZSB0byBjb252ZXJ0IHNvbWUgb2YgdGhlIGJlbG93IGRlc2NyaWJlZCBydWxlcyBmcm9tXG4gKiB0ZXh0IGZvcm1hdCB0byBhIHJ1bGUgb2JqZWN0LlxuICpcbiAqXG4gKiBSVUxFU1xuICpcbiAqIEV2ZXJ5IChbbl0pXG4gKiAgICAgICBkYXkocylcbiAqICAgICB8IFt3ZWVrZGF5XSwgLi4uLCAoYW5kKSBbd2Vla2RheV1cbiAqICAgICB8IHdlZWtkYXkocylcbiAqICAgICB8IHdlZWsocylcbiAqICAgICB8IG1vbnRoKHMpXG4gKiAgICAgfCBbbW9udGhdLCAuLi4sIChhbmQpIFttb250aF1cbiAqICAgICB8IHllYXIocylcbiAqXG4gKlxuICogUGx1cyAwLCAxLCBvciBtdWx0aXBsZSBvZiB0aGVzZTpcbiAqXG4gKiBvbiBbd2Vla2RheV0sIC4uLiwgKG9yKSBbd2Vla2RheV0gdGhlIFttb250aGRheV0sIFttb250aGRheV0sIC4uLiAob3IpIFttb250aGRheV1cbiAqXG4gKiBvbiBbd2Vla2RheV0sIC4uLiwgKGFuZCkgW3dlZWtkYXldXG4gKlxuICogb24gdGhlIFttb250aGRheV0sIFttb250aGRheV0sIC4uLiAoYW5kKSBbbW9udGhkYXldIChkYXkgb2YgdGhlIG1vbnRoKVxuICpcbiAqIG9uIHRoZSBbbnRoLXdlZWtkYXldLCAuLi4sIChhbmQpIFtudGgtd2Vla2RheV0gKG9mIHRoZSBtb250aC95ZWFyKVxuICpcbiAqXG4gKiBQbHVzIDAgb3IgMSBvZiB0aGVzZTpcbiAqXG4gKiBmb3IgW25dIHRpbWUocylcbiAqXG4gKiB1bnRpbCBbZGF0ZV1cbiAqXG4gKiBQbHVzICguKVxuICpcbiAqXG4gKiBEZWZpbml0ZWx5IG5vIHN1cHBvcnRlZCBmb3IgcGFyc2luZzpcbiAqXG4gKiAoZm9yIHllYXIpOlxuICogICAgIGluIHdlZWsocykgW25dLCAuLi4sIChhbmQpIFtuXVxuICpcbiAqICAgICBvbiB0aGUgW3llYXJkYXldLCAuLi4sIChhbmQpIFtuXSBkYXkgb2YgdGhlIHllYXJcbiAqICAgICBvbiBkYXkgW3llYXJkYXldLCAuLi4sIChhbmQpIFtuXVxuICpcbiAqXG4gKiBOT04tVEVSTUlOQUxTXG4gKlxuICogW25dOiAxLCAyIC4uLiwgb25lLCB0d28sIHRocmVlIC4uXG4gKiBbbW9udGhdOiBKYW51YXJ5LCBGZWJydWFyeSwgTWFyY2gsIEFwcmlsLCBNYXksIC4uLiBEZWNlbWJlclxuICogW3dlZWtkYXldOiBNb25kYXksIC4uLiBTdW5kYXlcbiAqIFtudGgtd2Vla2RheV06IGZpcnN0IFt3ZWVrZGF5XSwgMm5kIFt3ZWVrZGF5XSwgLi4uIGxhc3QgW3dlZWtkYXldLCAuLi5cbiAqIFttb250aGRheV06IGZpcnN0LCAxLiwgMi4sIDFzdCwgMm5kLCBzZWNvbmQsIC4uLiAzMXN0LCBsYXN0IGRheSwgMm5kIGxhc3QgZGF5LCAuLlxuICogW2RhdGVdOlxuICogICAgIFttb250aF0gKDAtMzEoLCkgKFt5ZWFyXSkpLFxuICogICAgICh0aGUpIDAtMzEuKDEtMTIuKFt5ZWFyXSkpLFxuICogICAgICh0aGUpIDAtMzEvKDEtMTIvKFt5ZWFyXSkpLFxuICogICAgIFt3ZWVrZGF5XVxuICpcbiAqIFt5ZWFyXTogMDAwMCwgMDAwMSwgLi4uIDAxLCAwMiwgLi5cbiAqXG4gKiBEZWZpbml0ZWx5IG5vdCBzdXBwb3J0ZWQgZm9yIHBhcnNpbmc6XG4gKlxuICogW3llYXJkYXldOiBmaXJzdCwgMS4sIDIuLCAxc3QsIDJuZCwgc2Vjb25kLCAuLi4gMzY2dGgsIGxhc3QgZGF5LCAybmQgbGFzdCBkYXksIC4uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRleHRcbiAqIEByZXR1cm4ge09iamVjdCwgQm9vbGVhbn0gdGhlIHJ1bGUsIG9yIG51bGwuXG4gKi9cbnZhciBmcm9tVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBsYW5ndWFnZSkge1xuICAgIGlmIChsYW5ndWFnZSA9PT0gdm9pZCAwKSB7IGxhbmd1YWdlID0gRU5HTElTSDsgfVxuICAgIHJldHVybiBuZXcgUlJ1bGUocGFyc2VUZXh0KHRleHQsIGxhbmd1YWdlKSB8fCB1bmRlZmluZWQpO1xufTtcbnZhciBjb21tb24gPSBbXG4gICAgJ2NvdW50JyxcbiAgICAndW50aWwnLFxuICAgICdpbnRlcnZhbCcsXG4gICAgJ2J5d2Vla2RheScsXG4gICAgJ2J5bW9udGhkYXknLFxuICAgICdieW1vbnRoJ1xuXTtcblRvVGV4dC5JTVBMRU1FTlRFRCA9IFtdO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5IT1VSTFldID0gY29tbW9uO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5NSU5VVEVMWV0gPSBjb21tb247XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5LkRBSUxZXSA9IFsnYnlob3VyJ10uY29uY2F0KGNvbW1vbik7XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5LldFRUtMWV0gPSBjb21tb247XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5Lk1PTlRITFldID0gY29tbW9uO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5ZRUFSTFldID0gWydieXdlZWtubycsICdieXllYXJkYXknXS5jb25jYXQoY29tbW9uKTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHBvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgdG9UZXh0ID0gZnVuY3Rpb24gKHJydWxlLCBnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcikge1xuICAgIHJldHVybiBuZXcgVG9UZXh0KHJydWxlLCBnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcikudG9TdHJpbmcoKTtcbn07XG52YXIgaXNGdWxseUNvbnZlcnRpYmxlID0gVG9UZXh0LmlzRnVsbHlDb252ZXJ0aWJsZTtcbmV4cG9ydCB7IGZyb21UZXh0LCBwYXJzZVRleHQsIGlzRnVsbHlDb252ZXJ0aWJsZSwgdG9UZXh0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyZXF1ZW5jeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcHltb2QsIGRpdm1vZCwgZW1wdHksIGluY2x1ZGVzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGRhdGV1dGlsIH0gZnJvbSAnLi9kYXRldXRpbCc7XG52YXIgVGltZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgICAgICB0aGlzLmhvdXIgPSBob3VyO1xuICAgICAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZTtcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCB8fCAwO1xuICAgIH1cbiAgICBUaW1lLnByb3RvdHlwZS5nZXRIb3VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cjtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldE1pbnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbnV0ZTtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldFNlY29uZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZDtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7XG4gICAgfTtcbiAgICBUaW1lLnByb3RvdHlwZS5nZXRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKCh0aGlzLmhvdXIgKiA2MCAqIDYwICsgdGhpcy5taW51dGUgKiA2MCArIHRoaXMuc2Vjb25kKSAqIDEwMDAgK1xuICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZTtcbn0oKSk7XG5leHBvcnQgeyBUaW1lIH07XG52YXIgRGF0ZVRpbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERhdGVUaW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGVUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnllYXIgPSB5ZWFyO1xuICAgICAgICBfdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICBfdGhpcy5kYXkgPSBkYXk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRGF0ZVRpbWUuZnJvbURhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCBkYXRlLmdldFVUQ0RhdGUoKSwgZGF0ZS5nZXRVVENIb3VycygpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCksIGRhdGUudmFsdWVPZigpICUgMTAwMCk7XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuZ2V0V2Vla2RheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRhdGV1dGlsLmdldFdlZWtkYXkobmV3IERhdGUodGhpcy5nZXRUaW1lKCkpKTtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5nZXRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1pbGxpc2Vjb25kKSkuZ2V0VGltZSgpO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmdldERheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF5O1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmdldE1vbnRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aDtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5nZXRZZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZFllYXJzID0gZnVuY3Rpb24gKHllYXJzKSB7XG4gICAgICAgIHRoaXMueWVhciArPSB5ZWFycztcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRNb250aHMgPSBmdW5jdGlvbiAobW9udGhzKSB7XG4gICAgICAgIHRoaXMubW9udGggKz0gbW9udGhzO1xuICAgICAgICBpZiAodGhpcy5tb250aCA+IDEyKSB7XG4gICAgICAgICAgICB2YXIgeWVhckRpdiA9IE1hdGguZmxvb3IodGhpcy5tb250aCAvIDEyKTtcbiAgICAgICAgICAgIHZhciBtb250aE1vZCA9IHB5bW9kKHRoaXMubW9udGgsIDEyKTtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSBtb250aE1vZDtcbiAgICAgICAgICAgIHRoaXMueWVhciArPSB5ZWFyRGl2O1xuICAgICAgICAgICAgaWYgKHRoaXMubW9udGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gMTI7XG4gICAgICAgICAgICAgICAgLS10aGlzLnllYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRXZWVrbHkgPSBmdW5jdGlvbiAoZGF5cywgd2tzdCkge1xuICAgICAgICBpZiAod2tzdCA+IHRoaXMuZ2V0V2Vla2RheSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRheSArPSAtKHRoaXMuZ2V0V2Vla2RheSgpICsgMSArICg2IC0gd2tzdCkpICsgZGF5cyAqIDc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRheSArPSAtKHRoaXMuZ2V0V2Vla2RheSgpIC0gd2tzdCkgKyBkYXlzICogNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpeERheSgpO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZERhaWx5ID0gZnVuY3Rpb24gKGRheXMpIHtcbiAgICAgICAgdGhpcy5kYXkgKz0gZGF5cztcbiAgICAgICAgdGhpcy5maXhEYXkoKTtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRIb3VycyA9IGZ1bmN0aW9uIChob3VycywgZmlsdGVyZWQsIGJ5aG91cikge1xuICAgICAgICBpZiAoZmlsdGVyZWQpIHtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gb25lIGl0ZXJhdGlvbiBiZWZvcmUgbmV4dCBkYXlcbiAgICAgICAgICAgIHRoaXMuaG91ciArPSBNYXRoLmZsb29yKCgyMyAtIHRoaXMuaG91cikgLyBob3VycykgKiBob3VycztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5ob3VyICs9IGhvdXJzO1xuICAgICAgICAgICAgdmFyIF9hID0gZGl2bW9kKHRoaXMuaG91ciwgMjQpLCBkYXlEaXYgPSBfYS5kaXYsIGhvdXJNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAoZGF5RGl2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VyID0gaG91ck1vZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZERhaWx5KGRheURpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW1wdHkoYnlob3VyKSB8fCBpbmNsdWRlcyhieWhvdXIsIHRoaXMuaG91cikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRNaW51dGVzID0gZnVuY3Rpb24gKG1pbnV0ZXMsIGZpbHRlcmVkLCBieWhvdXIsIGJ5bWludXRlKSB7XG4gICAgICAgIGlmIChmaWx0ZXJlZCkge1xuICAgICAgICAgICAgLy8gSnVtcCB0byBvbmUgaXRlcmF0aW9uIGJlZm9yZSBuZXh0IGRheVxuICAgICAgICAgICAgdGhpcy5taW51dGUgKz1cbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCgxNDM5IC0gKHRoaXMuaG91ciAqIDYwICsgdGhpcy5taW51dGUpKSAvIG1pbnV0ZXMpICogbWludXRlcztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGUgKz0gbWludXRlcztcbiAgICAgICAgICAgIHZhciBfYSA9IGRpdm1vZCh0aGlzLm1pbnV0ZSwgNjApLCBob3VyRGl2ID0gX2EuZGl2LCBtaW51dGVNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAoaG91ckRpdikge1xuICAgICAgICAgICAgICAgIHRoaXMubWludXRlID0gbWludXRlTW9kO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSG91cnMoaG91ckRpdiwgZmFsc2UsIGJ5aG91cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGVtcHR5KGJ5aG91cikgfHwgaW5jbHVkZXMoYnlob3VyLCB0aGlzLmhvdXIpKSAmJlxuICAgICAgICAgICAgICAgIChlbXB0eShieW1pbnV0ZSkgfHwgaW5jbHVkZXMoYnltaW51dGUsIHRoaXMubWludXRlKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZFNlY29uZHMgPSBmdW5jdGlvbiAoc2Vjb25kcywgZmlsdGVyZWQsIGJ5aG91ciwgYnltaW51dGUsIGJ5c2Vjb25kKSB7XG4gICAgICAgIGlmIChmaWx0ZXJlZCkge1xuICAgICAgICAgICAgLy8gSnVtcCB0byBvbmUgaXRlcmF0aW9uIGJlZm9yZSBuZXh0IGRheVxuICAgICAgICAgICAgdGhpcy5zZWNvbmQgKz1cbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCg4NjM5OSAtICh0aGlzLmhvdXIgKiAzNjAwICsgdGhpcy5taW51dGUgKiA2MCArIHRoaXMuc2Vjb25kKSkgLyBzZWNvbmRzKSAqIHNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kICs9IHNlY29uZHM7XG4gICAgICAgICAgICB2YXIgX2EgPSBkaXZtb2QodGhpcy5zZWNvbmQsIDYwKSwgbWludXRlRGl2ID0gX2EuZGl2LCBzZWNvbmRNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAobWludXRlRGl2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmRNb2Q7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRNaW51dGVzKG1pbnV0ZURpdiwgZmFsc2UsIGJ5aG91ciwgYnltaW51dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChlbXB0eShieWhvdXIpIHx8IGluY2x1ZGVzKGJ5aG91ciwgdGhpcy5ob3VyKSkgJiZcbiAgICAgICAgICAgICAgICAoZW1wdHkoYnltaW51dGUpIHx8IGluY2x1ZGVzKGJ5bWludXRlLCB0aGlzLm1pbnV0ZSkpICYmXG4gICAgICAgICAgICAgICAgKGVtcHR5KGJ5c2Vjb25kKSB8fCBpbmNsdWRlcyhieXNlY29uZCwgdGhpcy5zZWNvbmQpKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuZml4RGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kYXkgPD0gMjgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5c2lubW9udGggPSBkYXRldXRpbC5tb250aFJhbmdlKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEpWzFdO1xuICAgICAgICBpZiAodGhpcy5kYXkgPD0gZGF5c2lubW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5kYXkgPiBkYXlzaW5tb250aCkge1xuICAgICAgICAgICAgdGhpcy5kYXkgLT0gZGF5c2lubW9udGg7XG4gICAgICAgICAgICArK3RoaXMubW9udGg7XG4gICAgICAgICAgICBpZiAodGhpcy5tb250aCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gMTtcbiAgICAgICAgICAgICAgICArK3RoaXMueWVhcjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy55ZWFyID4gZGF0ZXV0aWwuTUFYWUVBUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF5c2lubW9udGggPSBkYXRldXRpbC5tb250aFJhbmdlKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEpWzFdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG9wdGlvbnMsIGZpbHRlcmVkKSB7XG4gICAgICAgIHZhciBmcmVxID0gb3B0aW9ucy5mcmVxLCBpbnRlcnZhbCA9IG9wdGlvbnMuaW50ZXJ2YWwsIHdrc3QgPSBvcHRpb25zLndrc3QsIGJ5aG91ciA9IG9wdGlvbnMuYnlob3VyLCBieW1pbnV0ZSA9IG9wdGlvbnMuYnltaW51dGUsIGJ5c2Vjb25kID0gb3B0aW9ucy5ieXNlY29uZDtcbiAgICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5ZRUFSTFk6IHJldHVybiB0aGlzLmFkZFllYXJzKGludGVydmFsKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5Lk1PTlRITFk6IHJldHVybiB0aGlzLmFkZE1vbnRocyhpbnRlcnZhbCk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5XRUVLTFk6IHJldHVybiB0aGlzLmFkZFdlZWtseShpbnRlcnZhbCwgd2tzdCk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5EQUlMWTogcmV0dXJuIHRoaXMuYWRkRGFpbHkoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuSE9VUkxZOiByZXR1cm4gdGhpcy5hZGRIb3VycyhpbnRlcnZhbCwgZmlsdGVyZWQsIGJ5aG91cik7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5NSU5VVEVMWTogcmV0dXJuIHRoaXMuYWRkTWludXRlcyhpbnRlcnZhbCwgZmlsdGVyZWQsIGJ5aG91ciwgYnltaW51dGUpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuU0VDT05ETFk6IHJldHVybiB0aGlzLmFkZFNlY29uZHMoaW50ZXJ2YWwsIGZpbHRlcmVkLCBieWhvdXIsIGJ5bWludXRlLCBieXNlY29uZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEYXRlVGltZTtcbn0oVGltZSkpO1xuZXhwb3J0IHsgRGF0ZVRpbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGV0aW1lLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBmcmVxSXNEYWlseU9yR3JlYXRlciB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgaW5jbHVkZXMsIG5vdEVtcHR5LCBpc1ByZXNlbnQsIGlzTnVtYmVyLCBpc0FycmF5LCBpc1dlZWtkYXlTdHIgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IFJSdWxlLCB7IGRlZmF1bHRLZXlzLCBERUZBVUxUX09QVElPTlMgfSBmcm9tICcuL3JydWxlJztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IHsgVGltZSB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgaW52YWxpZCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgLy8gU2hhbGxvdyBjb3B5IGZvciBvcHRpb25zIGFuZCBvcmlnT3B0aW9ucyBhbmQgY2hlY2sgZm9yIGludmFsaWRcbiAgICBmb3IgKHZhciBfaSA9IDAsIGtleXNfMSA9IGtleXM7IF9pIDwga2V5c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c18xW19pXTtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhkZWZhdWx0S2V5cywga2V5KSlcbiAgICAgICAgICAgIGludmFsaWQucHVzaChrZXkpO1xuICAgICAgICBpZiAoZGF0ZXV0aWwuaXNEYXRlKG9wdGlvbnNba2V5XSkgJiYgIWRhdGV1dGlsLmlzVmFsaWREYXRlKG9wdGlvbnNba2V5XSkpXG4gICAgICAgICAgICBpbnZhbGlkLnB1c2goa2V5KTtcbiAgICB9XG4gICAgaWYgKGludmFsaWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvcHRpb25zOiAnICsgaW52YWxpZC5qb2luKCcsICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKHt9LCBvcHRpb25zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHZhciBvcHRzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUyksIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICBpZiAoaXNQcmVzZW50KG9wdHMuYnllYXN0ZXIpKVxuICAgICAgICBvcHRzLmZyZXEgPSBSUnVsZS5ZRUFSTFk7XG4gICAgaWYgKCEoaXNQcmVzZW50KG9wdHMuZnJlcSkgJiYgUlJ1bGUuRlJFUVVFTkNJRVNbb3B0cy5mcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmcmVxdWVuY3k6IFwiICsgb3B0cy5mcmVxICsgXCIgXCIgKyBvcHRpb25zLmZyZXEpO1xuICAgIH1cbiAgICBpZiAoIW9wdHMuZHRzdGFydClcbiAgICAgICAgb3B0cy5kdHN0YXJ0ID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXRNaWxsaXNlY29uZHMoMCkpO1xuICAgIGlmICghaXNQcmVzZW50KG9wdHMud2tzdCkpIHtcbiAgICAgICAgb3B0cy53a3N0ID0gUlJ1bGUuTU8ud2Vla2RheTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNOdW1iZXIob3B0cy53a3N0KSkge1xuICAgICAgICAvLyBjb29sLCBqdXN0IGtlZXAgaXQgbGlrZSB0aGF0XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHRzLndrc3QgPSBvcHRzLndrc3Qud2Vla2RheTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChvcHRzLmJ5c2V0cG9zKSkge1xuICAgICAgICBpZiAoaXNOdW1iZXIob3B0cy5ieXNldHBvcykpXG4gICAgICAgICAgICBvcHRzLmJ5c2V0cG9zID0gW29wdHMuYnlzZXRwb3NdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdHMuYnlzZXRwb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2ID0gb3B0cy5ieXNldHBvc1tpXTtcbiAgICAgICAgICAgIGlmICh2ID09PSAwIHx8ICEodiA+PSAtMzY2ICYmIHYgPD0gMzY2KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYnlzZXRwb3MgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2NiwnICsgJyBvciBiZXR3ZWVuIC0zNjYgYW5kIC0xJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoQm9vbGVhbihvcHRzLmJ5d2Vla25vKSB8fFxuICAgICAgICBub3RFbXB0eShvcHRzLmJ5d2Vla25vKSB8fFxuICAgICAgICBub3RFbXB0eShvcHRzLmJ5eWVhcmRheSkgfHxcbiAgICAgICAgQm9vbGVhbihvcHRzLmJ5bW9udGhkYXkpIHx8XG4gICAgICAgIG5vdEVtcHR5KG9wdHMuYnltb250aGRheSkgfHxcbiAgICAgICAgaXNQcmVzZW50KG9wdHMuYnl3ZWVrZGF5KSB8fFxuICAgICAgICBpc1ByZXNlbnQob3B0cy5ieWVhc3RlcikpKSB7XG4gICAgICAgIHN3aXRjaCAob3B0cy5mcmVxKSB7XG4gICAgICAgICAgICBjYXNlIFJSdWxlLllFQVJMWTpcbiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuYnltb250aClcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ieW1vbnRoID0gb3B0cy5kdHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAxO1xuICAgICAgICAgICAgICAgIG9wdHMuYnltb250aGRheSA9IG9wdHMuZHRzdGFydC5nZXRVVENEYXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJSdWxlLk1PTlRITFk6XG4gICAgICAgICAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gb3B0cy5kdHN0YXJ0LmdldFVUQ0RhdGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUlJ1bGUuV0VFS0xZOlxuICAgICAgICAgICAgICAgIG9wdHMuYnl3ZWVrZGF5ID0gW2RhdGV1dGlsLmdldFdlZWtkYXkob3B0cy5kdHN0YXJ0KV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYnltb250aFxuICAgIGlmIChpc1ByZXNlbnQob3B0cy5ieW1vbnRoKSAmJiAhaXNBcnJheShvcHRzLmJ5bW9udGgpKSB7XG4gICAgICAgIG9wdHMuYnltb250aCA9IFtvcHRzLmJ5bW9udGhdO1xuICAgIH1cbiAgICAvLyBieXllYXJkYXlcbiAgICBpZiAoaXNQcmVzZW50KG9wdHMuYnl5ZWFyZGF5KSAmJlxuICAgICAgICAhaXNBcnJheShvcHRzLmJ5eWVhcmRheSkgJiZcbiAgICAgICAgaXNOdW1iZXIob3B0cy5ieXllYXJkYXkpKSB7XG4gICAgICAgIG9wdHMuYnl5ZWFyZGF5ID0gW29wdHMuYnl5ZWFyZGF5XTtcbiAgICB9XG4gICAgLy8gYnltb250aGRheVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnltb250aGRheSkpIHtcbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gW107XG4gICAgICAgIG9wdHMuYnlubW9udGhkYXkgPSBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheShvcHRzLmJ5bW9udGhkYXkpKSB7XG4gICAgICAgIHZhciBieW1vbnRoZGF5ID0gW107XG4gICAgICAgIHZhciBieW5tb250aGRheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdHMuYnltb250aGRheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHYgPSBvcHRzLmJ5bW9udGhkYXlbaV07XG4gICAgICAgICAgICBpZiAodiA+IDApIHtcbiAgICAgICAgICAgICAgICBieW1vbnRoZGF5LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2IDwgMCkge1xuICAgICAgICAgICAgICAgIGJ5bm1vbnRoZGF5LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gYnltb250aGRheTtcbiAgICAgICAgb3B0cy5ieW5tb250aGRheSA9IGJ5bm1vbnRoZGF5O1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRzLmJ5bW9udGhkYXkgPCAwKSB7XG4gICAgICAgIG9wdHMuYnlubW9udGhkYXkgPSBbb3B0cy5ieW1vbnRoZGF5XTtcbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gW107XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHRzLmJ5bm1vbnRoZGF5ID0gW107XG4gICAgICAgIG9wdHMuYnltb250aGRheSA9IFtvcHRzLmJ5bW9udGhkYXldO1xuICAgIH1cbiAgICAvLyBieXdlZWtub1xuICAgIGlmIChpc1ByZXNlbnQob3B0cy5ieXdlZWtubykgJiYgIWlzQXJyYXkob3B0cy5ieXdlZWtubykpIHtcbiAgICAgICAgb3B0cy5ieXdlZWtubyA9IFtvcHRzLmJ5d2Vla25vXTtcbiAgICB9XG4gICAgLy8gYnl3ZWVrZGF5IC8gYnlud2Vla2RheVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnl3ZWVrZGF5KSkge1xuICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5d2Vla2RheSkpIHtcbiAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBbb3B0cy5ieXdlZWtkYXldO1xuICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1dlZWtkYXlTdHIob3B0cy5ieXdlZWtkYXkpKSB7XG4gICAgICAgIG9wdHMuYnl3ZWVrZGF5ID0gW1dlZWtkYXkuZnJvbVN0cihvcHRzLmJ5d2Vla2RheSkud2Vla2RheV07XG4gICAgICAgIG9wdHMuYnlud2Vla2RheSA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdHMuYnl3ZWVrZGF5IGluc3RhbmNlb2YgV2Vla2RheSkge1xuICAgICAgICBpZiAoIW9wdHMuYnl3ZWVrZGF5Lm4gfHwgb3B0cy5mcmVxID4gUlJ1bGUuTU9OVEhMWSkge1xuICAgICAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBbb3B0cy5ieXdlZWtkYXkud2Vla2RheV07XG4gICAgICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0cy5ieW53ZWVrZGF5ID0gW1tvcHRzLmJ5d2Vla2RheS53ZWVrZGF5LCBvcHRzLmJ5d2Vla2RheS5uXV07XG4gICAgICAgICAgICBvcHRzLmJ5d2Vla2RheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBieXdlZWtkYXkgPSBbXTtcbiAgICAgICAgdmFyIGJ5bndlZWtkYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRzLmJ5d2Vla2RheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHdkYXkgPSBvcHRzLmJ5d2Vla2RheVtpXTtcbiAgICAgICAgICAgIGlmIChpc051bWJlcih3ZGF5KSkge1xuICAgICAgICAgICAgICAgIGJ5d2Vla2RheS5wdXNoKHdkYXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXZWVrZGF5U3RyKHdkYXkpKSB7XG4gICAgICAgICAgICAgICAgYnl3ZWVrZGF5LnB1c2goV2Vla2RheS5mcm9tU3RyKHdkYXkpLndlZWtkYXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3ZGF5Lm4gfHwgb3B0cy5mcmVxID4gUlJ1bGUuTU9OVEhMWSkge1xuICAgICAgICAgICAgICAgIGJ5d2Vla2RheS5wdXNoKHdkYXkud2Vla2RheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBieW53ZWVrZGF5LnB1c2goW3dkYXkud2Vla2RheSwgd2RheS5uXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBub3RFbXB0eShieXdlZWtkYXkpID8gYnl3ZWVrZGF5IDogbnVsbDtcbiAgICAgICAgb3B0cy5ieW53ZWVrZGF5ID0gbm90RW1wdHkoYnlud2Vla2RheSkgPyBieW53ZWVrZGF5IDogbnVsbDtcbiAgICB9XG4gICAgLy8gYnlob3VyXG4gICAgaWYgKCFpc1ByZXNlbnQob3B0cy5ieWhvdXIpKSB7XG4gICAgICAgIG9wdHMuYnlob3VyID1cbiAgICAgICAgICAgIG9wdHMuZnJlcSA8IFJSdWxlLkhPVVJMWSA/IFtvcHRzLmR0c3RhcnQuZ2V0VVRDSG91cnMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5aG91cikpIHtcbiAgICAgICAgb3B0cy5ieWhvdXIgPSBbb3B0cy5ieWhvdXJdO1xuICAgIH1cbiAgICAvLyBieW1pbnV0ZVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnltaW51dGUpKSB7XG4gICAgICAgIG9wdHMuYnltaW51dGUgPVxuICAgICAgICAgICAgb3B0cy5mcmVxIDwgUlJ1bGUuTUlOVVRFTFkgPyBbb3B0cy5kdHN0YXJ0LmdldFVUQ01pbnV0ZXMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5bWludXRlKSkge1xuICAgICAgICBvcHRzLmJ5bWludXRlID0gW29wdHMuYnltaW51dGVdO1xuICAgIH1cbiAgICAvLyBieXNlY29uZFxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnlzZWNvbmQpKSB7XG4gICAgICAgIG9wdHMuYnlzZWNvbmQgPVxuICAgICAgICAgICAgb3B0cy5mcmVxIDwgUlJ1bGUuU0VDT05ETFkgPyBbb3B0cy5kdHN0YXJ0LmdldFVUQ1NlY29uZHMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5c2Vjb25kKSkge1xuICAgICAgICBvcHRzLmJ5c2Vjb25kID0gW29wdHMuYnlzZWNvbmRdO1xuICAgIH1cbiAgICByZXR1cm4geyBwYXJzZWRPcHRpb25zOiBvcHRzIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUaW1lc2V0KG9wdHMpIHtcbiAgICB2YXIgbWlsbGlzZWNvbmRNb2R1bG8gPSBvcHRzLmR0c3RhcnQuZ2V0VGltZSgpICUgMTAwMDtcbiAgICBpZiAoIWZyZXFJc0RhaWx5T3JHcmVhdGVyKG9wdHMuZnJlcSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgdGltZXNldCA9IFtdO1xuICAgIG9wdHMuYnlob3VyLmZvckVhY2goZnVuY3Rpb24gKGhvdXIpIHtcbiAgICAgICAgb3B0cy5ieW1pbnV0ZS5mb3JFYWNoKGZ1bmN0aW9uIChtaW51dGUpIHtcbiAgICAgICAgICAgIG9wdHMuYnlzZWNvbmQuZm9yRWFjaChmdW5jdGlvbiAoc2Vjb25kKSB7XG4gICAgICAgICAgICAgICAgdGltZXNldC5wdXNoKG5ldyBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZE1vZHVsbykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aW1lc2V0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VvcHRpb25zLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgRGF5cyB9IGZyb20gJy4vcnJ1bGUnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHJmY1N0cmluZykge1xuICAgIHZhciBvcHRpb25zID0gcmZjU3RyaW5nLnNwbGl0KCdcXG4nKS5tYXAocGFyc2VMaW5lKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IG51bGw7IH0pO1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9uc1swXSksIG9wdGlvbnNbMV0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHRzdGFydChsaW5lKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICB2YXIgZHRzdGFydFdpdGhab25lID0gL0RUU1RBUlQoPzo7VFpJRD0oW146PV0rPykpPyg/Ojp8PSkoW147XFxzXSspL2kuZXhlYyhsaW5lKTtcbiAgICBpZiAoIWR0c3RhcnRXaXRoWm9uZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgdmFyIF8gPSBkdHN0YXJ0V2l0aFpvbmVbMF0sIHR6aWQgPSBkdHN0YXJ0V2l0aFpvbmVbMV0sIGR0c3RhcnQgPSBkdHN0YXJ0V2l0aFpvbmVbMl07XG4gICAgaWYgKHR6aWQpIHtcbiAgICAgICAgb3B0aW9ucy50emlkID0gdHppZDtcbiAgICB9XG4gICAgb3B0aW9ucy5kdHN0YXJ0ID0gZGF0ZXV0aWwudW50aWxTdHJpbmdUb0RhdGUoZHRzdGFydCk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBwYXJzZUxpbmUocmZjU3RyaW5nKSB7XG4gICAgcmZjU3RyaW5nID0gcmZjU3RyaW5nLnJlcGxhY2UoL15cXHMrfFxccyskLywgJycpO1xuICAgIGlmICghcmZjU3RyaW5nLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhlYWRlciA9IC9eKFtBLVpdKz8pWzo7XS8uZXhlYyhyZmNTdHJpbmcudG9VcHBlckNhc2UoKSk7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUnJ1bGUocmZjU3RyaW5nKTtcbiAgICB9XG4gICAgdmFyIF8gPSBoZWFkZXJbMF0sIGtleSA9IGhlYWRlclsxXTtcbiAgICBzd2l0Y2ggKGtleS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ1JSVUxFJzpcbiAgICAgICAgY2FzZSAnRVhSVUxFJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJydWxlKHJmY1N0cmluZyk7XG4gICAgICAgIGNhc2UgJ0RUU1RBUlQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRHRzdGFydChyZmNTdHJpbmcpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgUkZDIHByb3AgXCIgKyBrZXkgKyBcIiBpbiBcIiArIHJmY1N0cmluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VScnVsZShsaW5lKSB7XG4gICAgdmFyIHN0cmlwcGVkTGluZSA9IGxpbmUucmVwbGFjZSgvXlJSVUxFOi9pLCAnJyk7XG4gICAgdmFyIG9wdGlvbnMgPSBwYXJzZUR0c3RhcnQoc3RyaXBwZWRMaW5lKTtcbiAgICB2YXIgYXR0cnMgPSBsaW5lLnJlcGxhY2UoL14oPzpSUlVMRXxFWFJVTEUpOi9pLCAnJykuc3BsaXQoJzsnKTtcbiAgICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgIHZhciBfYSA9IGF0dHIuc3BsaXQoJz0nKSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0ZSRVEnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IEZyZXF1ZW5jeVt2YWx1ZS50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1dLU1QnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMud2tzdCA9IERheXNbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDT1VOVCc6XG4gICAgICAgICAgICBjYXNlICdJTlRFUlZBTCc6XG4gICAgICAgICAgICBjYXNlICdCWVNFVFBPUyc6XG4gICAgICAgICAgICBjYXNlICdCWU1PTlRIJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZTU9OVEhEQVknOlxuICAgICAgICAgICAgY2FzZSAnQllZRUFSREFZJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZV0VFS05PJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZSE9VUic6XG4gICAgICAgICAgICBjYXNlICdCWU1JTlVURSc6XG4gICAgICAgICAgICBjYXNlICdCWVNFQ09ORCc6XG4gICAgICAgICAgICAgICAgdmFyIG51bSA9IHBhcnNlTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG9wdGlvbnNbb3B0aW9uS2V5XSA9IG51bTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JZV0VFS0RBWSc6XG4gICAgICAgICAgICBjYXNlICdCWURBWSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkgPSBwYXJzZVdlZWtkYXkodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRFRTVEFSVCc6XG4gICAgICAgICAgICBjYXNlICdUWklEJzpcbiAgICAgICAgICAgICAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICB2YXIgZHRzdGFydCA9IHBhcnNlRHRzdGFydChsaW5lKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnR6aWQgPSBkdHN0YXJ0LnR6aWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gZHRzdGFydC5kdHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVU5USUwnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMudW50aWwgPSBkYXRldXRpbC51bnRpbFN0cmluZ1RvRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCWUVBU1RFUic6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieWVhc3RlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gUlJVTEUgcHJvcGVydHkgJ1wiICsga2V5ICsgXCInXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBwYXJzZU51bWJlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKCcsJykgIT09IC0xKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICByZXR1cm4gdmFsdWVzLm1hcChwYXJzZUluZGl2aWR1YWxOdW1iZXIpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VJbmRpdmlkdWFsTnVtYmVyKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSW5kaXZpZHVhbE51bWJlcih2YWx1ZSkge1xuICAgIGlmICgvXlsrLV0/XFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBwYXJzZVdlZWtkYXkodmFsdWUpIHtcbiAgICB2YXIgZGF5cyA9IHZhbHVlLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIGRheXMubWFwKGZ1bmN0aW9uIChkYXkpIHtcbiAgICAgICAgaWYgKGRheS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIE1PLCBUVSwgLi4uXG4gICAgICAgICAgICByZXR1cm4gRGF5c1tkYXldOyAvLyB3ZGF5IGluc3RhbmNlb2YgV2Vla2RheVxuICAgICAgICB9XG4gICAgICAgIC8vIC0xTU8sICszRlIsIDFTTywgMTNUVSAuLi5cbiAgICAgICAgdmFyIHBhcnRzID0gZGF5Lm1hdGNoKC9eKFsrLV0/XFxkezEsMn0pKFtBLVpdezJ9KSQvKTtcbiAgICAgICAgdmFyIG4gPSBOdW1iZXIocGFydHNbMV0pO1xuICAgICAgICB2YXIgd2RheXBhcnQgPSBwYXJ0c1syXTtcbiAgICAgICAgdmFyIHdkYXkgPSBEYXlzW3dkYXlwYXJ0XS53ZWVrZGF5O1xuICAgICAgICByZXR1cm4gbmV3IFdlZWtkYXkod2RheSwgbik7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXN0cmluZy5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShuKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Uobykge1xuICB2YXIgaSA9IDA7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICB9O1xuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xuICByZXR1cm4gaS5uZXh0LmJpbmQoaSk7XG59XG5cbi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEx1eG9uRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FcnJvcikge1xuICBfaW5oZXJpdHNMb29zZShMdXhvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEx1eG9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIF9FcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gTHV4b25FcnJvcjtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgSW52YWxpZERhdGVUaW1lRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9MdXhvbkVycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREYXRlVGltZUVycm9yLCBfTHV4b25FcnJvcik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZERhdGVUaW1lRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yLmNhbGwodGhpcywgXCJJbnZhbGlkIERhdGVUaW1lOiBcIiArIHJlYXNvbi50b01lc3NhZ2UoKSkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRGF0ZVRpbWVFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEludmFsaWRJbnRlcnZhbEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTHV4b25FcnJvcjIpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZEludGVydmFsRXJyb3IsIF9MdXhvbkVycm9yMik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEludGVydmFsRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yMi5jYWxsKHRoaXMsIFwiSW52YWxpZCBJbnRlcnZhbDogXCIgKyByZWFzb24udG9NZXNzYWdlKCkpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEludGVydmFsRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBJbnZhbGlkRHVyYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0x1eG9uRXJyb3IzKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREdXJhdGlvbkVycm9yLCBfTHV4b25FcnJvcjMpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREdXJhdGlvbkVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjMuY2FsbCh0aGlzLCBcIkludmFsaWQgRHVyYXRpb246IFwiICsgcmVhc29uLnRvTWVzc2FnZSgpKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWREdXJhdGlvbkVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9MdXhvbkVycm9yNCkge1xuICBfaW5oZXJpdHNMb29zZShDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciwgX0x1eG9uRXJyb3I0KTtcblxuICBmdW5jdGlvbiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEludmFsaWRVbml0RXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9MdXhvbkVycm9yNSkge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkVW5pdEVycm9yLCBfTHV4b25FcnJvcjUpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWRVbml0RXJyb3IodW5pdCkge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjUuY2FsbCh0aGlzLCBcIkludmFsaWQgdW5pdCBcIiArIHVuaXQpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZFVuaXRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEludmFsaWRBcmd1bWVudEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTHV4b25FcnJvcjYpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZEFyZ3VtZW50RXJyb3IsIF9MdXhvbkVycm9yNik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEFyZ3VtZW50RXJyb3IoKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBab25lSXNBYnN0cmFjdEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTHV4b25FcnJvcjcpIHtcbiAgX2luaGVyaXRzTG9vc2UoWm9uZUlzQWJzdHJhY3RFcnJvciwgX0x1eG9uRXJyb3I3KTtcblxuICBmdW5jdGlvbiBab25lSXNBYnN0cmFjdEVycm9yKCkge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCBcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIikgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbiA9IFwibnVtZXJpY1wiLFxuICAgIHMgPSBcInNob3J0XCIsXG4gICAgbCA9IFwibG9uZ1wiO1xudmFyIERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9NRURfV0lUSF9XRUVLREFZID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBzXG59O1xudmFyIERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogblxufTtcbnZhciBEQVRFX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGxcbn07XG52YXIgVElNRV9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogblxufTtcbnZhciBUSU1FX1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG5cbn07XG52YXIgVElNRV9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgVElNRV8yNF9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG52YXIgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogblxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG52YXIgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogblxufTtcbnZhciBEQVRFVElNRV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogblxufTtcbnZhciBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogblxufTtcbnZhciBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBzLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG5cbn07XG52YXIgREFURVRJTUVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbi8qXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXG4gIEJlY2F1c2UgTHV4b24gaXMgc21hbGwoaXNoKSwgdGhpcyBzaG91bGQgc3RheSBzbWFsbCBhbmQgd2Ugd29uJ3Qgd29ycnkgYWJvdXQgc3BsaXR0aW5nXG4gIGl0IHVwIGludG8sIHNheSwgcGFyc2luZ1V0aWwuanMgYW5kIGJhc2ljVXRpbC5qcyBhbmQgc28gb24uIEJ1dCB0aGV5IGFyZSBkaXZpZGVkIHVwIGJ5IGZlYXR1cmUgYXJlYS5cbiovXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbi8vIFRZUEVTXG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInVuZGVmaW5lZFwiO1xufVxuZnVuY3Rpb24gaXNOdW1iZXIobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBpc0ludGVnZXIobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwibnVtYmVyXCIgJiYgbyAlIDEgPT09IDA7XG59XG5mdW5jdGlvbiBpc1N0cmluZyhvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGlzRGF0ZShvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09IFwiW29iamVjdCBEYXRlXVwiO1xufSAvLyBDQVBBQklMSVRJRVNcblxuZnVuY3Rpb24gaGFzSW50bCgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIEludGwgIT09IFwidW5kZWZpbmVkXCIgJiYgSW50bC5EYXRlVGltZUZvcm1hdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzRm9ybWF0VG9QYXJ0cygpIHtcbiAgcmV0dXJuICFpc1VuZGVmaW5lZChJbnRsLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzKTtcbn1cbmZ1bmN0aW9uIGhhc1JlbGF0aXZlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB0eXBlb2YgSW50bCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhIUludGwuUmVsYXRpdmVUaW1lRm9ybWF0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IC8vIE9CSkVDVFMgQU5EIEFSUkFZU1xuXG5mdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cbmZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChiZXN0LCBuZXh0KSB7XG4gICAgdmFyIHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuXG4gICAgaWYgKCFiZXN0KSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoYmVzdFswXSwgcGFpclswXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChhLCBrKSB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn0gLy8gTlVNQkVSUyBBTkQgU1RSSU5HU1xuXG5mdW5jdGlvbiBpbnRlZ2VyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzSW50ZWdlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn0gLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5cbmZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCwgbikge1xuICBpZiAobiA9PT0gdm9pZCAwKSB7XG4gICAgbiA9IDI7XG4gIH1cblxuICB2YXIgbWludXMgPSBpbnB1dCA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIHZhciB0YXJnZXQgPSBtaW51cyA/IGlucHV0ICogLTEgOiBpbnB1dDtcbiAgdmFyIHJlc3VsdDtcblxuICBpZiAodGFyZ2V0LnRvU3RyaW5nKCkubGVuZ3RoIDwgbikge1xuICAgIHJlc3VsdCA9IChcIjBcIi5yZXBlYXQobikgKyB0YXJnZXQpLnNsaWNlKC1uKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0YXJnZXQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiICsgbWludXMgKyByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoXCIwLlwiICsgZnJhY3Rpb24pICogMTAwMDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihmKTtcbiAgfVxufVxuZnVuY3Rpb24gcm91bmRUbyhudW1iZXIsIGRpZ2l0cywgdG93YXJkWmVybykge1xuICBpZiAodG93YXJkWmVybyA9PT0gdm9pZCAwKSB7XG4gICAgdG93YXJkWmVybyA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGZhY3RvciA9IE1hdGgucG93KDEwLCBkaWdpdHMpLFxuICAgICAgcm91bmRlciA9IHRvd2FyZFplcm8gPyBNYXRoLnRydW5jIDogTWF0aC5yb3VuZDtcbiAgcmV0dXJuIHJvdW5kZXIobnVtYmVyICogZmFjdG9yKSAvIGZhY3Rvcjtcbn0gLy8gREFURSBCQVNJQ1NcblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cbmZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gIHZhciBtb2RNb250aCA9IGZsb29yTW9kKG1vbnRoIC0gMSwgMTIpICsgMSxcbiAgICAgIG1vZFllYXIgPSB5ZWFyICsgKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG5cbiAgaWYgKG1vZE1vbnRoID09PSAyKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIobW9kWWVhcikgPyAyOSA6IDI4O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb2RNb250aCAtIDFdO1xuICB9XG59IC8vIGNvdmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGxvY2FsIHRpbWVzdGFtcCAoZXBvY2gsIGJ1dCB3aXRoIHRoZSBvZmZzZXQgYmFrZWQgaW4pXG5cbmZ1bmN0aW9uIG9ialRvTG9jYWxUUyhvYmopIHtcbiAgdmFyIGQgPSBEYXRlLlVUQyhvYmoueWVhciwgb2JqLm1vbnRoIC0gMSwgb2JqLmRheSwgb2JqLmhvdXIsIG9iai5taW51dGUsIG9iai5zZWNvbmQsIG9iai5taWxsaXNlY29uZCk7IC8vIGZvciBsZWdhY3kgcmVhc29ucywgeWVhcnMgYmV0d2VlbiAwIGFuZCA5OSBhcmUgaW50ZXJwcmV0ZWQgYXMgMTlYWDsgcmV2ZXJ0IHRoYXRcblxuICBpZiAob2JqLnllYXIgPCAxMDAgJiYgb2JqLnllYXIgPj0gMCkge1xuICAgIGQgPSBuZXcgRGF0ZShkKTtcbiAgICBkLnNldFVUQ0Z1bGxZZWFyKGQuZ2V0VVRDRnVsbFllYXIoKSAtIDE5MDApO1xuICB9XG5cbiAgcmV0dXJuICtkO1xufVxuZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIHZhciBwMSA9ICh3ZWVrWWVhciArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICUgNyxcbiAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn0gLy8gUEFSU0lOR1xuXG5mdW5jdGlvbiBwYXJzZVpvbmVJbmZvKHRzLCBvZmZzZXRGb3JtYXQsIGxvY2FsZSwgdGltZVpvbmUpIHtcbiAgaWYgKHRpbWVab25lID09PSB2b2lkIDApIHtcbiAgICB0aW1lWm9uZSA9IG51bGw7XG4gIH1cblxuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgIGludGxPcHRzID0ge1xuICAgIGhvdXIxMjogZmFsc2UsXG4gICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgIGRheTogXCIyLWRpZ2l0XCIsXG4gICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgbWludXRlOiBcIjItZGlnaXRcIlxuICB9O1xuXG4gIGlmICh0aW1lWm9uZSkge1xuICAgIGludGxPcHRzLnRpbWVab25lID0gdGltZVpvbmU7XG4gIH1cblxuICB2YXIgbW9kaWZpZWQgPSBPYmplY3QuYXNzaWduKHtcbiAgICB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdFxuICB9LCBpbnRsT3B0cyksXG4gICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIHZhciBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXRUb1BhcnRzKGRhdGUpLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0aW1lem9uZW5hbWVcIjtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkID8gcGFyc2VkLnZhbHVlIDogbnVsbDtcbiAgfSBlbHNlIGlmIChpbnRsKSB7XG4gICAgLy8gdGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgZm9yIGFsbCBsb2NhbGVzXG4gICAgdmFyIHdpdGhvdXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIGludGxPcHRzKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGluY2x1ZGVkID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBtb2RpZmllZCkuZm9ybWF0KGRhdGUpLFxuICAgICAgICBkaWZmZWQgPSBpbmNsdWRlZC5zdWJzdHJpbmcod2l0aG91dC5sZW5ndGgpLFxuICAgICAgICB0cmltbWVkID0gZGlmZmVkLnJlcGxhY2UoL15bLCBcXHUyMDBlXSsvLCBcIlwiKTtcbiAgICByZXR1cm4gdHJpbW1lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSAvLyBzaWduZWRPZmZzZXQoJy01JywgJzMwJykgLT4gLTMzMFxuXG5mdW5jdGlvbiBzaWduZWRPZmZzZXQob2ZmSG91clN0ciwgb2ZmTWludXRlU3RyKSB7XG4gIHZhciBvZmZIb3VyID0gcGFyc2VJbnQob2ZmSG91clN0ciwgMTApOyAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuXG4gIGlmIChOdW1iZXIuaXNOYU4ob2ZmSG91cikpIHtcbiAgICBvZmZIb3VyID0gMDtcbiAgfVxuXG4gIHZhciBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgICAgb2ZmTWluU2lnbmVkID0gb2ZmSG91ciA8IDAgfHwgT2JqZWN0LmlzKG9mZkhvdXIsIC0wKSA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59IC8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlKSB7XG4gIHZhciBudW1lcmljVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PT0gXCJcIiB8fCBOdW1iZXIuaXNOYU4obnVtZXJpY1ZhbHVlKSkgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiSW52YWxpZCB1bml0IHZhbHVlIFwiICsgdmFsdWUpO1xuICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplciwgbm9uVW5pdEtleXMpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSB7fTtcblxuICBmb3IgKHZhciB1IGluIG9iaikge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIHUpKSB7XG4gICAgICBpZiAobm9uVW5pdEtleXMuaW5kZXhPZih1KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIHZhciB2ID0gb2JqW3VdO1xuICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplcih1KV0gPSBhc051bWJlcih2KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICB2YXIgaG91cnMgPSBNYXRoLnRydW5jKE1hdGguYWJzKG9mZnNldCAvIDYwKSksXG4gICAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgICAgc2lnbiA9IG9mZnNldCA+PSAwID8gXCIrXCIgOiBcIi1cIjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFwiXCIgKyBzaWduICsgcGFkU3RhcnQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWRTdGFydChtaW51dGVzLCAyKTtcblxuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBcIlwiICsgc2lnbiArIGhvdXJzICsgKG1pbnV0ZXMgPiAwID8gXCI6XCIgKyBtaW51dGVzIDogXCJcIik7XG5cbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gXCJcIiArIHNpZ24gKyBwYWRTdGFydChob3VycywgMikgKyBwYWRTdGFydChtaW51dGVzLCAyKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZhbHVlIGZvcm1hdCBcIiArIGZvcm1hdCArIFwiIGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0XCIpO1xuICB9XG59XG5mdW5jdGlvbiB0aW1lT2JqZWN0KG9iaikge1xuICByZXR1cm4gcGljayhvYmosIFtcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSk7XG59XG52YXIgaWFuYVJlZ2V4ID0gL1tBLVphLXpfKy1dezEsMjU2fSg6P1xcL1tBLVphLXpfKy1dezEsMjU2fShcXC9bQS1aYS16XystXXsxLDI1Nn0pPyk/LztcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBPYmplY3Qua2V5cyhvYmopLnNvcnQoKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgbW9udGhzTG9uZyA9IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdO1xudmFyIG1vbnRoc1Nob3J0ID0gW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdO1xudmFyIG1vbnRoc05hcnJvdyA9IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXTtcbmZ1bmN0aW9uIG1vbnRocyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gW10uY29uY2F0KG1vbnRoc05hcnJvdyk7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbXS5jb25jYXQobW9udGhzU2hvcnQpO1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbXS5jb25jYXQobW9udGhzTG9uZyk7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG52YXIgd2Vla2RheXNMb25nID0gW1wiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIl07XG52YXIgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcbnZhciB3ZWVrZGF5c05hcnJvdyA9IFtcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiLCBcIlNcIl07XG5mdW5jdGlvbiB3ZWVrZGF5cyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gW10uY29uY2F0KHdlZWtkYXlzTmFycm93KTtcblxuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCh3ZWVrZGF5c1Nob3J0KTtcblxuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gW10uY29uY2F0KHdlZWtkYXlzTG9uZyk7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIl07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbnZhciBtZXJpZGllbXMgPSBbXCJBTVwiLCBcIlBNXCJdO1xudmFyIGVyYXNMb25nID0gW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdO1xudmFyIGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG52YXIgZXJhc05hcnJvdyA9IFtcIkJcIiwgXCJBXCJdO1xuZnVuY3Rpb24gZXJhcyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gW10uY29uY2F0KGVyYXNOYXJyb3cpO1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gW10uY29uY2F0KGVyYXNTaG9ydCk7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChlcmFzTG9uZyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIHtcbiAgcmV0dXJuIG1lcmlkaWVtc1tkdC5ob3VyIDwgMTIgPyAwIDogMV07XG59XG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5mdW5jdGlvbiBtb250aEZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG1vbnRocyhsZW5ndGgpW2R0Lm1vbnRoIC0gMV07XG59XG5mdW5jdGlvbiBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBlcmFzKGxlbmd0aClbZHQueWVhciA8IDAgPyAwIDogMV07XG59XG5mdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIG51bWVyaWMsIG5hcnJvdykge1xuICBpZiAobnVtZXJpYyA9PT0gdm9pZCAwKSB7XG4gICAgbnVtZXJpYyA9IFwiYWx3YXlzXCI7XG4gIH1cblxuICBpZiAobmFycm93ID09PSB2b2lkIDApIHtcbiAgICBuYXJyb3cgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciB1bml0cyA9IHtcbiAgICB5ZWFyczogW1wieWVhclwiLCBcInlyLlwiXSxcbiAgICBxdWFydGVyczogW1wicXVhcnRlclwiLCBcInF0ci5cIl0sXG4gICAgbW9udGhzOiBbXCJtb250aFwiLCBcIm1vLlwiXSxcbiAgICB3ZWVrczogW1wid2Vla1wiLCBcIndrLlwiXSxcbiAgICBkYXlzOiBbXCJkYXlcIiwgXCJkYXlcIiwgXCJkYXlzXCJdLFxuICAgIGhvdXJzOiBbXCJob3VyXCIsIFwiaHIuXCJdLFxuICAgIG1pbnV0ZXM6IFtcIm1pbnV0ZVwiLCBcIm1pbi5cIl0sXG4gICAgc2Vjb25kczogW1wic2Vjb25kXCIsIFwic2VjLlwiXVxuICB9O1xuICB2YXIgbGFzdGFibGUgPSBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCJdLmluZGV4T2YodW5pdCkgPT09IC0xO1xuXG4gIGlmIChudW1lcmljID09PSBcImF1dG9cIiAmJiBsYXN0YWJsZSkge1xuICAgIHZhciBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuXG4gICAgc3dpdGNoIChjb3VudCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gaXNEYXkgPyBcInRvbW9ycm93XCIgOiBcIm5leHQgXCIgKyB1bml0c1t1bml0XVswXTtcblxuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IFwibGFzdCBcIiArIHVuaXRzW3VuaXRdWzBdO1xuXG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBpc0RheSA/IFwidG9kYXlcIiA6IFwidGhpcyBcIiArIHVuaXRzW3VuaXRdWzBdO1xuXG4gICAgfVxuICB9XG5cbiAgdmFyIGlzSW5QYXN0ID0gT2JqZWN0LmlzKGNvdW50LCAtMCkgfHwgY291bnQgPCAwLFxuICAgICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgICBzaW5ndWxhciA9IGZtdFZhbHVlID09PSAxLFxuICAgICAgbGlsVW5pdHMgPSB1bml0c1t1bml0XSxcbiAgICAgIGZtdFVuaXQgPSBuYXJyb3cgPyBzaW5ndWxhciA/IGxpbFVuaXRzWzFdIDogbGlsVW5pdHNbMl0gfHwgbGlsVW5pdHNbMV0gOiBzaW5ndWxhciA/IHVuaXRzW3VuaXRdWzBdIDogdW5pdDtcbiAgcmV0dXJuIGlzSW5QYXN0ID8gZm10VmFsdWUgKyBcIiBcIiArIGZtdFVuaXQgKyBcIiBhZ29cIiA6IFwiaW4gXCIgKyBmbXRWYWx1ZSArIFwiIFwiICsgZm10VW5pdDtcbn1cbmZ1bmN0aW9uIGZvcm1hdFN0cmluZyhrbm93bkZvcm1hdCkge1xuICAvLyB0aGVzZSBhbGwgaGF2ZSB0aGUgb2Zmc2V0cyByZW1vdmVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlbVxuICAvLyB3aXRob3V0IGFsbCB0aGUgaW50bCBzdHVmZiB0aGlzIGlzIGJhY2tmaWxsaW5nXG4gIHZhciBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcIndlZWtkYXlcIiwgXCJlcmFcIiwgXCJ5ZWFyXCIsIFwibW9udGhcIiwgXCJkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwidGltZVpvbmVOYW1lXCIsIFwiaG91cjEyXCJdKSxcbiAgICAgIGtleSA9IHN0cmluZ2lmeShmaWx0ZXJlZCksXG4gICAgICBkYXRlVGltZUh1Z2UgPSBcIkVFRUUsIExMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX1NIT1JUKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX01FRCk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9NRURfV0lUSF9XRUVLREFZKTpcbiAgICAgIHJldHVybiBcIkVFRSwgTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfU0lNUExFKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkhIOm1tOnNzXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRCk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKTpcbiAgICAgIHJldHVybiBcIkVFRSwgZCBMTEwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVRva2VucyhzcGxpdHMsIHRva2VuVG9TdHJpbmcpIHtcbiAgdmFyIHMgPSBcIlwiO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Uoc3BsaXRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgdG9rZW4gPSBfc3RlcC52YWx1ZTtcblxuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHM7XG59XG5cbnZhciBfbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogREFURV9TSE9SVCxcbiAgREQ6IERBVEVfTUVELFxuICBEREQ6IERBVEVfRlVMTCxcbiAgRERERDogREFURV9IVUdFLFxuICB0OiBUSU1FX1NJTVBMRSxcbiAgdHQ6IFRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIHR0dHQ6IFRJTUVfV0lUSF9MT05HX09GRlNFVCxcbiAgVDogVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBUSU1FXzI0X1dJVEhfU0VDT05EUyxcbiAgVFRUOiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VULFxuICBUVFRUOiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IERBVEVUSU1FX1NIT1JULFxuICBmZjogREFURVRJTUVfTUVELFxuICBmZmY6IERBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IERBVEVUSU1FX0hVR0UsXG4gIEY6IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyxcbiAgRkY6IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMsXG4gIEZGRkY6IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTXG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBGb3JtYXR0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBGb3JtYXR0ZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZvcm1hdHRlcihsb2NhbGUsIG9wdHMpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wYXJzZUZvcm1hdCA9IGZ1bmN0aW9uIHBhcnNlRm9ybWF0KGZtdCkge1xuICAgIHZhciBjdXJyZW50ID0gbnVsbCxcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuXG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBicmFja2V0ZWQsXG4gICAgICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgbGl0ZXJhbDogYnJhY2tldGVkLFxuICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXRzO1xuICB9O1xuXG4gIEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzID0gZnVuY3Rpb24gbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBfbWFjcm9Ub2tlblRvRm9ybWF0T3B0c1t0b2tlbl07XG4gIH07XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEZvcm1hdHRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0ID0gZnVuY3Rpb24gZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREYXRlVGltZSA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKGR0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdERhdGVUaW1lUGFydHMgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZVBhcnRzKGR0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0VG9QYXJ0cygpO1xuICB9O1xuXG4gIF9wcm90by5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfTtcblxuICBfcHJvdG8ubnVtID0gZnVuY3Rpb24gbnVtKG4sIHApIHtcbiAgICBpZiAocCA9PT0gdm9pZCAwKSB7XG4gICAgICBwID0gMDtcbiAgICB9XG5cbiAgICAvLyB3ZSBnZXQgc29tZSBwZXJmIG91dCBvZiBkb2luZyB0aGlzIGhlcmUsIGFubm95aW5nbHlcbiAgICBpZiAodGhpcy5vcHRzLmZvcmNlU2ltcGxlKSB7XG4gICAgICByZXR1cm4gcGFkU3RhcnQobiwgcCk7XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgaWYgKHAgPiAwKSB7XG4gICAgICBvcHRzLnBhZFRvID0gcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2MubnVtYmVyRm9ybWF0dGVyKG9wdHMpLmZvcm1hdChuKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmbXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgICAgdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPSB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciAmJiB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciAhPT0gXCJncmVnb3J5XCIgJiYgaGFzRm9ybWF0VG9QYXJ0cygpLFxuICAgICAgICBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob3B0cywgZXh0cmFjdCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvYy5leHRyYWN0KGR0LCBvcHRzLCBleHRyYWN0KTtcbiAgICB9LFxuICAgICAgICBmb3JtYXRPZmZzZXQgPSBmdW5jdGlvbiBmb3JtYXRPZmZzZXQob3B0cykge1xuICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgIHJldHVybiBcIlpcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICB9LFxuICAgICAgICBtZXJpZGllbSA9IGZ1bmN0aW9uIG1lcmlkaWVtKCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIDogc3RyaW5nKHtcbiAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgIGhvdXIxMjogdHJ1ZVxuICAgICAgfSwgXCJkYXlwZXJpb2RcIik7XG4gICAgfSxcbiAgICAgICAgbW9udGggPSBmdW5jdGlvbiBtb250aChsZW5ndGgsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtb250aEZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHN0YW5kYWxvbmUgPyB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGhcbiAgICAgIH0gOiB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGgsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0sIFwibW9udGhcIik7XG4gICAgfSxcbiAgICAgICAgd2Vla2RheSA9IGZ1bmN0aW9uIHdlZWtkYXkobGVuZ3RoLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gd2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHN0YW5kYWxvbmUgPyB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aFxuICAgICAgfSA6IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoLFxuICAgICAgICBtb250aDogXCJsb25nXCIsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0sIFwid2Vla2RheVwiKTtcbiAgICB9LFxuICAgICAgICBtYXliZU1hY3JvID0gZnVuY3Rpb24gbWF5YmVNYWNybyh0b2tlbikge1xuICAgICAgdmFyIGZvcm1hdE9wdHMgPSBGb3JtYXR0ZXIubWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbik7XG5cbiAgICAgIGlmIChmb3JtYXRPcHRzKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH0sIFwiZXJhXCIpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taWxsaXNlY29uZCk7XG5cbiAgICAgICAgY2FzZSBcInVcIjogLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuXG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5zZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kLCAyKTtcbiAgICAgICAgLy8gbWludXRlc1xuXG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuXG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgLy8gaG91cnNcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuXG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyKTtcblxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAvLyBvZmZzZXRcblxuICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGFsbG93WjogX3RoaXMub3B0cy5hbGxvd1pcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoe1xuICAgICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgICBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJ0ZWNoaWVcIixcbiAgICAgICAgICAgIGFsbG93WjogX3RoaXMub3B0cy5hbGxvd1pcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmUub2Zmc2V0TmFtZShkdC50cywge1xuICAgICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgICBsb2NhbGU6IF90aGlzLmxvYy5sb2NhbGVcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgIHJldHVybiBkdC56b25lLm9mZnNldE5hbWUoZHQudHMsIHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJsb25nXCIsXG4gICAgICAgICAgICBsb2NhbGU6IF90aGlzLmxvYy5sb2NhbGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgLy8gem9uZVxuXG4gICAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IF90aGlzLm51bShkdC5kYXkpO1xuXG4gICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICBkYXk6IFwiMi1kaWdpdFwiXG4gICAgICAgICAgfSwgXCJkYXlcIikgOiBfdGhpcy5udW0oZHQuZGF5LCAyKTtcbiAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrZGF5KTtcblxuICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlcydcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiRUVFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gc3RhbmRhbG9uZVxuXG4gICAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG5cbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJMTExMTFwiOlxuICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gZm9ybWF0XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IF90aGlzLm51bShkdC5tb250aCk7XG5cbiAgICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcblxuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyB5ZWFyc1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIHllYXI6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJ5ZWFyXCIpIDogX3RoaXMubnVtKGR0LnllYXIpO1xuXG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMTRcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG5cbiAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDAwMTJcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhciwgNCk7XG5cbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIHllYXI6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJ5ZWFyXCIpIDogX3RoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAvLyBlcmFzXG5cbiAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICAvLyBsaWtlIEFEXG4gICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuXG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIC8vIGxpa2UgQW5ubyBEb21pbmlcbiAgICAgICAgICByZXR1cm4gZXJhKFwibG9uZ1wiKTtcblxuICAgICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuXG4gICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksIDIpO1xuXG4gICAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhciwgNCk7XG5cbiAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuXG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla051bWJlciwgMik7XG5cbiAgICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwpO1xuXG4gICAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuXG4gICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5xdWFydGVyKTtcblxuICAgICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5xdWFydGVyLCAyKTtcblxuICAgICAgICBjYXNlIFwiWFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oTWF0aC5mbG9vcihkdC50cyAvIDEwMDApKTtcblxuICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQudHMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG1heWJlTWFjcm8odG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nID0gZnVuY3Rpb24gZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgdG9rZW5Ub0ZpZWxkID0gZnVuY3Rpb24gdG9rZW5Ub0ZpZWxkKHRva2VuKSB7XG4gICAgICBzd2l0Y2ggKHRva2VuWzBdKSB7XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcblxuICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG5cbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gXCJob3VyXCI7XG5cbiAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICByZXR1cm4gXCJkYXlcIjtcblxuICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICB0b2tlblRvU3RyaW5nID0gZnVuY3Rpb24gdG9rZW5Ub1N0cmluZyhsaWxkdXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IHRva2VuVG9GaWVsZCh0b2tlbik7XG5cbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksXG4gICAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKGZ1bmN0aW9uIChmb3VuZCwgX3JlZikge1xuICAgICAgdmFyIGxpdGVyYWwgPSBfcmVmLmxpdGVyYWwsXG4gICAgICAgICAgdmFsID0gX3JlZi52YWw7XG4gICAgICByZXR1cm4gbGl0ZXJhbCA/IGZvdW5kIDogZm91bmQuY29uY2F0KHZhbCk7XG4gICAgfSwgW10pLFxuICAgICAgICBjb2xsYXBzZWQgPSBkdXIuc2hpZnRUby5hcHBseShkdXIsIHJlYWxUb2tlbnMubWFwKHRva2VuVG9GaWVsZCkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW52YWxpZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIHRoaXMuZXhwbGFuYXRpb24gPSBleHBsYW5hdGlvbjtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJbnZhbGlkLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9NZXNzYWdlID0gZnVuY3Rpb24gdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFzb24gKyBcIjogXCIgKyB0aGlzLmV4cGxhbmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFzb247XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBJbnZhbGlkO1xufSgpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2VcbiAqL1xuXG52YXIgWm9uZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFpvbmUoKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBab25lLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBvZmZzZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ25hcnJvdycsICdzaG9ydCcsIG9yICd0ZWNoaWUnLiBSZXR1cm5pbmcgJys2JywgJyswNjowMCcsIG9yICcrMDYwMCcgcmVzcGVjdGl2ZWx5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICA7XG5cbiAgX2NyZWF0ZUNsYXNzKFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHpvbmVcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9mZnNldCBpcyBrbm93biB0byBiZSBmaXhlZCBmb3IgdGhlIHdob2xlIHllYXIuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFpvbmU7XG59KCk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB6b25lIGZvciB0aGlzIEphdmFTY3JpcHQgZW52aXJvbm1lbnQuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuXG52YXIgTG9jYWxab25lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgcmV0dXJuIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMb2NhbFpvbmUucHJvdG90eXBlO1xuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuICA7XG5cbiAgX3Byb3RvLmZvcm1hdE9mZnNldCA9IGZ1bmN0aW9uIGZvcm1hdE9mZnNldCQxKHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuICA7XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImxvY2FsXCI7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9jcmVhdGVDbGFzcyhMb2NhbFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcblxuICAgIC8qKiBAb3ZlcnJpZGUgKiovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsb2NhbFwiO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICoqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAgIH0gZWxzZSByZXR1cm4gXCJsb2NhbFwiO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICoqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImluc3RhbmNlXCIsXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGxvY2FsIHpvbmVcbiAgICAgKiBAcmV0dXJuIHtMb2NhbFpvbmV9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9jYWxab25lO1xufShab25lKTtcblxudmFyIG1hdGNoaW5nUmVnZXggPSBSZWdFeHAoXCJeXCIgKyBpYW5hUmVnZXguc291cmNlICsgXCIkXCIpO1xudmFyIGR0ZkNhY2hlID0ge307XG5cbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIHNlY29uZDogXCIyLWRpZ2l0XCJcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkdGZDYWNoZVt6b25lXTtcbn1cblxudmFyIHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDVcbn07XG5cbmZ1bmN0aW9uIGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuICByZXR1cm4gW2ZZZWFyLCBmTW9udGgsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXTtcbn1cblxuZnVuY3Rpb24gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICAgIGZpbGxlZCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChwb3MpKSB7XG4gICAgICBmaWxsZWRbcG9zXSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5cbnZhciBJQU5BWm9uZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSUFOQVpvbmUsIF9ab25lKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBJQU5BWm9uZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUobmFtZSkge1xuICAgIGlmICghaWFuYVpvbmVDYWNoZVtuYW1lXSkge1xuICAgICAgaWFuYVpvbmVDYWNoZVtuYW1lXSA9IG5ldyBJQU5BWm9uZShuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWFuYVpvbmVDYWNoZVtuYW1lXTtcbiAgfVxuICAvKipcbiAgICogUmVzZXQgbG9jYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICA7XG5cbiAgSUFOQVpvbmUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlzIGEgdmFsaWQgc3BlY2lmaWVyLiBUaGlzIG9ubHkgY2hlY2tzIHRoZSBzdHJpbmcncyBmb3JtYXQsIG5vdCB0aGF0IHRoZSBzcGVjaWZpZXIgaWRlbnRpZmllcyBhIGtub3duIHpvbmU7IHNlZSBpc1ZhbGlkWm9uZSBmb3IgdGhhdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHMgLSBUaGUgc3RyaW5nIHRvIGNoZWNrIHZhbGlkaXR5IG9uXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJBbWVyaWNhL05ld19Zb3JrXCIpIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKFwiRmFudGFzaWEvQ2FzdGxlXCIpIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKFwiU3BvcnR+fmJsb3JwXCIpIC8vPT4gZmFsc2VcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyID0gZnVuY3Rpb24gaXNWYWxpZFNwZWNpZmllcihzKSB7XG4gICAgcmV0dXJuICEhKHMgJiYgcy5tYXRjaChtYXRjaGluZ1JlZ2V4KSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICA7XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkWm9uZSh6b25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgICB0aW1lWm9uZTogem9uZVxuICAgICAgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIEV0Yy9HTVQrOCAtPiAtNDgwXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgO1xuXG4gIElBTkFab25lLnBhcnNlR01UT2Zmc2V0ID0gZnVuY3Rpb24gcGFyc2VHTVRPZmZzZXQoc3BlY2lmaWVyKSB7XG4gICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgdmFyIG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eRXRjXFwvR01UKDB8WystXVxcZHsxLDJ9KSQvaSk7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gLTYwICogcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIElBTkFab25lKG5hbWUpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9ab25lLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAvKiogQHByaXZhdGUgKiovXG5cbiAgICBfdGhpcy56b25lTmFtZSA9IG5hbWU7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuXG4gICAgX3RoaXMudmFsaWQgPSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShuYW1lKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIHZhciBfcHJvdG8gPSBJQU5BWm9uZS5wcm90b3R5cGU7XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUsIHRoaXMubmFtZSk7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9wcm90by5mb3JtYXRPZmZzZXQgPSBmdW5jdGlvbiBmb3JtYXRPZmZzZXQkMSh0cywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE9mZnNldCh0aGlzLm9mZnNldCh0cyksIGZvcm1hdCk7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKTtcbiAgICBpZiAoaXNOYU4oZGF0ZSkpIHJldHVybiBOYU47XG5cbiAgICB2YXIgZHRmID0gbWFrZURURih0aGlzLm5hbWUpLFxuICAgICAgICBfcmVmMiA9IGR0Zi5mb3JtYXRUb1BhcnRzID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSksXG4gICAgICAgIHllYXIgPSBfcmVmMlswXSxcbiAgICAgICAgbW9udGggPSBfcmVmMlsxXSxcbiAgICAgICAgZGF5ID0gX3JlZjJbMl0sXG4gICAgICAgIGhvdXIgPSBfcmVmMlszXSxcbiAgICAgICAgbWludXRlID0gX3JlZjJbNF0sXG4gICAgICAgIHNlY29uZCA9IF9yZWYyWzVdLFxuICAgICAgICBhZGp1c3RlZEhvdXIgPSBob3VyID09PSAyNCA/IDAgOiBob3VyO1xuXG4gICAgdmFyIGFzVVRDID0gb2JqVG9Mb2NhbFRTKHtcbiAgICAgIHllYXI6IHllYXIsXG4gICAgICBtb250aDogbW9udGgsXG4gICAgICBkYXk6IGRheSxcbiAgICAgIGhvdXI6IGFkanVzdGVkSG91cixcbiAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICBtaWxsaXNlY29uZDogMFxuICAgIH0pO1xuICAgIHZhciBhc1RTID0gK2RhdGU7XG4gICAgdmFyIG92ZXIgPSBhc1RTICUgMTAwMDtcbiAgICBhc1RTIC09IG92ZXIgPj0gMCA/IG92ZXIgOiAxMDAwICsgb3ZlcjtcbiAgICByZXR1cm4gKGFzVVRDIC0gYXNUUykgLyAoNjAgKiAxMDAwKTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuICA7XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiaWFuYVwiICYmIG90aGVyWm9uZS5uYW1lID09PSB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9jcmVhdGVDbGFzcyhJQU5BWm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaWFuYVwiO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICoqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKiovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElBTkFab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQxID0gbnVsbDtcbi8qKlxuICogQSB6b25lIHdpdGggYSBmaXhlZCBvZmZzZXQgKG1lYW5pbmcgbm8gRFNUKVxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cblxudmFyIEZpeGVkT2Zmc2V0Wm9uZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoRml4ZWRPZmZzZXRab25lLCBfWm9uZSk7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBpbiBtaW51dGVzXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZSA9IGZ1bmN0aW9uIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBGaXhlZE9mZnNldFpvbmUgZnJvbSBhIFVUQyBvZmZzZXQgc3RyaW5nLCBsaWtlIFwiVVRDKzZcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBvZmZzZXQgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQys2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQyswNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMtNjowMFwiKVxuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICA7XG5cbiAgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyID0gZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgciA9IHMubWF0Y2goL151dGMoPzooWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/KT8kL2kpO1xuXG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIG51bGwsIFt7XG4gICAga2V5OiBcInV0Y0luc3RhbmNlXCIsXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgVVRDXG4gICAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiQxID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiQxID0gbmV3IEZpeGVkT2Zmc2V0Wm9uZSgwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbiQxO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9ab25lLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAvKiogQHByaXZhdGUgKiovXG5cbiAgICBfdGhpcy5maXhlZCA9IG9mZnNldDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIHZhciBfcHJvdG8gPSBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlO1xuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIDtcblxuICBfcHJvdG8uZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0JDEodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgZm9ybWF0KTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuICA7XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuICA7XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImZpeGVkXCI7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKiovXG5cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXhlZCA9PT0gMCA/IFwiVVRDXCIgOiBcIlVUQ1wiICsgZm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRml4ZWRPZmZzZXRab25lO1xufShab25lKTtcblxuLyoqXG4gKiBBIHpvbmUgdGhhdCBmYWlsZWQgdG8gcGFyc2UuIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzLlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cblxudmFyIEludmFsaWRab25lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkWm9uZSwgX1pvbmUpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWRab25lKHpvbmVOYW1lKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfWm9uZS5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuXG4gICAgX3RoaXMuem9uZU5hbWUgPSB6b25lTmFtZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIHZhciBfcHJvdG8gPSBJbnZhbGlkWm9uZS5wcm90b3R5cGU7XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIDtcblxuICBfcHJvdG8uZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIDtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KCkge1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgO1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIDtcblxuICBfY3JlYXRlQ2xhc3MoSW52YWxpZFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICoqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52YWxpZFpvbmU7XG59KFpvbmUpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVpvbmUoaW5wdXQsIGRlZmF1bHRab25lKSB7XG4gIHZhciBvZmZzZXQ7XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSB8fCBpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFpvbmUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgdmFyIGxvd2VyZWQgPSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlcmVkID09PSBcImxvY2FsXCIpIHJldHVybiBkZWZhdWx0Wm9uZTtlbHNlIGlmIChsb3dlcmVkID09PSBcInV0Y1wiIHx8IGxvd2VyZWQgPT09IFwiZ210XCIpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gSUFOQVpvbmUuY3JlYXRlKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgbmV3IEludmFsaWRab25lKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQub2Zmc2V0ICYmIHR5cGVvZiBpbnB1dC5vZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9XG59XG5cbnZhciBub3cgPSBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufSxcbiAgICBkZWZhdWx0Wm9uZSA9IG51bGwsXG4gICAgLy8gbm90IHNldHRpbmcgdGhpcyBkaXJlY3RseSB0byBMb2NhbFpvbmUuaW5zdGFuY2UgYmMgbG9hZGluZyBvcmRlciBpc3N1ZXNcbmRlZmF1bHRMb2NhbGUgPSBudWxsLFxuICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG51bGwsXG4gICAgdGhyb3dPbkludmFsaWQgPSBmYWxzZTtcbi8qKlxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cbiAqL1xuXG5cbnZhciBTZXR0aW5ncyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNldHRpbmdzKCkge31cblxuICAvKipcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBTZXR0aW5ncy5yZXNldENhY2hlcyA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGVzKCkge1xuICAgIExvY2FsZS5yZXNldENhY2hlKCk7XG4gICAgSUFOQVpvbmUucmVzZXRDYWNoZSgpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTZXR0aW5ncywgbnVsbCwgW3tcbiAgICBrZXk6IFwibm93XCIsXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBub3c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gICAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBudW1iZXIsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gRXBvY2ggbWlsbGlzZWNvbmQgY291bnRcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gRGF0ZS5ub3coKSArIDMwMDAgLy8gcHJldGVuZCBpdCBpcyAzIHNlY29uZHMgaW4gdGhlIGZ1dHVyZVxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IDAgLy8gYWx3YXlzIHByZXRlbmQgaXQncyBKYW4gMSwgMTk3MCBhdCBtaWRuaWdodCBpbiBVVEMgdGltZVxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChuKSB7XG4gICAgICBub3cgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRab25lTmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh6KSB7XG4gICAgICBpZiAoIXopIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBub3JtYWxpemVab25lKHopO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIG9iamVjdCB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgICAqIEB0eXBlIHtab25lfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFpvbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Wm9uZSB8fCBMb2NhbFpvbmUuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVmYXVsdCBsb2NhbGUgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0TG9jYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobG9jYWxlKSB7XG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHROdW1iZXJpbmdTeXN0ZW1cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdE91dHB1dENhbGVuZGFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidGhyb3dPbkludmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aHJvd09uSW52YWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHdoZXRoZXIgTHV4b24gd2lsbCB0aHJvdyB3aGVuIGl0IGVuY291bnRlcnMgaW52YWxpZCBEYXRlVGltZXMsIER1cmF0aW9ucywgb3IgSW50ZXJ2YWxzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2V0dGluZ3M7XG59KCk7XG5cbnZhciBpbnRsRFRDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzKSB7XG4gIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICB2YXIgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcblxuICBpZiAoIWR0Zikge1xuICAgIGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bERUQ2FjaGVba2V5XSA9IGR0ZjtcbiAgfVxuXG4gIHJldHVybiBkdGY7XG59XG5cbnZhciBpbnRsTnVtQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgdmFyIGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuXG4gIGlmICghaW5mKSB7XG4gICAgaW5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bE51bUNhY2hlW2tleV0gPSBpbmY7XG4gIH1cblxuICByZXR1cm4gaW5mO1xufVxuXG52YXIgaW50bFJlbENhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMpIHtcbiAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICBiYXNlID0gX29wdHMuYmFzZSxcbiAgICAgIGNhY2hlS2V5T3B0cyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9vcHRzLCBbXCJiYXNlXCJdKTsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuXG5cbiAgdmFyIGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIGNhY2hlS2V5T3B0c10pO1xuICB2YXIgaW5mID0gaW50bFJlbENhY2hlW2tleV07XG5cbiAgaWYgKCFpbmYpIHtcbiAgICBpbmYgPSBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobG9jU3RyaW5nLCBvcHRzKTtcbiAgICBpbnRsUmVsQ2FjaGVba2V5XSA9IGluZjtcbiAgfVxuXG4gIHJldHVybiBpbmY7XG59XG5cbnZhciBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHN5c3RlbUxvY2FsZSgpIHtcbiAgaWYgKHN5c0xvY2FsZUNhY2hlKSB7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9IGVsc2UgaWYgKGhhc0ludGwoKSkge1xuICAgIHZhciBjb21wdXRlZFN5cyA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlOyAvLyBub2RlIHNvbWV0aW1lcyBkZWZhdWx0cyB0byBcInVuZFwiLiBPdmVycmlkZSB0aGF0IGJlY2F1c2UgdGhhdCBpcyBkdW1iXG5cbiAgICBzeXNMb2NhbGVDYWNoZSA9ICFjb21wdXRlZFN5cyB8fCBjb21wdXRlZFN5cyA9PT0gXCJ1bmRcIiA/IFwiZW4tVVNcIiA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IFwiZW4tVVNcIjtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlU3RyKSB7XG4gIC8vIEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQgd3JpdGluZyBhIEJDUCA0NyBwYXJzZXJcbiAgLy8gc2VlLCBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vYmNwLTQ3XG4gIC8vIEluc3RlYWQsIHdlJ2xsIGRvIHRoaXM6XG4gIC8vIGEpIGlmIHRoZSBzdHJpbmcgaGFzIG5vIC11IGV4dGVuc2lvbnMsIGp1c3QgbGVhdmUgaXQgYWxvbmVcbiAgLy8gYikgaWYgaXQgZG9lcywgdXNlIEludGwgdG8gcmVzb2x2ZSBldmVyeXRoaW5nXG4gIC8vIGMpIGlmIEludGwgZmFpbHMsIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSAtdVxuICB2YXIgdUluZGV4ID0gbG9jYWxlU3RyLmluZGV4T2YoXCItdS1cIik7XG5cbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgdmFyIG9wdGlvbnM7XG4gICAgdmFyIHNtYWxsZXIgPSBsb2NhbGVTdHIuc3Vic3RyaW5nKDAsIHVJbmRleCk7XG5cbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9vcHRpb25zLmNhbGVuZGFyOyAvLyByZXR1cm4gdGhlIHNtYWxsZXIgb25lIHNvIHRoYXQgd2UgY2FuIGFwcGVuZCB0aGUgY2FsZW5kYXIgYW5kIG51bWJlcmluZyBvdmVycmlkZXMgdG8gaXRcblxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKGhhc0ludGwoKSkge1xuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICBsb2NhbGVTdHIgKz0gXCItY2EtXCIgKyBvdXRwdXRDYWxlbmRhcjtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgICBsb2NhbGVTdHIgKz0gXCItbnUtXCIgKyBudW1iZXJpbmdTeXN0ZW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhbGVTdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2NhbGVTdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBNb250aHMoZikge1xuICB2YXIgbXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgdmFyIGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDc7IGkrKykge1xuICAgIHZhciBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuXG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbGlzdFN0dWZmKGxvYywgbGVuZ3RoLCBkZWZhdWx0T0ssIGVuZ2xpc2hGbiwgaW50bEZuKSB7XG4gIHZhciBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aChcImVuXCIpIHx8IGhhc0ludGwoKSAmJiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2MuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIjtcbiAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxudmFyIFBvbHlOdW1iZXJGb3JtYXR0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb2x5TnVtYmVyRm9ybWF0dGVyKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGlmICghZm9yY2VTaW1wbGUgJiYgaGFzSW50bCgpKSB7XG4gICAgICB2YXIgaW50bE9wdHMgPSB7XG4gICAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGlmIChvcHRzLnBhZFRvID4gMCkgaW50bE9wdHMubWluaW11bUludGVnZXJEaWdpdHMgPSBvcHRzLnBhZFRvO1xuICAgICAgdGhpcy5pbmYgPSBnZXRDYWNoZWRJTkYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQb2x5TnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIHZhciBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogaTtcbiAgICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0byBtYXRjaCB0aGUgYnJvd3NlcidzIG51bWJlcmZvcm1hdHRlciBkZWZhdWx0c1xuICAgICAgdmFyIF9maXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcblxuICAgICAgcmV0dXJuIHBhZFN0YXJ0KF9maXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBQb2x5TnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxudmFyIFBvbHlEYXRlRm9ybWF0dGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9seURhdGVGb3JtYXR0ZXIoZHQsIGludGwsIG9wdHMpIHtcbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgIHRoaXMuaGFzSW50bCA9IGhhc0ludGwoKTtcbiAgICB2YXIgejtcblxuICAgIGlmIChkdC56b25lLnVuaXZlcnNhbCAmJiB0aGlzLmhhc0ludGwpIHtcbiAgICAgIC8vIFVUQy04IG9yIEV0Yy9VVEMtOCBhcmUgbm90IHBhcnQgb2YgdHpkYXRhLCBvbmx5IEV0Yy9HTVQrOCBhbmQgdGhlIGxpa2UuXG4gICAgICAvLyBUaGF0IGlzIHdoeSBmaXhlZC1vZmZzZXQgVFogaXMgc2V0IHRvIHRoYXQgdW5sZXNzIGl0IGlzOlxuICAgICAgLy8gMS4gUmVwcmVzZW50aW5nIG9mZnNldCAwIHdoZW4gVVRDIGlzIHVzZWQgdG8gbWFpbnRhaW4gcHJldmlvdXMgYmVoYXZpb3IgYW5kIGRvZXMgbm90IGJlY29tZSBHTVQuXG4gICAgICAvLyAyLiBVbnN1cHBvcnRlZCBieSB0aGUgYnJvd3NlcjpcbiAgICAgIC8vICAgIC0gc29tZSBkbyBub3Qgc3VwcG9ydCBFdGMvXG4gICAgICAvLyAgICAtIDwgRXRjL0dNVC0xNCwgPiBFdGMvR01UKzEyLCBhbmQgMzAtbWludXRlIG9yIDQ1LW1pbnV0ZSBvZmZzZXRzIGFyZSBub3QgcGFydCBvZiB0emRhdGFcbiAgICAgIHZhciBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG4gICAgICB2YXIgb2Zmc2V0WiA9IGdtdE9mZnNldCA+PSAwID8gXCJFdGMvR01UK1wiICsgZ210T2Zmc2V0IDogXCJFdGMvR01UXCIgKyBnbXRPZmZzZXQ7XG4gICAgICB2YXIgaXNPZmZzZXRab25lU3VwcG9ydGVkID0gSUFOQVpvbmUuaXNWYWxpZFpvbmUob2Zmc2V0Wik7XG5cbiAgICAgIGlmIChkdC5vZmZzZXQgIT09IDAgJiYgaXNPZmZzZXRab25lU3VwcG9ydGVkKSB7XG4gICAgICAgIHogPSBvZmZzZXRaO1xuICAgICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3QgYWxsIGZpeGVkLW9mZnNldCB6b25lcyBsaWtlIEV0Yy8rNDozMCBhcmUgcHJlc2VudCBpbiB0emRhdGEuXG4gICAgICAgIC8vIFNvIHdlIGhhdmUgdG8gbWFrZSBkby4gVHdvIGNhc2VzOlxuICAgICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgICAvLyB3ZSBjYW4gZG8gaXMgZm9ybWF0IHRoZSBkYXRlIGluIFVUQy5cbiAgICAgICAgLy8gMi4gVGhlIGZvcm1hdCBvcHRpb25zIGRvbid0IHRlbGwgdXMgdG8gc2hvdyB0aGUgem9uZS4gVGhlbiB3ZSBjYW4gYWRqdXN0IHRoZW1cbiAgICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgICAvLyBhbmQgdGhlIGJhZCB6b25lIGRvZXNuJ3Qgc2hvdyB1cC5cbiAgICAgICAgeiA9IFwiVVRDXCI7XG5cbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwibG9jYWxcIikge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciBpbnRsT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh6KSB7XG4gICAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzIuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8yLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzIucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiBcImVuLVVTXCIsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogXCJsYXRuXCIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyOiBcImdyZWdvcnlcIlxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvbHlEYXRlRm9ybWF0dGVyO1xufSgpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxudmFyIFBvbHlSZWxGb3JtYXR0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb2x5UmVsRm9ybWF0dGVyKGludGwsIGlzRW5nbGlzaCwgb3B0cykge1xuICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgc3R5bGU6IFwibG9uZ1wiXG4gICAgfSwgb3B0cyk7XG5cbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvMyA9IFBvbHlSZWxGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0KGNvdW50LCB1bml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgdGhpcy5vcHRzLm51bWVyaWMsIHRoaXMub3B0cy5zdHlsZSAhPT0gXCJsb25nXCIpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvbHlSZWxGb3JtYXR0ZXI7XG59KCk7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgTG9jYWxlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgTG9jYWxlLmZyb21PcHRzID0gZnVuY3Rpb24gZnJvbU9wdHMob3B0cykge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKG9wdHMubG9jYWxlLCBvcHRzLm51bWJlcmluZ1N5c3RlbSwgb3B0cy5vdXRwdXRDYWxlbmRhciwgb3B0cy5kZWZhdWx0VG9FTik7XG4gIH07XG5cbiAgTG9jYWxlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIsIGRlZmF1bHRUb0VOKSB7XG4gICAgaWYgKGRlZmF1bHRUb0VOID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRUb0VOID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHNwZWNpZmllZExvY2FsZSA9IGxvY2FsZSB8fCBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlLFxuICAgICAgICAvLyB0aGUgc3lzdGVtIGxvY2FsZSBpcyB1c2VmdWwgZm9yIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MgYnV0IGFubm95aW5nIGZvciBwYXJzaW5nL2Zvcm1hdHRpbmcga25vd24gZm9ybWF0c1xuICAgIGxvY2FsZVIgPSBzcGVjaWZpZWRMb2NhbGUgfHwgKGRlZmF1bHRUb0VOID8gXCJlbi1VU1wiIDogc3lzdGVtTG9jYWxlKCkpLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyUiA9IG91dHB1dENhbGVuZGFyIHx8IFNldHRpbmdzLmRlZmF1bHRPdXRwdXRDYWxlbmRhcjtcbiAgICByZXR1cm4gbmV3IExvY2FsZShsb2NhbGVSLCBudW1iZXJpbmdTeXN0ZW1SLCBvdXRwdXRDYWxlbmRhclIsIHNwZWNpZmllZExvY2FsZSk7XG4gIH07XG5cbiAgTG9jYWxlLnJlc2V0Q2FjaGUgPSBmdW5jdGlvbiByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9O1xuXG4gIExvY2FsZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBMb2NhbGUobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICB2YXIgX3BhcnNlTG9jYWxlU3RyaW5nID0gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICAgICAgcGFyc2VkTG9jYWxlID0gX3BhcnNlTG9jYWxlU3RyaW5nWzBdLFxuICAgICAgICBwYXJzZWROdW1iZXJpbmdTeXN0ZW0gPSBfcGFyc2VMb2NhbGVTdHJpbmdbMV0sXG4gICAgICAgIHBhcnNlZE91dHB1dENhbGVuZGFyID0gX3BhcnNlTG9jYWxlU3RyaW5nWzJdO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tb250aHNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICB2YXIgX3Byb3RvNCA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNC5saXN0aW5nTW9kZSA9IGZ1bmN0aW9uIGxpc3RpbmdNb2RlKGRlZmF1bHRPSykge1xuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaW50bCA9IGhhc0ludGwoKSxcbiAgICAgICAgaGFzRlRQID0gaW50bCAmJiBoYXNGb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIGlzQWN0dWFsbHlFbiA9IHRoaXMuaXNFbmdsaXNoKCksXG4gICAgICAgIGhhc05vV2VpcmRuZXNzID0gKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gXCJncmVnb3J5XCIpO1xuXG4gICAgaWYgKCFoYXNGVFAgJiYgIShpc0FjdHVhbGx5RW4gJiYgaGFzTm9XZWlyZG5lc3MpICYmICFkZWZhdWx0T0spIHtcbiAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgfSBlbHNlIGlmICghaGFzRlRQIHx8IGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykge1xuICAgICAgcmV0dXJuIFwiZW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiaW50bFwiO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG80LmNsb25lID0gZnVuY3Rpb24gY2xvbmUoYWx0cykge1xuICAgIGlmICghYWx0cyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbHRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSwgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciwgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQucmVkZWZhdWx0VG9FTiA9IGZ1bmN0aW9uIHJlZGVmYXVsdFRvRU4oYWx0cykge1xuICAgIGlmIChhbHRzID09PSB2b2lkIDApIHtcbiAgICAgIGFsdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7XG4gICAgICBkZWZhdWx0VG9FTjogdHJ1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG80LnJlZGVmYXVsdFRvU3lzdGVtID0gZnVuY3Rpb24gcmVkZWZhdWx0VG9TeXN0ZW0oYWx0cykge1xuICAgIGlmIChhbHRzID09PSB2b2lkIDApIHtcbiAgICAgIGFsdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7XG4gICAgICBkZWZhdWx0VG9FTjogZmFsc2VcbiAgICB9KSk7XG4gIH07XG5cbiAgX3Byb3RvNC5tb250aHMgPSBmdW5jdGlvbiBtb250aHMkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChmb3JtYXQgPT09IHZvaWQgMCkge1xuICAgICAgZm9ybWF0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGgsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0gOiB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGhcbiAgICAgIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsIFwibW9udGhcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQud2Vla2RheXMgPSBmdW5jdGlvbiB3ZWVrZGF5cyQxKGxlbmd0aCwgZm9ybWF0LCBkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmIChmb3JtYXQgPT09IHZvaWQgMCkge1xuICAgICAgZm9ybWF0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIHdlZWtkYXlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IGZvcm1hdCA/IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoLFxuICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9IDoge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGhcbiAgICAgIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIV90aGlzMi53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBXZWVrZGF5cyhmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmV4dHJhY3QoZHQsIGludGwsIFwid2Vla2RheVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvNC5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMkMShkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIHVuZGVmaW5lZCwgZGVmYXVsdE9LLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVyaWRpZW1zO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAvLyBmb3IgQU0gYW5kIFBNLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBtYWtlcyBwYXJzaW5nIHdheSBlYXNpZXIuXG4gICAgICBpZiAoIV90aGlzMy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgIHZhciBpbnRsID0ge1xuICAgICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICAgIGhvdXIxMjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBfdGhpczMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczMubWVyaWRpZW1DYWNoZTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmVyYXMgPSBmdW5jdGlvbiBlcmFzJDEobGVuZ3RoLCBkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBlcmFzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH07IC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cblxuICAgICAgaWYgKCFfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGR0LCBpbnRsT3B0cywgZmllbGQpIHtcbiAgICB2YXIgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICAgIHJlc3VsdHMgPSBkZi5mb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09IGZpZWxkO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBfcHJvdG80Lm51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uIG51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgcmV0dXJuIG5ldyBQb2x5TnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzLCBvcHRzKTtcbiAgfTtcblxuICBfcHJvdG80LmR0Rm9ybWF0dGVyID0gZnVuY3Rpb24gZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSB7XG4gICAgaWYgKGludGxPcHRzID09PSB2b2lkIDApIHtcbiAgICAgIGludGxPcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH07XG5cbiAgX3Byb3RvNC5yZWxGb3JtYXR0ZXIgPSBmdW5jdGlvbiByZWxGb3JtYXR0ZXIob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBvbHlSZWxGb3JtYXR0ZXIodGhpcy5pbnRsLCB0aGlzLmlzRW5nbGlzaCgpLCBvcHRzKTtcbiAgfTtcblxuICBfcHJvdG80LmlzRW5nbGlzaCA9IGZ1bmN0aW9uIGlzRW5nbGlzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09IFwiZW5cIiB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHwgaGFzSW50bCgpICYmIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKTtcbiAgfTtcblxuICBfcHJvdG80LmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZSA9PT0gb3RoZXIubG9jYWxlICYmIHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBvdGhlci5udW1iZXJpbmdTeXN0ZW0gJiYgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXI7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKExvY2FsZSwgW3tcbiAgICBrZXk6IFwiZmFzdE51bWJlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IHN1cHBvcnRzRmFzdE51bWJlcnModGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXG4gKiBUaGlzIGZpbGUgaGFuZGxlcyBwYXJzaW5nIGZvciB3ZWxsLXNwZWNpZmllZCBmb3JtYXRzLiBIZXJlJ3MgaG93IGl0IHdvcmtzOlxuICogVHdvIHRoaW5ncyBnbyBpbnRvIHBhcnNpbmc6IGEgcmVnZXggdG8gbWF0Y2ggd2l0aCBhbmQgYW4gZXh0cmFjdG9yIHRvIHRha2UgYXBhcnQgdGhlIGdyb3VwcyBpbiB0aGUgbWF0Y2guXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XG4gKiBwYXJzZSgpIGRvZXMgdGhlIHdvcmsgb2YgZXhlY3V0aW5nIHRoZSByZWdleCBhbmQgYXBwbHlpbmcgdGhlIGV4dHJhY3Rvci4gSXQgdGFrZXMgbXVsdGlwbGUgcmVnZXgvZXh0cmFjdG9yIHBhaXJzIHRvIHRyeSBpbiBzZXF1ZW5jZS5cbiAqIEV4dHJhY3RvcnMgY2FuIHRha2UgYSBcImN1cnNvclwiIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IGluIHRoZSBtYXRjaCB0byBsb29rIGF0LiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY29tYmluZSBleHRyYWN0b3JzLlxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cbiAqIFNvbWUgZXh0cmFjdGlvbnMgYXJlIHN1cGVyIGR1bWIgYW5kIHNpbXBsZVBhcnNlIGFuZCBmcm9tU3RyaW5ncyBoZWxwIERSWSB0aGVtLlxuICovXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWdleGVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVnZXhlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICByZWdleGVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIGZ1bGwgPSByZWdleGVzLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgci5zb3VyY2U7XG4gIH0sIFwiXCIpO1xuICByZXR1cm4gUmVnRXhwKFwiXlwiICsgZnVsbCArIFwiJFwiKTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUV4dHJhY3RvcnMoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZXh0cmFjdG9ycyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIGV4dHJhY3RvcnNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBleHRyYWN0b3JzLnJlZHVjZShmdW5jdGlvbiAoX3JlZiwgZXgpIHtcbiAgICAgIHZhciBtZXJnZWRWYWxzID0gX3JlZlswXSxcbiAgICAgICAgICBtZXJnZWRab25lID0gX3JlZlsxXSxcbiAgICAgICAgICBjdXJzb3IgPSBfcmVmWzJdO1xuXG4gICAgICB2YXIgX2V4ID0gZXgobSwgY3Vyc29yKSxcbiAgICAgICAgICB2YWwgPSBfZXhbMF0sXG4gICAgICAgICAgem9uZSA9IF9leFsxXSxcbiAgICAgICAgICBuZXh0ID0gX2V4WzJdO1xuXG4gICAgICByZXR1cm4gW09iamVjdC5hc3NpZ24obWVyZ2VkVmFscywgdmFsKSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICB9LCBbe30sIG51bGwsIDFdKS5zbGljZSgwLCAyKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2Uocykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcGF0dGVybnMgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIHBhdHRlcm5zW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBfcGF0dGVybnMgPSBwYXR0ZXJuczsgX2kgPCBfcGF0dGVybnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9wYXR0ZXJucyRfaSA9IF9wYXR0ZXJuc1tfaV0sXG4gICAgICAgIHJlZ2V4ID0gX3BhdHRlcm5zJF9pWzBdLFxuICAgICAgICBleHRyYWN0b3IgPSBfcGF0dGVybnMkX2lbMV07XG4gICAgdmFyIG0gPSByZWdleC5leGVjKHMpO1xuXG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtudWxsLCBudWxsXTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlUGFyc2UoKSB7XG4gIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIGN1cnNvcikge1xuICAgIHZhciByZXQgPSB7fTtcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRba2V5c1tpXV0gPSBwYXJzZUludGVnZXIobWF0Y2hbY3Vyc29yICsgaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn0gLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xuXG5cbnZhciBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gICAgaXNvVGltZUJhc2VSZWdleCA9IC8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Wy4sXShcXGR7MSwzMH0pKT8pPyk/LyxcbiAgICBpc29UaW1lUmVnZXggPSBSZWdFeHAoXCJcIiArIGlzb1RpbWVCYXNlUmVnZXguc291cmNlICsgb2Zmc2V0UmVnZXguc291cmNlICsgXCI/XCIpLFxuICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OlRcIiArIGlzb1RpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpLFxuICAgIGlzb1ltZFJlZ2V4ID0gLyhbKy1dXFxkezZ9fFxcZHs0fSkoPzotPyhcXGRcXGQpKD86LT8oXFxkXFxkKSk/KT8vLFxuICAgIGlzb1dlZWtSZWdleCA9IC8oXFxkezR9KS0/VyhcXGRcXGQpKD86LT8oXFxkKSk/LyxcbiAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICBleHRyYWN0SVNPV2Vla0RhdGEgPSBzaW1wbGVQYXJzZShcIndlZWtZZWFyXCIsIFwid2Vla051bWJlclwiLCBcIndlZWtEYXlcIiksXG4gICAgZXh0cmFjdElTT09yZGluYWxEYXRhID0gc2ltcGxlUGFyc2UoXCJ5ZWFyXCIsIFwib3JkaW5hbFwiKSxcbiAgICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sXG4gICAgLy8gZHVtYmVkLWRvd24gdmVyc2lvbiBvZiB0aGUgSVNPIG9uZVxuc3FsVGltZVJlZ2V4ID0gUmVnRXhwKGlzb1RpbWVCYXNlUmVnZXguc291cmNlICsgXCIgPyg/OlwiICsgb2Zmc2V0UmVnZXguc291cmNlICsgXCJ8KFwiICsgaWFuYVJlZ2V4LnNvdXJjZSArIFwiKSk/XCIpLFxuICAgIHNxbFRpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OiBcIiArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpO1xuXG5mdW5jdGlvbiBpbnQobWF0Y2gsIHBvcywgZmFsbGJhY2spIHtcbiAgdmFyIG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIHllYXI6IGludChtYXRjaCwgY3Vyc29yKSxcbiAgICBtb250aDogaW50KG1hdGNoLCBjdXJzb3IgKyAxLCAxKSxcbiAgICBkYXk6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMSlcbiAgfTtcbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyczogaW50KG1hdGNoLCBjdXJzb3IsIDApLFxuICAgIG1pbnV0ZXM6IGludChtYXRjaCwgY3Vyc29yICsgMSwgMCksXG4gICAgc2Vjb25kczogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAwKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1hdGNoW2N1cnNvciArIDNdKVxuICB9O1xuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDRdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPT2Zmc2V0KG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgICAgZnVsbE9mZnNldCA9IHNpZ25lZE9mZnNldChtYXRjaFtjdXJzb3IgKyAxXSwgbWF0Y2hbY3Vyc29yICsgMl0pLFxuICAgICAgem9uZSA9IGxvY2FsID8gbnVsbCA6IEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShmdWxsT2Zmc2V0KTtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJQU5BWm9uZShtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciB6b25lID0gbWF0Y2hbY3Vyc29yXSA/IElBTkFab25lLmNyZWF0ZShtYXRjaFtjdXJzb3JdKSA6IG51bGw7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDFdO1xufSAvLyBJU08gdGltZSBwYXJzaW5nXG5cblxudmFyIGlzb1RpbWVPbmx5ID0gUmVnRXhwKFwiXlQ/XCIgKyBpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZSArIFwiJFwiKTsgLy8gSVNPIGR1cmF0aW9uIHBhcnNpbmdcblxudmFyIGlzb0R1cmF0aW9uID0gL14tP1AoPzooPzooLT9cXGR7MSw5fSlZKT8oPzooLT9cXGR7MSw5fSlNKT8oPzooLT9cXGR7MSw5fSlXKT8oPzooLT9cXGR7MSw5fSlEKT8oPzpUKD86KC0/XFxkezEsOX0pSCk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgdmFyIHMgPSBtYXRjaFswXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICB3ZWVrU3RyID0gbWF0Y2hbM10sXG4gICAgICBkYXlTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICBtaWxsaXNlY29uZHNTdHIgPSBtYXRjaFs4XTtcbiAgdmFyIGhhc05lZ2F0aXZlUHJlZml4ID0gc1swXSA9PT0gXCItXCI7XG4gIHZhciBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICB2YXIgbWF5YmVOZWdhdGUgPSBmdW5jdGlvbiBtYXliZU5lZ2F0ZShudW0sIGZvcmNlKSB7XG4gICAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICAgIGZvcmNlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gdW5kZWZpbmVkICYmIChmb3JjZSB8fCBudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpID8gLW51bSA6IG51bTtcbiAgfTtcblxuICByZXR1cm4gW3tcbiAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSxcbiAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihtb250aFN0cikpLFxuICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIod2Vla1N0cikpLFxuICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihkYXlTdHIpKSxcbiAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKGhvdXJTdHIpKSxcbiAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIobWludXRlU3RyKSksXG4gICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHNlY29uZFN0ciksIHNlY29uZFN0ciA9PT0gXCItMFwiKSxcbiAgICBtaWxsaXNlY29uZHM6IG1heWJlTmVnYXRlKHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0ciksIG5lZ2F0aXZlU2Vjb25kcylcbiAgfV07XG59IC8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcblxuXG52YXIgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50ZWdlcih5ZWFyU3RyKSkgOiBwYXJzZUludGVnZXIoeWVhclN0ciksXG4gICAgbW9udGg6IG1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpICsgMSxcbiAgICBkYXk6IHBhcnNlSW50ZWdlcihkYXlTdHIpLFxuICAgIGhvdXI6IHBhcnNlSW50ZWdlcihob3VyU3RyKSxcbiAgICBtaW51dGU6IHBhcnNlSW50ZWdlcihtaW51dGVTdHIpXG4gIH07XG4gIGlmIChzZWNvbmRTdHIpIHJlc3VsdC5zZWNvbmQgPSBwYXJzZUludGVnZXIoc2Vjb25kU3RyKTtcblxuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID0gd2Vla2RheVN0ci5sZW5ndGggPiAzID8gd2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxIDogd2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpICsgMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IC8vIFJGQyAyODIyLzUzMjJcblxuXG52YXIgcmZjMjgyMiA9IC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICBvYnNPZmZzZXQgPSBtYXRjaFs4XSxcbiAgICAgIG1pbE9mZnNldCA9IG1hdGNoWzldLFxuICAgICAgb2ZmSG91clN0ciA9IG1hdGNoWzEwXSxcbiAgICAgIG9mZk1pbnV0ZVN0ciA9IG1hdGNoWzExXSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgdmFyIG9mZnNldDtcblxuICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICB9IGVsc2UgaWYgKG1pbE9mZnNldCkge1xuICAgIG9mZnNldCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cik7XG4gIH1cblxuICByZXR1cm4gW3Jlc3VsdCwgbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpXTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCBcIiBcIikucmVwbGFjZSgvKFxcc1xccyspL2csIFwiIFwiKS50cmltKCk7XG59IC8vIGh0dHAgZGF0ZVxuXG5cbnZhciByZmMxMTIzID0gL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICByZmM4NTAgPSAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICAgIGFzY2lpID0gL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbnZhciBpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG52YXIgaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG52YXIgaXNvT3JkaW5hbFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29PcmRpbmFsUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG52YXIgaXNvVGltZUNvbWJpbmVkUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29UaW1lUmVnZXgpO1xudmFyIGV4dHJhY3RJU09ZbWRUaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xudmFyIGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xudmFyIGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPT3JkaW5hbERhdGEsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KTtcbnZhciBleHRyYWN0SVNPVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUlTT0RhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb1ltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lQW5kT2Zmc2V0XSwgW2lzb1dlZWtXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXRdLCBbaXNvT3JkaW5hbFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWVdLCBbaXNvVGltZUNvbWJpbmVkUmVnZXgsIGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0XSk7XG59XG5mdW5jdGlvbiBwYXJzZVJGQzI4MjJEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHByZXByb2Nlc3NSRkMyODIyKHMpLCBbcmZjMjgyMiwgZXh0cmFjdFJGQzI4MjJdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSFRUUERhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW2FzY2lpLCBleHRyYWN0QVNDSUldKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cbnZhciBleHRyYWN0SVNPVGltZU9ubHkgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSk7XG5mdW5jdGlvbiBwYXJzZUlTT1RpbWVPbmx5KHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtpc29UaW1lT25seSwgZXh0cmFjdElTT1RpbWVPbmx5XSk7XG59XG52YXIgc3FsWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFltZFJlZ2V4LCBzcWxUaW1lRXh0ZW5zaW9uUmVnZXgpO1xudmFyIHNxbFRpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KTtcbnZhciBleHRyYWN0SVNPWW1kVGltZU9mZnNldEFuZElBTkFab25lID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSk7XG52YXIgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpO1xuZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UocywgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLCBbc3FsVGltZUNvbWJpbmVkUmVnZXgsIGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmVdKTtcbn1cblxudmFyIElOVkFMSUQgPSBcIkludmFsaWQgRHVyYXRpb25cIjsgLy8gdW5pdCBjb252ZXJzaW9uIGNvbnN0YW50c1xuXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3Vyczoge1xuICAgIG1pbnV0ZXM6IDYwLFxuICAgIHNlY29uZHM6IDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBtaW51dGVzOiB7XG4gICAgc2Vjb25kczogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDBcbiAgfSxcbiAgc2Vjb25kczoge1xuICAgIG1pbGxpc2Vjb25kczogMTAwMFxuICB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIHF1YXJ0ZXJzOiA0LFxuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgcXVhcnRlcnM6IDQsXG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7IC8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuXG52YXIgb3JkZXJlZFVuaXRzID0gW1wieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl07XG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTsgLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcblxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhcikge1xuICBpZiAoY2xlYXIgPT09IHZvaWQgMCkge1xuICAgIGNsZWFyID0gZmFsc2U7XG4gIH1cblxuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIHZhciBjb25mID0ge1xuICAgIHZhbHVlczogY2xlYXIgPyBhbHRzLnZhbHVlcyA6IE9iamVjdC5hc3NpZ24oe30sIGR1ci52YWx1ZXMsIGFsdHMudmFsdWVzIHx8IHt9KSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeVxuICB9O1xuICByZXR1cm4gbmV3IER1cmF0aW9uKGNvbmYpO1xufVxuXG5mdW5jdGlvbiBhbnRpVHJ1bmMobikge1xuICByZXR1cm4gbiA8IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pO1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIHZhciBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgICAgc2FtZVNpZ24gPSBNYXRoLnNpZ24ocmF3KSA9PT0gTWF0aC5zaWduKHRvTWFwW3RvVW5pdF0pLFxuICAgICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICBhZGRlZCA9ICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59IC8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcblxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZXMobWF0cml4LCB2YWxzKSB7XG4gIHJldmVyc2VVbml0cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzLCBjdXJyZW50KSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh2YWxzW2N1cnJlbnRdKSkge1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnZlcnQobWF0cml4LCB2YWxzLCBwcmV2aW91cywgdmFscywgY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cbi8qKlxuICogQSBEdXJhdGlvbiBvYmplY3QgcmVwcmVzZW50cyBhIHBlcmlvZCBvZiB0aW1lLCBsaWtlIFwiMiBtb250aHNcIiBvciBcIjEgZGF5LCAxIGhvdXJcIi4gQ29uY2VwdHVhbGx5LCBpdCdzIGp1c3QgYSBtYXAgb2YgdW5pdHMgdG8gdGhlaXIgcXVhbnRpdGllcywgYWNjb21wYW5pZWQgYnkgc29tZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gYW5kIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uIFRoZXkgY2FuIGJlIHVzZWQgb24gdGhlaXIgb3duIG9yIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgTHV4b24gdHlwZXM7IGZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB7QGxpbmsgRGF0ZVRpbWUucGx1c30gdG8gYWRkIGEgRHVyYXRpb24gb2JqZWN0IHRvIGEgRGF0ZVRpbWUsIHByb2R1Y2luZyBhbm90aGVyIERhdGVUaW1lLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gRHVyYXRpb246XG4gKlxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGEgRHVyYXRpb24sIHVzZSB7QGxpbmsgRHVyYXRpb24uZnJvbU1pbGxpc30sIHtAbGluayBEdXJhdGlvbi5mcm9tT2JqZWN0fSwgb3Ige0BsaW5rIER1cmF0aW9uLmZyb21JU099LlxuICogKiAqKlVuaXQgdmFsdWVzKiogU2VlIHRoZSB7QGxpbmsgRHVyYXRpb24ueWVhcnN9LCB7QGxpbmsgRHVyYXRpb24ubW9udGhzfSwge0BsaW5rIER1cmF0aW9uLndlZWtzfSwge0BsaW5rIER1cmF0aW9uLmRheXN9LCB7QGxpbmsgRHVyYXRpb24uaG91cnN9LCB7QGxpbmsgRHVyYXRpb24ubWludXRlc30sIHtAbGluayBEdXJhdGlvbi5zZWNvbmRzfSwge0BsaW5rIER1cmF0aW9uLm1pbGxpc2Vjb25kc30gYWNjZXNzb3JzLlxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgIHtAbGluayBEdXJhdGlvbi5sb2NhbGV9IGFuZCB7QGxpbmsgRHVyYXRpb24ubnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKiBUbyBjcmVhdGUgbmV3IER1cmF0aW9ucyBvdXQgb2Ygb2xkIG9uZXMgdXNlIHtAbGluayBEdXJhdGlvbi5wbHVzfSwge0BsaW5rIER1cmF0aW9uLm1pbnVzfSwge0BsaW5rIER1cmF0aW9uLm5vcm1hbGl6ZX0sIHtAbGluayBEdXJhdGlvbi5zZXR9LCB7QGxpbmsgRHVyYXRpb24ucmVjb25maWd1cmV9LCB7QGxpbmsgRHVyYXRpb24uc2hpZnRUb30sIGFuZCB7QGxpbmsgRHVyYXRpb24ubmVnYXRlfS5cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBEdXJhdGlvbiBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBEdXJhdGlvbi5hc30sIHtAbGluayBEdXJhdGlvbi50b0lTT30sIHtAbGluayBEdXJhdGlvbi50b0Zvcm1hdH0sIGFuZCB7QGxpbmsgRHVyYXRpb24udG9KU09OfVxuICpcbiAqIFRoZXJlJ3MgYXJlIG1vcmUgbWV0aG9kcyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdmFsaWRpdHksIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cbiAqL1xuXG5cbnZhciBEdXJhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb24oY29uZmlnKSB7XG4gICAgdmFyIGFjY3VyYXRlID0gY29uZmlnLmNvbnZlcnNpb25BY2N1cmFjeSA9PT0gXCJsb25ndGVybVwiIHx8IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuY29udmVyc2lvbkFjY3VyYWN5ID0gYWNjdXJhdGUgPyBcImxvbmd0ZXJtXCIgOiBcImNhc3VhbFwiO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuaXNMdXhvbkR1cmF0aW9uID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgb2YgbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWlsbGlzZWNvbmRzOiBjb3VudFxuICAgIH0sIG9wdHMpKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFycycgYW5kICdob3VycycuXG4gICAqIElmIHRoaXMgb2JqZWN0IGlzIGVtcHR5IHRoZW4gYSB6ZXJvIG1pbGxpc2Vjb25kcyBkdXJhdGlvbiBpcyByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5xdWFydGVyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5c1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmouY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICA7XG5cbiAgRHVyYXRpb24uZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIkR1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290IFwiICsgKG9iaiA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIG9iaikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0LCBbXCJsb2NhbGVcIiwgXCJudW1iZXJpbmdTeXN0ZW1cIiwgXCJjb252ZXJzaW9uQWNjdXJhY3lcIiwgXCJ6b25lXCIgLy8gYSBiaXQgb2YgZGVidDsgaXQncyBzdXBlciBpbmNvbnZlbmllbnQgaW50ZXJuYWxseSBub3QgdG8gYmUgYWJsZSB0byBibGluZGx5IHBhc3MgdGhpc1xuICAgICAgXSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDNZNk0xVzREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgd2Vla3M6IDEsIGRheXM6IDQsIGhvdXJzOiAxMiwgbWludXRlczogMzAsIHNlY29uZHM6IDUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1A1WTNNJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDUsIG1vbnRoczogMyB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgO1xuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFcIik7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGFuIElTTyA4NjAxIHRpbWUgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZXNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjIyOjMzLjQ0NCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMjIsIHNlY29uZHM6IDMzLCBtaWxsaXNlY29uZHM6IDQ0NCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCdUMTE6MDAnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMTEsIG1pbnV0ZXM6IDAsIHNlY29uZHM6IDAgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTEwMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCdUMTEwMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgO1xuXG4gIER1cmF0aW9uLmZyb21JU09UaW1lID0gZnVuY3Rpb24gZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIHZhciBfcGFyc2VJU09UaW1lT25seSA9IHBhcnNlSVNPVGltZU9ubHkodGV4dCksXG4gICAgICAgIHBhcnNlZCA9IF9wYXJzZUlTT1RpbWVPbmx5WzBdO1xuXG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgdmFyIG9iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2VkLCBvcHRzKTtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBcInRoZSBpbnB1dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIGNhbid0IGJlIHBhcnNlZCBhcyBJU08gODYwMVwiKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBkYXRldGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICA7XG5cbiAgRHVyYXRpb24uaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREdXJhdGlvbkVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgO1xuXG4gIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQgPSBmdW5jdGlvbiBub3JtYWxpemVVbml0KHVuaXQpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICAgIHllYXI6IFwieWVhcnNcIixcbiAgICAgIHllYXJzOiBcInllYXJzXCIsXG4gICAgICBxdWFydGVyOiBcInF1YXJ0ZXJzXCIsXG4gICAgICBxdWFydGVyczogXCJxdWFydGVyc1wiLFxuICAgICAgbW9udGg6IFwibW9udGhzXCIsXG4gICAgICBtb250aHM6IFwibW9udGhzXCIsXG4gICAgICB3ZWVrOiBcIndlZWtzXCIsXG4gICAgICB3ZWVrczogXCJ3ZWVrc1wiLFxuICAgICAgZGF5OiBcImRheXNcIixcbiAgICAgIGRheXM6IFwiZGF5c1wiLFxuICAgICAgaG91cjogXCJob3Vyc1wiLFxuICAgICAgaG91cnM6IFwiaG91cnNcIixcbiAgICAgIG1pbnV0ZTogXCJtaW51dGVzXCIsXG4gICAgICBtaW51dGVzOiBcIm1pbnV0ZXNcIixcbiAgICAgIHNlY29uZDogXCJzZWNvbmRzXCIsXG4gICAgICBzZWNvbmRzOiBcInNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgbWlsbGlzZWNvbmRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gICAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRHVyYXRpb24uIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBEdXJhdGlvbi5pc0R1cmF0aW9uID0gZnVuY3Rpb24gaXNEdXJhdGlvbihvKSB7XG4gICAgcmV0dXJuIG8gJiYgby5pc0x1eG9uRHVyYXRpb24gfHwgZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEdldCAgdGhlIGxvY2FsZSBvZiBhIER1cmF0aW9uLCBzdWNoICdlbi1HQidcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIDtcblxuICB2YXIgX3Byb3RvID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBfcHJvdG8udG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChmbXQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgLy8gcmV2ZXJzZS1jb21wYXQgc2luY2UgMS4yOyB3ZSBhbHdheXMgcm91bmQgZG93biBub3csIG5ldmVyIHVwLCBhbmQgd2UgZG8gaXQgYnkgZGVmYXVsdFxuICAgIHZhciBmbXRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge1xuICAgICAgZmxvb3I6IG9wdHMucm91bmQgIT09IGZhbHNlICYmIG9wdHMuZmxvb3IgIT09IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MsIGZtdE9wdHMpLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmFsdWVzKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2UuY29udmVyc2lvbkFjY3VyYWN5ID0gdGhpcy5jb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAzLCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1AzWVQ0NVMnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDQsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDRNVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNSB9KS50b0lTTygpIC8vPT4gJ1A1TSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbnV0ZXM6IDUgfSkudG9JU08oKSAvLz0+ICdQVDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiA2IH0pLnRvSVNPKCkgLy89PiAnUFQwLjAwNlMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIHZhciBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApIC8vIHRoaXMgd2lsbCBoYW5kbGUgXCJmbG9hdGluZyBwb2ludCBtYWRuZXNzXCIgYnkgcmVtb3ZpbmcgZXh0cmEgZGVjaW1hbCBwbGFjZXNcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU4ODAwNC9pcy1mbG9hdGluZy1wb2ludC1tYXRoLWJyb2tlblxuICAgICAgcyArPSByb3VuZFRvKHRoaXMuc2Vjb25kcyArIHRoaXMubWlsbGlzZWNvbmRzIC8gMTAwMCwgMykgKyBcIlNcIjtcbiAgICBpZiAocyA9PT0gXCJQXCIpIHMgKz0gXCJUMFNcIjtcbiAgICByZXR1cm4gcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24sIGZvcm1hdHRlZCBhcyBhIHRpbWUgb2YgZGF5LlxuICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkLCBuZWdhdGl2ZSwgb3IgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDI0IGhvdXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKCkgLy89PiAnMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzTWlsbGlzZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzExOjAwOjAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBpbmNsdWRlUHJlZml4OiB0cnVlIH0pIC8vPT4gJ1QxMTowMDowMC4wMDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzExMDAwMC4wMDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9JU09UaW1lID0gZnVuY3Rpb24gdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIHZhciBtaWxsaXMgPSB0aGlzLnRvTWlsbGlzKCk7XG4gICAgaWYgKG1pbGxpcyA8IDAgfHwgbWlsbGlzID49IDg2NDAwMDAwKSByZXR1cm4gbnVsbDtcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kczogZmFsc2UsXG4gICAgICBzdXBwcmVzc1NlY29uZHM6IGZhbHNlLFxuICAgICAgaW5jbHVkZVByZWZpeDogZmFsc2UsXG4gICAgICBmb3JtYXQ6IFwiZXh0ZW5kZWRcIlxuICAgIH0sIG9wdHMpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuc2hpZnRUbyhcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIik7XG4gICAgdmFyIGZtdCA9IG9wdHMuZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcImhobW1cIiA6IFwiaGg6bW1cIjtcblxuICAgIGlmICghb3B0cy5zdXBwcmVzc1NlY29uZHMgfHwgdmFsdWUuc2Vjb25kcyAhPT0gMCB8fCB2YWx1ZS5taWxsaXNlY29uZHMgIT09IDApIHtcbiAgICAgIGZtdCArPSBvcHRzLmZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJzc1wiIDogXCI6c3NcIjtcblxuICAgICAgaWYgKCFvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0ciA9IHZhbHVlLnRvRm9ybWF0KGZtdCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlUHJlZml4KSB7XG4gICAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoXCJtaWxsaXNlY29uZHNcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by52YWx1ZU9mID0gZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLFxuICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Uob3JkZXJlZFVuaXRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBrID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShkdXIudmFsdWVzLCBrKSB8fCBoYXNPd25Qcm9wZXJ0eSh0aGlzLnZhbHVlcywgaykpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gZHVyLmdldChrKSArIHRoaXMuZ2V0KGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTY2FsZSB0aGlzIER1cmF0aW9uIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB1bml0LiBBcml0eSBpcyAxIG9yIDI6IHRoZSB2YWx1ZSBvZiB0aGUgdW5pdCBhbmQsIG9wdGlvbmFsbHksIHRoZSB1bml0IG5hbWUuIE11c3QgcmV0dXJuIGEgbnVtYmVyLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXQoeCA9PiB4ICogMikgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiA2MCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdCgoeCwgdSkgPT4gdSA9PT0gXCJob3VyXCIgPyB4ICogMiA6IHgpIC8vPT4geyBob3VyczogMiwgbWludXRlczogMzAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ubWFwVW5pdHMgPSBmdW5jdGlvbiBtYXBVbml0cyhmbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9PYmplY3Qka2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTsgX2kgPCBfT2JqZWN0JGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgayA9IF9PYmplY3Qka2V5c1tfaV07XG4gICAgICByZXN1bHRba10gPSBhc051bWJlcihmbih0aGlzLnZhbHVlc1trXSwgaykpO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ3llYXJzJykgLy89PiAyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdtb250aHMnKSAvLz0+IDBcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ2RheXMnKSAvLz0+IDNcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyB5ZWFyczogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQodmFsdWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQsIFtdKSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbWl4ZWRcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlIGFuZC9vciBudW1iZXJpbmdTeXN0ZW0uICBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBleGFtcGxlIGR1ci5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgY29udmVyc2lvbkFjY3VyYWN5ID0gX3JlZi5jb252ZXJzaW9uQWNjdXJhY3k7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbVxuICAgIH0pLFxuICAgICAgICBvcHRzID0ge1xuICAgICAgbG9jOiBsb2NcbiAgICB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFzID0gZnVuY3Rpb24gYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBSZWR1Y2UgdGhpcyBEdXJhdGlvbiB0byBpdHMgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGluIGl0cyBjdXJyZW50IHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDIsIGRheXM6IDUwMDAgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDE1LCBkYXlzOiAyNTUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIG5vcm1hbGl6ZVZhbHVlcyh0aGlzLm1hdHJpeCwgdmFscyk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogdmFsc1xuICAgIH0sIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2hpZnRUbyA9IGZ1bmN0aW9uIHNoaWZ0VG8oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHVuaXRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuICAgIHZhciBidWlsdCA9IHt9LFxuICAgICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgICB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIHZhciBsYXN0VW5pdDtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG9yZGVyZWRVbml0cyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgayA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG4gICAgICAgIHZhciBvd24gPSAwOyAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcblxuICAgICAgICBmb3IgKHZhciBhayBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICAgIG93biArPSB0aGlzLm1hdHJpeFtha11ba10gKiBhY2N1bXVsYXRlZFtha107XG4gICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgfSAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuXG5cbiAgICAgICAgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgICAgb3duICs9IHZhbHNba107XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IE1hdGgudHJ1bmMob3duKTtcbiAgICAgICAgYnVpbHRba10gPSBpO1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IG93biAtIGk7IC8vIHdlJ2QgbGlrZSB0byBhYnNvcmIgdGhlc2UgZnJhY3Rpb25zIGluIGFub3RoZXIgdW5pdFxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gdGhhdCBzaG91bGQgYmUgcm9sbGVkIHVwIGluIHRvIHRoaXNcblxuICAgICAgICBmb3IgKHZhciBkb3duIGluIHZhbHMpIHtcbiAgICAgICAgICBpZiAob3JkZXJlZFVuaXRzLmluZGV4T2YoZG93bikgPiBvcmRlcmVkVW5pdHMuaW5kZXhPZihrKSkge1xuICAgICAgICAgICAgY29udmVydCh0aGlzLm1hdHJpeCwgdmFscywgZG93biwgYnVpbHQsIGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBvdGhlcndpc2UsIGtlZXAgaXQgaW4gdGhlIHdpbmdzIHRvIGJvaWwgaXQgbGF0ZXJcblxuICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IHZhbHNba107XG4gICAgICB9XG4gICAgfSAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuXG5cbiAgICBmb3IgKHZhciBrZXkgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgIGlmIChhY2N1bXVsYXRlZFtrZXldICE9PSAwKSB7XG4gICAgICAgIGJ1aWx0W2xhc3RVbml0XSArPSBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiBidWlsdFxuICAgIH0sIHRydWUpLm5vcm1hbGl6ZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmVnYXRlZCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kyID0gMCwgX09iamVjdCRrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTsgX2kyIDwgX09iamVjdCRrZXlzMi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgayA9IF9PYmplY3Qka2V5czJbX2kyXTtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbmVnYXRlZFxuICAgIH0sIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHllYXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBFcXVhbGl0eSBjaGVja1xuICAgKiBUd28gRHVyYXRpb25zIGFyZSBlcXVhbCBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHVuaXRzIGFuZCB0aGUgc2FtZSB2YWx1ZXMgZm9yIGVhY2ggdW5pdC5cbiAgICogQHBhcmFtIHtEdXJhdGlvbn0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcSh2MSwgdjIpIHtcbiAgICAgIC8vIENvbnNpZGVyIDAgYW5kIHVuZGVmaW5lZCBhcyBlcXVhbFxuICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgfHwgdjEgPT09IDApIHJldHVybiB2MiA9PT0gdW5kZWZpbmVkIHx8IHYyID09PSAwO1xuICAgICAgcmV0dXJuIHYxID09PSB2MjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvcmRlcmVkVW5pdHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgdmFyIHUgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgIGlmICghZXEodGhpcy52YWx1ZXNbdV0sIG90aGVyLnZhbHVlc1t1XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhEdXJhdGlvbiwgW3tcbiAgICBrZXk6IFwibG9jYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXJpbmcgc3lzdGVtIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2JlbmcnLiBUaGUgbnVtYmVyaW5nIHN5c3RlbSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRHVyYXRpb25cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJudW1iZXJpbmdTeXN0ZW1cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ5ZWFyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcXVhcnRlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInF1YXJ0ZXJzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHdlZWtzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhvdXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJob3Vyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibWludXRlc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWNvbmRzLlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNlY29uZHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcbiAgICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHVyYXRpb247XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uaXNoKSB7XG4gIGlmIChpc051bWJlcihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSBpZiAoRHVyYXRpb24uaXNEdXJhdGlvbihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gZHVyYXRpb25pc2g7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uaXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoZHVyYXRpb25pc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZHVyYXRpb24gYXJndW1lbnQgXCIgKyBkdXJhdGlvbmlzaCArIFwiIG9mIHR5cGUgXCIgKyB0eXBlb2YgZHVyYXRpb25pc2gpO1xuICB9XG59XG5cbnZhciBJTlZBTElEJDEgPSBcIkludmFsaWQgSW50ZXJ2YWxcIjsgLy8gY2hlY2tzIGlmIHRoZSBzdGFydCBpcyBlcXVhbCB0byBvciBiZWZvcmUgdGhlIGVuZFxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJlbmQgYmVmb3JlIHN0YXJ0XCIsIFwiVGhlIGVuZCBvZiBhbiBpbnRlcnZhbCBtdXN0IGJlIGFmdGVyIGl0cyBzdGFydCwgYnV0IHlvdSBoYWQgc3RhcnQ9XCIgKyBzdGFydC50b0lTTygpICsgXCIgYW5kIGVuZD1cIiArIGVuZC50b0lTTygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBBbiBJbnRlcnZhbCBvYmplY3QgcmVwcmVzZW50cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBvZiB0aW1lLCB3aGVyZSBlYWNoIGVuZHBvaW50IGlzIGEge0BsaW5rIERhdGVUaW1lfS4gQ29uY2VwdHVhbGx5LCBpdCdzIGEgY29udGFpbmVyIGZvciB0aG9zZSB0d28gZW5kcG9pbnRzLCBhY2NvbXBhbmllZCBieSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgY29tcGFyaW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBJbnRlcnZhbDpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYW4gSW50ZXJ2YWwsIHVzZSB7QGxpbmsgZnJvbURhdGVUaW1lc30sIHtAbGluayBhZnRlcn0sIHtAbGluayBiZWZvcmV9LCBvciB7QGxpbmsgZnJvbUlTT30uXG4gKiAqICoqQWNjZXNzb3JzKiogVXNlIHtAbGluayBzdGFydH0gYW5kIHtAbGluayBlbmR9IHRvIGdldCB0aGUgc3RhcnQgYW5kIGVuZC5cbiAqICogKipJbnRlcnJvZ2F0aW9uKiogVG8gYW5hbHl6ZSB0aGUgSW50ZXJ2YWwsIHVzZSB7QGxpbmsgY291bnR9LCB7QGxpbmsgbGVuZ3RofSwge0BsaW5rIGhhc1NhbWV9LCB7QGxpbmsgY29udGFpbnN9LCB7QGxpbmsgaXNBZnRlcn0sIG9yIHtAbGluayBpc0JlZm9yZX0uXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKiBUbyBjcmVhdGUgb3RoZXIgSW50ZXJ2YWxzIG91dCBvZiB0aGlzIG9uZSwgdXNlIHtAbGluayBzZXR9LCB7QGxpbmsgc3BsaXRBdH0sIHtAbGluayBzcGxpdEJ5fSwge0BsaW5rIGRpdmlkZUVxdWFsbHl9LCB7QGxpbmsgbWVyZ2V9LCB7QGxpbmsgeG9yfSwge0BsaW5rIHVuaW9ufSwge0BsaW5rIGludGVyc2VjdGlvbn0sIG9yIHtAbGluayBkaWZmZXJlbmNlfS5cbiAqICogKipDb21wYXJpc29uKiogVG8gY29tcGFyZSB0aGlzIEludGVydmFsIHRvIGFub3RoZXIgb25lLCB1c2Uge0BsaW5rIGVxdWFsc30sIHtAbGluayBvdmVybGFwc30sIHtAbGluayBhYnV0c1N0YXJ0fSwge0BsaW5rIGFidXRzRW5kfSwge0BsaW5rIGVuZ3VsZnN9LlxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIEludGVydmFsIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvSVNPRGF0ZX0sIHtAbGluayB0b0lTT1RpbWV9LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LlxuICovXG5cblxudmFyIEludGVydmFsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnZhbChjb25maWcpIHtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnMgPSBjb25maWcuc3RhcnQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuaXNMdXhvbkludGVydmFsID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIEludGVydmFsIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG5cblxuICBJbnRlcnZhbC5pbnZhbGlkID0gZnVuY3Rpb24gaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgaWYgKGV4cGxhbmF0aW9uID09PSB2b2lkIDApIHtcbiAgICAgIGV4cGxhbmF0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBJbnRlcnZhbCBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEludGVydmFsRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgICBpbnZhbGlkOiBpbnZhbGlkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGFuIGVuZCBEYXRlVGltZS4gSW5jbHVzaXZlIG9mIHRoZSBzdGFydCBidXQgbm90IHRoZSBlbmQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIDtcblxuICBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzID0gZnVuY3Rpb24gZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKSB7XG4gICAgdmFyIGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgICAgYnVpbHRFbmQgPSBmcmllbmRseURhdGVUaW1lKGVuZCk7XG4gICAgdmFyIHZhbGlkYXRlRXJyb3IgPSB2YWxpZGF0ZVN0YXJ0RW5kKGJ1aWx0U3RhcnQsIGJ1aWx0RW5kKTtcblxuICAgIGlmICh2YWxpZGF0ZUVycm9yID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgICBzdGFydDogYnVpbHRTdGFydCxcbiAgICAgICAgZW5kOiBidWlsdEVuZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbC5cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICA7XG5cbiAgSW50ZXJ2YWwuYWZ0ZXIgPSBmdW5jdGlvbiBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGFuIGVuZCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgYmFja3dhcmRzIHRvLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIDtcblxuICBJbnRlcnZhbC5iZWZvcmUgPSBmdW5jdGlvbiBiZWZvcmUoZW5kLCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKGVuZCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQubWludXMoZHVyKSwgZHQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBJU08gODYwMSBzdHJpbmcuXG4gICAqIEFjY2VwdHMgYDxzdGFydD4vPGVuZD5gLCBgPHN0YXJ0Pi88ZHVyYXRpb24+YCwgYW5kIGA8ZHVyYXRpb24+LzxlbmQ+YCBmb3JtYXRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBvcHRpb25zIHRvIHBhc3Mge0BsaW5rIERhdGVUaW1lLmZyb21JU099IGFuZCBvcHRpb25hbGx5IHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfVxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgO1xuXG4gIEludGVydmFsLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3NwbGl0ID0gKHRleHQgfHwgXCJcIikuc3BsaXQoXCIvXCIsIDIpLFxuICAgICAgICBzID0gX3NwbGl0WzBdLFxuICAgICAgICBlID0gX3NwbGl0WzFdO1xuXG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgdmFyIHN0YXJ0LCBzdGFydElzVmFsaWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXJ0ID0gRGF0ZVRpbWUuZnJvbUlTTyhzLCBvcHRzKTtcbiAgICAgICAgc3RhcnRJc1ZhbGlkID0gc3RhcnQuaXNWYWxpZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3RhcnRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbmQsIGVuZElzVmFsaWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVuZCA9IERhdGVUaW1lLmZyb21JU08oZSwgb3B0cyk7XG4gICAgICAgIGVuZElzVmFsaWQgPSBlbmQuaXNWYWxpZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnRJc1ZhbGlkICYmIGVuZElzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQpIHtcbiAgICAgICAgdmFyIGR1ciA9IER1cmF0aW9uLmZyb21JU08oZSwgb3B0cyk7XG5cbiAgICAgICAgaWYgKGR1ci5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIEludGVydmFsLmFmdGVyKHN0YXJ0LCBkdXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZElzVmFsaWQpIHtcbiAgICAgICAgdmFyIF9kdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuXG4gICAgICAgIGlmIChfZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgX2R1cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFcIik7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhbiBJbnRlcnZhbC4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIEludGVydmFsLmlzSW50ZXJ2YWwgPSBmdW5jdGlvbiBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gbyAmJiBvLmlzTHV4b25JbnRlcnZhbCB8fCBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXG4gICAqIEB0eXBlIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICB2YXIgX3Byb3RvID0gSW50ZXJ2YWwucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIF9wcm90by5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIGxlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY291bnQgPSBmdW5jdGlvbiBjb3VudCh1bml0KSB7XG4gICAgaWYgKHVuaXQgPT09IHZvaWQgMCkge1xuICAgICAgdW5pdCA9IFwibWlsbGlzZWNvbmRzXCI7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5zdGFydC5zdGFydE9mKHVuaXQpLFxuICAgICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBhbmQgZW5kIGFyZSBib3RoIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUodW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmUubWludXMoMSkuaGFzU2FtZSh0aGlzLnMsIHVuaXQpIDogZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgRGF0ZVRpbWVzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLnZhbHVlT2YoKSA9PT0gdGhpcy5lLnZhbHVlT2YoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmlzQWZ0ZXIgPSBmdW5jdGlvbiBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmlzQmVmb3JlID0gZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmUgPD0gZGF0ZVRpbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucyA8PSBkYXRlVGltZSAmJiB0aGlzLmUgPiBkYXRlVGltZTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIHRoZSB2YWx1ZXMgdG8gc2V0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcbiAgICogQHBhcmFtIHsuLi5bRGF0ZVRpbWVdfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIHNvcnRlZCA9IGRhdGVUaW1lcy5tYXAoZnJpZW5kbHlEYXRlVGltZSkuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gX3RoaXMuY29udGFpbnMoZCk7XG4gICAgfSkuc29ydCgpLFxuICAgICAgICByZXN1bHRzID0gW107XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIHZhciBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnNwbGl0QnkgPSBmdW5jdGlvbiBzcGxpdEJ5KGR1cmF0aW9uKSB7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgICBpZHggPSAxLFxuICAgICAgICBuZXh0O1xuICAgIHZhciByZXN1bHRzID0gW107XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgdmFyIGFkZGVkID0gdGhpcy5zdGFydC5wbHVzKGR1ci5tYXBVbml0cyhmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geCAqIGlkeDtcbiAgICAgIH0pKTtcbiAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGlkeCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kaXZpZGVFcXVhbGx5ID0gZnVuY3Rpb24gZGl2aWRlRXF1YWxseShudW1iZXJPZlBhcnRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEJ5KHRoaXMubGVuZ3RoKCkgLyBudW1iZXJPZlBhcnRzKS5zbGljZSgwLCBudW1iZXJPZlBhcnRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub3ZlcmxhcHMgPSBmdW5jdGlvbiBvdmVybGFwcyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmUgPiBvdGhlci5zICYmIHRoaXMucyA8IG90aGVyLmU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWJ1dHNFbmQgPSBmdW5jdGlvbiBhYnV0c0VuZChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICtvdGhlci5lID09PSArdGhpcy5zO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZW5ndWxmcyA9IGZ1bmN0aW9uIGVuZ3VsZnMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gb3RoZXIucyAmJiB0aGlzLmUgPj0gb3RoZXIuZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA8IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuXG4gICAgaWYgKHMgPj0gZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVuaW9uID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPCBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9XG4gIC8qKlxuICAgKiBNZXJnZSBhbiBhcnJheSBvZiBJbnRlcnZhbHMgaW50byBhIGVxdWl2YWxlbnQgbWluaW1hbCBzZXQgb2YgSW50ZXJ2YWxzLlxuICAgKiBDb21iaW5lcyBvdmVybGFwcGluZyBhbmQgYWRqYWNlbnQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cbiAgO1xuXG4gIEludGVydmFsLm1lcmdlID0gZnVuY3Rpb24gbWVyZ2UoaW50ZXJ2YWxzKSB7XG4gICAgdmFyIF9pbnRlcnZhbHMkc29ydCRyZWR1YyA9IGludGVydmFscy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5zIC0gYi5zO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoX3JlZjIsIGl0ZW0pIHtcbiAgICAgIHZhciBzb2ZhciA9IF9yZWYyWzBdLFxuICAgICAgICAgIGN1cnJlbnQgPSBfcmVmMlsxXTtcblxuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Lm92ZXJsYXBzKGl0ZW0pIHx8IGN1cnJlbnQuYWJ1dHNTdGFydChpdGVtKSkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBjdXJyZW50LnVuaW9uKGl0ZW0pXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc29mYXIuY29uY2F0KFtjdXJyZW50XSksIGl0ZW1dO1xuICAgICAgfVxuICAgIH0sIFtbXSwgbnVsbF0pLFxuICAgICAgICBmb3VuZCA9IF9pbnRlcnZhbHMkc29ydCRyZWR1Y1swXSxcbiAgICAgICAgZmluYWwgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMV07XG5cbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGZvdW5kLnB1c2goZmluYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIEludGVydmFscyByZXByZXNlbnRpbmcgdGhlIHNwYW5zIG9mIHRpbWUgdGhhdCBvbmx5IGFwcGVhciBpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XG4gICAqL1xuICA7XG5cbiAgSW50ZXJ2YWwueG9yID0gZnVuY3Rpb24geG9yKGludGVydmFscykge1xuICAgIHZhciBfQXJyYXkkcHJvdG90eXBlO1xuXG4gICAgdmFyIHN0YXJ0ID0gbnVsbCxcbiAgICAgICAgY3VycmVudENvdW50ID0gMDtcblxuICAgIHZhciByZXN1bHRzID0gW10sXG4gICAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGltZTogaS5zLFxuICAgICAgICB0eXBlOiBcInNcIlxuICAgICAgfSwge1xuICAgICAgICB0aW1lOiBpLmUsXG4gICAgICAgIHR5cGU6IFwiZVwiXG4gICAgICB9XTtcbiAgICB9KSxcbiAgICAgICAgZmxhdHRlbmVkID0gKF9BcnJheSRwcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGUpLmNvbmNhdC5hcHBseShfQXJyYXkkcHJvdG90eXBlLCBlbmRzKSxcbiAgICAgICAgYXJyID0gZmxhdHRlbmVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnRpbWUgLSBiLnRpbWU7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKGFyciksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgaSA9IF9zdGVwLnZhbHVlO1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7Li4uSW50ZXJ2YWx9IGludGVydmFsc1xuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgaW50ZXJ2YWxzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBpbnRlcnZhbHNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSkubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gX3RoaXMyLmludGVyc2VjdGlvbihpKTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpICYmICFpLmlzRW1wdHkoKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJbXCIgKyB0aGlzLnMudG9JU08oKSArIFwiIFxcdTIwMTMgXCIgKyB0aGlzLmUudG9JU08oKSArIFwiKVwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbC5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSVNPID0gZnVuY3Rpb24gdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiB0aGlzLnMudG9JU08ob3B0cykgKyBcIi9cIiArIHRoaXMuZS50b0lTTyhvcHRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRhdGUgb2YgdGhpcyBJbnRlcnZhbC5cbiAgICogVGhlIHRpbWUgY29tcG9uZW50cyBhcmUgaWdub3JlZC5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPRGF0ZSgpICsgXCIvXCIgKyB0aGlzLmUudG9JU09EYXRlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZS50b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0lTT1RpbWUgPSBmdW5jdGlvbiB0b0lTT1RpbWUob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiB0aGlzLnMudG9JU09UaW1lKG9wdHMpICsgXCIvXCIgKyB0aGlzLmUudG9JU09UaW1lKG9wdHMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlRm9ybWF0IC0gdGhlIGZvcm1hdCBzdHJpbmcuIFRoaXMgc3RyaW5nIGZvcm1hdHMgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZS4gU2VlIHtAbGluayBEYXRlVGltZS50b0Zvcm1hdH0gZm9yIGRldGFpbHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gICcg4oCTICddIC0gYSBzZXBhcmF0b3IgdG8gcGxhY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByZXByZXNlbnRhdGlvbnNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQsIF90ZW1wMikge1xuICAgIHZhciBfcmVmMyA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDIsXG4gICAgICAgIF9yZWYzJHNlcGFyYXRvciA9IF9yZWYzLnNlcGFyYXRvcixcbiAgICAgICAgc2VwYXJhdG9yID0gX3JlZjMkc2VwYXJhdG9yID09PSB2b2lkIDAgPyBcIiDigJMgXCIgOiBfcmVmMyRzZXBhcmF0b3I7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJcIiArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGEgRHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNwYW5uZWQgYnkgdGhpcyBpbnRlcnZhbC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbigpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogODg0ODkyNTcgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdkYXlzJykudG9PYmplY3QoKSAvLz0+IHsgZGF5czogMS4wMjQxODEyMTUyNzc3Nzc4IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNC44MjA5NSB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNCwgc2Vjb25kczogNDkuMjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignc2Vjb25kcycpLnRvT2JqZWN0KCkgLy89PiB7IHNlY29uZHM6IDg4NDg5LjI1NyB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0R1cmF0aW9uID0gZnVuY3Rpb24gdG9EdXJhdGlvbih1bml0LCBvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKHRoaXMuaW52YWxpZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZS5kaWZmKHRoaXMucywgdW5pdCwgb3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBtYXBGbiBvbiB0aGUgaW50ZXJ2YWwgc3RhcnQgYW5kIGVuZCwgcmV0dXJuaW5nIGEgbmV3IEludGVydmFsIGZyb20gdGhlIHJlc3VsdGluZyBEYXRlVGltZXNcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWFwRm5cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLm1hcEVuZHBvaW50cyhlbmRwb2ludCA9PiBlbmRwb2ludC50b1VUQygpKVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQucGx1cyh7IGhvdXJzOiAyIH0pKVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5tYXBFbmRwb2ludHMgPSBmdW5jdGlvbiBtYXBFbmRwb2ludHMobWFwRm4pIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhtYXBGbih0aGlzLnMpLCBtYXBGbih0aGlzLmUpKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJ2YWwsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgICAqIEB0eXBlIHtEYXRlVGltZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW50ZXJ2YWw7XG59KCk7XG5cbi8qKlxuICogVGhlIEluZm8gY2xhc3MgY29udGFpbnMgc3RhdGljIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgZ2VuZXJhbCB0aW1lIGFuZCBkYXRlIHJlbGF0ZWQgZGF0YS4gRm9yIGV4YW1wbGUsIGl0IGhhcyBtZXRob2RzIGZvciBmaW5kaW5nIG91dCBpZiBhIHRpbWUgem9uZSBoYXMgYSBEU1QsIGZvciBsaXN0aW5nIHRoZSBtb250aHMgaW4gYW55IHN1cHBvcnRlZCBsb2NhbGUsIGFuZCBmb3IgZGlzY292ZXJpbmcgd2hpY2ggb2YgTHV4b24gZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAqL1xuXG52YXIgSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEluZm8oKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgY29udGFpbnMgYSBEU1QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gWm9uZSB0byBjaGVjay4gRGVmYXVsdHMgdG8gdGhlIGVudmlyb25tZW50J3MgbG9jYWwgem9uZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIEluZm8uaGFzRFNUID0gZnVuY3Rpb24gaGFzRFNUKHpvbmUpIHtcbiAgICBpZiAoem9uZSA9PT0gdm9pZCAwKSB7XG4gICAgICB6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubm93KCkuc2V0Wm9uZSh6b25lKS5zZXQoe1xuICAgICAgbW9udGg6IDEyXG4gICAgfSk7XG4gICAgcmV0dXJuICF6b25lLnVuaXZlcnNhbCAmJiBwcm90by5vZmZzZXQgIT09IHByb3RvLnNldCh7XG4gICAgICBtb250aDogNlxuICAgIH0pLm9mZnNldDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGlzIGEgdmFsaWQgSUFOQSBzcGVjaWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB6b25lIC0gWm9uZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIEluZm8uaXNWYWxpZElBTkFab25lID0gZnVuY3Rpb24gaXNWYWxpZElBTkFab25lKHpvbmUpIHtcbiAgICByZXR1cm4gSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcih6b25lKSAmJiBJQU5BWm9uZS5pc1ZhbGlkWm9uZSh6b25lKTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGlucHV0IGludG8gYSB7QGxpbmsgWm9uZX0gaW5zdGFuY2UuXG4gICAqXG4gICAqICogSWYgYGlucHV0YCBpcyBhbHJlYWR5IGEgWm9uZSBpbnN0YW5jZSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYSBzdHJpbmcgY29udGFpbmluZyBhIHZhbGlkIHRpbWUgem9uZSBuYW1lLCBhIFpvbmUgaW5zdGFuY2VcbiAgICogICB3aXRoIHRoYXQgbmFtZSBpcyByZXR1cm5lZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIHRoYXQgZG9lc24ndCByZWZlciB0byBhIGtub3duIHRpbWUgem9uZSwgYSBab25lXG4gICAqICAgaW5zdGFuY2Ugd2l0aCB7QGxpbmsgWm9uZS5pc1ZhbGlkfSA9PSBmYWxzZSBpcyByZXR1cm5lZC5cbiAgICogKiBJZiBgaW5wdXQgaXMgYSBudW1iZXIsIGEgWm9uZSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZml4ZWQgb2Zmc2V0XG4gICAqICAgaW4gbWludXRlcyBpcyByZXR1cm5lZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgdGhlIGRlZmF1bHQgem9uZSBpcyByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZXxudW1iZXJ9IFtpbnB1dF0gLSB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkXG4gICAqIEByZXR1cm4ge1pvbmV9XG4gICAqL1xuICA7XG5cbiAgSW5mby5ub3JtYWxpemVab25lID0gZnVuY3Rpb24gbm9ybWFsaXplWm9uZSQxKGlucHV0KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVpvbmUoaW5wdXQsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgbW9udGggbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NPYmo9bnVsbF0gLSBhbiBleGlzdGluZyBsb2NhbGUgb2JqZWN0IHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygpWzBdIC8vPT4gJ0phbnVhcnknXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcpWzBdIC8vPT4gJ0phbidcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnKVswXSAvLz0+ICcxJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9IClbMF0gLy89PiAnamFudi4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2aEnXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdsb25nJywgeyBvdXRwdXRDYWxlbmRhcjogJ2lzbGFtaWMnIH0pWzBdIC8vPT4gJ1JhYmnKuyBJJ1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG4gIDtcblxuICBJbmZvLm1vbnRocyA9IGZ1bmN0aW9uIG1vbnRocyhsZW5ndGgsIF90ZW1wKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmJGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkbG9jYWxlLFxuICAgICAgICBfcmVmJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmJGxvY09iaiA9IF9yZWYubG9jT2JqLFxuICAgICAgICBsb2NPYmogPSBfcmVmJGxvY09iaiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkbG9jT2JqLFxuICAgICAgICBfcmVmJG91dHB1dENhbGVuZGFyID0gX3JlZi5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmJG91dHB1dENhbGVuZGFyID09PSB2b2lkIDAgPyBcImdyZWdvcnlcIiA6IF9yZWYkb3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IG1vbnRoIG5hbWVzLlxuICAgKiBGb3JtYXQgbW9udGhzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgbW9udGhzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byB0aGUgZGF5IG9mIHRoZSBtb250aC4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIG1vbnRoc31cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NPYmo9bnVsbF0gLSBhbiBleGlzdGluZyBsb2NhbGUgb2JqZWN0IHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG4gIDtcblxuICBJbmZvLm1vbnRoc0Zvcm1hdCA9IGZ1bmN0aW9uIG1vbnRoc0Zvcm1hdChsZW5ndGgsIF90ZW1wMikge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYyID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMixcbiAgICAgICAgX3JlZjIkbG9jYWxlID0gX3JlZjIubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRsb2NhbGUsXG4gICAgICAgIF9yZWYyJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYyLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIkbnVtYmVyaW5nU3lzdGVtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjIkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmMiRsb2NPYmogPSBfcmVmMi5sb2NPYmosXG4gICAgICAgIGxvY09iaiA9IF9yZWYyJGxvY09iaiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJGxvY09iaixcbiAgICAgICAgX3JlZjIkb3V0cHV0Q2FsZW5kYXIgPSBfcmVmMi5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmMiRvdXRwdXRDYWxlbmRhciA9PT0gdm9pZCAwID8gXCJncmVnb3J5XCIgOiBfcmVmMiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKSkubW9udGhzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIHdlZWsgbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIHdlZWtkYXkgcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygpWzBdIC8vPT4gJ01vbmRheSdcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSlbMF0gLy89PiAnbHVuLidcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfYp9mE2KfYq9mG2YrZhidcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuICA7XG5cbiAgSW5mby53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCwgX3RlbXAzKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjMgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmMyRsb2NhbGUgPSBfcmVmMy5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYzJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJGxvY2FsZSxcbiAgICAgICAgX3JlZjMkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMyRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYzJGxvY09iaiA9IF9yZWYzLmxvY09iaixcbiAgICAgICAgbG9jT2JqID0gX3JlZjMkbG9jT2JqID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkbG9jT2JqO1xuXG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIHdlZWtkYXlzfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgd2Vla2RheSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cbiAgO1xuXG4gIEluZm8ud2Vla2RheXNGb3JtYXQgPSBmdW5jdGlvbiB3ZWVrZGF5c0Zvcm1hdChsZW5ndGgsIF90ZW1wNCkge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWY0ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgX3JlZjQkbG9jYWxlID0gX3JlZjQubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNCRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNCRsb2NhbGUsXG4gICAgICAgIF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQkbnVtYmVyaW5nU3lzdGVtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjQkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmNCRsb2NPYmogPSBfcmVmNC5sb2NPYmosXG4gICAgICAgIGxvY09iaiA9IF9yZWY0JGxvY09iaiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JGxvY09iajtcblxuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgsIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWVyaWRpZW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoKSAvLz0+IFsgJ0FNJywgJ1BNJyBdXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKHsgbG9jYWxlOiAnbXknIH0pIC8vPT4gWyAn4YCU4YC24YCU4YCA4YC6JywgJ+GAiuGAlOGAsScgXVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG4gIDtcblxuICBJbmZvLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyhfdGVtcDUpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDUgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA1LFxuICAgICAgICBfcmVmNSRsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY1JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY1JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSkubWVyaWRpZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuICA7XG5cbiAgSW5mby5lcmFzID0gZnVuY3Rpb24gZXJhcyhsZW5ndGgsIF90ZW1wNikge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJzaG9ydFwiO1xuICAgIH1cblxuICAgIHZhciBfcmVmNiA9IF90ZW1wNiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDYsXG4gICAgICAgIF9yZWY2JGxvY2FsZSA9IF9yZWY2LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjYkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjYkbG9jYWxlO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudWxsLCBcImdyZWdvcnlcIikuZXJhcyhsZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMgaW4gdGhpcyBlbnZpcm9ubWVudC5cbiAgICogU29tZSBmZWF0dXJlcyBvZiBMdXhvbiBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgb24gb2xkZXIgYnJvd3NlcnMsIHRpbWV6b25lIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiB0aGF0J3MgdGhlIGNhc2UuXG4gICAqIEtleXM6XG4gICAqICogYHpvbmVzYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIElBTkEgdGltZXpvbmVzXG4gICAqICogYGludGxUb2tlbnNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6ZWQgdG9rZW4tYmFzZWQgZm9ybWF0dGluZy9wYXJzaW5nXG4gICAqICogYGludGxgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgZ2VuZXJhbCBpbnRlcm5hdGlvbmFsaXphdGlvblxuICAgKiAqIGByZWxhdGl2ZWA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmdcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUsIHJlbGF0aXZlOiBmYWxzZSB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIDtcblxuICBJbmZvLmZlYXR1cmVzID0gZnVuY3Rpb24gZmVhdHVyZXMoKSB7XG4gICAgdmFyIGludGwgPSBmYWxzZSxcbiAgICAgICAgaW50bFRva2VucyA9IGZhbHNlLFxuICAgICAgICB6b25lcyA9IGZhbHNlLFxuICAgICAgICByZWxhdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgaW50bCA9IHRydWU7XG4gICAgICBpbnRsVG9rZW5zID0gaGFzRm9ybWF0VG9QYXJ0cygpO1xuICAgICAgcmVsYXRpdmUgPSBoYXNSZWxhdGl2ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB6b25lcyA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICAgIHRpbWVab25lOiBcIkFtZXJpY2EvTmV3X1lvcmtcIlxuICAgICAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSA9PT0gXCJBbWVyaWNhL05ld19Zb3JrXCI7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHpvbmVzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGludGw6IGludGwsXG4gICAgICBpbnRsVG9rZW5zOiBpbnRsVG9rZW5zLFxuICAgICAgem9uZXM6IHpvbmVzLFxuICAgICAgcmVsYXRpdmU6IHJlbGF0aXZlXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICB2YXIgdXRjRGF5U3RhcnQgPSBmdW5jdGlvbiB1dGNEYXlTdGFydChkdCkge1xuICAgIHJldHVybiBkdC50b1VUQygwLCB7XG4gICAgICBrZWVwTG9jYWxUaW1lOiB0cnVlXG4gICAgfSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCk7XG4gIH0sXG4gICAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuXG4gIHJldHVybiBNYXRoLmZsb29yKER1cmF0aW9uLmZyb21NaWxsaXMobXMpLmFzKFwiZGF5c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIHZhciBkaWZmZXJzID0gW1tcInllYXJzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIueWVhciAtIGEueWVhcjtcbiAgfV0sIFtcInF1YXJ0ZXJzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIucXVhcnRlciAtIGEucXVhcnRlcjtcbiAgfV0sIFtcIm1vbnRoc1wiLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLm1vbnRoIC0gYS5tb250aCArIChiLnllYXIgLSBhLnllYXIpICogMTI7XG4gIH1dLCBbXCJ3ZWVrc1wiLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICByZXR1cm4gKGRheXMgLSBkYXlzICUgNykgLyA3O1xuICB9XSwgW1wiZGF5c1wiLCBkYXlEaWZmXV07XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBsb3dlc3RPcmRlciwgaGlnaFdhdGVyO1xuXG4gIGZvciAodmFyIF9pID0gMCwgX2RpZmZlcnMgPSBkaWZmZXJzOyBfaSA8IF9kaWZmZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZGlmZmVycyRfaSA9IF9kaWZmZXJzW19pXSxcbiAgICAgICAgdW5pdCA9IF9kaWZmZXJzJF9pWzBdLFxuICAgICAgICBkaWZmZXIgPSBfZGlmZmVycyRfaVsxXTtcblxuICAgIGlmICh1bml0cy5pbmRleE9mKHVuaXQpID49IDApIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXM7XG5cbiAgICAgIGxvd2VzdE9yZGVyID0gdW5pdDtcbiAgICAgIHZhciBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKChfY3Vyc29yJHBsdXMgPSB7fSwgX2N1cnNvciRwbHVzW3VuaXRdID0gZGVsdGEsIF9jdXJzb3IkcGx1cykpO1xuXG4gICAgICBpZiAoaGlnaFdhdGVyID4gbGF0ZXIpIHtcbiAgICAgICAgdmFyIF9jdXJzb3IkcGx1czI7XG5cbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1czIgPSB7fSwgX2N1cnNvciRwbHVzMlt1bml0XSA9IGRlbHRhIC0gMSwgX2N1cnNvciRwbHVzMikpO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcbiAgdmFyIGxvd2VyT3JkZXJVbml0cyA9IHVuaXRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgIHJldHVybiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMzO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMyA9IHt9LCBfY3Vyc29yJHBsdXMzW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czMpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgbnVtYmVyaW5nU3lzdGVtcyA9IHtcbiAgYXJhYjogXCJbXFx1MDY2MC1cXHUwNjY5XVwiLFxuICBhcmFiZXh0OiBcIltcXHUwNkYwLVxcdTA2RjldXCIsXG4gIGJhbGk6IFwiW1xcdTFCNTAtXFx1MUI1OV1cIixcbiAgYmVuZzogXCJbXFx1MDlFNi1cXHUwOUVGXVwiLFxuICBkZXZhOiBcIltcXHUwOTY2LVxcdTA5NkZdXCIsXG4gIGZ1bGx3aWRlOiBcIltcXHVGRjEwLVxcdUZGMTldXCIsXG4gIGd1anI6IFwiW1xcdTBBRTYtXFx1MEFFRl1cIixcbiAgaGFuaWRlYzogXCJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXVwiLFxuICBraG1yOiBcIltcXHUxN0UwLVxcdTE3RTldXCIsXG4gIGtuZGE6IFwiW1xcdTBDRTYtXFx1MENFRl1cIixcbiAgbGFvbzogXCJbXFx1MEVEMC1cXHUwRUQ5XVwiLFxuICBsaW1iOiBcIltcXHUxOTQ2LVxcdTE5NEZdXCIsXG4gIG1seW06IFwiW1xcdTBENjYtXFx1MEQ2Rl1cIixcbiAgbW9uZzogXCJbXFx1MTgxMC1cXHUxODE5XVwiLFxuICBteW1yOiBcIltcXHUxMDQwLVxcdTEwNDldXCIsXG4gIG9yeWE6IFwiW1xcdTBCNjYtXFx1MEI2Rl1cIixcbiAgdGFtbGRlYzogXCJbXFx1MEJFNi1cXHUwQkVGXVwiLFxuICB0ZWx1OiBcIltcXHUwQzY2LVxcdTBDNkZdXCIsXG4gIHRoYWk6IFwiW1xcdTBFNTAtXFx1MEU1OV1cIixcbiAgdGlidDogXCJbXFx1MEYyMC1cXHUwRjI5XVwiLFxuICBsYXRuOiBcIlxcXFxkXCJcbn07XG52YXIgbnVtYmVyaW5nU3lzdGVtc1VURjE2ID0ge1xuICBhcmFiOiBbMTYzMiwgMTY0MV0sXG4gIGFyYWJleHQ6IFsxNzc2LCAxNzg1XSxcbiAgYmFsaTogWzY5OTIsIDcwMDFdLFxuICBiZW5nOiBbMjUzNCwgMjU0M10sXG4gIGRldmE6IFsyNDA2LCAyNDE1XSxcbiAgZnVsbHdpZGU6IFs2NTI5NiwgNjUzMDNdLFxuICBndWpyOiBbMjc5MCwgMjc5OV0sXG4gIGtobXI6IFs2MTEyLCA2MTIxXSxcbiAga25kYTogWzMzMDIsIDMzMTFdLFxuICBsYW9vOiBbMzc5MiwgMzgwMV0sXG4gIGxpbWI6IFs2NDcwLCA2NDc5XSxcbiAgbWx5bTogWzM0MzAsIDM0MzldLFxuICBtb25nOiBbNjE2MCwgNjE2OV0sXG4gIG15bXI6IFs0MTYwLCA0MTY5XSxcbiAgb3J5YTogWzI5MTgsIDI5MjddLFxuICB0YW1sZGVjOiBbMzA0NiwgMzA1NV0sXG4gIHRlbHU6IFszMTc0LCAzMTgzXSxcbiAgdGhhaTogWzM2NjQsIDM2NzNdLFxuICB0aWJ0OiBbMzg3MiwgMzg4MV1cbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuXG52YXIgaGFuaWRlY0NoYXJzID0gbnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjLnJlcGxhY2UoL1tcXFt8XFxdXS9nLCBcIlwiKS5zcGxpdChcIlwiKTtcbmZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cikge1xuICB2YXIgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcblxuICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgdmFsdWUgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgIGlmIChzdHJbaV0uc2VhcmNoKG51bWJlcmluZ1N5c3RlbXMuaGFuaWRlYykgIT09IC0xKSB7XG4gICAgICAgIHZhbHVlICs9IGhhbmlkZWNDaGFycy5pbmRleE9mKHN0cltpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgdmFyIF9udW1iZXJpbmdTeXN0ZW1zVVRGID0gbnVtYmVyaW5nU3lzdGVtc1VURjE2W2tleV0sXG4gICAgICAgICAgICAgIG1pbiA9IF9udW1iZXJpbmdTeXN0ZW1zVVRGWzBdLFxuICAgICAgICAgICAgICBtYXggPSBfbnVtYmVyaW5nU3lzdGVtc1VURlsxXTtcblxuICAgICAgICAgIGlmIChjb2RlID49IG1pbiAmJiBjb2RlIDw9IG1heCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gY29kZSAtIG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZ2l0UmVnZXgoX3JlZiwgYXBwZW5kKSB7XG4gIHZhciBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbTtcblxuICBpZiAoYXBwZW5kID09PSB2b2lkIDApIHtcbiAgICBhcHBlbmQgPSBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAoXCJcIiArIG51bWJlcmluZ1N5c3RlbXNbbnVtYmVyaW5nU3lzdGVtIHx8IFwibGF0blwiXSArIGFwcGVuZCk7XG59XG5cbnZhciBNSVNTSU5HX0ZUUCA9IFwibWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpbnRVbml0KHJlZ2V4LCBwb3N0KSB7XG4gIGlmIChwb3N0ID09PSB2b2lkIDApIHtcbiAgICBwb3N0ID0gZnVuY3Rpb24gcG9zdChpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZWdleDogcmVnZXgsXG4gICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYpIHtcbiAgICAgIHZhciBzID0gX3JlZlswXTtcbiAgICAgIHJldHVybiBwb3N0KHBhcnNlRGlnaXRzKHMpKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBOQlNQID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xudmFyIHNwYWNlT3JOQlNQID0gXCIoIHxcIiArIE5CU1AgKyBcIilcIjtcbnZhciBzcGFjZU9yTkJTUFJlZ0V4cCA9IG5ldyBSZWdFeHAoc3BhY2VPck5CU1AsIFwiZ1wiKTtcblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIC8vIG1ha2Ugc3BhY2UgYW5kIG5vbiBicmVha2FibGUgc3BhY2UgY2hhcmFjdGVycyBpbnRlcmNoYW5nZWFibGVcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuL2csIFwiXFxcXC4/XCIpLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIHNwYWNlT3JOQlNQKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXC4vZywgXCJcIikgLy8gaWdub3JlIGRvdHMgdGhhdCB3ZXJlIG1hZGUgb3B0aW9uYWxcbiAgLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIFwiIFwiKSAvLyBpbnRlcmNoYW5nZSBzcGFjZSBhbmQgbmJzcFxuICAudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbihcInxcIikpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYyKSB7XG4gICAgICAgIHZhciBzID0gX3JlZjJbMF07XG4gICAgICAgIHJldHVybiBzdHJpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSk7XG4gICAgICAgIH0pICsgc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldChyZWdleCwgZ3JvdXBzKSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sXG4gICAgZ3JvdXBzOiBncm91cHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlVG9rZW4odmFsdWUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXFwtXFxbXFxde30oKSorPy4sXFxcXFxcXiR8I1xcc10vZywgXCJcXFxcJCZcIik7XG59XG5cbmZ1bmN0aW9uIHVuaXRGb3JUb2tlbih0b2tlbiwgbG9jKSB7XG4gIHZhciBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgICB0d28gPSBkaWdpdFJlZ2V4KGxvYywgXCJ7Mn1cIiksXG4gICAgICB0aHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInszfVwiKSxcbiAgICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgICBzaXggPSBkaWdpdFJlZ2V4KGxvYywgXCJ7Nn1cIiksXG4gICAgICBvbmVPclR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDJ9XCIpLFxuICAgICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgICAgb25lVG9TaXggPSBkaWdpdFJlZ2V4KGxvYywgXCJ7MSw2fVwiKSxcbiAgICAgIG9uZVRvTmluZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDl9XCIpLFxuICAgICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgICBmb3VyVG9TaXggPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NCw2fVwiKSxcbiAgICAgIGxpdGVyYWwgPSBmdW5jdGlvbiBsaXRlcmFsKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChlc2NhcGVUb2tlbih0LnZhbCkpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWY1KSB7XG4gICAgICAgIHZhciBzID0gX3JlZjVbMF07XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfSxcbiAgICAgIGxpdGVyYWw6IHRydWVcbiAgICB9O1xuICB9LFxuICAgICAgdW5pdGF0ZSA9IGZ1bmN0aW9uIHVuaXRhdGUodCkge1xuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAvLyBlcmFcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcInNob3J0XCIsIGZhbHNlKSwgMCk7XG5cbiAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJsb25nXCIsIGZhbHNlKSwgMCk7XG4gICAgICAvLyB5ZWFyc1xuXG4gICAgICBjYXNlIFwieVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1NpeCk7XG5cbiAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcblxuICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyVG9TaXgpO1xuXG4gICAgICBjYXNlIFwieXl5eXl5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHNpeCk7XG4gICAgICAvLyBtb250aHNcblxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIHRydWUsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIGRhdGVzXG5cbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyBvcmRpbmFsc1xuXG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcblxuICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG5cbiAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInNzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuXG4gICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcblxuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZShvbmVUb05pbmUpO1xuICAgICAgLy8gbWVyaWRpZW1cblxuICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAvLyB3ZWVrWWVhciAoaylcblxuICAgICAgY2FzZSBcImtra2tcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG5cbiAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgIC8vIHdlZWtOdW1iZXIgKFcpXG5cbiAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIldXXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyB3ZWVrZGF5c1xuXG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcblxuICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgLy8gb2Zmc2V0L3pvbmVcblxuICAgICAgY2FzZSBcIlpcIjpcbiAgICAgIGNhc2UgXCJaWlwiOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KG5ldyBSZWdFeHAoXCIoWystXVwiICsgb25lT3JUd28uc291cmNlICsgXCIpKD86OihcIiArIHR3by5zb3VyY2UgKyBcIikpP1wiKSwgMik7XG5cbiAgICAgIGNhc2UgXCJaWlpcIjpcbiAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKFwiKFsrLV1cIiArIG9uZU9yVHdvLnNvdXJjZSArIFwiKShcIiArIHR3by5zb3VyY2UgKyBcIik/XCIpLCAyKTtcbiAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgWlpaWiAoUFNUKSBvciBaWlpaWiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKSBpbiBwYXJzaW5nXG4gICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcblxuICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvW2Etel8rLS9dezEsMjU2fT8vaSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdW5pdCA9IHVuaXRhdGUodG9rZW4pIHx8IHtcbiAgICBpbnZhbGlkUmVhc29uOiBNSVNTSU5HX0ZUUFxuICB9O1xuICB1bml0LnRva2VuID0gdG9rZW47XG4gIHJldHVybiB1bml0O1xufVxuXG52YXIgcGFydFR5cGVTdHlsZVRvVG9rZW5WYWwgPSB7XG4gIHllYXI6IHtcbiAgICBcIjItZGlnaXRcIjogXCJ5eVwiLFxuICAgIG51bWVyaWM6IFwieXl5eXlcIlxuICB9LFxuICBtb250aDoge1xuICAgIG51bWVyaWM6IFwiTVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIk1NXCIsXG4gICAgc2hvcnQ6IFwiTU1NXCIsXG4gICAgbG9uZzogXCJNTU1NXCJcbiAgfSxcbiAgZGF5OiB7XG4gICAgbnVtZXJpYzogXCJkXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiZGRcIlxuICB9LFxuICB3ZWVrZGF5OiB7XG4gICAgc2hvcnQ6IFwiRUVFXCIsXG4gICAgbG9uZzogXCJFRUVFXCJcbiAgfSxcbiAgZGF5cGVyaW9kOiBcImFcIixcbiAgZGF5UGVyaW9kOiBcImFcIixcbiAgaG91cjoge1xuICAgIG51bWVyaWM6IFwiaFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImhoXCJcbiAgfSxcbiAgbWludXRlOiB7XG4gICAgbnVtZXJpYzogXCJtXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwibW1cIlxuICB9LFxuICBzZWNvbmQ6IHtcbiAgICBudW1lcmljOiBcInNcIixcbiAgICBcIjItZGlnaXRcIjogXCJzc1wiXG4gIH1cbn07XG5cbmZ1bmN0aW9uIHRva2VuRm9yUGFydChwYXJ0LCBsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgdmFyIHR5cGUgPSBwYXJ0LnR5cGUsXG4gICAgICB2YWx1ZSA9IHBhcnQudmFsdWU7XG5cbiAgaWYgKHR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IHRydWUsXG4gICAgICB2YWw6IHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG4gIHZhciB2YWwgPSBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbFt0eXBlXTtcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsOiB2YWxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWdleCh1bml0cykge1xuICB2YXIgcmUgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICByZXR1cm4gdS5yZWdleDtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyBcIihcIiArIHIuc291cmNlICsgXCIpXCI7XG4gIH0sIFwiXCIpO1xuICByZXR1cm4gW1wiXlwiICsgcmUgKyBcIiRcIiwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIHZhciBtYXRjaGVzID0gaW5wdXQubWF0Y2gocmVnZXgpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgdmFyIGFsbCA9IHt9O1xuICAgIHZhciBtYXRjaEluZGV4ID0gMTtcblxuICAgIGZvciAodmFyIGkgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShoYW5kbGVycywgaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcblxuICAgICAgICBpZiAoIWgubGl0ZXJhbCAmJiBoLnRva2VuKSB7XG4gICAgICAgICAgYWxsW2gudG9rZW4udmFsWzBdXSA9IGguZGVzZXIobWF0Y2hlcy5zbGljZShtYXRjaEluZGV4LCBtYXRjaEluZGV4ICsgZ3JvdXBzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcblxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla051bWJlclwiO1xuXG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuXG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gXCJxdWFydGVyXCI7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICB2YXIgem9uZTtcblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICB6b25lID0gbmV3IEZpeGVkT2Zmc2V0Wm9uZShtYXRjaGVzLlopO1xuICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnopKSB7XG4gICAgem9uZSA9IElBTkFab25lLmNyZWF0ZShtYXRjaGVzLnopO1xuICB9IGVsc2Uge1xuICAgIHpvbmUgPSBudWxsO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyhtYXRjaGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGspIHtcbiAgICB2YXIgZiA9IHRvRmllbGQoayk7XG5cbiAgICBpZiAoZikge1xuICAgICAgcltmXSA9IG1hdGNoZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxudmFyIGR1bW15RGF0ZVRpbWVDYWNoZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldER1bW15RGF0ZVRpbWUoKSB7XG4gIGlmICghZHVtbXlEYXRlVGltZUNhY2hlKSB7XG4gICAgZHVtbXlEYXRlVGltZUNhY2hlID0gRGF0ZVRpbWUuZnJvbU1pbGxpcygxNTU1NTU1NTU1NTU1KTtcbiAgfVxuXG4gIHJldHVybiBkdW1teURhdGVUaW1lQ2FjaGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlRXhwYW5kTWFjcm9Ub2tlbih0b2tlbiwgbG9jYWxlKSB7XG4gIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgdmFyIGZvcm1hdE9wdHMgPSBGb3JtYXR0ZXIubWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbi52YWwpO1xuXG4gIGlmICghZm9ybWF0T3B0cykge1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHZhciBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuY3JlYXRlKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIHZhciBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXREYXRlVGltZVBhcnRzKGdldER1bW15RGF0ZVRpbWUoKSk7XG4gIHZhciB0b2tlbnMgPSBwYXJ0cy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gdG9rZW5Gb3JQYXJ0KHAsIGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIH0pO1xuXG4gIGlmICh0b2tlbnMuaW5jbHVkZXModW5kZWZpbmVkKSkge1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZE1hY3JvVG9rZW5zKHRva2VucywgbG9jYWxlKSB7XG4gIHZhciBfQXJyYXkkcHJvdG90eXBlO1xuXG4gIHJldHVybiAoX0FycmF5JHByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSkuY29uY2F0LmFwcGx5KF9BcnJheSRwcm90b3R5cGUsIHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHQsIGxvY2FsZSk7XG4gIH0pKTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gZXhwYW5kTWFjcm9Ub2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksIGxvY2FsZSksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvblxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9idWlsZFJlZ2V4ID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICAgIHJlZ2V4U3RyaW5nID0gX2J1aWxkUmVnZXhbMF0sXG4gICAgICAgIGhhbmRsZXJzID0gX2J1aWxkUmVnZXhbMV0sXG4gICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCBcImlcIiksXG4gICAgICAgIF9tYXRjaCA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgICByYXdNYXRjaGVzID0gX21hdGNoWzBdLFxuICAgICAgICBtYXRjaGVzID0gX21hdGNoWzFdLFxuICAgICAgICBfcmVmNiA9IG1hdGNoZXMgPyBkYXRlVGltZUZyb21NYXRjaGVzKG1hdGNoZXMpIDogW251bGwsIG51bGxdLFxuICAgICAgICByZXN1bHQgPSBfcmVmNlswXSxcbiAgICAgICAgem9uZSA9IF9yZWY2WzFdO1xuXG4gICAgaWYgKGhhc093blByb3BlcnR5KG1hdGNoZXMsIFwiYVwiKSAmJiBoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcIkhcIikpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IGluY2x1ZGUgbWVyaWRpZW0gd2hlbiBzcGVjaWZ5aW5nIDI0LWhvdXIgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dDogaW5wdXQsXG4gICAgICB0b2tlbnM6IHRva2VucyxcbiAgICAgIHJlZ2V4OiByZWdleCxcbiAgICAgIHJhd01hdGNoZXM6IHJhd01hdGNoZXMsXG4gICAgICBtYXRjaGVzOiBtYXRjaGVzLFxuICAgICAgcmVzdWx0OiByZXN1bHQsXG4gICAgICB6b25lOiB6b25lXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgX2V4cGxhaW5Gcm9tVG9rZW5zID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSxcbiAgICAgIHJlc3VsdCA9IF9leHBsYWluRnJvbVRva2Vucy5yZXN1bHQsXG4gICAgICB6b25lID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnpvbmUsXG4gICAgICBpbnZhbGlkUmVhc29uID0gX2V4cGxhaW5Gcm9tVG9rZW5zLmludmFsaWRSZWFzb247XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuXG52YXIgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuaXQgb3V0IG9mIHJhbmdlXCIsIFwieW91IHNwZWNpZmllZCBcIiArIHZhbHVlICsgXCIgKG9mIHR5cGUgXCIgKyB0eXBlb2YgdmFsdWUgKyBcIikgYXMgYSBcIiArIHVuaXQgKyBcIiwgd2hpY2ggaXMgaW52YWxpZFwiKTtcbn1cblxuZnVuY3Rpb24gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgdmFyIGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgdmFyIHRhYmxlID0gaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyLFxuICAgICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGkgPCBvcmRpbmFsO1xuICB9KSxcbiAgICAgIGRheSA9IG9yZGluYWwgLSB0YWJsZVttb250aDBdO1xuICByZXR1cm4ge1xuICAgIG1vbnRoOiBtb250aDAgKyAxLFxuICAgIGRheTogZGF5XG4gIH07XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICB2YXIgeWVhciA9IGdyZWdPYmoueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ09iai5tb250aCxcbiAgICAgIGRheSA9IGdyZWdPYmouZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgd2Vla2RheSA9IGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KTtcbiAgdmFyIHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgICAgd2Vla1llYXI7XG5cbiAgaWYgKHdlZWtOdW1iZXIgPCAxKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyIC0gMTtcbiAgICB3ZWVrTnVtYmVyID0gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICh3ZWVrTnVtYmVyID4gd2Vla3NJbldlZWtZZWFyKHllYXIpKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyICsgMTtcbiAgICB3ZWVrTnVtYmVyID0gMTtcbiAgfSBlbHNlIHtcbiAgICB3ZWVrWWVhciA9IHllYXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgd2Vla1llYXI6IHdlZWtZZWFyLFxuICAgIHdlZWtOdW1iZXI6IHdlZWtOdW1iZXIsXG4gICAgd2Vla2RheTogd2Vla2RheVxuICB9LCB0aW1lT2JqZWN0KGdyZWdPYmopKTtcbn1cbmZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICB2YXIgd2Vla1llYXIgPSB3ZWVrRGF0YS53ZWVrWWVhcixcbiAgICAgIHdlZWtOdW1iZXIgPSB3ZWVrRGF0YS53ZWVrTnVtYmVyLFxuICAgICAgd2Vla2RheSA9IHdlZWtEYXRhLndlZWtkYXksXG4gICAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICAgIHllYXJJbkRheXMgPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgdmFyIG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICAgIHllYXI7XG5cbiAgaWYgKG9yZGluYWwgPCAxKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyIC0gMTtcbiAgICBvcmRpbmFsICs9IGRheXNJblllYXIoeWVhcik7XG4gIH0gZWxzZSBpZiAob3JkaW5hbCA+IHllYXJJbkRheXMpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgKyAxO1xuICAgIG9yZGluYWwgLT0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSB7XG4gICAgeWVhciA9IHdlZWtZZWFyO1xuICB9XG5cbiAgdmFyIF91bmNvbXB1dGVPcmRpbmFsID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwubW9udGgsXG4gICAgICBkYXkgPSBfdW5jb21wdXRlT3JkaW5hbC5kYXk7XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogZGF5XG4gIH0sIHRpbWVPYmplY3Qod2Vla0RhdGEpKTtcbn1cbmZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICB2YXIgeWVhciA9IGdyZWdEYXRhLnllYXIsXG4gICAgICBtb250aCA9IGdyZWdEYXRhLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ0RhdGEuZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBvcmRpbmFsOiBvcmRpbmFsXG4gIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cbmZ1bmN0aW9uIG9yZGluYWxUb0dyZWdvcmlhbihvcmRpbmFsRGF0YSkge1xuICB2YXIgeWVhciA9IG9yZGluYWxEYXRhLnllYXIsXG4gICAgICBvcmRpbmFsID0gb3JkaW5hbERhdGEub3JkaW5hbCxcbiAgICAgIF91bmNvbXB1dGVPcmRpbmFsMiA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCksXG4gICAgICBtb250aCA9IF91bmNvbXB1dGVPcmRpbmFsMi5tb250aCxcbiAgICAgIGRheSA9IF91bmNvbXB1dGVPcmRpbmFsMi5kYXk7XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogZGF5XG4gIH0sIHRpbWVPYmplY3Qob3JkaW5hbERhdGEpKTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoud2Vla1llYXIpLFxuICAgICAgdmFsaWRXZWVrID0gaW50ZWdlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgICB2YWxpZE9yZGluYWwgPSBpbnRlZ2VyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRNb250aCA9IGludGVnZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgICAgdmFsaWREYXkgPSBpbnRlZ2VyQmV0d2VlbihvYmouZGF5LCAxLCBkYXlzSW5Nb250aChvYmoueWVhciwgb2JqLm1vbnRoKSk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ5ZWFyXCIsIG9iai55ZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNb250aCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1vbnRoXCIsIG9iai5tb250aCk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkRGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiZGF5XCIsIG9iai5kYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFRpbWVEYXRhKG9iaikge1xuICB2YXIgaG91ciA9IG9iai5ob3VyLFxuICAgICAgbWludXRlID0gb2JqLm1pbnV0ZSxcbiAgICAgIHNlY29uZCA9IG9iai5zZWNvbmQsXG4gICAgICBtaWxsaXNlY29uZCA9IG9iai5taWxsaXNlY29uZDtcbiAgdmFyIHZhbGlkSG91ciA9IGludGVnZXJCZXR3ZWVuKGhvdXIsIDAsIDIzKSB8fCBob3VyID09PSAyNCAmJiBtaW51dGUgPT09IDAgJiYgc2Vjb25kID09PSAwICYmIG1pbGxpc2Vjb25kID09PSAwLFxuICAgICAgdmFsaWRNaW51dGUgPSBpbnRlZ2VyQmV0d2VlbihtaW51dGUsIDAsIDU5KSxcbiAgICAgIHZhbGlkU2Vjb25kID0gaW50ZWdlckJldHdlZW4oc2Vjb25kLCAwLCA1OSksXG4gICAgICB2YWxpZE1pbGxpc2Vjb25kID0gaW50ZWdlckJldHdlZW4obWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIGhvdXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbnV0ZSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBzZWNvbmQpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gXCJJbnZhbGlkIERhdGVUaW1lXCI7XG52YXIgTUFYX0RBVEUgPSA4LjY0ZTE1O1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIFwidGhlIHpvbmUgXFxcIlwiICsgem9uZS5uYW1lICsgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG59IC8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5cblxuZnVuY3Rpb24gcG9zc2libHlDYWNoZWRXZWVrRGF0YShkdCkge1xuICBpZiAoZHQud2Vla0RhdGEgPT09IG51bGwpIHtcbiAgICBkdC53ZWVrRGF0YSA9IGdyZWdvcmlhblRvV2VlayhkdC5jKTtcbiAgfVxuXG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn0gLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuXG5cbmZ1bmN0aW9uIGNsb25lJDEoaW5zdCwgYWx0cykge1xuICB2YXIgY3VycmVudCA9IHtcbiAgICB0czogaW5zdC50cyxcbiAgICB6b25lOiBpbnN0LnpvbmUsXG4gICAgYzogaW5zdC5jLFxuICAgIG86IGluc3QubyxcbiAgICBsb2M6IGluc3QubG9jLFxuICAgIGludmFsaWQ6IGluc3QuaW52YWxpZFxuICB9O1xuICByZXR1cm4gbmV3IERhdGVUaW1lKE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnQsIGFsdHMsIHtcbiAgICBvbGQ6IGN1cnJlbnRcbiAgfSkpO1xufSAvLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5cblxuZnVuY3Rpb24gZml4T2Zmc2V0KGxvY2FsVFMsIG8sIHR6KSB7XG4gIC8vIE91ciBVVEMgdGltZSBpcyBqdXN0IGEgZ3Vlc3MgYmVjYXVzZSBvdXIgb2Zmc2V0IGlzIGp1c3QgYSBndWVzc1xuICB2YXIgdXRjR3Vlc3MgPSBsb2NhbFRTIC0gbyAqIDYwICogMTAwMDsgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuXG4gIHZhciBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7IC8vIElmIHNvLCBvZmZzZXQgZGlkbid0IGNoYW5nZSBhbmQgd2UncmUgZG9uZVxuXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9IC8vIElmIG5vdCwgY2hhbmdlIHRoZSB0cyBieSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgb2Zmc2V0XG5cblxuICB1dGNHdWVzcyAtPSAobzIgLSBvKSAqIDYwICogMTAwMDsgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG5cbiAgdmFyIG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcblxuICBpZiAobzIgPT09IG8zKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgbzJdO1xuICB9IC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcblxuXG4gIHJldHVybiBbbG9jYWxUUyAtIE1hdGgubWluKG8yLCBvMykgKiA2MCAqIDEwMDAsIE1hdGgubWF4KG8yLCBvMyldO1xufSAvLyBjb252ZXJ0IGFuIGVwb2NoIHRpbWVzdGFtcCBpbnRvIGEgY2FsZW5kYXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG9mZnNldFxuXG5cbmZ1bmN0aW9uIHRzVG9PYmoodHMsIG9mZnNldCkge1xuICB0cyArPSBvZmZzZXQgKiA2MCAqIDEwMDA7XG4gIHZhciBkID0gbmV3IERhdGUodHMpO1xuICByZXR1cm4ge1xuICAgIHllYXI6IGQuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICBtb250aDogZC5nZXRVVENNb250aCgpICsgMSxcbiAgICBkYXk6IGQuZ2V0VVRDRGF0ZSgpLFxuICAgIGhvdXI6IGQuZ2V0VVRDSG91cnMoKSxcbiAgICBtaW51dGU6IGQuZ2V0VVRDTWludXRlcygpLFxuICAgIHNlY29uZDogZC5nZXRVVENTZWNvbmRzKCksXG4gICAgbWlsbGlzZWNvbmQ6IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcbiAgfTtcbn0gLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIG9ialRvVFMob2JqLCBvZmZzZXQsIHpvbmUpIHtcbiAgcmV0dXJuIGZpeE9mZnNldChvYmpUb0xvY2FsVFMob2JqKSwgb2Zmc2V0LCB6b25lKTtcbn0gLy8gY3JlYXRlIGEgbmV3IERUIGluc3RhbmNlIGJ5IGFkZGluZyBhIGR1cmF0aW9uLCBhZGp1c3RpbmcgZm9yIERTVHNcblxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICB2YXIgb1ByZSA9IGluc3QubyxcbiAgICAgIHllYXIgPSBpbnN0LmMueWVhciArIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgTWF0aC50cnVuYyhkdXIubW9udGhzKSArIE1hdGgudHJ1bmMoZHVyLnF1YXJ0ZXJzKSAqIDMsXG4gICAgICBjID0gT2JqZWN0LmFzc2lnbih7fSwgaW5zdC5jLCB7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgTWF0aC50cnVuYyhkdXIuZGF5cykgKyBNYXRoLnRydW5jKGR1ci53ZWVrcykgKiA3XG4gIH0pLFxuICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICB5ZWFyczogZHVyLnllYXJzIC0gTWF0aC50cnVuYyhkdXIueWVhcnMpLFxuICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgbW9udGhzOiBkdXIubW9udGhzIC0gTWF0aC50cnVuYyhkdXIubW9udGhzKSxcbiAgICB3ZWVrczogZHVyLndlZWtzIC0gTWF0aC50cnVuYyhkdXIud2Vla3MpLFxuICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoXCJtaWxsaXNlY29uZHNcIiksXG4gICAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIHZhciBfZml4T2Zmc2V0ID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSksXG4gICAgICB0cyA9IF9maXhPZmZzZXRbMF0sXG4gICAgICBvID0gX2ZpeE9mZnNldFsxXTtcblxuICBpZiAobWlsbGlzVG9BZGQgIT09IDApIHtcbiAgICB0cyArPSBtaWxsaXNUb0FkZDsgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuXG4gICAgbyA9IGluc3Quem9uZS5vZmZzZXQodHMpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0czogdHMsXG4gICAgbzogb1xuICB9O1xufSAvLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcblxuXG5mdW5jdGlvbiBwYXJzZURhdGFUb0RhdGVUaW1lKHBhcnNlZCwgcGFyc2VkWm9uZSwgb3B0cywgZm9ybWF0LCB0ZXh0KSB7XG4gIHZhciBzZXRab25lID0gb3B0cy5zZXRab25lLFxuICAgICAgem9uZSA9IG9wdHMuem9uZTtcblxuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMsIHtcbiAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgIC8vIHNldFpvbmUgaXMgYSB2YWxpZCBvcHRpb24gaW4gdGhlIGNhbGxpbmcgbWV0aG9kcywgYnV0IG5vdCBpbiBmcm9tT2JqZWN0XG4gICAgICBzZXRab25lOiB1bmRlZmluZWRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHNldFpvbmUgPyBpbnN0IDogaW5zdC5zZXRab25lKHpvbmUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKG5ldyBJbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBcInRoZSBpbnB1dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIGNhbid0IGJlIHBhcnNlZCBhcyBcIiArIGZvcm1hdCkpO1xuICB9XG59IC8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5cblxuZnVuY3Rpb24gdG9UZWNoRm9ybWF0KGR0LCBmb3JtYXQsIGFsbG93Wikge1xuICBpZiAoYWxsb3daID09PSB2b2lkIDApIHtcbiAgICBhbGxvd1ogPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGR0LmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoXCJlbi1VU1wiKSwge1xuICAgIGFsbG93WjogYWxsb3daLFxuICAgIGZvcmNlU2ltcGxlOiB0cnVlXG4gIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KSA6IG51bGw7XG59IC8vIHRlY2huaWNhbCB0aW1lIGZvcm1hdHMgKGUuZy4gdGhlIHRpbWUgcGFydCBvZiBJU08gODYwMSksIHRha2Ugc29tZSBvcHRpb25zXG4vLyBhbmQgdGhpcyBjb21tb25pemVzIHRoZWlyIGhhbmRsaW5nXG5cblxuZnVuY3Rpb24gdG9UZWNoVGltZUZvcm1hdChkdCwgX3JlZikge1xuICB2YXIgX3JlZiRzdXBwcmVzc1NlY29uZHMgPSBfcmVmLnN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NTZWNvbmRzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgX3JlZiRzdXBwcmVzc01pbGxpc2VjID0gX3JlZi5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gX3JlZiRzdXBwcmVzc01pbGxpc2VjID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyxcbiAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmLmluY2x1ZGVPZmZzZXQsXG4gICAgICBfcmVmJGluY2x1ZGVQcmVmaXggPSBfcmVmLmluY2x1ZGVQcmVmaXgsXG4gICAgICBpbmNsdWRlUHJlZml4ID0gX3JlZiRpbmNsdWRlUHJlZml4ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaW5jbHVkZVByZWZpeCxcbiAgICAgIF9yZWYkaW5jbHVkZVpvbmUgPSBfcmVmLmluY2x1ZGVab25lLFxuICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmJGluY2x1ZGVab25lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaW5jbHVkZVpvbmUsXG4gICAgICBfcmVmJHNwYWNlWm9uZSA9IF9yZWYuc3BhY2Vab25lLFxuICAgICAgc3BhY2Vab25lID0gX3JlZiRzcGFjZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzcGFjZVpvbmUsXG4gICAgICBfcmVmJGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgZm9ybWF0ID0gX3JlZiRmb3JtYXQgPT09IHZvaWQgMCA/IFwiZXh0ZW5kZWRcIiA6IF9yZWYkZm9ybWF0O1xuICB2YXIgZm10ID0gZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcIkhIbW1cIiA6IFwiSEg6bW1cIjtcblxuICBpZiAoIXN1cHByZXNzU2Vjb25kcyB8fCBkdC5zZWNvbmQgIT09IDAgfHwgZHQubWlsbGlzZWNvbmQgIT09IDApIHtcbiAgICBmbXQgKz0gZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcInNzXCIgOiBcIjpzc1wiO1xuXG4gICAgaWYgKCFzdXBwcmVzc01pbGxpc2Vjb25kcyB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgICAgZm10ICs9IFwiLlNTU1wiO1xuICAgIH1cbiAgfVxuXG4gIGlmICgoaW5jbHVkZVpvbmUgfHwgaW5jbHVkZU9mZnNldCkgJiYgc3BhY2Vab25lKSB7XG4gICAgZm10ICs9IFwiIFwiO1xuICB9XG5cbiAgaWYgKGluY2x1ZGVab25lKSB7XG4gICAgZm10ICs9IFwielwiO1xuICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICBmbXQgKz0gZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcIlpaWlwiIDogXCJaWlwiO1xuICB9XG5cbiAgdmFyIHN0ciA9IHRvVGVjaEZvcm1hdChkdCwgZm10KTtcblxuICBpZiAoaW5jbHVkZVByZWZpeCkge1xuICAgIHN0ciA9IFwiVFwiICsgc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn0gLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5cblxudmFyIGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdFdlZWtVbml0VmFsdWVzID0ge1xuICB3ZWVrTnVtYmVyOiAxLFxuICB3ZWVrZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICBvcmRpbmFsOiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn07IC8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xuXG52YXIgb3JkZXJlZFVuaXRzJDEgPSBbXCJ5ZWFyXCIsIFwibW9udGhcIiwgXCJkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0sXG4gICAgb3JkZXJlZFdlZWtVbml0cyA9IFtcIndlZWtZZWFyXCIsIFwid2Vla051bWJlclwiLCBcIndlZWtkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0sXG4gICAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdOyAvLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcblxuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gIHZhciBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiXG4gIH1bdW5pdC50b0xvd2VyQ2FzZSgpXTtcbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59IC8vIHRoaXMgaXMgYSBkdW1iZWQgZG93biB2ZXJzaW9uIG9mIGZyb21PYmplY3QoKSB0aGF0IHJ1bnMgYWJvdXQgNjAlIGZhc3RlclxuLy8gYnV0IGRvZXNuJ3QgZG8gYW55IHZhbGlkYXRpb24sIG1ha2VzIGEgYnVuY2ggb2YgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCB1bml0c1xuLy8gYXJlIHByZXNlbnQsIGFuZCBzbyBvbi5cblxuXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgem9uZSkge1xuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Uob3JkZXJlZFVuaXRzJDEpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciB1ID0gX3N0ZXAudmFsdWU7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWQgPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuXG4gIGlmIChpbnZhbGlkKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gIH1cblxuICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KSxcbiAgICAgIF9vYmpUb1RTID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSksXG4gICAgICB0cyA9IF9vYmpUb1RTWzBdLFxuICAgICAgbyA9IF9vYmpUb1RTWzFdO1xuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRpZmZSZWxhdGl2ZShzdGFydCwgZW5kLCBvcHRzKSB7XG4gIHZhciByb3VuZCA9IGlzVW5kZWZpbmVkKG9wdHMucm91bmQpID8gdHJ1ZSA6IG9wdHMucm91bmQsXG4gICAgICBmb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoYywgdW5pdCkge1xuICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgIHZhciBmb3JtYXR0ZXIgPSBlbmQubG9jLmNsb25lKG9wdHMpLnJlbEZvcm1hdHRlcihvcHRzKTtcbiAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChjLCB1bml0KTtcbiAgfSxcbiAgICAgIGRpZmZlciA9IGZ1bmN0aW9uIGRpZmZlcih1bml0KSB7XG4gICAgaWYgKG9wdHMuY2FsZW5kYXJ5KSB7XG4gICAgICBpZiAoIWVuZC5oYXNTYW1lKHN0YXJ0LCB1bml0KSkge1xuICAgICAgICByZXR1cm4gZW5kLnN0YXJ0T2YodW5pdCkuZGlmZihzdGFydC5zdGFydE9mKHVuaXQpLCB1bml0KS5nZXQodW5pdCk7XG4gICAgICB9IGVsc2UgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpO1xuICAgIH1cbiAgfTtcblxuICBpZiAob3B0cy51bml0KSB7XG4gICAgcmV0dXJuIGZvcm1hdChkaWZmZXIob3B0cy51bml0KSwgb3B0cy51bml0KTtcbiAgfVxuXG4gIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG9wdHMudW5pdHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgIHZhciB1bml0ID0gX3N0ZXAyLnZhbHVlO1xuICAgIHZhciBjb3VudCA9IGRpZmZlcih1bml0KTtcblxuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdChzdGFydCA+IGVuZCA/IC0wIDogMCwgb3B0cy51bml0c1tvcHRzLnVuaXRzLmxlbmd0aCAtIDFdKTtcbn1cbi8qKlxuICogQSBEYXRlVGltZSBpcyBhbiBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSBhbmQgYWNjb21wYW55aW5nIG1ldGhvZHMuIEl0IGNvbnRhaW5zIGNsYXNzIGFuZCBpbnN0YW5jZSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLlxuICpcbiAqIEEgRGF0ZVRpbWUgY29tcHJpc2VzIG9mOlxuICogKiBBIHRpbWVzdGFtcC4gRWFjaCBEYXRlVGltZSBpbnN0YW5jZSByZWZlcnMgdG8gYSBzcGVjaWZpYyBtaWxsaXNlY29uZCBvZiB0aGUgVW5peCBlcG9jaC5cbiAqICogQSB0aW1lIHpvbmUuIEVhY2ggaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBpbiB0aGUgY29udGV4dCBvZiBhIHNwZWNpZmljIHpvbmUgKGJ5IGRlZmF1bHQgdGhlIGxvY2FsIHN5c3RlbSdzIHpvbmUpLlxuICogKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBlZmZlY3QgaG93IG91dHB1dCBzdHJpbmdzIGFyZSBmb3JtYXR0ZWQsIHN1Y2ggYXMgYGxvY2FsZWAsIGBudW1iZXJpbmdTeXN0ZW1gLCBhbmQgYG91dHB1dENhbGVuZGFyYC5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdW5jdGlvbmFsaXR5IGl0IHByb3ZpZGVzOlxuICpcbiAqICogKipDcmVhdGlvbioqOiBUbyBjcmVhdGUgYSBEYXRlVGltZSBmcm9tIGl0cyBjb21wb25lbnRzLCB1c2Ugb25lIG9mIGl0cyBmYWN0b3J5IGNsYXNzIG1ldGhvZHM6IHtAbGluayBsb2NhbH0sIHtAbGluayB1dGN9LCBhbmQgKG1vc3QgZmxleGlibHkpIHtAbGluayBmcm9tT2JqZWN0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgc3RhbmRhcmQgc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tSVNPfSwge0BsaW5rIGZyb21IVFRQfSwgYW5kIHtAbGluayBmcm9tUkZDMjgyMn0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIGN1c3RvbSBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21Gb3JtYXR9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBuYXRpdmUgSlMgZGF0ZSwgdXNlIHtAbGluayBmcm9tSlNEYXRlfS5cbiAqICogKipHcmVnb3JpYW4gY2FsZW5kYXIgYW5kIHRpbWUqKjogVG8gZXhhbWluZSB0aGUgR3JlZ29yaWFuIHByb3BlcnRpZXMgb2YgYSBEYXRlVGltZSBpbmRpdmlkdWFsbHkgKGkuZSBhcyBvcHBvc2VkIHRvIGNvbGxlY3RpdmVseSB0aHJvdWdoIHtAbGluayB0b09iamVjdH0pLCB1c2UgdGhlIHtAbGluayB5ZWFyfSwge0BsaW5rIG1vbnRofSxcbiAqIHtAbGluayBkYXl9LCB7QGxpbmsgaG91cn0sIHtAbGluayBtaW51dGV9LCB7QGxpbmsgc2Vjb25kfSwge0BsaW5rIG1pbGxpc2Vjb25kfSBhY2Nlc3NvcnMuXG4gKiAqICoqV2VlayBjYWxlbmRhcioqOiBGb3IgSVNPIHdlZWsgY2FsZW5kYXIgYXR0cmlidXRlcywgc2VlIHRoZSB7QGxpbmsgd2Vla1llYXJ9LCB7QGxpbmsgd2Vla051bWJlcn0sIGFuZCB7QGxpbmsgd2Vla2RheX0gYWNjZXNzb3JzLlxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgdGhlIHtAbGluayBsb2NhbGV9IGFuZCB7QGxpbmsgbnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKjogVG8gdHJhbnNmb3JtIHRoZSBEYXRlVGltZSBpbnRvIG90aGVyIERhdGVUaW1lcywgdXNlIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2V0Wm9uZX0sIHtAbGluayBzZXRMb2NhbGV9LCB7QGxpbmsgcGx1c30sIHtAbGluayBtaW51c30sIHtAbGluayBlbmRPZn0sIHtAbGluayBzdGFydE9mfSwge0BsaW5rIHRvVVRDfSwgYW5kIHtAbGluayB0b0xvY2FsfS5cbiAqICogKipPdXRwdXQqKjogVG8gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCB1c2UgdGhlIHtAbGluayB0b1JlbGF0aXZlfSwge0BsaW5rIHRvUmVsYXRpdmVDYWxlbmRhcn0sIHtAbGluayB0b0pTT059LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9IVFRQfSwge0BsaW5rIHRvT2JqZWN0fSwge0BsaW5rIHRvUkZDMjgyMn0sIHtAbGluayB0b1N0cmluZ30sIHtAbGluayB0b0xvY2FsZVN0cmluZ30sIHtAbGluayB0b0Zvcm1hdH0sIHtAbGluayB0b01pbGxpc30gYW5kIHtAbGluayB0b0pTRGF0ZX0uXG4gKlxuICogVGhlcmUncyBwbGVudHkgb3RoZXJzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uLCB0aW1lIHpvbmVzLCBhbHRlcm5hdGl2ZSBjYWxlbmRhcnMsIHZhbGlkaXR5LCBhbmQgc28gb24sIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cbiAqL1xuXG5cbnZhciBEYXRlVGltZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIERhdGVUaW1lKGNvbmZpZykge1xuICAgIHZhciB6b25lID0gY29uZmlnLnpvbmUgfHwgU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgdmFyIGludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fCAoIXpvbmUuaXNWYWxpZCA/IHVuc3VwcG9ydGVkWm9uZSh6b25lKSA6IG51bGwpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy50cyA9IGlzVW5kZWZpbmVkKGNvbmZpZy50cykgPyBTZXR0aW5ncy5ub3coKSA6IGNvbmZpZy50cztcbiAgICB2YXIgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuXG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICB2YXIgdW5jaGFuZ2VkID0gY29uZmlnLm9sZCAmJiBjb25maWcub2xkLnRzID09PSB0aGlzLnRzICYmIGNvbmZpZy5vbGQuem9uZS5lcXVhbHMoem9uZSk7XG5cbiAgICAgIGlmICh1bmNoYW5nZWQpIHtcbiAgICAgICAgdmFyIF9yZWYyID0gW2NvbmZpZy5vbGQuYywgY29uZmlnLm9sZC5vXTtcbiAgICAgICAgYyA9IF9yZWYyWzBdO1xuICAgICAgICBvID0gX3JlZjJbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cblxuICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuYyA9IGM7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9IC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBEYXRlVGltZS5ub3cgPSBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7fSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeWVhcl0gLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2hvdXI9MF0gLSBUaGUgaG91ciBvZiB0aGUgZGF5LCBpbiAyNC1ob3VyIHRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbGxpc2Vjb25kPTBdIC0gVGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5OTlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5ub3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeWVhcl0gLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyKSAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBEYXRlVGltZS51dGMgPSBmdW5jdGlvbiB1dGMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHllYXIpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IFNldHRpbmdzLm5vdygpLFxuICAgICAgICB6b25lOiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVpY2tEVCh7XG4gICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgZGF5OiBkYXksXG4gICAgICAgIGhvdXI6IGhvdXIsXG4gICAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kXG4gICAgICB9LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3QuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIERhdGVUaW1lLmZyb21KU0RhdGUgPSBmdW5jdGlvbiBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdmFyIHRzID0gaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU47XG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKHRzKSkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpO1xuICAgIH1cblxuICAgIHZhciB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuXG4gICAgaWYgKCF6b25lVG9Vc2UuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmVUb1VzZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IHRzLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKG1lYW5pbmcgc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIC0gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIERhdGVUaW1lLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXQsIGJ1dCByZWNlaXZlZCBhIFwiICsgdHlwZW9mIG1pbGxpc2Vjb25kcyArIFwiIHdpdGggdmFsdWUgXCIgKyBtaWxsaXNlY29uZHMpO1xuICAgIH0gZWxzZSBpZiAobWlsbGlzZWNvbmRzIDwgLU1BWF9EQVRFIHx8IG1pbGxpc2Vjb25kcyA+IE1BWF9EQVRFKSB7XG4gICAgICAvLyB0aGlzIGlzbid0IHBlcmZlY3QgYmVjYXVzZSBiZWNhdXNlIHdlIGNhbiBzdGlsbCBlbmQgdXAgb3V0IG9mIHJhbmdlIGJlY2F1c2Ugb2YgYWRkaXRpb25hbCBzaGlmdGluZywgYnV0IGl0J3MgYSBzdGFydFxuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJUaW1lc3RhbXAgb3V0IG9mIHJhbmdlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IG1pbGxpc2Vjb25kcyxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHMgLSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIERhdGVUaW1lLmZyb21TZWNvbmRzID0gZnVuY3Rpb24gZnJvbVNlY29uZHMoc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb2JqLnpvbmU9J2xvY2FsJ10gLSBpbnRlcnByZXQgdGhlIG51bWJlcnMgaW4gdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIHpvbmUuIENhbiB0YWtlIGFueSB2YWx1ZSB0YWtlbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0Wm9uZSgpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyLCBtb250aDogNSwgZGF5OiAyNX0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDEtMDEnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0pIC8vfj4gdG9kYXkgYXQgMTA6MjY6MDZcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICd1dGMnIH0pLFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ2xvY2FsJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ0FtZXJpY2EvTmV3X1lvcmsnIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB3ZWVrWWVhcjogMjAxNiwgd2Vla051bWJlcjogMiwgd2Vla2RheTogMyB9KS50b0lTT0RhdGUoKSAvLz0+ICcyMDE2LTAxLTEzJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBEYXRlVGltZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICB2YXIgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvYmouem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuXG4gICAgaWYgKCF6b25lVG9Vc2UuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmVUb1VzZSkpO1xuICAgIH1cblxuICAgIHZhciB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgICBvZmZzZXRQcm92aXMgPSB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZVVuaXQsIFtcInpvbmVcIiwgXCJsb2NhbGVcIiwgXCJvdXRwdXRDYWxlbmRhclwiLCBcIm51bWJlcmluZ1N5c3RlbVwiXSksXG4gICAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgICBjb250YWluc0dyZWdvclllYXIgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC55ZWFyKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgICBkZWZpbml0ZVdlZWtEZWYgPSBub3JtYWxpemVkLndlZWtZZWFyIHx8IG5vcm1hbGl6ZWQud2Vla051bWJlcixcbiAgICAgICAgbG9jID0gTG9jYWxlLmZyb21PYmplY3Qob2JqKTsgLy8gY2FzZXM6XG4gICAgLy8ganVzdCBhIHdlZWtkYXkgLT4gdGhpcyB3ZWVrJ3MgaW5zdGFuY2Ugb2YgdGhhdCB3ZWVrZGF5LCBubyB3b3JyaWVzXG4gICAgLy8gKGdyZWdvcmlhbiBkYXRhIG9yIG9yZGluYWwpICsgKHdlZWtZZWFyIG9yIHdlZWtOdW1iZXIpIC0+IGVycm9yXG4gICAgLy8gKGdyZWdvcmlhbiBtb250aCBvciBkYXkpICsgb3JkaW5hbCAtPiBlcnJvclxuICAgIC8vIG90aGVyd2lzZSBqdXN0IHVzZSB3ZWVrcyBvciBvcmRpbmFscyBvciBncmVnb3JpYW4sIGRlcGVuZGluZyBvbiB3aGF0J3Mgc3BlY2lmaWVkXG5cbiAgICBpZiAoKGNvbnRhaW5zR3JlZ29yIHx8IGNvbnRhaW5zT3JkaW5hbCkgJiYgZGVmaW5pdGVXZWVrRGVmKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzXCIpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluc0dyZWdvck1EICYmIGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXlcIik7XG4gICAgfVxuXG4gICAgdmFyIHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IG5vcm1hbGl6ZWQud2Vla2RheSAmJiAhY29udGFpbnNHcmVnb3I7IC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG5cbiAgICB2YXIgdW5pdHMsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG5cbiAgICBpZiAodXNlV2Vla0RhdGEpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFdlZWtVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0V2Vla1VuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub1dlZWsob2JqTm93KTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkT3JkaW5hbFVuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRPcmRpbmFsVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvT3JkaW5hbChvYmpOb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRVbml0cyQxO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRVbml0VmFsdWVzO1xuICAgIH0gLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG5cblxuICAgIHZhciBmb3VuZEZpcnN0ID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSh1bml0cyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgIHZhciB2ID0gbm9ybWFsaXplZFt1XTtcblxuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfSAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyB3ZSBoYXZlIGFyZSBpbiByYW5nZVxuXG5cbiAgICB2YXIgaGlnaGVyT3JkZXJJbnZhbGlkID0gdXNlV2Vla0RhdGEgPyBoYXNJbnZhbGlkV2Vla0RhdGEobm9ybWFsaXplZCkgOiBjb250YWluc09yZGluYWwgPyBoYXNJbnZhbGlkT3JkaW5hbERhdGEobm9ybWFsaXplZCkgOiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShub3JtYWxpemVkKSxcbiAgICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuXG5cbiAgICB2YXIgZ3JlZ29yaWFuID0gdXNlV2Vla0RhdGEgPyB3ZWVrVG9HcmVnb3JpYW4obm9ybWFsaXplZCkgOiBjb250YWluc09yZGluYWwgPyBvcmRpbmFsVG9HcmVnb3JpYW4obm9ybWFsaXplZCkgOiBub3JtYWxpemVkLFxuICAgICAgICBfb2JqVG9UUzIgPSBvYmpUb1RTKGdyZWdvcmlhbiwgb2Zmc2V0UHJvdmlzLCB6b25lVG9Vc2UpLFxuICAgICAgICB0c0ZpbmFsID0gX29ialRvVFMyWzBdLFxuICAgICAgICBvZmZzZXRGaW5hbCA9IF9vYmpUb1RTMlsxXSxcbiAgICAgICAgaW5zdCA9IG5ldyBEYXRlVGltZSh7XG4gICAgICB0czogdHNGaW5hbCxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIG86IG9mZnNldEZpbmFsLFxuICAgICAgbG9jOiBsb2NcbiAgICB9KTsgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG5cblxuICAgIGlmIChub3JtYWxpemVkLndlZWtkYXkgJiYgY29udGFpbnNHcmVnb3IgJiYgb2JqLndlZWtkYXkgIT09IGluc3Qud2Vla2RheSkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJtaXNtYXRjaGVkIHdlZWtkYXlcIiwgXCJ5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiBcIiArIG5vcm1hbGl6ZWQud2Vla2RheSArIFwiIGFuZCBhIGRhdGUgb2YgXCIgKyBpbnN0LnRvSVNPKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBEYXRlVGltZS5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VJU09EYXRlID0gcGFyc2VJU09EYXRlKHRleHQpLFxuICAgICAgICB2YWxzID0gX3BhcnNlSVNPRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZUlTT0RhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIklTTyA4NjAxXCIsIHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSB0aGUgb2Zmc2V0IGlzIGFsd2F5cyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMzoxMiBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignRnJpLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUuZnJvbVJGQzI4MjIgPSBmdW5jdGlvbiBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJSRkMgMjgyMlwiLCB0ZXh0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBEYXRlVGltZS5mcm9tSFRUUCA9IGZ1bmN0aW9uIGZyb21IVFRQKHRleHQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9wYXJzZUhUVFBEYXRlID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUhUVFBEYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSFRUUERhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIkhUVFBcIiwgb3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gaW5wdXQgc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nLlxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXG4gICAqIEBzZWUgaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uL2RvY3MvbWFudWFsL3BhcnNpbmcuaHRtbCN0YWJsZS1vZi10b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSB0aGUgbGluayBiZWxvdyBmb3IgdGhlIGZvcm1hdHMpXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQodGV4dCkgfHwgaXNVbmRlZmluZWQoZm10KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICAgIF9vcHRzJGxvY2FsZSA9IF9vcHRzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdHMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdHMkbG9jYWxlLFxuICAgICAgICBfb3B0cyRudW1iZXJpbmdTeXN0ZW0gPSBfb3B0cy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRzJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZCA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiZm9ybWF0IFwiICsgZm10LCB0ZXh0KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIDtcblxuICBEYXRlVGltZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodGV4dCwgZm10LCBvcHRzKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUuZnJvbVNRTCA9IGZ1bmN0aW9uIGZyb21TUUwodGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlU1FMID0gcGFyc2VTUUwodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VTUUxbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VTUUxbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBEYXRlVGltZS5pbnZhbGlkID0gZnVuY3Rpb24gaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgaWYgKGV4cGxhbmF0aW9uID09PSB2b2lkIDApIHtcbiAgICAgIGV4cGxhbmF0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERhdGVUaW1lRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICBpbnZhbGlkOiBpbnZhbGlkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIERhdGVUaW1lLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUuaXNEYXRlVGltZSA9IGZ1bmN0aW9uIGlzRGF0ZVRpbWUobykge1xuICAgIHJldHVybiBvICYmIG8uaXNMdXhvbkRhdGVUaW1lIHx8IGZhbHNlO1xuICB9IC8vIElORk9cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgdmFyIF9wcm90byA9IERhdGVUaW1lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1t1bml0XTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGJ5IGFuIG9wZXJhdGlvbiBvbiBhbm90aGVyIGludmFsaWQgZGF0ZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgSW50bCBvcHRpb25zIGZvciB0aGlzIERhdGVUaW1lLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBmb3JtYXR0aW5nIG1ldGhvZHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSB0aGUgc2FtZSBvcHRpb25zIGFzIHRvTG9jYWxlU3RyaW5nXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIF9wcm90by5yZXNvbHZlZExvY2FsZU9wdHMgPSBmdW5jdGlvbiByZXNvbHZlZExvY2FsZU9wdHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX0Zvcm1hdHRlciRjcmVhdGUkcmVzID0gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykucmVzb2x2ZWRPcHRpb25zKHRoaXMpLFxuICAgICAgICBsb2NhbGUgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5jYWxlbmRhcjtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyXG4gICAgfTtcbiAgfSAvLyBUUkFOU0ZPUk1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBzZXRab25lfSgndXRjJylcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1VUQyA9IGZ1bmN0aW9uIHRvVVRDKG9mZnNldCwgb3B0cykge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byBgc2V0Wm9uZSgnbG9jYWwnKWBcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHNldHRlciBrZWVwcyB0aGUgdW5kZXJseWluZyB0aW1lIHRoZSBzYW1lIChhcyBpbiwgdGhlIHNhbWUgdGltZXN0YW1wKSwgYnV0IHRoZSBuZXcgaW5zdGFuY2Ugd2lsbCByZXBvcnQgZGlmZmVyZW50IGxvY2FsIHRpbWVzIGFuZCBjb25zaWRlciBEU1RzIHdoZW4gbWFraW5nIGNvbXB1dGF0aW9ucywgYXMgd2l0aCB7QGxpbmsgcGx1c30uIFlvdSBtYXkgd2lzaCB0byB1c2Uge0BsaW5rIHRvTG9jYWx9IGFuZCB7QGxpbmsgdG9VVEN9IHdoaWNoIHByb3ZpZGUgc2ltcGxlIGNvbnZlbmllbmNlIHdyYXBwZXJzIGZvciBjb21tb25seSB1c2VkIHpvbmVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbem9uZT0nbG9jYWwnXSAtIGEgem9uZSBpZGVudGlmaWVyLiBBcyBhIHN0cmluZywgdGhhdCBjYW4gYmUgYW55IElBTkEgem9uZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgZW52aXJvbm1lbnQsIG9yIGEgZml4ZWQtb2Zmc2V0IG5hbWUgb2YgdGhlIGZvcm0gJ1VUQyszJywgb3IgdGhlIHN0cmluZ3MgJ2xvY2FsJyBvciAndXRjJy4gWW91IG1heSBhbHNvIHN1cHBseSBhbiBpbnN0YW5jZSBvZiBhIHtAbGluayBab25lfSBjbGFzcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMua2VlcExvY2FsVGltZT1mYWxzZV0gLSBJZiB0cnVlLCBhZGp1c3QgdGhlIHVuZGVybHlpbmcgdGltZSBzbyB0aGF0IHRoZSBsb2NhbCB0aW1lIHN0YXlzIHRoZSBzYW1lLCBidXQgaW4gdGhlIHRhcmdldCB6b25lLiBZb3Ugc2hvdWxkIHJhcmVseSBuZWVkIHRoaXMuXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lLCBfdGVtcCkge1xuICAgIHZhciBfcmVmMyA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMyRrZWVwTG9jYWxUaW1lID0gX3JlZjMua2VlcExvY2FsVGltZSxcbiAgICAgICAga2VlcExvY2FsVGltZSA9IF9yZWYzJGtlZXBMb2NhbFRpbWUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMka2VlcExvY2FsVGltZSxcbiAgICAgICAgX3JlZjMka2VlcENhbGVuZGFyVGltID0gX3JlZjMua2VlcENhbGVuZGFyVGltZSxcbiAgICAgICAga2VlcENhbGVuZGFyVGltZSA9IF9yZWYzJGtlZXBDYWxlbmRhclRpbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRrZWVwQ2FsZW5kYXJUaW07XG5cbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoem9uZS5lcXVhbHModGhpcy56b25lKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmICghem9uZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSB0aGlzLnRzO1xuXG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIHZhciBvZmZzZXRHdWVzcyA9IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgICAgICB2YXIgYXNPYmogPSB0aGlzLnRvT2JqZWN0KCk7XG5cbiAgICAgICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMoYXNPYmosIG9mZnNldEd1ZXNzLCB6b25lKTtcblxuICAgICAgICBuZXdUUyA9IF9vYmpUb1RTM1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgICB0czogbmV3VFMsXG4gICAgICAgIHpvbmU6IHpvbmVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG9yIG91dHB1dENhbGVuZGFyLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gdGhlIHByb3BlcnRpZXMgdG8gc2V0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcDIpIHtcbiAgICB2YXIgX3JlZjQgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmNC5vdXRwdXRDYWxlbmRhcjtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IG91dHB1dENhbGVuZGFyXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgbG9jOiBsb2NcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuc2V0TG9jYWxlKCdlbi1HQicpXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zZXRMb2NhbGUgPSBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoe1xuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBZb3UgY2FuIG9ubHkgc2V0IHVuaXRzIHdpdGggdGhpcyBtZXRob2Q7IGZvciBcInNldHRpbmdcIiBtZXRhZGF0YSwgc2VlIHtAbGluayByZWNvbmZpZ3VyZX0gYW5kIHtAbGluayBzZXRab25lfS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHllYXI6IDIwMTcgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgaG91cjogOCwgbWludXRlOiAzMCB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHllYXI6IDIwMDUsIG9yZGluYWw6IDIzNCB9KVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQsIFtdKSxcbiAgICAgICAgc2V0dGluZ1dlZWtTdHVmZiA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtZZWFyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrTnVtYmVyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrZGF5KSxcbiAgICAgICAgY29udGFpbnNPcmRpbmFsID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yID0gY29udGFpbnNHcmVnb3JZZWFyIHx8IGNvbnRhaW5zR3JlZ29yTUQsXG4gICAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyO1xuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFsc1wiKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIHZhciBtaXhlZDtcblxuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSkge1xuICAgICAgbWl4ZWQgPSBvcmRpbmFsVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy50b09iamVjdCgpLCBub3JtYWxpemVkKTsgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcblxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTNCA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzRbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzRbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICB0czogdHMsXG4gICAgICBvOiBvXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqXG4gICAqIEFkZGluZyBob3VycywgbWludXRlcywgc2Vjb25kcywgb3IgbWlsbGlzZWNvbmRzIGluY3JlYXNlcyB0aGUgdGltZXN0YW1wIGJ5IHRoZSByaWdodCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBZGRpbmcgZGF5cywgbW9udGhzLCBvciB5ZWFycyBzaGlmdHMgdGhlIGNhbGVuZGFyLCBhY2NvdW50aW5nIGZvciBEU1RzIGFuZCBsZWFwIHllYXJzIGFsb25nIHRoZSB3YXkuIFRodXMsIGBkdC5wbHVzKHsgaG91cnM6IDI0IH0pYCBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHRpbWUgdGhhbiBgZHQucGx1cyh7IGRheXM6IDEgfSlgIGlmIHRoZXJlJ3MgYSBEU1Qgc2hpZnQgaW4gYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKDEyMykgLy9+PiBpbiAxMjMgbWlsbGlzZWNvbmRzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IC0xIH0pIC8vfj4gdGhpcyB0aW1lIHllc3RlcmRheVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnBsdXMgPSBmdW5jdGlvbiBwbHVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG4gIC8qKlxuICAgKiBTdWJ0cmFjdCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXG4gICBAcmV0dXJuIHtEYXRlVGltZX1cbiAgKi9cbiAgO1xuXG4gIF9wcm90by5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHVuaXQgb2YgdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgYmVnaW5uaW5nIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCdtb250aCcpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd5ZWFyJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDEtMDEnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3dlZWsnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMycsIHdlZWtzIGFsd2F5cyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdkYXknKS50b0lTT1RpbWUoKTsgLy89PiAnMDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignaG91cicpLnRvSVNPVGltZSgpOyAvLz0+ICcwNTowMDowMC4wMDAtMDU6MDAnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zdGFydE9mID0gZnVuY3Rpb24gc3RhcnRPZih1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBvID0ge30sXG4gICAgICAgIG5vcm1hbGl6ZWRVbml0ID0gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFVuaXQpIHtcbiAgICAgIGNhc2UgXCJ5ZWFyc1wiOlxuICAgICAgICBvLm1vbnRoID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcInF1YXJ0ZXJzXCI6XG4gICAgICBjYXNlIFwibW9udGhzXCI6XG4gICAgICAgIG8uZGF5ID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcIndlZWtzXCI6XG4gICAgICBjYXNlIFwiZGF5c1wiOlxuICAgICAgICBvLmhvdXIgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiaG91cnNcIjpcbiAgICAgICAgby5taW51dGUgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwibWludXRlc1wiOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJzZWNvbmRzXCI6XG4gICAgICAgIG8ubWlsbGlzZWNvbmQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIG5vIGRlZmF1bHQsIGludmFsaWQgdW5pdHMgdGhyb3cgaW4gbm9ybWFsaXplVW5pdCgpXG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcIndlZWtzXCIpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcInF1YXJ0ZXJzXCIpIHtcbiAgICAgIHZhciBxID0gTWF0aC5jZWlsKHRoaXMubW9udGggLyAzKTtcbiAgICAgIG8ubW9udGggPSAocSAtIDEpICogMyArIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0KG8pO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAobWVhbmluZyB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3dlZWsnKS50b0lTTygpOyAvLyA9PiAnMjAxNC0wMy0wOVQyMzo1OTo1OS45OTktMDU6MDAnLCB3ZWVrcyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZW5kT2YgPSBmdW5jdGlvbiBlbmRPZih1bml0KSB7XG4gICAgdmFyIF90aGlzJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5wbHVzKChfdGhpcyRwbHVzID0ge30sIF90aGlzJHBsdXNbdW5pdF0gPSAxLCBfdGhpcyRwbHVzKSkuc3RhcnRPZih1bml0KS5taW51cygxKSA6IHRoaXM7XG4gIH0gLy8gT1VUUFVUXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIEZvciBhIHRhYmxlIG9mIHRva2VucyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zLCBzZWUgW2hlcmVdKGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zKS5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLlxuICAgKiBAc2VlIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJywgeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+ICcyMDE3IGF2ci4gMjInXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBkYXRlLiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgdGhlIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3IgYW5kIGFueSBwcmVzZXRzIGRlZmluZWQgYnkgTHV4b24sIHN1Y2ggYXMgYERhdGVUaW1lLkRBVEVfRlVMTGAgb3IgYERhdGVUaW1lLlRJTUVfU0lNUExFYC5cbiAgICogVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIGJyb3dzZXItc3BlY2lmaWMsIGJ1dCBpbiBnZW5lcmFsIGl0IHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBEYXRlVGltZSBpbiB0aGUgYXNzaWduZWQgbG9jYWxlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogJ2VuLWdiJyB9KTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyB3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHVyc2RheSwgQXByaWwgMjAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JywgaG91cjEyOiBmYWxzZSB9KTsgLy89PiAnMTE6MzInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZyhvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IERBVEVfU0hPUlQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLmZvcm1hdERhdGVUaW1lKHRoaXMpIDogSU5WQUxJRCQyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIG1lYW5pbmcgaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVBhcnRzKCk7IC8vPT4gW1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9Mb2NhbGVQYXJ0cyA9IGZ1bmN0aW9uIHRvTG9jYWxlUGFydHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzIwMTcwNDIyVDIwNDcwNS4zMzUtMDQwMCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvSVNPRGF0ZShvcHRzKSArIFwiVFwiICsgdGhpcy50b0lTT1RpbWUob3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZShfdGVtcDMpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmNSRmb3JtYXQgPSBfcmVmNS5mb3JtYXQsXG4gICAgICAgIGZvcm1hdCA9IF9yZWY1JGZvcm1hdCA9PT0gdm9pZCAwID8gXCJleHRlbmRlZFwiIDogX3JlZjUkZm9ybWF0O1xuXG4gICAgdmFyIGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJ5eXl5TU1kZFwiIDogXCJ5eXl5LU1NLWRkXCI7XG5cbiAgICBpZiAodGhpcy55ZWFyID4gOTk5OSkge1xuICAgICAgZm10ID0gXCIrXCIgKyBmbXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBmbXQpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHdlZWsgZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSVNPV2Vla0RhdGUgPSBmdW5jdGlvbiB0b0lTT1dlZWtEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJra2trLSdXJ1dXLWNcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgdGltZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVByZWZpeD1mYWxzZV0gLSBpbmNsdWRlIHRoZSBgVGAgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0IH0pLnRvSVNPVGltZSgpIC8vPT4gJzA3OjM0OjE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQsIHNlY29uZHM6IDAsIG1pbGxpc2Vjb25kczogMCB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMDc6MzRaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0IH0pLnRvSVNPVGltZSh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcwNzM0MTkuMzYxWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBpbmNsdWRlUHJlZml4OiB0cnVlIH0pIC8vPT4gJ1QwNzozNDoxOS4zNjFaJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSVNPVGltZSA9IGZ1bmN0aW9uIHRvSVNPVGltZShfdGVtcDQpIHtcbiAgICB2YXIgX3JlZjYgPSBfdGVtcDQgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA0LFxuICAgICAgICBfcmVmNiRzdXBwcmVzc01pbGxpc2UgPSBfcmVmNi5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmNiRzdXBwcmVzc01pbGxpc2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjYkc3VwcHJlc3NNaWxsaXNlLFxuICAgICAgICBfcmVmNiRzdXBwcmVzc1NlY29uZHMgPSBfcmVmNi5zdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWY2JHN1cHByZXNzU2Vjb25kcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRzdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIF9yZWY2JGluY2x1ZGVPZmZzZXQgPSBfcmVmNi5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjYkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY2JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY2JGluY2x1ZGVQcmVmaXggPSBfcmVmNi5pbmNsdWRlUHJlZml4LFxuICAgICAgICBpbmNsdWRlUHJlZml4ID0gX3JlZjYkaW5jbHVkZVByZWZpeCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRpbmNsdWRlUHJlZml4LFxuICAgICAgICBfcmVmNiRmb3JtYXQgPSBfcmVmNi5mb3JtYXQsXG4gICAgICAgIGZvcm1hdCA9IF9yZWY2JGZvcm1hdCA9PT0gdm9pZCAwID8gXCJleHRlbmRlZFwiIDogX3JlZjYkZm9ybWF0O1xuXG4gICAgcmV0dXJuIHRvVGVjaFRpbWVGb3JtYXQodGhpcywge1xuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBzdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kczogc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICBpbmNsdWRlT2Zmc2V0OiBpbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZVByZWZpeDogaW5jbHVkZVByZWZpeCxcbiAgICAgIGZvcm1hdDogZm9ybWF0XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gUkZDIDI4MjItY29tcGF0aWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSwgYWx3YXlzIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvUkZDMjgyMiA9IGZ1bmN0aW9uIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWlpcIiwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHN0cmluZyBjb25mb3JtcyB0byBSRkMgMTEyMy5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzLCAxOSkudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAxOTowMDowMCBHTVQnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9IVFRQID0gZnVuY3Rpb24gdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1NRTERhdGUgPSBmdW5jdGlvbiB0b1NRTERhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcInl5eXktTU0tZGRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TUUxUaW1lID0gZnVuY3Rpb24gdG9TUUxUaW1lKF90ZW1wNSkge1xuICAgIHZhciBfcmVmNyA9IF90ZW1wNSA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDUsXG4gICAgICAgIF9yZWY3JGluY2x1ZGVPZmZzZXQgPSBfcmVmNy5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjckaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY3JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY3JGluY2x1ZGVab25lID0gX3JlZjcuaW5jbHVkZVpvbmUsXG4gICAgICAgIGluY2x1ZGVab25lID0gX3JlZjckaW5jbHVkZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjckaW5jbHVkZVpvbmU7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBpbmNsdWRlT2Zmc2V0OiBpbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZVpvbmU6IGluY2x1ZGVab25lLFxuICAgICAgc3BhY2Vab25lOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlVGltZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcnJpZGVzIGluY2x1ZGVPZmZzZXQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIC0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCh7IGluY2x1ZGVab25lOiB0cnVlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TUUwgPSBmdW5jdGlvbiB0b1NRTChvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b1NRTERhdGUoKSArIFwiIFwiICsgdGhpcy50b1NRTFRpbWUob3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIHRvTWlsbGlzfVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIHNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1NlY29uZHMgPSBmdW5jdGlvbiB0b1NlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgLyAxMDAwIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQlNPTiBzZXJpYWxpemFibGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0JTT04gPSBmdW5jdGlvbiB0b0JTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9KU0RhdGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEYXRlVGltZSdzIHllYXIsIG1vbnRoLCBkYXksIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLm91dHB1dENhbGVuZGFyID0gdGhpcy5vdXRwdXRDYWxlbmRhcjtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKYXZhU2NyaXB0IERhdGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b0pTRGF0ZSA9IGZ1bmN0aW9uIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfSAvLyBDT01QQVJFXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIGFycmF5IG9mIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xuICAgKiBpMi5kaWZmKGkxKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDQzODA3NTAwMDAwIH1cbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XG4gICAqIGkyLmRpZmYoaTEsIFsnbW9udGhzJywgJ2RheXMnLCAnaG91cnMnXSkudG9PYmplY3QoKSAvLz0+IHsgbW9udGhzOiAxNiwgZGF5czogMTksIGhvdXJzOiAwLjc1IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRpZmYgPSBmdW5jdGlvbiBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQsIG9wdHMpIHtcbiAgICBpZiAodW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgICB1bml0ID0gXCJtaWxsaXNlY29uZHNcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyRGF0ZVRpbWUuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkIHx8IG90aGVyRGF0ZVRpbWUuaW52YWxpZCwgXCJjcmVhdGVkIGJ5IGRpZmZpbmcgYW4gaW52YWxpZCBEYXRlVGltZVwiKTtcbiAgICB9XG5cbiAgICB2YXIgZHVyT3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogdGhpcy5udW1iZXJpbmdTeXN0ZW1cbiAgICB9LCBvcHRzKTtcblxuICAgIHZhciB1bml0cyA9IG1heWJlQXJyYXkodW5pdCkubWFwKER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICAgIGxhdGVyID0gb3RoZXJJc0xhdGVyID8gb3RoZXJEYXRlVGltZSA6IHRoaXMsXG4gICAgICAgIGRpZmZlZCA9IF9kaWZmKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgZHVyT3B0cyk7XG5cbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXG4gICAqIFNlZSB7QGxpbmsgZGlmZn1cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3codW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIG90aGVyIGVuZCBwb2ludCBvZiB0aGUgSW50ZXJ2YWxcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVudGlsID0gZnVuY3Rpb24gdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIHNldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYXNTYW1lID0gZnVuY3Rpb24gaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIHZhciBvdGhlclpvbmVEYXRlVGltZSA9IHRoaXMuc2V0Wm9uZShvdGhlckRhdGVUaW1lLnpvbmUsIHtcbiAgICAgIGtlZXBMb2NhbFRpbWU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb3RoZXJab25lRGF0ZVRpbWUuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gb3RoZXJab25lRGF0ZVRpbWUuZW5kT2YodW5pdCk7XG4gIH1cbiAgLyoqXG4gICAqIEVxdWFsaXR5IGNoZWNrXG4gICAqIFR3byBEYXRlVGltZXMgYXJlIGVxdWFsIGlmZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBtaWxsaXNlY29uZCwgaGF2ZSB0aGUgc2FtZSB6b25lIGFuZCBsb2NhdGlvbiwgYW5kIGFyZSBib3RoIHZhbGlkLlxuICAgKiBUbyBjb21wYXJlIGp1c3QgdGhlIG1pbGxpc2Vjb25kIHZhbHVlcywgdXNlIGArZHQxID09PSArZHQyYC5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXIgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCAmJiBvdGhlci5pc1ZhbGlkICYmIHRoaXMudmFsdWVPZigpID09PSBvdGhlci52YWx1ZU9mKCkgJiYgdGhpcy56b25lLmVxdWFscyhvdGhlci56b25lKSAmJiB0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRoaXMgdGltZSByZWxhdGl2ZSB0byBub3csIHN1Y2ggYXMgXCJpbiB0d28gZGF5c1wiLiBDYW4gb25seSBpbnRlcm5hdGlvbmFsaXplIGlmIHlvdXJcbiAgICogcGxhdGZvcm0gc3VwcG9ydHMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuIFJvdW5kcyBkb3duIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IFtvcHRpb25zLmJhc2U9RGF0ZVRpbWUubm93KCldIC0gdGhlIERhdGVUaW1lIHRvIHVzZSBhcyB0aGUgYmFzaXMgdG8gd2hpY2ggdGhpcyB0aW1lIGlzIGNvbXBhcmVkLiBEZWZhdWx0cyB0byBub3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1cImxvbmdcIl0gLSB0aGUgc3R5bGUgb2YgdW5pdHMsIG11c3QgYmUgXCJsb25nXCIsIFwic2hvcnRcIiwgb3IgXCJuYXJyb3dcIlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gb3B0aW9ucy51bml0IC0gdXNlIGEgc3BlY2lmaWMgdW5pdCBvciBhcnJheSBvZiB1bml0czsgaWYgb21pdHRlZCwgb3IgYW4gYXJyYXksIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSBiZXN0IHVuaXQuIFVzZSBhbiBhcnJheSBvciBvbmUgb2YgXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIG9yIFwic2Vjb25kc1wiXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucm91bmQ9dHJ1ZV0gLSB3aGV0aGVyIHRvIHJvdW5kIHRoZSBudW1iZXJzIGluIHRoZSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5wYWRkaW5nPTBdIC0gcGFkZGluZyBpbiBtaWxsaXNlY29uZHMuIFRoaXMgYWxsb3dzIHlvdSB0byByb3VuZCB1cCB0aGUgcmVzdWx0IGlmIGl0IGZpdHMgaW5zaWRlIHRoZSB0aHJlc2hvbGQuIERvbid0IHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHtyb3VuZDogZmFsc2V9IGJlY2F1c2UgdGhlIGRlY2ltYWwgb3V0cHV0IHdpbGwgaW5jbHVkZSB0aGUgcGFkZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubG9jYWxlIC0gb3ZlcnJpZGUgdGhlIGxvY2FsZSBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJpbiAxIGRheVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZShcImVzXCIpLnRvUmVsYXRpdmUoeyBkYXlzOiAxIH0pIC8vPT4gXCJkZW50cm8gZGUgMSBkw61hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSh7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gXCJkYW5zIDIzIGhldXJlc1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlKCkgLy89PiBcIjIgZGF5cyBhZ29cIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGRheXM6IDIgfSkudG9SZWxhdGl2ZSh7IHVuaXQ6IFwiaG91cnNcIiB9KSAvLz0+IFwiNDggaG91cnMgYWdvXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBob3VyczogMzYgfSkudG9SZWxhdGl2ZSh7IHJvdW5kOiBmYWxzZSB9KSAvLz0+IFwiMS41IGRheXMgYWdvXCJcbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9SZWxhdGl2ZSA9IGZ1bmN0aW9uIHRvUmVsYXRpdmUob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGJhc2UgPSBvcHRpb25zLmJhc2UgfHwgRGF0ZVRpbWUuZnJvbU9iamVjdCh7XG4gICAgICB6b25lOiB0aGlzLnpvbmVcbiAgICB9KSxcbiAgICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyA/IHRoaXMgPCBiYXNlID8gLW9wdGlvbnMucGFkZGluZyA6IG9wdGlvbnMucGFkZGluZyA6IDA7XG4gICAgdmFyIHVuaXRzID0gW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXTtcbiAgICB2YXIgdW5pdCA9IG9wdGlvbnMudW5pdDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudW5pdCkpIHtcbiAgICAgIHVuaXRzID0gb3B0aW9ucy51bml0O1xuICAgICAgdW5pdCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlmZlJlbGF0aXZlKGJhc2UsIHRoaXMucGx1cyhwYWRkaW5nKSwgT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7XG4gICAgICBudW1lcmljOiBcImFsd2F5c1wiLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgdW5pdDogdW5pdFxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRhdGUgcmVsYXRpdmUgdG8gdG9kYXksIHN1Y2ggYXMgXCJ5ZXN0ZXJkYXlcIiBvciBcIm5leHQgbW9udGhcIi5cbiAgICogT25seSBpbnRlcm5hdGlvbmFsaXplcyBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0cyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBvdXRwdXRcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gW29wdGlvbnMuYmFzZT1EYXRlVGltZS5ub3coKV0gLSB0aGUgRGF0ZVRpbWUgdG8gdXNlIGFzIHRoZSBiYXNpcyB0byB3aGljaCB0aGlzIHRpbWUgaXMgY29tcGFyZWQuIERlZmF1bHRzIHRvIG5vdy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubG9jYWxlIC0gb3ZlcnJpZGUgdGhlIGxvY2FsZSBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnVuaXQgLSB1c2UgYSBzcGVjaWZpYyB1bml0OyBpZiBvbWl0dGVkLCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgdW5pdC4gVXNlIG9uZSBvZiBcInllYXJzXCIsIFwicXVhcnRlcnNcIiwgXCJtb250aHNcIiwgXCJ3ZWVrc1wiLCBvciBcImRheXNcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmVDYWxlbmRhcigpIC8vPT4gXCJ0b21vcnJvd1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZShcImVzXCIpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiXCJtYcOxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvUmVsYXRpdmVDYWxlbmRhciA9IGZ1bmN0aW9uIHRvUmVsYXRpdmVDYWxlbmRhcihvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGlmZlJlbGF0aXZlKG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHtcbiAgICAgIHpvbmU6IHRoaXMuem9uZVxuICAgIH0pLCB0aGlzLCBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtcbiAgICAgIG51bWVyaWM6IFwiYXV0b1wiLFxuICAgICAgdW5pdHM6IFtcInllYXJzXCIsIFwibW9udGhzXCIsIFwiZGF5c1wiXSxcbiAgICAgIGNhbGVuZGFyeTogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgO1xuXG4gIERhdGVUaW1lLm1pbiA9IGZ1bmN0aW9uIG1pbigpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGlmICghZGF0ZVRpbWVzLmV2ZXJ5KERhdGVUaW1lLmlzRGF0ZVRpbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJtaW4gcmVxdWlyZXMgYWxsIGFyZ3VtZW50cyBiZSBEYXRlVGltZXNcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RCeShkYXRlVGltZXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaS52YWx1ZU9mKCk7XG4gICAgfSwgTWF0aC5taW4pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWF4aW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUubWF4ID0gZnVuY3Rpb24gbWF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfSAvLyBNSVNDXG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4gPSBmdW5jdGlvbiBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgX29wdGlvbnMkbG9jYWxlID0gX29wdGlvbnMubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRsb2NhbGUsXG4gICAgICAgIF9vcHRpb25zJG51bWJlcmluZ1N5cyA9IF9vcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkbnVtYmVyaW5nU3lzLFxuICAgICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgZGVmYXVsdFRvRU46IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0RXhwbGFpbiBpbnN0ZWFkXG4gICAqL1xuICA7XG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH0gLy8gRk9STUFUIFBSRVNFVFNcblxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICA7XG5cbiAgX2NyZWF0ZUNsYXNzKERhdGVUaW1lLCBbe1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkUmVhc29uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRFeHBsYW5hdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbG9jYWxlIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2VuLUdCJy4gVGhlIGxvY2FsZSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3V0cHV0IGNhbGVuZGFyIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2lzbGFtaWMnLiBUaGUgb3V0cHV0IGNhbGVuZGFyIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm91dHB1dENhbGVuZGFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRpbWUgem9uZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBEYXRlVGltZS5cbiAgICAgKiBAdHlwZSB7Wm9uZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInpvbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgem9uZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiem9uZU5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgeWVhclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ5ZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcXVhcnRlclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5xdWFydGVyIC8vPT4gMlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJxdWFydGVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gTWF0aC5jZWlsKHRoaXMuYy5tb250aCAvIDMpIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkubW9udGggLy89PiA1XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggKDEtMzBpc2gpLlxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhvdXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuaG91ciA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCkubWludXRlIC8vPT4gMzBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibWludXRlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkuXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaWxsaXNlY29uZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taWxsaXNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3ZWVrIHllYXJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMiwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLndlZWtOdW1iZXIgLy89PiAyMVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgd2Vlay5cbiAgICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtkYXkgLy89PiA0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtkYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JkaW5hbCAobWVhbmluZyB0aGUgZGF5IG9mIHRoZSB5ZWFyKVxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XG4gICAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9yZGluYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aFNob3J0IC8vPT4gT2N0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoU2hvcnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcInNob3J0XCIsIHtcbiAgICAgICAgbG9jT2JqOiB0aGlzLmxvY1xuICAgICAgfSlbdGhpcy5tb250aCAtIDFdIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aExvbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcImxvbmdcIiwge1xuICAgICAgICBsb2NPYmo6IHRoaXMubG9jXG4gICAgICB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IHdlZWtkYXksIHN1Y2ggYXMgJ01vbicuXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcInNob3J0XCIsIHtcbiAgICAgICAgbG9jT2JqOiB0aGlzLmxvY1xuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlMb25nIC8vPT4gTW9uZGF5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtkYXlMb25nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcImxvbmdcIiwge1xuICAgICAgICBsb2NPYmo6IHRoaXMubG9jXG4gICAgICB9KVt0aGlzLndlZWtkYXkgLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5vZmZzZXQgLy89PiAtMjQwXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZzZXRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyArdGhpcy5vIDogTmFOO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0TmFtZVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZzZXROYW1lTG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogXCJsb25nXCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgd2hldGhlciB0aGlzIHpvbmUncyBvZmZzZXQgZXZlciBjaGFuZ2VzLCBhcyBpbiBhIERTVC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzT2Zmc2V0Rml4ZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUudW5pdmVyc2FsIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgdGhlIERhdGVUaW1lIGlzIGluIGEgRFNULlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkRTVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7XG4gICAgICAgICAgbW9udGg6IDFcbiAgICAgICAgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoe1xuICAgICAgICAgIG1vbnRoOiA1XG4gICAgICAgIH0pLm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW4gYSBsZWFwIHllYXIsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkxlYXBZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAyKS5kYXlzSW5Nb250aCAvLz0+IDI5XG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlzSW5Nb250aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmRheXNJblllYXIgLy89PiAzNjVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c0luWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGRheXNJblllYXIodGhpcy55ZWFyKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdlZWtzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS53ZWVrc0luV2Vla1llYXIgLy89PiA1MlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrc0luV2Vla1llYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiREFURV9TSE9SVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfU0hPUlQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MydcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURV9NRURcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX01FRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCBPY3QgMTQsIDE5ODMnXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVfTUVEX1dJVEhfV0VFS0RBWVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfTUVEX1dJVEhfV0VFS0RBWTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MydcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURV9GVUxMXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURV9GVUxMO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdUdWVzZGF5LCBPY3RvYmVyIDE0LCAxOTgzJ1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX0hVR0VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX0hVR0U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfU0lNUExFXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9TSU1QTEU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9MT05HX09GRlNFVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAnLCBhbHdheXMgMjQtaG91ci5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9TSU1QTEVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1NJTVBMRTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMnLCBhbHdheXMgMjQtaG91ci5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX1NIT1JUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfTUVEXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfTUVEX1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgMTQgT2N0IDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0ZVTExcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9GVUxMO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0hVR0VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERhdGVUaW1lO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoRGF0ZVRpbWUuaXNEYXRlVGltZShkYXRlVGltZWlzaCkpIHtcbiAgICByZXR1cm4gZGF0ZVRpbWVpc2g7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgZGF0ZVRpbWVpc2gudmFsdWVPZiAmJiBpc051bWJlcihkYXRlVGltZWlzaC52YWx1ZU9mKCkpKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIHR5cGVvZiBkYXRlVGltZWlzaCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tT2JqZWN0KGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiBcIiArIGRhdGVUaW1laXNoICsgXCIsIG9mIHR5cGUgXCIgKyB0eXBlb2YgZGF0ZVRpbWVpc2gpO1xuICB9XG59XG5cbnZhciBWRVJTSU9OID0gXCIxLjI4LjBcIjtcblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5GaXhlZE9mZnNldFpvbmUgPSBGaXhlZE9mZnNldFpvbmU7XG5leHBvcnRzLklBTkFab25lID0gSUFOQVpvbmU7XG5leHBvcnRzLkluZm8gPSBJbmZvO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbnZhbGlkWm9uZSA9IEludmFsaWRab25lO1xuZXhwb3J0cy5Mb2NhbFpvbmUgPSBMb2NhbFpvbmU7XG5leHBvcnRzLlNldHRpbmdzID0gU2V0dGluZ3M7XG5leHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OO1xuZXhwb3J0cy5ab25lID0gWm9uZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWx1eG9uLmpzLm1hcFxuIiwiaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG52YXIgRGF0ZVdpdGhab25lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVXaXRoWm9uZShkYXRlLCB0emlkKSB7XG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMudHppZCA9IHR6aWQ7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRlV2l0aFpvbmUucHJvdG90eXBlLCBcImlzVVRDXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMudHppZCB8fCB0aGlzLnR6aWQudG9VcHBlckNhc2UoKSA9PT0gJ1VUQyc7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERhdGVXaXRoWm9uZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRlc3RyID0gZGF0ZXV0aWwudGltZVRvVW50aWxTdHJpbmcodGhpcy5kYXRlLmdldFRpbWUoKSwgdGhpcy5pc1VUQyk7XG4gICAgICAgIGlmICghdGhpcy5pc1VUQykge1xuICAgICAgICAgICAgcmV0dXJuIFwiO1RaSUQ9XCIgKyB0aGlzLnR6aWQgKyBcIjpcIiArIGRhdGVzdHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiOlwiICsgZGF0ZXN0cjtcbiAgICB9O1xuICAgIERhdGVXaXRoWm9uZS5wcm90b3R5cGUuZ2V0VGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZS5nZXRUaW1lKCk7XG4gICAgfTtcbiAgICBEYXRlV2l0aFpvbmUucHJvdG90eXBlLnJlem9uZWREYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc1VUQykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGRhdGV0aW1lID0gRGF0ZVRpbWVcbiAgICAgICAgICAgICAgICAuZnJvbUpTRGF0ZSh0aGlzLmRhdGUpO1xuICAgICAgICAgICAgdmFyIHJlem9uZWQgPSBkYXRldGltZS5zZXRab25lKHRoaXMudHppZCwgeyBrZWVwTG9jYWxUaW1lOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlem9uZWQudG9KU0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVc2luZyBUWklEIHdpdGhvdXQgTHV4b24gYXZhaWxhYmxlIGlzIHVuc3VwcG9ydGVkLiBSZXR1cm5lZCB0aW1lcyBhcmUgaW4gVVRDLCBub3QgdGhlIHJlcXVlc3RlZCB0aW1lIHpvbmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEYXRlV2l0aFpvbmU7XG59KCkpO1xuZXhwb3J0IHsgRGF0ZVdpdGhab25lIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRld2l0aHpvbmUuanMubWFwIiwiaW1wb3J0IFJSdWxlLCB7IERFRkFVTFRfT1BUSU9OUyB9IGZyb20gJy4vcnJ1bGUnO1xuaW1wb3J0IHsgaW5jbHVkZXMsIGlzUHJlc2VudCwgaXNBcnJheSwgaXNOdW1iZXIsIHRvQXJyYXkgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgV2Vla2RheSB9IGZyb20gJy4vd2Vla2RheSc7XG5pbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBEYXRlV2l0aFpvbmUgfSBmcm9tICcuL2RhdGV3aXRoem9uZSc7XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uc1RvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgcnJ1bGUgPSBbXTtcbiAgICB2YXIgZHRzdGFydCA9ICcnO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgdmFyIGRlZmF1bHRLZXlzID0gT2JqZWN0LmtleXMoREVGQVVMVF9PUFRJT05TKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGtleXNbaV0gPT09ICd0emlkJylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWluY2x1ZGVzKGRlZmF1bHRLZXlzLCBrZXlzW2ldKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBvcHRpb25zW2tleXNbaV1dO1xuICAgICAgICB2YXIgb3V0VmFsdWUgPSAnJztcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodmFsdWUpIHx8IChpc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnRlJFUSc6XG4gICAgICAgICAgICAgICAgb3V0VmFsdWUgPSBSUnVsZS5GUkVRVUVOQ0lFU1tvcHRpb25zLmZyZXFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnV0tTVCc6XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSA9IG5ldyBXZWVrZGF5KHZhbHVlKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JZV0VFS0RBWSc6XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBOT1RFOiBCWVdFRUtEQVkgaXMgYSBzcGVjaWFsIGNhc2UuXG4gICAgICAgICAgICAgICAgUlJ1bGUoKSBkZWNvbnN0cnVjdHMgdGhlIHJ1bGUub3B0aW9ucy5ieXdlZWtkYXkgYXJyYXlcbiAgICAgICAgICAgICAgICBpbnRvIGFuIGFycmF5IG9mIFdlZWtkYXkgYXJndW1lbnRzLlxuICAgICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCBydWxlLm9yaWdPcHRpb25zIGlzIGFuIGFycmF5IG9mIFdlZWtkYXlzLlxuICAgICAgICAgICAgICAgIFdlIG5lZWQgdG8gaGFuZGxlIGJvdGggY2FzZXMgaGVyZS5cbiAgICAgICAgICAgICAgICBJdCBtaWdodCBiZSB3b3J0aCBjaGFuZ2UgUlJ1bGUgdG8ga2VlcCB0aGUgV2Vla2RheXMuXG4gICAgICBcbiAgICAgICAgICAgICAgICBBbHNvLCBCWVdFRUtEQVkgKHVzZWQgYnkgUlJ1bGUpIHZzLiBCWURBWSAoUkZDKVxuICAgICAgXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBrZXkgPSAnQllEQVknO1xuICAgICAgICAgICAgICAgIG91dFZhbHVlID0gdG9BcnJheSh2YWx1ZSkubWFwKGZ1bmN0aW9uICh3ZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3ZGF5IGluc3RhbmNlb2YgV2Vla2RheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdkYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkod2RheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2Vla2RheSh3ZGF5WzBdLCB3ZGF5WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlZWtkYXkod2RheSk7XG4gICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RUU1RBUlQnOlxuICAgICAgICAgICAgICAgIGR0c3RhcnQgPSBidWlsZER0c3RhcnQodmFsdWUsIG9wdGlvbnMudHppZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdVTlRJTCc6XG4gICAgICAgICAgICAgICAgb3V0VmFsdWUgPSBkYXRldXRpbC50aW1lVG9VbnRpbFN0cmluZyh2YWx1ZSwgIW9wdGlvbnMudHppZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0clZhbHVlc1tqXSA9IFN0cmluZyh2YWx1ZVtqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUgPSBzdHJWYWx1ZXMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dFZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dFZhbHVlKSB7XG4gICAgICAgICAgICBycnVsZS5wdXNoKFtrZXksIG91dFZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJ1bGVzID0gcnJ1bGUubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHJldHVybiBrZXkgKyBcIj1cIiArIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSkuam9pbignOycpO1xuICAgIHZhciBydWxlU3RyaW5nID0gJyc7XG4gICAgaWYgKHJ1bGVzICE9PSAnJykge1xuICAgICAgICBydWxlU3RyaW5nID0gXCJSUlVMRTpcIiArIHJ1bGVzO1xuICAgIH1cbiAgICByZXR1cm4gW2R0c3RhcnQsIHJ1bGVTdHJpbmddLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gISF4OyB9KS5qb2luKCdcXG4nKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRHRzdGFydChkdHN0YXJ0LCB0emlkKSB7XG4gICAgaWYgKCFkdHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuICdEVFNUQVJUJyArIG5ldyBEYXRlV2l0aFpvbmUobmV3IERhdGUoZHRzdGFydCksIHR6aWQpLnRvU3RyaW5nKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcHRpb25zdG9zdHJpbmcuanMubWFwIiwiaW1wb3J0IEl0ZXJSZXN1bHQgZnJvbSAnLi9pdGVycmVzdWx0JztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL2hlbHBlcnMnO1xudmFyIENhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhY2hlKCkge1xuICAgICAgICB0aGlzLmFsbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJlZm9yZSA9IFtdO1xuICAgICAgICB0aGlzLmFmdGVyID0gW107XG4gICAgICAgIHRoaXMuYmV0d2VlbiA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2hhdCAtIGFsbC9iZWZvcmUvYWZ0ZXIvYmV0d2VlblxuICAgICAqIEBwYXJhbSB7QXJyYXksRGF0ZX0gdmFsdWUgLSBhbiBhcnJheSBvZiBkYXRlcywgb25lIGRhdGUsIG9yIG51bGxcbiAgICAgKiBAcGFyYW0ge09iamVjdD99IGFyZ3MgLSBfaXRlciBhcmd1bWVudHNcbiAgICAgKi9cbiAgICBDYWNoZS5wcm90b3R5cGUuX2NhY2hlQWRkID0gZnVuY3Rpb24gKHdoYXQsIHZhbHVlLCBhcmdzKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IGRhdGV1dGlsLmNsb25lKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGRhdGV1dGlsLmNsb25lRGF0ZXModmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aGF0ID09PSAnYWxsJykge1xuICAgICAgICAgICAgdGhpcy5hbGwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3MuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzW3doYXRdLnB1c2goYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gZmFsc2UgLSBub3QgaW4gdGhlIGNhY2hlXG4gICAgICogICAgICAgICBudWxsICAtIGNhY2hlZCwgYnV0IHplcm8gb2NjdXJyZW5jZXMgKGJlZm9yZS9hZnRlcilcbiAgICAgKiAgICAgICAgIERhdGUgIC0gY2FjaGVkIChiZWZvcmUvYWZ0ZXIpXG4gICAgICogICAgICAgICBbXSAgICAtIGNhY2hlZCwgYnV0IHplcm8gb2NjdXJyZW5jZXMgKGFsbC9iZXR3ZWVuKVxuICAgICAqICAgICAgICAgW0RhdGUxLCBEYXRlTl0gLSBjYWNoZWQgKGFsbC9iZXR3ZWVuKVxuICAgICAqL1xuICAgIENhY2hlLnByb3RvdHlwZS5fY2FjaGVHZXQgPSBmdW5jdGlvbiAod2hhdCwgYXJncykge1xuICAgICAgICB2YXIgY2FjaGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBhcmdzS2V5cyA9IGFyZ3MgPyBPYmplY3Qua2V5cyhhcmdzKSA6IFtdO1xuICAgICAgICB2YXIgZmluZENhY2hlRGlmZiA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGFyZ3NLZXlzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoYXJnc1trZXldKSAhPT0gU3RyaW5nKGl0ZW1ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY2FjaGVkT2JqZWN0ID0gdGhpc1t3aGF0XTtcbiAgICAgICAgaWYgKHdoYXQgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSB0aGlzLmFsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KGNhY2hlZE9iamVjdCkpIHtcbiAgICAgICAgICAgIC8vIExldCdzIHNlZSB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgY2FsbGVkIHRoZVxuICAgICAgICAgICAgLy8gJ3doYXQnIG1ldGhvZCB3aXRoIHRoZSBzYW1lICdhcmdzJ1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZWRPYmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGNhY2hlZE9iamVjdFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc0tleXMubGVuZ3RoICYmIGZpbmRDYWNoZURpZmYoaXRlbSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhY2hlZCA9IGl0ZW0uX3ZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2FjaGVkICYmIHRoaXMuYWxsKSB7XG4gICAgICAgICAgICAvLyBOb3QgaW4gdGhlIGNhY2hlLCBidXQgd2UgYWxyZWFkeSBrbm93IGFsbCB0aGUgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gZmluZCB0aGUgY29ycmVjdCBkYXRlcyBmcm9tIHRoZSBjYWNoZWQgb25lcy5cbiAgICAgICAgICAgIHZhciBpdGVyUmVzdWx0ID0gbmV3IEl0ZXJSZXN1bHQod2hhdCwgYXJncyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpdGVyUmVzdWx0LmFjY2VwdCh0aGlzLmFsbFtpXSkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGVkID0gaXRlclJlc3VsdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVBZGQod2hhdCwgY2FjaGVkLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheShjYWNoZWQpXG4gICAgICAgICAgICA/IGRhdGV1dGlsLmNsb25lRGF0ZXMoY2FjaGVkKVxuICAgICAgICAgICAgOiBjYWNoZWQgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgICAgICAgPyBkYXRldXRpbC5jbG9uZShjYWNoZWQpXG4gICAgICAgICAgICAgICAgOiBjYWNoZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FjaGU7XG59KCkpO1xuZXhwb3J0IHsgQ2FjaGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhY2hlLmpzLm1hcCIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByYW5nZSwgcmVwZWF0IH0gZnJvbSAnLi9oZWxwZXJzJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRlIG1hc2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXZlcnkgbWFzayBpcyA3IGRheXMgbG9uZ2VyIHRvIGhhbmRsZSBjcm9zcy15ZWFyIHdlZWtseSBwZXJpb2RzLlxudmFyIE0zNjVNQVNLID0gX19zcHJlYWRBcnJheXMocmVwZWF0KDEsIDMxKSwgcmVwZWF0KDIsIDI4KSwgcmVwZWF0KDMsIDMxKSwgcmVwZWF0KDQsIDMwKSwgcmVwZWF0KDUsIDMxKSwgcmVwZWF0KDYsIDMwKSwgcmVwZWF0KDcsIDMxKSwgcmVwZWF0KDgsIDMxKSwgcmVwZWF0KDksIDMwKSwgcmVwZWF0KDEwLCAzMSksIHJlcGVhdCgxMSwgMzApLCByZXBlYXQoMTIsIDMxKSwgcmVwZWF0KDEsIDcpKTtcbnZhciBNMzY2TUFTSyA9IF9fc3ByZWFkQXJyYXlzKHJlcGVhdCgxLCAzMSksIHJlcGVhdCgyLCAyOSksIHJlcGVhdCgzLCAzMSksIHJlcGVhdCg0LCAzMCksIHJlcGVhdCg1LCAzMSksIHJlcGVhdCg2LCAzMCksIHJlcGVhdCg3LCAzMSksIHJlcGVhdCg4LCAzMSksIHJlcGVhdCg5LCAzMCksIHJlcGVhdCgxMCwgMzEpLCByZXBlYXQoMTEsIDMwKSwgcmVwZWF0KDEyLCAzMSksIHJlcGVhdCgxLCA3KSk7XG52YXIgTTI4ID0gcmFuZ2UoMSwgMjkpO1xudmFyIE0yOSA9IHJhbmdlKDEsIDMwKTtcbnZhciBNMzAgPSByYW5nZSgxLCAzMSk7XG52YXIgTTMxID0gcmFuZ2UoMSwgMzIpO1xudmFyIE1EQVkzNjZNQVNLID0gX19zcHJlYWRBcnJheXMoTTMxLCBNMjksIE0zMSwgTTMwLCBNMzEsIE0zMCwgTTMxLCBNMzEsIE0zMCwgTTMxLCBNMzAsIE0zMSwgTTMxLnNsaWNlKDAsIDcpKTtcbnZhciBNREFZMzY1TUFTSyA9IF9fc3ByZWFkQXJyYXlzKE0zMSwgTTI4LCBNMzEsIE0zMCwgTTMxLCBNMzAsIE0zMSwgTTMxLCBNMzAsIE0zMSwgTTMwLCBNMzEsIE0zMS5zbGljZSgwLCA3KSk7XG52YXIgTk0yOCA9IHJhbmdlKC0yOCwgMCk7XG52YXIgTk0yOSA9IHJhbmdlKC0yOSwgMCk7XG52YXIgTk0zMCA9IHJhbmdlKC0zMCwgMCk7XG52YXIgTk0zMSA9IHJhbmdlKC0zMSwgMCk7XG52YXIgTk1EQVkzNjZNQVNLID0gX19zcHJlYWRBcnJheXMoTk0zMSwgTk0yOSwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMS5zbGljZSgwLCA3KSk7XG52YXIgTk1EQVkzNjVNQVNLID0gX19zcHJlYWRBcnJheXMoTk0zMSwgTk0yOCwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMCwgTk0zMSwgTk0zMS5zbGljZSgwLCA3KSk7XG52YXIgTTM2NlJBTkdFID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LCAzNjZdO1xudmFyIE0zNjVSQU5HRSA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1XTtcbnZhciBXREFZTUFTSyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHdkYXltYXNrID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1NTsgaSsrKVxuICAgICAgICB3ZGF5bWFzayA9IHdkYXltYXNrLmNvbmNhdChyYW5nZSg3KSk7XG4gICAgcmV0dXJuIHdkYXltYXNrO1xufSkoKTtcbmV4cG9ydCB7IFdEQVlNQVNLLCBNMzY1TUFTSywgTTM2NVJBTkdFLCBNMzY2TUFTSywgTTM2NlJBTkdFLCBNREFZMzY1TUFTSywgTURBWTM2Nk1BU0ssIE5NREFZMzY1TUFTSywgTk1EQVkzNjZNQVNLIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXNrcy5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4uL2RhdGV1dGlsJztcbmltcG9ydCB7IGVtcHR5LCByZXBlYXQsIHB5bW9kLCBpbmNsdWRlcyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgTTM2NU1BU0ssIE1EQVkzNjVNQVNLLCBOTURBWTM2NU1BU0ssIFdEQVlNQVNLLCBNMzY1UkFOR0UsIE0zNjZNQVNLLCBNREFZMzY2TUFTSywgTk1EQVkzNjZNQVNLLCBNMzY2UkFOR0UgfSBmcm9tICcuLi9tYXNrcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVidWlsZFllYXIoeWVhciwgb3B0aW9ucykge1xuICAgIHZhciBmaXJzdHlkYXkgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCAwLCAxKSk7XG4gICAgdmFyIHllYXJsZW4gPSBkYXRldXRpbC5pc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIHZhciBuZXh0eWVhcmxlbiA9IGRhdGV1dGlsLmlzTGVhcFllYXIoeWVhciArIDEpID8gMzY2IDogMzY1O1xuICAgIHZhciB5ZWFyb3JkaW5hbCA9IGRhdGV1dGlsLnRvT3JkaW5hbChmaXJzdHlkYXkpO1xuICAgIHZhciB5ZWFyd2Vla2RheSA9IGRhdGV1dGlsLmdldFdlZWtkYXkoZmlyc3R5ZGF5KTtcbiAgICB2YXIgcmVzdWx0ID0gX19hc3NpZ24oX19hc3NpZ24oeyB5ZWFybGVuOiB5ZWFybGVuLFxuICAgICAgICBuZXh0eWVhcmxlbjogbmV4dHllYXJsZW4sXG4gICAgICAgIHllYXJvcmRpbmFsOiB5ZWFyb3JkaW5hbCxcbiAgICAgICAgeWVhcndlZWtkYXk6IHllYXJ3ZWVrZGF5IH0sIGJhc2VZZWFyTWFza3MoeWVhcikpLCB7IHdub21hc2s6IG51bGwgfSk7XG4gICAgaWYgKGVtcHR5KG9wdGlvbnMuYnl3ZWVrbm8pKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJlc3VsdC53bm9tYXNrID0gcmVwZWF0KDAsIHllYXJsZW4gKyA3KTtcbiAgICB2YXIgZmlyc3R3a3N0O1xuICAgIHZhciB3eWVhcmxlbjtcbiAgICB2YXIgbm8xd2tzdCA9IGZpcnN0d2tzdCA9IHB5bW9kKDcgLSB5ZWFyd2Vla2RheSArIG9wdGlvbnMud2tzdCwgNyk7XG4gICAgaWYgKG5vMXdrc3QgPj0gNCkge1xuICAgICAgICBubzF3a3N0ID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIGRheXMgaW4gdGhlIHllYXIsIHBsdXMgdGhlIGRheXMgd2UgZ290XG4gICAgICAgIC8vIGZyb20gbGFzdCB5ZWFyLlxuICAgICAgICB3eWVhcmxlbiA9XG4gICAgICAgICAgICByZXN1bHQueWVhcmxlbiArIHB5bW9kKHllYXJ3ZWVrZGF5IC0gb3B0aW9ucy53a3N0LCA3KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE51bWJlciBvZiBkYXlzIGluIHRoZSB5ZWFyLCBtaW51cyB0aGUgZGF5cyB3ZVxuICAgICAgICAvLyBsZWZ0IGluIGxhc3QgeWVhci5cbiAgICAgICAgd3llYXJsZW4gPSB5ZWFybGVuIC0gbm8xd2tzdDtcbiAgICB9XG4gICAgdmFyIGRpdiA9IE1hdGguZmxvb3Iod3llYXJsZW4gLyA3KTtcbiAgICB2YXIgbW9kID0gcHltb2Qod3llYXJsZW4sIDcpO1xuICAgIHZhciBudW13ZWVrcyA9IE1hdGguZmxvb3IoZGl2ICsgbW9kIC8gNCk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcHRpb25zLmJ5d2Vla25vLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBuID0gb3B0aW9ucy5ieXdlZWtub1tqXTtcbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICBuICs9IG51bXdlZWtzICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShuID4gMCAmJiBuIDw9IG51bXdlZWtzKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgICAgIGlmIChuID4gMSkge1xuICAgICAgICAgICAgaSA9IG5vMXdrc3QgKyAobiAtIDEpICogNztcbiAgICAgICAgICAgIGlmIChubzF3a3N0ICE9PSBmaXJzdHdrc3QpIHtcbiAgICAgICAgICAgICAgICBpIC09IDcgLSBmaXJzdHdrc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpID0gbm8xd2tzdDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IDc7IGsrKykge1xuICAgICAgICAgICAgcmVzdWx0Lndub21hc2tbaV0gPSAxO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC53ZGF5bWFza1tpXSA9PT0gb3B0aW9ucy53a3N0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbmNsdWRlcyhvcHRpb25zLmJ5d2Vla25vLCAxKSkge1xuICAgICAgICAvLyBDaGVjayB3ZWVrIG51bWJlciAxIG9mIG5leHQgeWVhciBhcyB3ZWxsXG4gICAgICAgIC8vIG9yaWctVE9ETyA6IENoZWNrIC1udW13ZWVrcyBmb3IgbmV4dCB5ZWFyLlxuICAgICAgICB2YXIgaSA9IG5vMXdrc3QgKyBudW13ZWVrcyAqIDc7XG4gICAgICAgIGlmIChubzF3a3N0ICE9PSBmaXJzdHdrc3QpXG4gICAgICAgICAgICBpIC09IDcgLSBmaXJzdHdrc3Q7XG4gICAgICAgIGlmIChpIDwgeWVhcmxlbikge1xuICAgICAgICAgICAgLy8gSWYgd2VlayBzdGFydHMgaW4gbmV4dCB5ZWFyLCB3ZVxuICAgICAgICAgICAgLy8gZG9uJ3QgY2FyZSBhYm91dCBpdC5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lndub21hc2tbaV0gPSAxO1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndkYXltYXNrW2ldID09PSBvcHRpb25zLndrc3QpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChubzF3a3N0KSB7XG4gICAgICAgIC8vIENoZWNrIGxhc3Qgd2VlayBudW1iZXIgb2YgbGFzdCB5ZWFyIGFzXG4gICAgICAgIC8vIHdlbGwuIElmIG5vMXdrc3QgaXMgMCwgZWl0aGVyIHRoZSB5ZWFyXG4gICAgICAgIC8vIHN0YXJ0ZWQgb24gd2VlayBzdGFydCwgb3Igd2VlayBudW1iZXIgMVxuICAgICAgICAvLyBnb3QgZGF5cyBmcm9tIGxhc3QgeWVhciwgc28gdGhlcmUgYXJlIG5vXG4gICAgICAgIC8vIGRheXMgZnJvbSBsYXN0IHllYXIncyBsYXN0IHdlZWsgbnVtYmVyIGluXG4gICAgICAgIC8vIHRoaXMgeWVhci5cbiAgICAgICAgdmFyIGxudW13ZWVrcyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhvcHRpb25zLmJ5d2Vla25vLCAtMSkpIHtcbiAgICAgICAgICAgIHZhciBseWVhcndlZWtkYXkgPSBkYXRldXRpbC5nZXRXZWVrZGF5KG5ldyBEYXRlKERhdGUuVVRDKHllYXIgLSAxLCAwLCAxKSkpO1xuICAgICAgICAgICAgdmFyIGxubzF3a3N0ID0gcHltb2QoNyAtIGx5ZWFyd2Vla2RheS52YWx1ZU9mKCkgKyBvcHRpb25zLndrc3QsIDcpO1xuICAgICAgICAgICAgdmFyIGx5ZWFybGVuID0gZGF0ZXV0aWwuaXNMZWFwWWVhcih5ZWFyIC0gMSkgPyAzNjYgOiAzNjU7XG4gICAgICAgICAgICB2YXIgd2Vla3N0ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGxubzF3a3N0ID49IDQpIHtcbiAgICAgICAgICAgICAgICBsbm8xd2tzdCA9IDA7XG4gICAgICAgICAgICAgICAgd2Vla3N0ID0gbHllYXJsZW4gKyBweW1vZChseWVhcndlZWtkYXkgLSBvcHRpb25zLndrc3QsIDcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2Vla3N0ID0geWVhcmxlbiAtIG5vMXdrc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsbnVtd2Vla3MgPSBNYXRoLmZsb29yKDUyICsgcHltb2Qod2Vla3N0LCA3KSAvIDQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG51bXdlZWtzID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKG9wdGlvbnMuYnl3ZWVrbm8sIGxudW13ZWVrcykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm8xd2tzdDsgaSsrKVxuICAgICAgICAgICAgICAgIHJlc3VsdC53bm9tYXNrW2ldID0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYmFzZVllYXJNYXNrcyh5ZWFyKSB7XG4gICAgdmFyIHllYXJsZW4gPSBkYXRldXRpbC5pc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIHZhciBmaXJzdHlkYXkgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCAwLCAxKSk7XG4gICAgdmFyIHdkYXkgPSBkYXRldXRpbC5nZXRXZWVrZGF5KGZpcnN0eWRheSk7XG4gICAgaWYgKHllYXJsZW4gPT09IDM2NSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW1hc2s6IE0zNjVNQVNLLFxuICAgICAgICAgICAgbWRheW1hc2s6IE1EQVkzNjVNQVNLLFxuICAgICAgICAgICAgbm1kYXltYXNrOiBOTURBWTM2NU1BU0ssXG4gICAgICAgICAgICB3ZGF5bWFzazogV0RBWU1BU0suc2xpY2Uod2RheSksXG4gICAgICAgICAgICBtcmFuZ2U6IE0zNjVSQU5HRVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtbWFzazogTTM2Nk1BU0ssXG4gICAgICAgIG1kYXltYXNrOiBNREFZMzY2TUFTSyxcbiAgICAgICAgbm1kYXltYXNrOiBOTURBWTM2Nk1BU0ssXG4gICAgICAgIHdkYXltYXNrOiBXREFZTUFTSy5zbGljZSh3ZGF5KSxcbiAgICAgICAgbXJhbmdlOiBNMzY2UkFOR0VcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eWVhcmluZm8uanMubWFwIiwiaW1wb3J0IFJSdWxlIGZyb20gJy4uL3JydWxlJztcbmltcG9ydCB7IGVtcHR5LCByZXBlYXQsIHB5bW9kIH0gZnJvbSAnLi4vaGVscGVycyc7XG5leHBvcnQgZnVuY3Rpb24gcmVidWlsZE1vbnRoKHllYXIsIG1vbnRoLCB5ZWFybGVuLCBtcmFuZ2UsIHdkYXltYXNrLCBvcHRpb25zKSB7XG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgbGFzdHllYXI6IHllYXIsXG4gICAgICAgIGxhc3Rtb250aDogbW9udGgsXG4gICAgICAgIG53ZGF5bWFzazogW11cbiAgICB9O1xuICAgIHZhciByYW5nZXMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5mcmVxID09PSBSUnVsZS5ZRUFSTFkpIHtcbiAgICAgICAgaWYgKGVtcHR5KG9wdGlvbnMuYnltb250aCkpIHtcbiAgICAgICAgICAgIHJhbmdlcyA9IFtbMCwgeWVhcmxlbl1dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcHRpb25zLmJ5bW9udGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBtb250aCA9IG9wdGlvbnMuYnltb250aFtqXTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChtcmFuZ2Uuc2xpY2UobW9udGggLSAxLCBtb250aCArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmZyZXEgPT09IFJSdWxlLk1PTlRITFkpIHtcbiAgICAgICAgcmFuZ2VzID0gW21yYW5nZS5zbGljZShtb250aCAtIDEsIG1vbnRoICsgMSldO1xuICAgIH1cbiAgICBpZiAoZW1wdHkocmFuZ2VzKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBXZWVrbHkgZnJlcXVlbmN5IHdvbid0IGdldCBoZXJlLCBzbyB3ZSBtYXkgbm90XG4gICAgLy8gY2FyZSBhYm91dCBjcm9zcy15ZWFyIHdlZWtseSBwZXJpb2RzLlxuICAgIHJlc3VsdC5ud2RheW1hc2sgPSByZXBlYXQoMCwgeWVhcmxlbik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByYW5nZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHJhbmcgPSByYW5nZXNbal07XG4gICAgICAgIHZhciBmaXJzdCA9IHJhbmdbMF07XG4gICAgICAgIHZhciBsYXN0ID0gcmFuZ1sxXSAtIDE7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3B0aW9ucy5ieW53ZWVrZGF5Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBfYSA9IG9wdGlvbnMuYnlud2Vla2RheVtrXSwgd2RheSA9IF9hWzBdLCBuID0gX2FbMV07XG4gICAgICAgICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgICAgICAgICBpID0gbGFzdCArIChuICsgMSkgKiA3O1xuICAgICAgICAgICAgICAgIGkgLT0gcHltb2Qod2RheW1hc2tbaV0gLSB3ZGF5LCA3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgPSBmaXJzdCArIChuIC0gMSkgKiA3O1xuICAgICAgICAgICAgICAgIGkgKz0gcHltb2QoNyAtIHdkYXltYXNrW2ldICsgd2RheSwgNyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3QgPD0gaSAmJiBpIDw9IGxhc3QpXG4gICAgICAgICAgICAgICAgcmVzdWx0Lm53ZGF5bWFza1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbnRoaW5mby5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gZWFzdGVyKHksIG9mZnNldCkge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkgeyBvZmZzZXQgPSAwOyB9XG4gICAgdmFyIGEgPSB5ICUgMTk7XG4gICAgdmFyIGIgPSBNYXRoLmZsb29yKHkgLyAxMDApO1xuICAgIHZhciBjID0geSAlIDEwMDtcbiAgICB2YXIgZCA9IE1hdGguZmxvb3IoYiAvIDQpO1xuICAgIHZhciBlID0gYiAlIDQ7XG4gICAgdmFyIGYgPSBNYXRoLmZsb29yKChiICsgOCkgLyAyNSk7XG4gICAgdmFyIGcgPSBNYXRoLmZsb29yKChiIC0gZiArIDEpIC8gMyk7XG4gICAgdmFyIGggPSBNYXRoLmZsb29yKDE5ICogYSArIGIgLSBkIC0gZyArIDE1KSAlIDMwO1xuICAgIHZhciBpID0gTWF0aC5mbG9vcihjIC8gNCk7XG4gICAgdmFyIGsgPSBjICUgNDtcbiAgICB2YXIgbCA9IE1hdGguZmxvb3IoMzIgKyAyICogZSArIDIgKiBpIC0gaCAtIGspICUgNztcbiAgICB2YXIgbSA9IE1hdGguZmxvb3IoKGEgKyAxMSAqIGggKyAyMiAqIGwpIC8gNDUxKTtcbiAgICB2YXIgbW9udGggPSBNYXRoLmZsb29yKChoICsgbCAtIDcgKiBtICsgMTE0KSAvIDMxKTtcbiAgICB2YXIgZGF5ID0gKChoICsgbCAtIDcgKiBtICsgMTE0KSAlIDMxKSArIDE7XG4gICAgdmFyIGRhdGUgPSBEYXRlLlVUQyh5LCBtb250aCAtIDEsIGRheSArIG9mZnNldCk7XG4gICAgdmFyIHllYXJTdGFydCA9IERhdGUuVVRDKHksIDAsIDEpO1xuICAgIHJldHVybiBbTWF0aC5jZWlsKChkYXRlIC0geWVhclN0YXJ0KSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSldO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWFzdGVyLmpzLm1hcCIsImltcG9ydCBkYXRldXRpbCBmcm9tICcuLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBub3RFbXB0eSwgcmVwZWF0LCByYW5nZSwgaXNQcmVzZW50IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyByZWJ1aWxkWWVhciB9IGZyb20gJy4veWVhcmluZm8nO1xuaW1wb3J0IHsgcmVidWlsZE1vbnRoIH0gZnJvbSAnLi9tb250aGluZm8nO1xuaW1wb3J0IHsgZWFzdGVyIH0gZnJvbSAnLi9lYXN0ZXInO1xuaW1wb3J0IHsgVGltZSB9IGZyb20gJy4uL2RhdGV0aW1lJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJdGVyaW5mb1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBJdGVyaW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJdGVyaW5mbyhvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5yZWJ1aWxkID0gZnVuY3Rpb24gKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoeWVhciAhPT0gdGhpcy5sYXN0eWVhcikge1xuICAgICAgICAgICAgdGhpcy55ZWFyaW5mbyA9IHJlYnVpbGRZZWFyKHllYXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3RFbXB0eShvcHRpb25zLmJ5bndlZWtkYXkpICYmXG4gICAgICAgICAgICAobW9udGggIT09IHRoaXMubGFzdG1vbnRoIHx8IHllYXIgIT09IHRoaXMubGFzdHllYXIpKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLnllYXJpbmZvLCB5ZWFybGVuID0gX2EueWVhcmxlbiwgbXJhbmdlID0gX2EubXJhbmdlLCB3ZGF5bWFzayA9IF9hLndkYXltYXNrO1xuICAgICAgICAgICAgdGhpcy5tb250aGluZm8gPSByZWJ1aWxkTW9udGgoeWVhciwgbW9udGgsIHllYXJsZW4sIG1yYW5nZSwgd2RheW1hc2ssIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucy5ieWVhc3RlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZWFzdGVybWFzayA9IGVhc3Rlcih5ZWFyLCBvcHRpb25zLmJ5ZWFzdGVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJsYXN0eWVhclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9udGhpbmZvID8gdGhpcy5tb250aGluZm8ubGFzdHllYXIgOiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcImxhc3Rtb250aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9udGhpbmZvID8gdGhpcy5tb250aGluZm8ubGFzdG1vbnRoIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJ5ZWFybGVuXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby55ZWFybGVuO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcInllYXJvcmRpbmFsXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby55ZWFyb3JkaW5hbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJtcmFuZ2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLm1yYW5nZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJ3ZGF5bWFza1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhcmluZm8ud2RheW1hc2s7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibW1hc2tcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLm1tYXNrO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcIndub21hc2tcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLndub21hc2s7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibndkYXltYXNrXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb250aGluZm8gPyB0aGlzLm1vbnRoaW5mby5ud2RheW1hc2sgOiBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJuZXh0eWVhcmxlblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhcmluZm8ubmV4dHllYXJsZW47XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibWRheW1hc2tcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLm1kYXltYXNrO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcIm5tZGF5bWFza1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhcmluZm8ubm1kYXltYXNrO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJdGVyaW5mby5wcm90b3R5cGUueWRheXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFtyYW5nZSh0aGlzLnllYXJsZW4pLCAwLCB0aGlzLnllYXJsZW5dO1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLm1kYXlzZXQgPSBmdW5jdGlvbiAoXywgbW9udGgsIF9fKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMubXJhbmdlW21vbnRoIC0gMV07XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLm1yYW5nZVttb250aF07XG4gICAgICAgIHZhciBzZXQgPSByZXBlYXQobnVsbCwgdGhpcy55ZWFybGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspXG4gICAgICAgICAgICBzZXRbaV0gPSBpO1xuICAgICAgICByZXR1cm4gW3NldCwgc3RhcnQsIGVuZF07XG4gICAgfTtcbiAgICBJdGVyaW5mby5wcm90b3R5cGUud2RheXNldCA9IGZ1bmN0aW9uICh5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gaGFuZGxlIGNyb3NzLXllYXIgd2Vla3MgaGVyZS5cbiAgICAgICAgdmFyIHNldCA9IHJlcGVhdChudWxsLCB0aGlzLnllYXJsZW4gKyA3KTtcbiAgICAgICAgdmFyIGkgPSBkYXRldXRpbC50b09yZGluYWwobmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKSkgLVxuICAgICAgICAgICAgdGhpcy55ZWFyb3JkaW5hbDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gaTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgIHNldFtpXSA9IGk7XG4gICAgICAgICAgICArK2k7XG4gICAgICAgICAgICBpZiAodGhpcy53ZGF5bWFza1tpXSA9PT0gdGhpcy5vcHRpb25zLndrc3QpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzZXQsIHN0YXJ0LCBpXTtcbiAgICB9O1xuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5kZGF5c2V0ID0gZnVuY3Rpb24gKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgICAgdmFyIHNldCA9IHJlcGVhdChudWxsLCB0aGlzLnllYXJsZW4pO1xuICAgICAgICB2YXIgaSA9IGRhdGV1dGlsLnRvT3JkaW5hbChuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSkpKSAtXG4gICAgICAgICAgICB0aGlzLnllYXJvcmRpbmFsO1xuICAgICAgICBzZXRbaV0gPSBpO1xuICAgICAgICByZXR1cm4gW3NldCwgaSwgaSArIDFdO1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLmh0aW1lc2V0ID0gZnVuY3Rpb24gKGhvdXIsIF8sIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHNldCA9IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMuYnltaW51dGUuZm9yRWFjaChmdW5jdGlvbiAobWludXRlKSB7XG4gICAgICAgICAgICBzZXQgPSBzZXQuY29uY2F0KF90aGlzLm10aW1lc2V0KGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0ZXV0aWwuc29ydChzZXQpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLm10aW1lc2V0ID0gZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgXywgbWlsbGlzZWNvbmQpIHtcbiAgICAgICAgdmFyIHNldCA9IHRoaXMub3B0aW9ucy5ieXNlY29uZC5tYXAoZnVuY3Rpb24gKHNlY29uZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRldXRpbC5zb3J0KHNldCk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfTtcbiAgICBJdGVyaW5mby5wcm90b3R5cGUuc3RpbWVzZXQgPSBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKV07XG4gICAgfTtcbiAgICBJdGVyaW5mby5wcm90b3R5cGUuZ2V0ZGF5c2V0ID0gZnVuY3Rpb24gKGZyZXEpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5ZRUFSTFk6IHJldHVybiB0aGlzLnlkYXlzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5Lk1PTlRITFk6IHJldHVybiB0aGlzLm1kYXlzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5LldFRUtMWTogcmV0dXJuIHRoaXMud2RheXNldC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuREFJTFk6IHJldHVybiB0aGlzLmRkYXlzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB0aGlzLmRkYXlzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLmdldHRpbWVzZXQgPSBmdW5jdGlvbiAoZnJlcSkge1xuICAgICAgICBzd2l0Y2ggKGZyZXEpIHtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5LkhPVVJMWTogcmV0dXJuIHRoaXMuaHRpbWVzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5Lk1JTlVURUxZOiByZXR1cm4gdGhpcy5tdGltZXNldC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuU0VDT05ETFk6IHJldHVybiB0aGlzLnN0aW1lc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBJdGVyaW5mbztcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBJdGVyaW5mbztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBkYXRldXRpbCBmcm9tICcuLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBweW1vZCwgaXNQcmVzZW50LCBpbmNsdWRlcyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9zbGlzdChieXNldHBvcywgdGltZXNldCwgc3RhcnQsIGVuZCwgaWksIGRheXNldCkge1xuICAgIHZhciBwb3NsaXN0ID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBieXNldHBvcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZGF5cG9zID0gdm9pZCAwO1xuICAgICAgICB2YXIgdGltZXBvcyA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHBvcyA9IGJ5c2V0cG9zW2pdO1xuICAgICAgICBpZiAocG9zIDwgMCkge1xuICAgICAgICAgICAgZGF5cG9zID0gTWF0aC5mbG9vcihwb3MgLyB0aW1lc2V0Lmxlbmd0aCk7XG4gICAgICAgICAgICB0aW1lcG9zID0gcHltb2QocG9zLCB0aW1lc2V0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXlwb3MgPSBNYXRoLmZsb29yKChwb3MgLSAxKSAvIHRpbWVzZXQubGVuZ3RoKTtcbiAgICAgICAgICAgIHRpbWVwb3MgPSBweW1vZChwb3MgLSAxLCB0aW1lc2V0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRtcCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHZhbCA9IGRheXNldFtrXTtcbiAgICAgICAgICAgIGlmICghaXNQcmVzZW50KHZhbCkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0bXAucHVzaCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICBpZiAoZGF5cG9zIDwgMCkge1xuICAgICAgICAgICAgaSA9IHRtcC5zbGljZShkYXlwb3MpWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSA9IHRtcFtkYXlwb3NdO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aW1lID0gdGltZXNldFt0aW1lcG9zXTtcbiAgICAgICAgdmFyIGRhdGUgPSBkYXRldXRpbC5mcm9tT3JkaW5hbChpaS55ZWFyb3JkaW5hbCArIGkpO1xuICAgICAgICB2YXIgcmVzID0gZGF0ZXV0aWwuY29tYmluZShkYXRlLCB0aW1lKTtcbiAgICAgICAgLy8gWFhYOiBjYW4gdGhpcyBldmVyIGJlIGluIHRoZSBhcnJheT9cbiAgICAgICAgLy8gLSBjb21wYXJlIHRoZSBhY3R1YWwgZGF0ZSBpbnN0ZWFkP1xuICAgICAgICBpZiAoIWluY2x1ZGVzKHBvc2xpc3QsIHJlcykpXG4gICAgICAgICAgICBwb3NsaXN0LnB1c2gocmVzKTtcbiAgICB9XG4gICAgZGF0ZXV0aWwuc29ydChwb3NsaXN0KTtcbiAgICByZXR1cm4gcG9zbGlzdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvc2xpc3QuanMubWFwIiwiaW1wb3J0IHsgZnJlcUlzRGFpbHlPckdyZWF0ZXIgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi4vZGF0ZXV0aWwnO1xuaW1wb3J0IEl0ZXJpbmZvIGZyb20gJy4uL2l0ZXJpbmZvL2luZGV4JztcbmltcG9ydCBSUnVsZSBmcm9tICcuLi9ycnVsZSc7XG5pbXBvcnQgeyBidWlsZFRpbWVzZXQgfSBmcm9tICcuLi9wYXJzZW9wdGlvbnMnO1xuaW1wb3J0IHsgbm90RW1wdHksIGluY2x1ZGVzLCBpc1ByZXNlbnQgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IERhdGVXaXRoWm9uZSB9IGZyb20gJy4uL2RhdGV3aXRoem9uZSc7XG5pbXBvcnQgeyBidWlsZFBvc2xpc3QgfSBmcm9tICcuL3Bvc2xpc3QnO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICcuLi9kYXRldGltZSc7XG5leHBvcnQgZnVuY3Rpb24gaXRlcihpdGVyUmVzdWx0LCBvcHRpb25zKSB7XG4gICAgdmFyIGR0c3RhcnQgPSBvcHRpb25zLmR0c3RhcnQsIGZyZXEgPSBvcHRpb25zLmZyZXEsIGludGVydmFsID0gb3B0aW9ucy5pbnRlcnZhbCwgdW50aWwgPSBvcHRpb25zLnVudGlsLCBieXNldHBvcyA9IG9wdGlvbnMuYnlzZXRwb3M7XG4gICAgdmFyIGNvdW50ID0gb3B0aW9ucy5jb3VudDtcbiAgICBpZiAoY291bnQgPT09IDAgfHwgaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtaXRSZXN1bHQoaXRlclJlc3VsdCk7XG4gICAgfVxuICAgIHZhciBjb3VudGVyRGF0ZSA9IERhdGVUaW1lLmZyb21EYXRlKGR0c3RhcnQpO1xuICAgIHZhciBpaSA9IG5ldyBJdGVyaW5mbyhvcHRpb25zKTtcbiAgICBpaS5yZWJ1aWxkKGNvdW50ZXJEYXRlLnllYXIsIGNvdW50ZXJEYXRlLm1vbnRoKTtcbiAgICB2YXIgdGltZXNldCA9IG1ha2VUaW1lc2V0KGlpLCBjb3VudGVyRGF0ZSwgb3B0aW9ucyk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIF9hID0gaWkuZ2V0ZGF5c2V0KGZyZXEpKGNvdW50ZXJEYXRlLnllYXIsIGNvdW50ZXJEYXRlLm1vbnRoLCBjb3VudGVyRGF0ZS5kYXkpLCBkYXlzZXQgPSBfYVswXSwgc3RhcnQgPSBfYVsxXSwgZW5kID0gX2FbMl07XG4gICAgICAgIHZhciBmaWx0ZXJlZCA9IHJlbW92ZUZpbHRlcmVkRGF5cyhkYXlzZXQsIHN0YXJ0LCBlbmQsIGlpLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG5vdEVtcHR5KGJ5c2V0cG9zKSkge1xuICAgICAgICAgICAgdmFyIHBvc2xpc3QgPSBidWlsZFBvc2xpc3QoYnlzZXRwb3MsIHRpbWVzZXQsIHN0YXJ0LCBlbmQsIGlpLCBkYXlzZXQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwb3NsaXN0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IHBvc2xpc3Rbal07XG4gICAgICAgICAgICAgICAgaWYgKHVudGlsICYmIHJlcyA+IHVudGlsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzID49IGR0c3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlem9uZWREYXRlID0gcmV6b25lSWZOZWVkZWQocmVzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyUmVzdWx0LmFjY2VwdChyZXpvbmVkRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLS1jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnREYXkgPSBkYXlzZXRbal07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQoY3VycmVudERheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXRlID0gZGF0ZXV0aWwuZnJvbU9yZGluYWwoaWkueWVhcm9yZGluYWwgKyBjdXJyZW50RGF5KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRpbWVzZXQubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSB0aW1lc2V0W2tdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gZGF0ZXV0aWwuY29tYmluZShkYXRlLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVudGlsICYmIHJlcyA+IHVudGlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzID49IGR0c3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXpvbmVkRGF0ZSA9IHJlem9uZUlmTmVlZGVkKHJlcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZXJSZXN1bHQuYWNjZXB0KHJlem9uZWREYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcnZhbCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRSZXN1bHQoaXRlclJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGZyZXF1ZW5jeSBhbmQgaW50ZXJ2YWxcbiAgICAgICAgY291bnRlckRhdGUuYWRkKG9wdGlvbnMsIGZpbHRlcmVkKTtcbiAgICAgICAgaWYgKGNvdW50ZXJEYXRlLnllYXIgPiBkYXRldXRpbC5NQVhZRUFSKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyZXFJc0RhaWx5T3JHcmVhdGVyKGZyZXEpKSB7XG4gICAgICAgICAgICB0aW1lc2V0ID0gaWkuZ2V0dGltZXNldChmcmVxKShjb3VudGVyRGF0ZS5ob3VyLCBjb3VudGVyRGF0ZS5taW51dGUsIGNvdW50ZXJEYXRlLnNlY29uZCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWkucmVidWlsZChjb3VudGVyRGF0ZS55ZWFyLCBjb3VudGVyRGF0ZS5tb250aCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNGaWx0ZXJlZChpaSwgY3VycmVudERheSwgb3B0aW9ucykge1xuICAgIHZhciBieW1vbnRoID0gb3B0aW9ucy5ieW1vbnRoLCBieXdlZWtubyA9IG9wdGlvbnMuYnl3ZWVrbm8sIGJ5d2Vla2RheSA9IG9wdGlvbnMuYnl3ZWVrZGF5LCBieWVhc3RlciA9IG9wdGlvbnMuYnllYXN0ZXIsIGJ5bW9udGhkYXkgPSBvcHRpb25zLmJ5bW9udGhkYXksIGJ5bm1vbnRoZGF5ID0gb3B0aW9ucy5ieW5tb250aGRheSwgYnl5ZWFyZGF5ID0gb3B0aW9ucy5ieXllYXJkYXk7XG4gICAgcmV0dXJuICgobm90RW1wdHkoYnltb250aCkgJiYgIWluY2x1ZGVzKGJ5bW9udGgsIGlpLm1tYXNrW2N1cnJlbnREYXldKSkgfHxcbiAgICAgICAgKG5vdEVtcHR5KGJ5d2Vla25vKSAmJiAhaWkud25vbWFza1tjdXJyZW50RGF5XSkgfHxcbiAgICAgICAgKG5vdEVtcHR5KGJ5d2Vla2RheSkgJiYgIWluY2x1ZGVzKGJ5d2Vla2RheSwgaWkud2RheW1hc2tbY3VycmVudERheV0pKSB8fFxuICAgICAgICAobm90RW1wdHkoaWkubndkYXltYXNrKSAmJiAhaWkubndkYXltYXNrW2N1cnJlbnREYXldKSB8fFxuICAgICAgICAoYnllYXN0ZXIgIT09IG51bGwgJiYgIWluY2x1ZGVzKGlpLmVhc3Rlcm1hc2ssIGN1cnJlbnREYXkpKSB8fFxuICAgICAgICAoKG5vdEVtcHR5KGJ5bW9udGhkYXkpIHx8IG5vdEVtcHR5KGJ5bm1vbnRoZGF5KSkgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhieW1vbnRoZGF5LCBpaS5tZGF5bWFza1tjdXJyZW50RGF5XSkgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhieW5tb250aGRheSwgaWkubm1kYXltYXNrW2N1cnJlbnREYXldKSkgfHxcbiAgICAgICAgKG5vdEVtcHR5KGJ5eWVhcmRheSkgJiZcbiAgICAgICAgICAgICgoY3VycmVudERheSA8IGlpLnllYXJsZW4gJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXMoYnl5ZWFyZGF5LCBjdXJyZW50RGF5ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXMoYnl5ZWFyZGF5LCAtaWkueWVhcmxlbiArIGN1cnJlbnREYXkpKSB8fFxuICAgICAgICAgICAgICAgIChjdXJyZW50RGF5ID49IGlpLnllYXJsZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgIWluY2x1ZGVzKGJ5eWVhcmRheSwgY3VycmVudERheSArIDEgLSBpaS55ZWFybGVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXMoYnl5ZWFyZGF5LCAtaWkubmV4dHllYXJsZW4gKyBjdXJyZW50RGF5IC0gaWkueWVhcmxlbikpKSkpO1xufVxuZnVuY3Rpb24gcmV6b25lSWZOZWVkZWQoZGF0ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRGF0ZVdpdGhab25lKGRhdGUsIG9wdGlvbnMudHppZCkucmV6b25lZERhdGUoKTtcbn1cbmZ1bmN0aW9uIGVtaXRSZXN1bHQoaXRlclJlc3VsdCkge1xuICAgIHJldHVybiBpdGVyUmVzdWx0LmdldFZhbHVlKCk7XG59XG5mdW5jdGlvbiByZW1vdmVGaWx0ZXJlZERheXMoZGF5c2V0LCBzdGFydCwgZW5kLCBpaSwgb3B0aW9ucykge1xuICAgIHZhciBmaWx0ZXJlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGRheUNvdW50ZXIgPSBzdGFydDsgZGF5Q291bnRlciA8IGVuZDsgZGF5Q291bnRlcisrKSB7XG4gICAgICAgIHZhciBjdXJyZW50RGF5ID0gZGF5c2V0W2RheUNvdW50ZXJdO1xuICAgICAgICBmaWx0ZXJlZCA9IGlzRmlsdGVyZWQoaWksIGN1cnJlbnREYXksIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZmlsdGVyZWQpXG4gICAgICAgICAgICBkYXlzZXRbY3VycmVudERheV0gPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG59XG5mdW5jdGlvbiBtYWtlVGltZXNldChpaSwgY291bnRlckRhdGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZnJlcSA9IG9wdGlvbnMuZnJlcSwgYnlob3VyID0gb3B0aW9ucy5ieWhvdXIsIGJ5bWludXRlID0gb3B0aW9ucy5ieW1pbnV0ZSwgYnlzZWNvbmQgPSBvcHRpb25zLmJ5c2Vjb25kO1xuICAgIGlmIChmcmVxSXNEYWlseU9yR3JlYXRlcihmcmVxKSkge1xuICAgICAgICByZXR1cm4gYnVpbGRUaW1lc2V0KG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoKGZyZXEgPj0gUlJ1bGUuSE9VUkxZICYmXG4gICAgICAgIG5vdEVtcHR5KGJ5aG91cikgJiZcbiAgICAgICAgIWluY2x1ZGVzKGJ5aG91ciwgY291bnRlckRhdGUuaG91cikpIHx8XG4gICAgICAgIChmcmVxID49IFJSdWxlLk1JTlVURUxZICYmXG4gICAgICAgICAgICBub3RFbXB0eShieW1pbnV0ZSkgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhieW1pbnV0ZSwgY291bnRlckRhdGUubWludXRlKSkgfHxcbiAgICAgICAgKGZyZXEgPj0gUlJ1bGUuU0VDT05ETFkgJiZcbiAgICAgICAgICAgIG5vdEVtcHR5KGJ5c2Vjb25kKSAmJlxuICAgICAgICAgICAgIWluY2x1ZGVzKGJ5c2Vjb25kLCBjb3VudGVyRGF0ZS5zZWNvbmQpKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBpaS5nZXR0aW1lc2V0KGZyZXEpKGNvdW50ZXJEYXRlLmhvdXIsIGNvdW50ZXJEYXRlLm1pbnV0ZSwgY291bnRlckRhdGUuc2Vjb25kLCBjb3VudGVyRGF0ZS5taWxsaXNlY29uZCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi9kYXRldXRpbCc7XG5pbXBvcnQgSXRlclJlc3VsdCBmcm9tICcuL2l0ZXJyZXN1bHQnO1xuaW1wb3J0IENhbGxiYWNrSXRlclJlc3VsdCBmcm9tICcuL2NhbGxiYWNraXRlcnJlc3VsdCc7XG5pbXBvcnQgeyBmcm9tVGV4dCwgcGFyc2VUZXh0LCB0b1RleHQsIGlzRnVsbHlDb252ZXJ0aWJsZSB9IGZyb20gJy4vbmxwL2luZGV4JztcbmltcG9ydCB7IEZyZXF1ZW5jeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPcHRpb25zLCBpbml0aWFsaXplT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VvcHRpb25zJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nIH0gZnJvbSAnLi9wYXJzZXN0cmluZyc7XG5pbXBvcnQgeyBvcHRpb25zVG9TdHJpbmcgfSBmcm9tICcuL29wdGlvbnN0b3N0cmluZyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vY2FjaGUnO1xuaW1wb3J0IHsgV2Vla2RheSB9IGZyb20gJy4vd2Vla2RheSc7XG5pbXBvcnQgeyBpdGVyIH0gZnJvbSAnLi9pdGVyL2luZGV4Jztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSUnVsZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB2YXIgRGF5cyA9IHtcbiAgICBNTzogbmV3IFdlZWtkYXkoMCksXG4gICAgVFU6IG5ldyBXZWVrZGF5KDEpLFxuICAgIFdFOiBuZXcgV2Vla2RheSgyKSxcbiAgICBUSDogbmV3IFdlZWtkYXkoMyksXG4gICAgRlI6IG5ldyBXZWVrZGF5KDQpLFxuICAgIFNBOiBuZXcgV2Vla2RheSg1KSxcbiAgICBTVTogbmV3IFdlZWtkYXkoNilcbn07XG5leHBvcnQgdmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBmcmVxOiBGcmVxdWVuY3kuWUVBUkxZLFxuICAgIGR0c3RhcnQ6IG51bGwsXG4gICAgaW50ZXJ2YWw6IDEsXG4gICAgd2tzdDogRGF5cy5NTyxcbiAgICBjb3VudDogbnVsbCxcbiAgICB1bnRpbDogbnVsbCxcbiAgICB0emlkOiBudWxsLFxuICAgIGJ5c2V0cG9zOiBudWxsLFxuICAgIGJ5bW9udGg6IG51bGwsXG4gICAgYnltb250aGRheTogbnVsbCxcbiAgICBieW5tb250aGRheTogbnVsbCxcbiAgICBieXllYXJkYXk6IG51bGwsXG4gICAgYnl3ZWVrbm86IG51bGwsXG4gICAgYnl3ZWVrZGF5OiBudWxsLFxuICAgIGJ5bndlZWtkYXk6IG51bGwsXG4gICAgYnlob3VyOiBudWxsLFxuICAgIGJ5bWludXRlOiBudWxsLFxuICAgIGJ5c2Vjb25kOiBudWxsLFxuICAgIGJ5ZWFzdGVyOiBudWxsXG59O1xuZXhwb3J0IHZhciBkZWZhdWx0S2V5cyA9IE9iamVjdC5rZXlzKERFRkFVTFRfT1BUSU9OUyk7XG4vKipcbiAqXG4gKiBAcGFyYW0ge09wdGlvbnM/fSBvcHRpb25zIC0gc2VlIDxodHRwOi8vbGFiaXgub3JnL3B5dGhvbi1kYXRldXRpbC8jaGVhZC1jZjAwNGVlOWE3NTU5Mjc5N2UwNzY3NTJiMmE4ODljMTBmNDQ1NDE4PlxuICogICAgICAgIFRoZSBvbmx5IHJlcXVpcmVkIG9wdGlvbiBpcyBgZnJlcWAsIG9uZSBvZiBSUnVsZS5ZRUFSTFksIFJSdWxlLk1PTlRITFksIC4uLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnZhciBSUnVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSUnVsZShvcHRpb25zLCBub0NhY2hlKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGlmIChub0NhY2hlID09PSB2b2lkIDApIHsgbm9DYWNoZSA9IGZhbHNlOyB9XG4gICAgICAgIC8vIFJGQyBzdHJpbmdcbiAgICAgICAgdGhpcy5fY2FjaGUgPSBub0NhY2hlID8gbnVsbCA6IG5ldyBDYWNoZSgpO1xuICAgICAgICAvLyB1c2VkIGJ5IHRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5vcmlnT3B0aW9ucyA9IGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcGFyc2VkT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKS5wYXJzZWRPcHRpb25zO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBwYXJzZWRPcHRpb25zO1xuICAgIH1cbiAgICBSUnVsZS5wYXJzZVRleHQgPSBmdW5jdGlvbiAodGV4dCwgbGFuZ3VhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVGV4dCh0ZXh0LCBsYW5ndWFnZSk7XG4gICAgfTtcbiAgICBSUnVsZS5mcm9tVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBsYW5ndWFnZSkge1xuICAgICAgICByZXR1cm4gZnJvbVRleHQodGV4dCwgbGFuZ3VhZ2UpO1xuICAgIH07XG4gICAgUlJ1bGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSUnVsZShSUnVsZS5wYXJzZVN0cmluZyhzdHIpIHx8IHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICBSUnVsZS5wcm90b3R5cGUuX2l0ZXIgPSBmdW5jdGlvbiAoaXRlclJlc3VsdCkge1xuICAgICAgICByZXR1cm4gaXRlcihpdGVyUmVzdWx0LCB0aGlzLm9wdGlvbnMpO1xuICAgIH07XG4gICAgUlJ1bGUucHJvdG90eXBlLl9jYWNoZUdldCA9IGZ1bmN0aW9uICh3aGF0LCBhcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5fY2FjaGVHZXQod2hhdCwgYXJncyk7XG4gICAgfTtcbiAgICBSUnVsZS5wcm90b3R5cGUuX2NhY2hlQWRkID0gZnVuY3Rpb24gKHdoYXQsIHZhbHVlLCBhcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5fY2FjaGVBZGQod2hhdCwgdmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3IgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgb24gZWFjaCBkYXRlIHRoYXQgaXMgYWRkZWQuIEl0IGNhbiByZXR1cm4gZmFsc2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICB0byBzdG9wIHRoZSBpdGVyYXRpb24uXG4gICAgICogQHJldHVybiBBcnJheSBjb250YWluaW5nIGFsbCByZWN1cnJlbmNlcy5cbiAgICAgKi9cbiAgICBSUnVsZS5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG4gICAgICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIobmV3IENhbGxiYWNrSXRlclJlc3VsdCgnYWxsJywge30sIGl0ZXJhdG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhY2hlR2V0KCdhbGwnKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2l0ZXIobmV3IEl0ZXJSZXN1bHQoJ2FsbCcsIHt9KSk7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZUFkZCgnYWxsJywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgdGhlIG9jY3VycmVuY2VzIG9mIHRoZSBycnVsZSBiZXR3ZWVuIGFmdGVyIGFuZCBiZWZvcmUuXG4gICAgICogVGhlIGluYyBrZXl3b3JkIGRlZmluZXMgd2hhdCBoYXBwZW5zIGlmIGFmdGVyIGFuZC9vciBiZWZvcmUgYXJlXG4gICAgICogdGhlbXNlbHZlcyBvY2N1cnJlbmNlcy4gV2l0aCBpbmMgPT0gVHJ1ZSwgdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZVxuICAgICAqIGxpc3QsIGlmIHRoZXkgYXJlIGZvdW5kIGluIHRoZSByZWN1cnJlbmNlIHNldC5cbiAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLmJldHdlZW4gPSBmdW5jdGlvbiAoYWZ0ZXIsIGJlZm9yZSwgaW5jLCBpdGVyYXRvcikge1xuICAgICAgICBpZiAoaW5jID09PSB2b2lkIDApIHsgaW5jID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKCFkYXRldXRpbC5pc1ZhbGlkRGF0ZShhZnRlcikgfHwgIWRhdGV1dGlsLmlzVmFsaWREYXRlKGJlZm9yZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZSBwYXNzZWQgaW4gdG8gUlJ1bGUuYmV0d2VlbicpO1xuICAgICAgICB2YXIgYXJncyA9IHtcbiAgICAgICAgICAgIGJlZm9yZTogYmVmb3JlLFxuICAgICAgICAgICAgYWZ0ZXI6IGFmdGVyLFxuICAgICAgICAgICAgaW5jOiBpbmNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlcihuZXcgQ2FsbGJhY2tJdGVyUmVzdWx0KCdiZXR3ZWVuJywgYXJncywgaXRlcmF0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FjaGVHZXQoJ2JldHdlZW4nLCBhcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2l0ZXIobmV3IEl0ZXJSZXN1bHQoJ2JldHdlZW4nLCBhcmdzKSk7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZUFkZCgnYmV0d2VlbicsIHJlc3VsdCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgcmVjdXJyZW5jZSBiZWZvcmUgdGhlIGdpdmVuIGRhdGV0aW1lIGluc3RhbmNlLlxuICAgICAqIFRoZSBpbmMga2V5d29yZCBkZWZpbmVzIHdoYXQgaGFwcGVucyBpZiBkdCBpcyBhbiBvY2N1cnJlbmNlLlxuICAgICAqIFdpdGggaW5jID09IFRydWUsIGlmIGR0IGl0c2VsZiBpcyBhbiBvY2N1cnJlbmNlLCBpdCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm4gRGF0ZSBvciBudWxsXG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLmJlZm9yZSA9IGZ1bmN0aW9uIChkdCwgaW5jKSB7XG4gICAgICAgIGlmIChpbmMgPT09IHZvaWQgMCkgeyBpbmMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoIWRhdGV1dGlsLmlzVmFsaWREYXRlKGR0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIHBhc3NlZCBpbiB0byBSUnVsZS5iZWZvcmUnKTtcbiAgICAgICAgdmFyIGFyZ3MgPSB7IGR0OiBkdCwgaW5jOiBpbmMgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhY2hlR2V0KCdiZWZvcmUnLCBhcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2l0ZXIobmV3IEl0ZXJSZXN1bHQoJ2JlZm9yZScsIGFyZ3MpKTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlQWRkKCdiZWZvcmUnLCByZXN1bHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCByZWN1cnJlbmNlIGFmdGVyIHRoZSBnaXZlbiBkYXRldGltZSBpbnN0YW5jZS5cbiAgICAgKiBUaGUgaW5jIGtleXdvcmQgZGVmaW5lcyB3aGF0IGhhcHBlbnMgaWYgZHQgaXMgYW4gb2NjdXJyZW5jZS5cbiAgICAgKiBXaXRoIGluYyA9PSBUcnVlLCBpZiBkdCBpdHNlbGYgaXMgYW4gb2NjdXJyZW5jZSwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJuIERhdGUgb3IgbnVsbFxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS5hZnRlciA9IGZ1bmN0aW9uIChkdCwgaW5jKSB7XG4gICAgICAgIGlmIChpbmMgPT09IHZvaWQgMCkgeyBpbmMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoIWRhdGV1dGlsLmlzVmFsaWREYXRlKGR0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIHBhc3NlZCBpbiB0byBSUnVsZS5hZnRlcicpO1xuICAgICAgICB2YXIgYXJncyA9IHsgZHQ6IGR0LCBpbmM6IGluYyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FjaGVHZXQoJ2FmdGVyJywgYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9pdGVyKG5ldyBJdGVyUmVzdWx0KCdhZnRlcicsIGFyZ3MpKTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlQWRkKCdhZnRlcicsIHJlc3VsdCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWN1cnJlbmNlcyBpbiB0aGlzIHNldC4gSXQgd2lsbCBoYXZlIGdvIHRyb3VnaFxuICAgICAqIHRoZSB3aG9sZSByZWN1cnJlbmNlLCBpZiB0aGlzIGhhc24ndCBiZWVuIGRvbmUgYmVmb3JlLlxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsKCkubGVuZ3RoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHJydWxlIGludG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAqIEBzZWUgPGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI0NDUudHh0PlxuICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uc1RvU3RyaW5nKHRoaXMub3JpZ09wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2lsbCBjb252ZXJ0IGFsbCBydWxlcyBkZXNjcmliZWQgaW4gbmxwOlRvVGV4dFxuICAgICAqIHRvIHRleHQuXG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLnRvVGV4dCA9IGZ1bmN0aW9uIChnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcikge1xuICAgICAgICByZXR1cm4gdG9UZXh0KHRoaXMsIGdldHRleHQsIGxhbmd1YWdlLCBkYXRlRm9ybWF0dGVyKTtcbiAgICB9O1xuICAgIFJSdWxlLnByb3RvdHlwZS5pc0Z1bGx5Q29udmVydGlibGVUb1RleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpc0Z1bGx5Q29udmVydGlibGUodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIGEgUlJ1bGUgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBmcmVxIGFuZCBvcHRpb25zXG4gICAgICogICAgICAgICAgYXMgdGhpcyBvbmUgKGNhY2hlIGlzIG5vdCBjbG9uZWQpXG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJSdWxlKHRoaXMub3JpZ09wdGlvbnMpO1xuICAgIH07XG4gICAgLy8gUlJ1bGUgY2xhc3MgJ2NvbnN0YW50cydcbiAgICBSUnVsZS5GUkVRVUVOQ0lFUyA9IFtcbiAgICAgICAgJ1lFQVJMWScsXG4gICAgICAgICdNT05USExZJyxcbiAgICAgICAgJ1dFRUtMWScsXG4gICAgICAgICdEQUlMWScsXG4gICAgICAgICdIT1VSTFknLFxuICAgICAgICAnTUlOVVRFTFknLFxuICAgICAgICAnU0VDT05ETFknXG4gICAgXTtcbiAgICBSUnVsZS5ZRUFSTFkgPSBGcmVxdWVuY3kuWUVBUkxZO1xuICAgIFJSdWxlLk1PTlRITFkgPSBGcmVxdWVuY3kuTU9OVEhMWTtcbiAgICBSUnVsZS5XRUVLTFkgPSBGcmVxdWVuY3kuV0VFS0xZO1xuICAgIFJSdWxlLkRBSUxZID0gRnJlcXVlbmN5LkRBSUxZO1xuICAgIFJSdWxlLkhPVVJMWSA9IEZyZXF1ZW5jeS5IT1VSTFk7XG4gICAgUlJ1bGUuTUlOVVRFTFkgPSBGcmVxdWVuY3kuTUlOVVRFTFk7XG4gICAgUlJ1bGUuU0VDT05ETFkgPSBGcmVxdWVuY3kuU0VDT05ETFk7XG4gICAgUlJ1bGUuTU8gPSBEYXlzLk1PO1xuICAgIFJSdWxlLlRVID0gRGF5cy5UVTtcbiAgICBSUnVsZS5XRSA9IERheXMuV0U7XG4gICAgUlJ1bGUuVEggPSBEYXlzLlRIO1xuICAgIFJSdWxlLkZSID0gRGF5cy5GUjtcbiAgICBSUnVsZS5TQSA9IERheXMuU0E7XG4gICAgUlJ1bGUuU1UgPSBEYXlzLlNVO1xuICAgIFJSdWxlLnBhcnNlU3RyaW5nID0gcGFyc2VTdHJpbmc7XG4gICAgUlJ1bGUub3B0aW9uc1RvU3RyaW5nID0gb3B0aW9uc1RvU3RyaW5nO1xuICAgIHJldHVybiBSUnVsZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBSUnVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJydWxlLmpzLm1hcCIsImltcG9ydCB7IERhdGVXaXRoWm9uZSB9IGZyb20gJy4vZGF0ZXdpdGh6b25lJztcbmltcG9ydCB7IGl0ZXIgfSBmcm9tICcuL2l0ZXIvaW5kZXgnO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJTZXQoaXRlclJlc3VsdCwgX3JydWxlLCBfZXhydWxlLCBfcmRhdGUsIF9leGRhdGUsIHR6aWQpIHtcbiAgICB2YXIgX2V4ZGF0ZUhhc2ggPSB7fTtcbiAgICB2YXIgX2FjY2VwdCA9IGl0ZXJSZXN1bHQuYWNjZXB0O1xuICAgIGZ1bmN0aW9uIGV2YWxFeGRhdGUoYWZ0ZXIsIGJlZm9yZSkge1xuICAgICAgICBfZXhydWxlLmZvckVhY2goZnVuY3Rpb24gKHJydWxlKSB7XG4gICAgICAgICAgICBycnVsZS5iZXR3ZWVuKGFmdGVyLCBiZWZvcmUsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBfZXhkYXRlSGFzaFtOdW1iZXIoZGF0ZSldID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2V4ZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciB6b25lZERhdGUgPSBuZXcgRGF0ZVdpdGhab25lKGRhdGUsIHR6aWQpLnJlem9uZWREYXRlKCk7XG4gICAgICAgIF9leGRhdGVIYXNoW051bWJlcih6b25lZERhdGUpXSA9IHRydWU7XG4gICAgfSk7XG4gICAgaXRlclJlc3VsdC5hY2NlcHQgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgZHQgPSBOdW1iZXIoZGF0ZSk7XG4gICAgICAgIGlmIChpc05hTihkdCkpXG4gICAgICAgICAgICByZXR1cm4gX2FjY2VwdC5jYWxsKHRoaXMsIGRhdGUpO1xuICAgICAgICBpZiAoIV9leGRhdGVIYXNoW2R0XSkge1xuICAgICAgICAgICAgZXZhbEV4ZGF0ZShuZXcgRGF0ZShkdCAtIDEpLCBuZXcgRGF0ZShkdCArIDEpKTtcbiAgICAgICAgICAgIGlmICghX2V4ZGF0ZUhhc2hbZHRdKSB7XG4gICAgICAgICAgICAgICAgX2V4ZGF0ZUhhc2hbZHRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2FjY2VwdC5jYWxsKHRoaXMsIGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgaWYgKGl0ZXJSZXN1bHQubWV0aG9kID09PSAnYmV0d2VlbicpIHtcbiAgICAgICAgZXZhbEV4ZGF0ZShpdGVyUmVzdWx0LmFyZ3MuYWZ0ZXIsIGl0ZXJSZXN1bHQuYXJncy5iZWZvcmUpO1xuICAgICAgICBpdGVyUmVzdWx0LmFjY2VwdCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICB2YXIgZHQgPSBOdW1iZXIoZGF0ZSk7XG4gICAgICAgICAgICBpZiAoIV9leGRhdGVIYXNoW2R0XSkge1xuICAgICAgICAgICAgICAgIF9leGRhdGVIYXNoW2R0XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQuY2FsbCh0aGlzLCBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9yZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgem9uZWREYXRlID0gbmV3IERhdGVXaXRoWm9uZShfcmRhdGVbaV0sIHR6aWQpLnJlem9uZWREYXRlKCk7XG4gICAgICAgIGlmICghaXRlclJlc3VsdC5hY2NlcHQobmV3IERhdGUoem9uZWREYXRlLmdldFRpbWUoKSkpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIF9ycnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChycnVsZSkge1xuICAgICAgICBpdGVyKGl0ZXJSZXN1bHQsIHJydWxlLm9wdGlvbnMpO1xuICAgIH0pO1xuICAgIHZhciByZXMgPSBpdGVyUmVzdWx0Ll9yZXN1bHQ7XG4gICAgZGF0ZXV0aWwuc29ydChyZXMpO1xuICAgIHN3aXRjaCAoaXRlclJlc3VsdC5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgcmV0dXJuICgocmVzLmxlbmd0aCAmJiByZXNbcmVzLmxlbmd0aCAtIDFdKSB8fCBudWxsKTtcbiAgICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICgocmVzLmxlbmd0aCAmJiByZXNbMF0pIHx8IG51bGwpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJzZXQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSUnVsZSBmcm9tICcuL3JydWxlJztcbmltcG9ydCBSUnVsZVNldCBmcm9tICcuL3JydWxlc2V0JztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IGluY2x1ZGVzLCBzcGxpdCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZywgcGFyc2VEdHN0YXJ0IH0gZnJvbSAnLi9wYXJzZXN0cmluZyc7XG4vKipcbiAqIFJSdWxlU3RyXG4gKiAgVG8gcGFyc2UgYSBzZXQgb2YgcnJ1bGUgc3RyaW5nc1xuICovXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGR0c3RhcnQ6IG51bGwsXG4gICAgY2FjaGU6IGZhbHNlLFxuICAgIHVuZm9sZDogZmFsc2UsXG4gICAgZm9yY2VzZXQ6IGZhbHNlLFxuICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgIHR6aWQ6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnB1dChzLCBvcHRpb25zKSB7XG4gICAgdmFyIHJydWxldmFscyA9IFtdO1xuICAgIHZhciByZGF0ZXZhbHMgPSBbXTtcbiAgICB2YXIgZXhydWxldmFscyA9IFtdO1xuICAgIHZhciBleGRhdGV2YWxzID0gW107XG4gICAgdmFyIF9hID0gcGFyc2VEdHN0YXJ0KHMpLCBkdHN0YXJ0ID0gX2EuZHRzdGFydCwgdHppZCA9IF9hLnR6aWQ7XG4gICAgdmFyIGxpbmVzID0gc3BsaXRJbnRvTGluZXMocywgb3B0aW9ucy51bmZvbGQpO1xuICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgX2EgPSBicmVha0Rvd25MaW5lKGxpbmUpLCBuYW1lID0gX2EubmFtZSwgcGFybXMgPSBfYS5wYXJtcywgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgc3dpdGNoIChuYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ1JSVUxFJzpcbiAgICAgICAgICAgICAgICBpZiAocGFybXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIFJSVUxFIHBhcm06IFwiICsgcGFybXMuam9pbignLCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnJ1bGV2YWxzLnB1c2gocGFyc2VTdHJpbmcobGluZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUkRBVEUnOlxuICAgICAgICAgICAgICAgIHZhciBfYiA9IC9SREFURSg/OjtUWklEPShbXjo9XSspKT8vaS5leGVjKGxpbmUpLCBfID0gX2JbMF0sIHJkYXRlVHppZCA9IF9iWzFdO1xuICAgICAgICAgICAgICAgIGlmIChyZGF0ZVR6aWQgJiYgIXR6aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHppZCA9IHJkYXRlVHppZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmRhdGV2YWxzID0gcmRhdGV2YWxzLmNvbmNhdChwYXJzZVJEYXRlKHZhbHVlLCBwYXJtcykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRVhSVUxFJzpcbiAgICAgICAgICAgICAgICBpZiAocGFybXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIEVYUlVMRSBwYXJtOiBcIiArIHBhcm1zLmpvaW4oJywnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4cnVsZXZhbHMucHVzaChwYXJzZVN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRVhEQVRFJzpcbiAgICAgICAgICAgICAgICBleGRhdGV2YWxzID0gZXhkYXRldmFscy5jb25jYXQocGFyc2VSRGF0ZSh2YWx1ZSwgcGFybXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RUU1RBUlQnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHByb3BlcnR5OiAnICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkdHN0YXJ0OiBkdHN0YXJ0LFxuICAgICAgICB0emlkOiB0emlkLFxuICAgICAgICBycnVsZXZhbHM6IHJydWxldmFscyxcbiAgICAgICAgcmRhdGV2YWxzOiByZGF0ZXZhbHMsXG4gICAgICAgIGV4cnVsZXZhbHM6IGV4cnVsZXZhbHMsXG4gICAgICAgIGV4ZGF0ZXZhbHM6IGV4ZGF0ZXZhbHNcbiAgICB9O1xufVxuZnVuY3Rpb24gYnVpbGRSdWxlKHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUlucHV0KHMsIG9wdGlvbnMpLCBycnVsZXZhbHMgPSBfYS5ycnVsZXZhbHMsIHJkYXRldmFscyA9IF9hLnJkYXRldmFscywgZXhydWxldmFscyA9IF9hLmV4cnVsZXZhbHMsIGV4ZGF0ZXZhbHMgPSBfYS5leGRhdGV2YWxzLCBkdHN0YXJ0ID0gX2EuZHRzdGFydCwgdHppZCA9IF9hLnR6aWQ7XG4gICAgdmFyIG5vQ2FjaGUgPSBvcHRpb25zLmNhY2hlID09PSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy5jb21wYXRpYmxlKSB7XG4gICAgICAgIG9wdGlvbnMuZm9yY2VzZXQgPSB0cnVlO1xuICAgICAgICBvcHRpb25zLnVuZm9sZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlc2V0IHx8XG4gICAgICAgIHJydWxldmFscy5sZW5ndGggPiAxIHx8XG4gICAgICAgIHJkYXRldmFscy5sZW5ndGggfHxcbiAgICAgICAgZXhydWxldmFscy5sZW5ndGggfHxcbiAgICAgICAgZXhkYXRldmFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHJzZXRfMSA9IG5ldyBSUnVsZVNldChub0NhY2hlKTtcbiAgICAgICAgcnNldF8xLmR0c3RhcnQoZHRzdGFydCk7XG4gICAgICAgIHJzZXRfMS50emlkKHR6aWQgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgcnJ1bGV2YWxzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcnNldF8xLnJydWxlKG5ldyBSUnVsZShncm9vbVJydWxlT3B0aW9ucyh2YWwsIGR0c3RhcnQsIHR6aWQpLCBub0NhY2hlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZGF0ZXZhbHMuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgcnNldF8xLnJkYXRlKGRhdGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZXhydWxldmFscy5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJzZXRfMS5leHJ1bGUobmV3IFJSdWxlKGdyb29tUnJ1bGVPcHRpb25zKHZhbCwgZHRzdGFydCwgdHppZCksIG5vQ2FjaGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4ZGF0ZXZhbHMuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgcnNldF8xLmV4ZGF0ZShkYXRlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLmNvbXBhdGlibGUgJiYgb3B0aW9ucy5kdHN0YXJ0KVxuICAgICAgICAgICAgcnNldF8xLnJkYXRlKGR0c3RhcnQpO1xuICAgICAgICByZXR1cm4gcnNldF8xO1xuICAgIH1cbiAgICB2YXIgdmFsID0gcnJ1bGV2YWxzWzBdIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUlJ1bGUoZ3Jvb21ScnVsZU9wdGlvbnModmFsLCB2YWwuZHRzdGFydCB8fCBvcHRpb25zLmR0c3RhcnQgfHwgZHRzdGFydCwgdmFsLnR6aWQgfHwgb3B0aW9ucy50emlkIHx8IHR6aWQpLCBub0NhY2hlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBycnVsZXN0cihzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICByZXR1cm4gYnVpbGRSdWxlKHMsIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIGdyb29tUnJ1bGVPcHRpb25zKHZhbCwgZHRzdGFydCwgdHppZCkge1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdmFsKSwgeyBkdHN0YXJ0OiBkdHN0YXJ0LFxuICAgICAgICB0emlkOiB0emlkIH0pO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHZhciBpbnZhbGlkID0gW107XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICB2YXIgZGVmYXVsdEtleXMgPSBPYmplY3Qua2V5cyhERUZBVUxUX09QVElPTlMpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaW5jbHVkZXMoZGVmYXVsdEtleXMsIGtleSkpXG4gICAgICAgICAgICBpbnZhbGlkLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoaW52YWxpZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG9wdGlvbnM6ICcgKyBpbnZhbGlkLmpvaW4oJywgJykpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUyksIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZXh0cmFjdE5hbWUobGluZSkge1xuICAgIGlmIChsaW5lLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdSUlVMRScsXG4gICAgICAgICAgICB2YWx1ZTogbGluZVxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgX2EgPSBzcGxpdChsaW5lLCAnOicsIDEpLCBuYW1lID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJyZWFrRG93bkxpbmUobGluZSkge1xuICAgIHZhciBfYSA9IGV4dHJhY3ROYW1lKGxpbmUpLCBuYW1lID0gX2EubmFtZSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICB2YXIgcGFybXMgPSBuYW1lLnNwbGl0KCc7Jyk7XG4gICAgaWYgKCFwYXJtcylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbXB0eSBwcm9wZXJ0eSBuYW1lJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcGFybXNbMF0udG9VcHBlckNhc2UoKSxcbiAgICAgICAgcGFybXM6IHBhcm1zLnNsaWNlKDEpLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9O1xufVxuZnVuY3Rpb24gc3BsaXRJbnRvTGluZXMocywgdW5mb2xkKSB7XG4gICAgaWYgKHVuZm9sZCA9PT0gdm9pZCAwKSB7IHVuZm9sZCA9IGZhbHNlOyB9XG4gICAgcyA9IHMgJiYgcy50cmltKCk7XG4gICAgaWYgKCFzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW1wdHkgc3RyaW5nJyk7XG4gICAgLy8gTW9yZSBpbmZvIGFib3V0ICd1bmZvbGQnIG9wdGlvblxuICAgIC8vIEdvIGhlYWQgdG8gaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjQ0NS50eHRcbiAgICBpZiAoIXVuZm9sZCkge1xuICAgICAgICByZXR1cm4gcy5zcGxpdCgvXFxzLyk7XG4gICAgfVxuICAgIHZhciBsaW5lcyA9IHMuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHZhciBsaW5lID0gKGxpbmVzW2ldID0gbGluZXNbaV0ucmVwbGFjZSgvXFxzKyQvZywgJycpKTtcbiAgICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgICAgICBsaW5lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA+IDAgJiYgbGluZVswXSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBsaW5lc1tpIC0gMV0gKz0gbGluZS5zbGljZSgxKTtcbiAgICAgICAgICAgIGxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZURhdGVQYXJtKHBhcm1zKSB7XG4gICAgcGFybXMuZm9yRWFjaChmdW5jdGlvbiAocGFybSkge1xuICAgICAgICBpZiAoIS8oVkFMVUU9REFURSgtVElNRSk/KXwoVFpJRD0pLy50ZXN0KHBhcm0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIFJEQVRFL0VYREFURSBwYXJtOiAnICsgcGFybSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHBhcnNlUkRhdGUocmRhdGV2YWwsIHBhcm1zKSB7XG4gICAgdmFsaWRhdGVEYXRlUGFybShwYXJtcyk7XG4gICAgcmV0dXJuIHJkYXRldmFsXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGRhdGVzdHIpIHsgcmV0dXJuIGRhdGV1dGlsLnVudGlsU3RyaW5nVG9EYXRlKGRhdGVzdHIpOyB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJydWxlc3RyLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJSdWxlIGZyb20gJy4vcnJ1bGUnO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgaW5jbHVkZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgaXRlclNldCB9IGZyb20gJy4vaXRlcnNldCc7XG5pbXBvcnQgeyBycnVsZXN0ciB9IGZyb20gJy4vcnJ1bGVzdHInO1xuaW1wb3J0IHsgb3B0aW9uc1RvU3RyaW5nIH0gZnJvbSAnLi9vcHRpb25zdG9zdHJpbmcnO1xuZnVuY3Rpb24gY3JlYXRlR2V0dGVyU2V0dGVyKGZpZWxkTmFtZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgX3RoaXNbXCJfXCIgKyBmaWVsZE5hbWVdID0gZmllbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF90aGlzW1wiX1wiICsgZmllbGROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXNbXCJfXCIgKyBmaWVsZE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMuX3JydWxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGRfMSA9IF90aGlzLl9ycnVsZVtpXS5vcmlnT3B0aW9uc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkXzEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG52YXIgUlJ1bGVTZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJSdWxlU2V0LCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFuP30gbm9DYWNoZVxuICAgICAqICBUaGUgc2FtZSBzdHJhdGFneSBhcyBSUnVsZSBvbiBjYWNoZSwgZGVmYXVsdCB0byBmYWxzZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJSdWxlU2V0KG5vQ2FjaGUpIHtcbiAgICAgICAgaWYgKG5vQ2FjaGUgPT09IHZvaWQgMCkgeyBub0NhY2hlID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywge30sIG5vQ2FjaGUpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmR0c3RhcnQgPSBjcmVhdGVHZXR0ZXJTZXR0ZXIuYXBwbHkoX3RoaXMsIFsnZHRzdGFydCddKTtcbiAgICAgICAgX3RoaXMudHppZCA9IGNyZWF0ZUdldHRlclNldHRlci5hcHBseShfdGhpcywgWyd0emlkJ10pO1xuICAgICAgICBfdGhpcy5fcnJ1bGUgPSBbXTtcbiAgICAgICAgX3RoaXMuX3JkYXRlID0gW107XG4gICAgICAgIF90aGlzLl9leHJ1bGUgPSBbXTtcbiAgICAgICAgX3RoaXMuX2V4ZGF0ZSA9IFtdO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5faXRlciA9IGZ1bmN0aW9uIChpdGVyUmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBpdGVyU2V0KGl0ZXJSZXN1bHQsIHRoaXMuX3JydWxlLCB0aGlzLl9leHJ1bGUsIHRoaXMuX3JkYXRlLCB0aGlzLl9leGRhdGUsIHRoaXMudHppZCgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gUlJ1bGUgdG8gdGhlIHNldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtSUnVsZX1cbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUucnJ1bGUgPSBmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgX2FkZFJ1bGUocnJ1bGUsIHRoaXMuX3JydWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gRVhSVUxFIHRvIHRoZSBzZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UlJ1bGV9XG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLmV4cnVsZSA9IGZ1bmN0aW9uIChycnVsZSkge1xuICAgICAgICBfYWRkUnVsZShycnVsZSwgdGhpcy5fZXhydWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gUkRhdGUgdG8gdGhlIHNldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfVxuICAgICAqL1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5yZGF0ZSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIF9hZGREYXRlKGRhdGUsIHRoaXMuX3JkYXRlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gRVhEQVRFIHRvIHRoZSBzZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0ZX1cbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUuZXhkYXRlID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgX2FkZERhdGUoZGF0ZSwgdGhpcy5fZXhkYXRlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGluY2x1ZGVkIHJydWxlcyBpbiB0aGlzIHJlY3VycmVuY2Ugc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiBMaXN0IG9mIHJydWxlc1xuICAgICAqL1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5ycnVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ycnVsZS5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHJydWxlc3RyKGUudG9TdHJpbmcoKSk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZXhjbHVkZWQgcnJ1bGVzIGluIHRoaXMgcmVjdXJyZW5jZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIExpc3Qgb2YgZXhydWxlc1xuICAgICAqL1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5leHJ1bGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhydWxlLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gcnJ1bGVzdHIoZS50b1N0cmluZygpKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgbGlzdCBvZiBpbmNsdWRlZCBkYXRldGltZXMgaW4gdGhpcyByZWN1cnJlbmNlIHNldC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gTGlzdCBvZiByZGF0ZXNcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUucmRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmRhdGUubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBuZXcgRGF0ZShlLmdldFRpbWUoKSk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgaW5jbHVkZWQgZGF0ZXRpbWVzIGluIHRoaXMgcmVjdXJyZW5jZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIExpc3Qgb2YgZXhkYXRlc1xuICAgICAqL1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5leGRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhkYXRlLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gbmV3IERhdGUoZS5nZXRUaW1lKCkpOyB9KTtcbiAgICB9O1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICghdGhpcy5fcnJ1bGUubGVuZ3RoICYmIHRoaXMuX2R0c3RhcnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQob3B0aW9uc1RvU3RyaW5nKHsgZHRzdGFydDogdGhpcy5fZHRzdGFydCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcnJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocnJ1bGUudG9TdHJpbmcoKS5zcGxpdCgnXFxuJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZXhydWxlLmZvckVhY2goZnVuY3Rpb24gKGV4cnVsZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChleHJ1bGUudG9TdHJpbmcoKS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChsaW5lKSB7IHJldHVybiBsaW5lLnJlcGxhY2UoL15SUlVMRTovLCAnRVhSVUxFOicpOyB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGxpbmUpIHsgcmV0dXJuICEvXkRUU1RBUlQvLnRlc3QobGluZSk7IH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLl9yZGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJkYXRlc1RvU3RyaW5nKCdSREFURScsIHRoaXMuX3JkYXRlLCB0aGlzLnR6aWQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9leGRhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChyZGF0ZXNUb1N0cmluZygnRVhEQVRFJywgdGhpcy5fZXhkYXRlLCB0aGlzLnR6aWQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiB0byBnZW5lcmF0ZSByZWN1cnJlbmNlIGZpZWxkIHN1Y2ggYXM6XG4gICAgICogICBEVFNUQVJUOjE5OTcwOTAyVDAxMDAwMFpcbiAgICAgKiAgIFJSVUxFOkZSRVE9WUVBUkxZO0NPVU5UPTI7QllEQVk9VFVcbiAgICAgKiAgIFJSVUxFOkZSRVE9WUVBUkxZO0NPVU5UPTE7QllEQVk9VEhcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKS5qb2luKCdcXG4nKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBSUnVsZVNldCBPYmplY3QgY29tcGxldGVseSBiYXNlIG9uIGN1cnJlbnQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBycnMgPSBuZXcgUlJ1bGVTZXQoISF0aGlzLl9jYWNoZSk7XG4gICAgICAgIHRoaXMuX3JydWxlLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHsgcmV0dXJuIHJycy5ycnVsZShydWxlLmNsb25lKCkpOyB9KTtcbiAgICAgICAgdGhpcy5fZXhydWxlLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHsgcmV0dXJuIHJycy5leHJ1bGUocnVsZS5jbG9uZSgpKTsgfSk7XG4gICAgICAgIHRoaXMuX3JkYXRlLmZvckVhY2goZnVuY3Rpb24gKGRhdGUpIHsgcmV0dXJuIHJycy5yZGF0ZShuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSkpOyB9KTtcbiAgICAgICAgdGhpcy5fZXhkYXRlLmZvckVhY2goZnVuY3Rpb24gKGRhdGUpIHsgcmV0dXJuIHJycy5leGRhdGUobmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpKTsgfSk7XG4gICAgICAgIHJldHVybiBycnM7XG4gICAgfTtcbiAgICByZXR1cm4gUlJ1bGVTZXQ7XG59KFJSdWxlKSk7XG5leHBvcnQgZGVmYXVsdCBSUnVsZVNldDtcbmZ1bmN0aW9uIF9hZGRSdWxlKHJydWxlLCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKCEocnJ1bGUgaW5zdGFuY2VvZiBSUnVsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihTdHJpbmcocnJ1bGUpICsgJyBpcyBub3QgUlJ1bGUgaW5zdGFuY2UnKTtcbiAgICB9XG4gICAgaWYgKCFpbmNsdWRlcyhjb2xsZWN0aW9uLm1hcChTdHJpbmcpLCBTdHJpbmcocnJ1bGUpKSkge1xuICAgICAgICBjb2xsZWN0aW9uLnB1c2gocnJ1bGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hZGREYXRlKGRhdGUsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihTdHJpbmcoZGF0ZSkgKyAnIGlzIG5vdCBEYXRlIGluc3RhbmNlJyk7XG4gICAgfVxuICAgIGlmICghaW5jbHVkZXMoY29sbGVjdGlvbi5tYXAoTnVtYmVyKSwgTnVtYmVyKGRhdGUpKSkge1xuICAgICAgICBjb2xsZWN0aW9uLnB1c2goZGF0ZSk7XG4gICAgICAgIGRhdGV1dGlsLnNvcnQoY29sbGVjdGlvbik7XG4gICAgfVxufVxuZnVuY3Rpb24gcmRhdGVzVG9TdHJpbmcocGFyYW0sIHJkYXRlcywgdHppZCkge1xuICAgIHZhciBpc1VUQyA9ICF0emlkIHx8IHR6aWQudG9VcHBlckNhc2UoKSA9PT0gJ1VUQyc7XG4gICAgdmFyIGhlYWRlciA9IGlzVVRDID8gcGFyYW0gKyBcIjpcIiA6IHBhcmFtICsgXCI7VFpJRD1cIiArIHR6aWQgKyBcIjpcIjtcbiAgICB2YXIgZGF0ZVN0cmluZyA9IHJkYXRlc1xuICAgICAgICAubWFwKGZ1bmN0aW9uIChyZGF0ZSkgeyByZXR1cm4gZGF0ZXV0aWwudGltZVRvVW50aWxTdHJpbmcocmRhdGUudmFsdWVPZigpLCBpc1VUQyk7IH0pXG4gICAgICAgIC5qb2luKCcsJyk7XG4gICAgcmV0dXJuIFwiXCIgKyBoZWFkZXIgKyBkYXRlU3RyaW5nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnJ1bGVzZXQuanMubWFwIiwiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgUlJ1bGUgfSBmcm9tICdycnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnJlbmNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJydWxlOiBSUnVsZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSBkYXRlIGlzIHVzZWQgdG8gY2FsY3VsYXRlIGZ1dHVyZSBvY2N1cmVuY2VzLlxuICAgICAqXG4gICAgICogRnV0dXJlIG9jY3VyZW5jZXMgd2lsbCByZWN1ciBiYXNlZCBvbiB0aGUgcmVmZXJlbmNlIGRhdGUuXG4gICAgICogVGhlIHJlZmVyZW5jZSBkYXRlIGlzIHRoZSBkdWUgZGF0ZSwgaWYgaXQgaXMgZ2l2ZW4uXG4gICAgICogT3RoZXJ3aXNlIHRoZSBzY2hlZHVsZWQgZGF0ZSwgaWYgaXQgaXMgZ2l2ZW4uIEFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIFJlY3VycmVuY2Ugb2YgYWxsIGRhdGVzIHdpbGwgYmUga2VwdCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIGRhdGUuXG4gICAgICogRm9yIGV4YW1wbGU6IGlmIHRoZSBkdWUgZGF0ZSBhbmQgdGhlIHN0YXJ0IGRhdGUgYXJlIGdpdmVuLCB0aGUgZHVlIGRhdGVcbiAgICAgKiBpcyB0aGUgcmVmZXJlbmNlIGRhdGUuIEZ1dHVyZSBvY2N1cnJlbmNlcyB3aWxsIGhhdmUgYSBzdGFydCBkYXRlIHdpdGggdGhlXG4gICAgICogc2FtZSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgZHVlIGRhdGUgYXMgdGhlIG9yaWdpbmFsIHRhc2suIEZvciBleGFtcGxlXG4gICAgICogXCJzdGFydHMgb25lIHdlZWsgYmVmb3JlIGl0IGlzIGR1ZVwiLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmZXJlbmNlRGF0ZTogTW9tZW50IHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgcnJ1bGUsXG4gICAgICAgIHJlZmVyZW5jZURhdGUsXG4gICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgZHVlRGF0ZSxcbiAgICB9OiB7XG4gICAgICAgIHJydWxlOiBSUnVsZTtcbiAgICAgICAgcmVmZXJlbmNlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5ycnVsZSA9IHJydWxlO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURhdGUgPSByZWZlcmVuY2VEYXRlO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlID0gc2NoZWR1bGVkRGF0ZTtcbiAgICAgICAgdGhpcy5kdWVEYXRlID0gZHVlRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21UZXh0KHtcbiAgICAgICAgcmVjdXJyZW5jZVJ1bGVUZXh0LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgfToge1xuICAgICAgICByZWN1cnJlbmNlUnVsZVRleHQ6IHN0cmluZztcbiAgICAgICAgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIH0pOiBSZWN1cnJlbmNlIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gUlJ1bGUucGFyc2VUZXh0KHJlY3VycmVuY2VSdWxlVGV4dCk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFBpY2sgdGhlIHJlZmVyZW5jZSBkYXRlIGZvciByZWN1cnJlbmNlIGJhc2VkIG9uIGltcG9ydGFuY2UuXG4gICAgICAgICAgICAgICAgLy8gQXNzdW1pbmcgZHVlIGRhdGUgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgICAgICAgICAgICAgIGxldCByZWZlcmVuY2VEYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgbW9tZW50IG9iamVjdHMuXG4gICAgICAgICAgICAgICAgaWYgKGR1ZURhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSA9IHdpbmRvdy5tb21lbnQoZHVlRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGUgPSB3aW5kb3cubW9tZW50KHNjaGVkdWxlZERhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGUgPSB3aW5kb3cubW9tZW50KHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZURhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAubW9tZW50KHJlZmVyZW5jZURhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRPZignZGF5JylcbiAgICAgICAgICAgICAgICAgICAgICAgIC51dGModHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBycnVsZSA9IG5ldyBSUnVsZShvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3VycmVuY2Uoe1xuICAgICAgICAgICAgICAgICAgICBycnVsZSxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gQ291bGQgbm90IHJlYWQgcmVjdXJyZW5jZSBydWxlLiBVc2VyIHBvc3NpYmx5IG5vdCBkb25lIHR5cGluZy5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1RleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnJ1bGUudG9UZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG5leHQgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dCgpOiB7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9IHwgbnVsbCB7XG4gICAgICAgIC8vIFRoZSBuZXh0IG9jY3VycmVuY2Ugc2hvdWxkIGhhcHBlbiBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlXG4gICAgICAgIC8vIGRhdGUgaWYgcG9zc2libGUuIE90aGVyd2lzZSwgYmFzZSBpdCBvbiB0b2RheS5cbiAgICAgICAgbGV0IGFmdGVyOiBNb21lbnQ7XG4gICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZURhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENsb25lIHRvIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGRhdGUuXG4gICAgICAgICAgICBhZnRlciA9IHdpbmRvdy5tb21lbnQodGhpcy5yZWZlcmVuY2VEYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFmdGVyID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWZ0ZXIuZW5kT2YoJ2RheScpO1xuICAgICAgICBhZnRlci51dGModHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucnJ1bGUuYWZ0ZXIoYWZ0ZXIudG9EYXRlKCkpO1xuXG4gICAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZS1hZGQgdGhlIHRpbWV6b25lIHRoYXQgUlJ1bGUgZGlzcmVnYXJkZWQ6XG4gICAgICAgICAgICBjb25zdCBsb2NhbFRpbWVab25lID0gd2luZG93Lm1vbWVudC51dGMobmV4dCkubG9jYWwodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0T2NjdXJyZW5jZSA9IGxvY2FsVGltZVpvbmUuc3RhcnRPZignZGF5Jyk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kXG4gICAgICAgICAgICAvLyBzdGFydC9zY2hlZHVsZWQvZHVlLlxuICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgZHVlRGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgaWYgYSByZWZlcmVuY2UgZGF0ZSBpcyBnaXZlbi4gQSByZWZlcmVuY2UgZGF0ZSB3aWxsIGV4aXN0IGlmIGF0XG4gICAgICAgICAgICAvLyBsZWFzdCBvbmUgb2YgdGhlIG90aGVyIGRhdGVzIGlzIHNldC5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZURhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEaWZmZXJlbmNlID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmRpZmYodGhpcy5yZWZlcmVuY2VEYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uaW5nIHNvIHRoYXQgb3JpZ2luYWwgd29uJ3QgYmUgbWFuaXB1bGF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQobmV4dE9jY3VycmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZGluZyBkYXlzIHRvIGhhbmRsZSBjcm9zcyBkYXlsaWdodC1zYXZpbmdzLXRpbWUgcmVjdXJyZW5jZXMuXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZS5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG9yaWdpbmFsRGlmZmVyZW5jZS5hc0RheXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF5cycsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEaWZmZXJlbmNlID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVkRGF0ZS5kaWZmKHRoaXMucmVmZXJlbmNlRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmluZyBzbyB0aGF0IG9yaWdpbmFsIHdvbid0IGJlIG1hbmlwdWxhdGVkOlxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlID0gd2luZG93Lm1vbWVudChuZXh0T2NjdXJyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZS5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG9yaWdpbmFsRGlmZmVyZW5jZS5hc0RheXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF5cycsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmR1ZURhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEaWZmZXJlbmNlID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVlRGF0ZS5kaWZmKHRoaXMucmVmZXJlbmNlRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmluZyBzbyB0aGF0IG9yaWdpbmFsIHdvbid0IGJlIG1hbmlwdWxhdGVkOlxuICAgICAgICAgICAgICAgICAgICBkdWVEYXRlID0gd2luZG93Lm1vbWVudChuZXh0T2NjdXJyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZS5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG9yaWdpbmFsRGlmZmVyZW5jZS5hc0RheXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF5cycsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgICAgIGR1ZURhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGNsYXNzIFVyZ2VuY3kge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGR1ZUNvZWZmaWNpZW50ID0gMTIuMDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzY2hlZHVsZWRDb2VmZmljaWVudCA9IDUuMDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdGFydGVkQ29lZmZpY2llbnQgPSAtMy4wO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHByaW9yaXR5Q29lZmZpY2llbnQgPSA2LjA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBtaWxsaVNlY29uZHNQZXJEYXkgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuXG4gICAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGUodGFzazogVGFzayk6IG51bWJlciB7XG4gICAgICAgIGxldCB1cmdlbmN5ID0gMC4wO1xuXG4gICAgICAgIGlmICh0YXNrLmR1ZURhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE1hcCBhIHJhbmdlIG9mIDIxIGRheXMgdG8gdGhlIHZhbHVlIDAuMiAtIDEuMFxuICAgICAgICAgICAgY29uc3QgZGF5c092ZXJkdWUgPVxuICAgICAgICAgICAgICAgIHdpbmRvdy5tb21lbnQoKS5kaWZmKHRhc2suZHVlRGF0ZSkgLyBVcmdlbmN5Lm1pbGxpU2Vjb25kc1BlckRheTtcblxuICAgICAgICAgICAgbGV0IGR1ZU11bHRpcGxpZXI6IG51bWJlcjtcbiAgICAgICAgICAgIGlmIChkYXlzT3ZlcmR1ZSA+PSA3LjApIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMS4wOyAvLyA8IDEgd2sgYWdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheXNPdmVyZHVlID49IC0xNC4wKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIGJldHdlZW4gNyBkYXlzICgrNykgYWdvIGFuZCBpbiAxNCBkYXlzICgtMTQpXG4gICAgICAgICAgICAgICAgZHVlTXVsdGlwbGllciA9ICgoZGF5c092ZXJkdWUgKyAxNC4wKSAqIDAuOCkgLyAyMS4wICsgMC4yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMC4yOyAvLyA+IDIgd2tzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVyZ2VuY3kgKz0gZHVlTXVsdGlwbGllciAqIFVyZ2VuY3kuZHVlQ29lZmZpY2llbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zY2hlZHVsZWREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1vbWVudCgpLmlzU2FtZU9yQWZ0ZXIodGFzay5zY2hlZHVsZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMSAqIFVyZ2VuY3kuc2NoZWR1bGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zdGFydERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KCkuaXNCZWZvcmUodGFzay5zdGFydERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdXJnZW5jeSArPSAxICogVXJnZW5jeS5zdGFydGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRhc2sucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIC8vIEhpZ2hcbiAgICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMS4wICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gTWVkaXVtXG4gICAgICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuNjUgKiBVcmdlbmN5LnByaW9yaXR5Q29lZmZpY2llbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBOb25lXG4gICAgICAgICAgICBjYXNlICczJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuMzI1ICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVyZ2VuY3k7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBNYXJrZG93blJlbmRlcmVyIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyByZXBsYWNlVGFza1dpdGhUYXNrcyB9IGZyb20gJy4vRmlsZSc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vU2V0dGluZ3MnO1xuaW1wb3J0IHsgTGF5b3V0T3B0aW9ucyB9IGZyb20gJy4vTGF5b3V0T3B0aW9ucyc7XG5pbXBvcnQgeyBSZWN1cnJlbmNlIH0gZnJvbSAnLi9SZWN1cnJlbmNlJztcbmltcG9ydCB7IFVyZ2VuY3kgfSBmcm9tICcuL1VyZ2VuY3knO1xuXG5leHBvcnQgZW51bSBTdGF0dXMge1xuICAgIFRvZG8gPSAnVG9kbycsXG4gICAgRG9uZSA9ICdEb25lJyxcbn1cblxuLy8gU29ydCBsb3cgYmVsb3cgbm9uZS5cbmV4cG9ydCBlbnVtIFByaW9yaXR5IHtcbiAgICBIaWdoID0gJzEnLFxuICAgIE1lZGl1bSA9ICcyJyxcbiAgICBOb25lID0gJzMnLFxuICAgIExvdyA9ICc0Jyxcbn1cblxuZXhwb3J0IGNsYXNzIFRhc2sge1xuICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXM6IFN0YXR1cztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBpbmRlbnRhdGlvbjogc3RyaW5nO1xuICAgIC8qKiBMaW5lIG51bWJlciB3aGVyZSB0aGUgc2VjdGlvbiBzdGFydHMgdGhhdCBjb250YWlucyB0aGlzIHRhc2suICovXG4gICAgcHVibGljIHJlYWRvbmx5IHNlY3Rpb25TdGFydDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIG50aCB0YXNrIGluIGl0cyBzZWN0aW9uLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzZWN0aW9uSW5kZXg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgY2hhcmFjdGVyIGZyb20gd2l0aGluIGBbXWAgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqIFJlcXVpcmVkIHRvIGJlIGFkZGVkIHRvIHRoZSBMSSB0aGUgc2FtZSB3YXkgb2JzaWRpYW4gZG9lcyBhcyBhIGBkYXRhLXRhc2tgIGF0dHJpYnV0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxTdGF0dXNDaGFyYWN0ZXI6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJlY2VkaW5nSGVhZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQcmlvcml0eTtcblxuICAgIHB1YmxpYyByZWFkb25seSBzdGFydERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGR1ZURhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGRvbmVEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHJlY3VycmVuY2U6IFJlY3VycmVuY2UgfCBudWxsO1xuICAgIC8qKiBUaGUgYmxvY2tMaW5rIGlzIGEgXCJeXCIgYW5ub3RhdGlvbiBhZnRlciB0aGUgZGF0ZXMvcmVjdXJyZW5jZSBydWxlcy4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tMaW5rOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0YXNrUmVnZXggPSAvXihbXFxzXFx0XSopWy0qXSArXFxbKC4pXFxdICooLiopL3U7XG4gICAgLy8gVGhlIGZvbGxvd2luZyByZWdleGVzIGVuZCB3aXRoIGAkYCBiZWNhdXNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIGFuZFxuICAgIC8vIHJlbW92ZWQgZnJvbSB0aGUgZW5kIHVudGlsIG5vbmUgYXJlIGxlZnQuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBwcmlvcml0eVJlZ2V4ID0gLyhb4o+r8J+UvPCflL1dKSQvdTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0YXJ0RGF0ZVJlZ2V4ID0gL/Cfm6sgPyhcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzY2hlZHVsZWREYXRlUmVnZXggPSAvW+KPs+KMm10gPyhcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkdWVEYXRlUmVnZXggPSAvW/Cfk4Xwn5OG8J+Xk10gPyhcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkb25lRGF0ZVJlZ2V4ID0gL+KchSA/KFxcZHs0fS1cXGR7Mn0tXFxkezJ9KSQvdTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJlY3VycmVuY2VSZWdleCA9IC/wn5SBKFthLXpBLVowLTksICFdKykkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBibG9ja0xpbmtSZWdleCA9IC8gXFxeW2EtekEtWjAtOS1dKyQvdTtcblxuICAgIHByaXZhdGUgX3VyZ2VuY3k6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBzdGF0dXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBwYXRoLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgc2VjdGlvblN0YXJ0LFxuICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgIG9yaWdpbmFsU3RhdHVzQ2hhcmFjdGVyLFxuICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgICAgIGRvbmVEYXRlLFxuICAgICAgICByZWN1cnJlbmNlLFxuICAgICAgICBibG9ja0xpbmssXG4gICAgfToge1xuICAgICAgICBzdGF0dXM6IFN0YXR1cztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICBpbmRlbnRhdGlvbjogc3RyaW5nO1xuICAgICAgICBzZWN0aW9uU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgc2VjdGlvbkluZGV4OiBudW1iZXI7XG4gICAgICAgIG9yaWdpbmFsU3RhdHVzQ2hhcmFjdGVyOiBzdHJpbmc7XG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgcHJpb3JpdHk6IFByaW9yaXR5O1xuICAgICAgICBzdGFydERhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogbW9tZW50Lk1vbWVudCB8IG51bGw7XG4gICAgICAgIGRvbmVEYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgICAgIGJsb2NrTGluazogc3RyaW5nO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHNlY3Rpb25TdGFydDtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSBzZWN0aW9uSW5kZXg7XG4gICAgICAgIHRoaXMub3JpZ2luYWxTdGF0dXNDaGFyYWN0ZXIgPSBvcmlnaW5hbFN0YXR1c0NoYXJhY3RlcjtcbiAgICAgICAgdGhpcy5wcmVjZWRpbmdIZWFkZXIgPSBwcmVjZWRpbmdIZWFkZXI7XG5cbiAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZERhdGUgPSBzY2hlZHVsZWREYXRlO1xuICAgICAgICB0aGlzLmR1ZURhdGUgPSBkdWVEYXRlO1xuICAgICAgICB0aGlzLmRvbmVEYXRlID0gZG9uZURhdGU7XG5cbiAgICAgICAgdGhpcy5yZWN1cnJlbmNlID0gcmVjdXJyZW5jZTtcbiAgICAgICAgdGhpcy5ibG9ja0xpbmsgPSBibG9ja0xpbms7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tTGluZSh7XG4gICAgICAgIGxpbmUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHNlY3Rpb25TdGFydCxcbiAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgfToge1xuICAgICAgICBsaW5lOiBzdHJpbmc7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgc2VjdGlvblN0YXJ0OiBudW1iZXI7XG4gICAgICAgIHNlY3Rpb25JbmRleDogbnVtYmVyO1xuICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IHN0cmluZyB8IG51bGw7XG4gICAgfSk6IFRhc2sgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVnZXhNYXRjaCA9IGxpbmUubWF0Y2goVGFzay50YXNrUmVnZXgpO1xuICAgICAgICBpZiAocmVnZXhNYXRjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnRhdGlvbiA9IHJlZ2V4TWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IHN0YXR1c1N0cmluZyA9IHJlZ2V4TWF0Y2hbMl0udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgc3RhdHVzOiBTdGF0dXM7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzU3RyaW5nKSB7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuVG9kbztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzLkRvbmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaFszXSBpbmNsdWRlcyB0aGUgd2hvbGUgYm9keSBvZiB0aGUgdGFzayBhZnRlciB0aGUgYnJhY2tldHMuXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWdleE1hdGNoWzNdLnRyaW0oKTtcblxuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgaWYgKCFib2R5LmluY2x1ZGVzKGdsb2JhbEZpbHRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gYm9keTtcblxuICAgICAgICBjb25zdCBibG9ja0xpbmtNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKHRoaXMuYmxvY2tMaW5rUmVnZXgpO1xuICAgICAgICBjb25zdCBibG9ja0xpbmsgPSBibG9ja0xpbmtNYXRjaCAhPT0gbnVsbCA/IGJsb2NrTGlua01hdGNoWzBdIDogJyc7XG5cbiAgICAgICAgaWYgKGJsb2NrTGluayAhPT0gJycpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZSh0aGlzLmJsb2NrTGlua1JlZ2V4LCAnJykudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBtYXRjaGluZyBhbmQgcmVtb3Zpbmcgc3BlY2lhbCBzdHJpbmdzIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaW4gYW55IG9yZGVyLiBUaGUgbG9vcCBzaG91bGQgb25seSBydW4gb25jZSBpZiB0aGVcbiAgICAgICAgLy8gc3RyaW5ncyBhcmUgaW4gdGhlIGV4cGVjdGVkIG9yZGVyIGFmdGVyIHRoZSBkZXNjcmlwdGlvbi5cbiAgICAgICAgbGV0IG1hdGNoZWQ6IGJvb2xlYW47XG4gICAgICAgIGxldCBwcmlvcml0eTogUHJpb3JpdHkgPSBQcmlvcml0eS5Ob25lO1xuICAgICAgICBsZXQgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZHVlRGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBkb25lRGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCByZWN1cnJlbmNlOiBSZWN1cnJlbmNlIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIC8vIEFkZCBhIFwibWF4IHJ1bnNcIiBmYWlsc2FmZSB0byBuZXZlciBlbmQgaW4gYW4gZW5kbGVzcyBsb29wOlxuICAgICAgICBjb25zdCBtYXhSdW5zID0gNztcbiAgICAgICAgbGV0IHJ1bnMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwcmlvcml0eU1hdGNoID0gZGVzY3JpcHRpb24ubWF0Y2goVGFzay5wcmlvcml0eVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChwcmlvcml0eU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcmlvcml0eU1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ/CflL0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBQcmlvcml0eS5Mb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAn8J+UvCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IFByaW9yaXR5Lk1lZGl1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICfij6snOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShUYXNrLnByaW9yaXR5UmVnZXgsICcnKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkb25lRGF0ZU1hdGNoID0gZGVzY3JpcHRpb24ubWF0Y2goVGFzay5kb25lRGF0ZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChkb25lRGF0ZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZG9uZURhdGUgPSB3aW5kb3cubW9tZW50KGRvbmVEYXRlTWF0Y2hbMV0sIFRhc2suZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShUYXNrLmRvbmVEYXRlUmVnZXgsICcnKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkdWVEYXRlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrLmR1ZURhdGVSZWdleCk7XG4gICAgICAgICAgICBpZiAoZHVlRGF0ZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHVlRGF0ZSA9IHdpbmRvdy5tb21lbnQoZHVlRGF0ZU1hdGNoWzFdLCBUYXNrLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrLmR1ZURhdGVSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVkRGF0ZU1hdGNoID0gZGVzY3JpcHRpb24ubWF0Y2goXG4gICAgICAgICAgICAgICAgVGFzay5zY2hlZHVsZWREYXRlUmVnZXgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZERhdGVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSB3aW5kb3cubW9tZW50KFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlTWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIFRhc2suZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoVGFzay5zY2hlZHVsZWREYXRlUmVnZXgsICcnKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGVNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2suc3RhcnREYXRlUmVnZXgpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlID0gd2luZG93Lm1vbWVudChzdGFydERhdGVNYXRjaFsxXSwgVGFzay5kYXRlRm9ybWF0KTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFRhc2suc3RhcnREYXRlUmVnZXgsICcnKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWN1cnJlbmNlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrLnJlY3VycmVuY2VSZWdleCk7XG4gICAgICAgICAgICBpZiAocmVjdXJyZW5jZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVjdXJyZW5jZSA9IFJlY3VycmVuY2UuZnJvbVRleHQoe1xuICAgICAgICAgICAgICAgICAgICByZWN1cnJlbmNlUnVsZVRleHQ6IHJlY3VycmVuY2VNYXRjaFsxXS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoVGFzay5yZWN1cnJlbmNlUmVnZXgsICcnKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW5zKys7XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZWQgJiYgcnVucyA8PSBtYXhSdW5zKTtcblxuICAgICAgICBjb25zdCB0YXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgICBzZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXR1c0NoYXJhY3Rlcjogc3RhdHVzU3RyaW5nLFxuICAgICAgICAgICAgcHJlY2VkaW5nSGVhZGVyLFxuICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIGRvbmVEYXRlLFxuICAgICAgICAgICAgcmVjdXJyZW5jZSxcbiAgICAgICAgICAgIGJsb2NrTGluayxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRvTGkoe1xuICAgICAgICBwYXJlbnRVbEVsZW1lbnQsXG4gICAgICAgIGxpc3RJbmRleCxcbiAgICAgICAgbGF5b3V0T3B0aW9ucyxcbiAgICB9OiB7XG4gICAgICAgIHBhcmVudFVsRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8qKiBUaGUgbnRoIGl0ZW0gaW4gdGhpcyBsaXN0IChpbmNsdWRpbmcgbm9uLXRhc2tzKS4gKi9cbiAgICAgICAgbGlzdEluZGV4OiBudW1iZXI7XG4gICAgICAgIGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zO1xuICAgIH0pOiBQcm9taXNlPEhUTUxMSUVsZW1lbnQ+IHtcbiAgICAgICAgY29uc3QgbGk6IEhUTUxMSUVsZW1lbnQgPSBwYXJlbnRVbEVsZW1lbnQuY3JlYXRlRWwoJ2xpJyk7XG4gICAgICAgIGxpLmFkZENsYXNzZXMoWyd0YXNrLWxpc3QtaXRlbScsICdwbHVnaW4tdGFza3MtbGlzdC1pdGVtJ10pO1xuXG4gICAgICAgIGxldCB0YXNrQXNTdHJpbmcgPSB0aGlzLnRvU3RyaW5nKGxheW91dE9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciwgcmVtb3ZlR2xvYmFsRmlsdGVyIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICBpZiAocmVtb3ZlR2xvYmFsRmlsdGVyKSB7XG4gICAgICAgICAgICB0YXNrQXNTdHJpbmcgPSB0YXNrQXNTdHJpbmcucmVwbGFjZShnbG9iYWxGaWx0ZXIsICcnKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGxpLmNyZWF0ZVNwYW4oKTtcbiAgICAgICAgdGV4dFNwYW4uYWRkQ2xhc3MoJ3Rhc2tzLWxpc3QtdGV4dCcpO1xuXG4gICAgICAgIGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oXG4gICAgICAgICAgICB0YXNrQXNTdHJpbmcsXG4gICAgICAgICAgICB0ZXh0U3BhbixcbiAgICAgICAgICAgIHRoaXMucGF0aCxcbiAgICAgICAgICAgIG51bGwgYXMgdW5rbm93biBhcyBDb21wb25lbnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVW53cmFwIHRoZSBwLXRhZyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSBNYXJrZG93blJlbmRlcmVyOlxuICAgICAgICBjb25zdCBwRWxlbWVudCA9IHRleHRTcGFuLnF1ZXJ5U2VsZWN0b3IoJ3AnKTtcbiAgICAgICAgaWYgKHBFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aGlsZSAocEVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRleHRTcGFuLmluc2VydEJlZm9yZShwRWxlbWVudC5maXJzdENoaWxkLCBwRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBhbiBlbXB0eSB0cmFpbGluZyBwLXRhZyB0aGF0IHRoZSBNYXJrZG93blJlbmRlcmVyIGFwcGVuZHMgd2hlbiB0aGVyZSBpcyBhIGJsb2NrIGxpbms6XG4gICAgICAgIHRleHRTcGFuLmZpbmRBbGwoJ3AnKS5mb3JFYWNoKChwRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBwRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBmb290bm90ZSB0aGF0IHRoZSBNYXJrZG93blJlbmRlcmVyIGFwcGVuZHMgd2hlbiB0aGVyZSBpcyBhIGZvb3Rub3RlIGluIHRoZSB0YXNrOlxuICAgICAgICB0ZXh0U3Bhbi5maW5kQWxsKCcuZm9vdG5vdGVzJykuZm9yRWFjaCgoZm9vdG5vdGVFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBmb290bm90ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94ID0gbGkuY3JlYXRlRWwoJ2lucHV0Jyk7XG4gICAgICAgIGNoZWNrYm94LmFkZENsYXNzKCd0YXNrLWxpc3QtaXRlbS1jaGVja2JveCcpO1xuICAgICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzICE9PSBTdGF0dXMuVG9kbykge1xuICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBsaS5hZGRDbGFzcygnaXMtY2hlY2tlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrYm94Lm9uQ2xpY2tFdmVudCgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBJdCBpcyByZXF1aXJlZCB0byBzdG9wIHByb3BhZ2F0aW9uIHNvIHRoYXQgb2JzaWRpYW4gd29uJ3Qgd3JpdGUgdGhlIGZpbGUgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIGNoZWNrYm94ICh1biljaGVja2VkLiBPYnNpZGlhbiB3b3VsZCB3cml0ZSBhZnRlciB1cyBhbmQgb3ZlcndyaXRlIG91ciBjaGFuZ2UuXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHJlLXJlbmRlcmVkIGFzIGVuYWJsZWQgYWZ0ZXIgdXBkYXRlIGluIGZpbGUuXG4gICAgICAgICAgICBjaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgcmVwbGFjZVRhc2tXaXRoVGFza3Moe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVGFzazogdGhpcyxcbiAgICAgICAgICAgICAgICBuZXdUYXNrczogdG9nZ2xlZFRhc2tzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpLnByZXBlbmQoY2hlY2tib3gpO1xuXG4gICAgICAgIC8vIFNldCB0aGVzZSB0byBiZSBjb21wYXRpYmxlIHdpdGggc3RvY2sgb2JzaWRpYW4gbGlzdHM6XG4gICAgICAgIGxpLnNldEF0dHIoJ2RhdGEtdGFzaycsIHRoaXMub3JpZ2luYWxTdGF0dXNDaGFyYWN0ZXIudHJpbSgpKTsgLy8gVHJpbSB0byBlbnN1cmUgZW1wdHkgYXR0cmlidXRlIGZvciBzcGFjZS4gU2FtZSB3YXkgYXMgb2JzaWRpYW4uXG4gICAgICAgIGxpLnNldEF0dHIoJ2RhdGEtbGluZScsIGxpc3RJbmRleCk7XG4gICAgICAgIGNoZWNrYm94LnNldEF0dHIoJ2RhdGEtbGluZScsIGxpc3RJbmRleCk7XG5cbiAgICAgICAgaWYgKGxheW91dE9wdGlvbnM/LnNob3J0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRUb29sdGlwKHsgZWxlbWVudDogdGV4dFNwYW4gfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGF5b3V0T3B0aW9ucyA9IGxheW91dE9wdGlvbnMgPz8gbmV3IExheW91dE9wdGlvbnMoKTtcbiAgICAgICAgbGV0IHRhc2tTdHJpbmcgPSB0aGlzLmRlc2NyaXB0aW9uO1xuXG4gICAgICAgIGlmICghbGF5b3V0T3B0aW9ucy5oaWRlUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIGxldCBwcmlvcml0eTogc3RyaW5nID0gJyc7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnByaW9yaXR5ID09PSBQcmlvcml0eS5IaWdoKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAnIOKPqyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJpb3JpdHkgPT09IFByaW9yaXR5Lk1lZGl1bSkge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gJyDwn5S8JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTG93KSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAnIPCflL0nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXNrU3RyaW5nICs9IHByaW9yaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsYXlvdXRPcHRpb25zLmhpZGVSZWN1cnJlbmNlUnVsZSAmJiB0aGlzLnJlY3VycmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VSdWxlOiBzdHJpbmcgPSBsYXlvdXRPcHRpb25zLnNob3J0TW9kZVxuICAgICAgICAgICAgICAgID8gJyDwn5SBJ1xuICAgICAgICAgICAgICAgIDogYCDwn5SBICR7dGhpcy5yZWN1cnJlbmNlLnRvVGV4dCgpfWA7XG4gICAgICAgICAgICB0YXNrU3RyaW5nICs9IHJlY3VycmVuY2VSdWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsYXlvdXRPcHRpb25zLmhpZGVTdGFydERhdGUgJiYgdGhpcy5zdGFydERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogc3RyaW5nID0gbGF5b3V0T3B0aW9ucy5zaG9ydE1vZGVcbiAgICAgICAgICAgICAgICA/ICcg8J+bqydcbiAgICAgICAgICAgICAgICA6IGAg8J+bqyAke3RoaXMuc3RhcnREYXRlLmZvcm1hdChUYXNrLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICB0YXNrU3RyaW5nICs9IHN0YXJ0RGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGF5b3V0T3B0aW9ucy5oaWRlU2NoZWR1bGVkRGF0ZSAmJiB0aGlzLnNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlZERhdGU6IHN0cmluZyA9IGxheW91dE9wdGlvbnMuc2hvcnRNb2RlXG4gICAgICAgICAgICAgICAgPyAnIOKPsydcbiAgICAgICAgICAgICAgICA6IGAg4o+zICR7dGhpcy5zY2hlZHVsZWREYXRlLmZvcm1hdChUYXNrLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICB0YXNrU3RyaW5nICs9IHNjaGVkdWxlZERhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxheW91dE9wdGlvbnMuaGlkZUR1ZURhdGUgJiYgdGhpcy5kdWVEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBkdWVEYXRlOiBzdHJpbmcgPSBsYXlvdXRPcHRpb25zLnNob3J0TW9kZVxuICAgICAgICAgICAgICAgID8gJyDwn5OFJ1xuICAgICAgICAgICAgICAgIDogYCDwn5OFICR7dGhpcy5kdWVEYXRlLmZvcm1hdChUYXNrLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICB0YXNrU3RyaW5nICs9IGR1ZURhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxheW91dE9wdGlvbnMuaGlkZURvbmVEYXRlICYmIHRoaXMuZG9uZURhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVEYXRlOiBzdHJpbmcgPSBsYXlvdXRPcHRpb25zLnNob3J0TW9kZVxuICAgICAgICAgICAgICAgID8gJyDinIUnXG4gICAgICAgICAgICAgICAgOiBgIOKchSAke3RoaXMuZG9uZURhdGUuZm9ybWF0KFRhc2suZGF0ZUZvcm1hdCl9YDtcbiAgICAgICAgICAgIHRhc2tTdHJpbmcgKz0gZG9uZURhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBibG9ja0xpbms6IHN0cmluZyA9IHRoaXMuYmxvY2tMaW5rID8/ICcnO1xuICAgICAgICB0YXNrU3RyaW5nICs9IGJsb2NrTGluaztcblxuICAgICAgICByZXR1cm4gdGFza1N0cmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9GaWxlTGluZVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pbmRlbnRhdGlvbn0tIFske1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbFN0YXR1c0NoYXJhY3RlclxuICAgICAgICB9XSAke3RoaXMudG9TdHJpbmcoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhpcyB0YXNrIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgdGFza3MuXG4gICAgICpcbiAgICAgKiBUb2dnbGluZyBjYW4gcmVzdWx0IGluIG1vcmUgdGhhbiBvbmUgcmV0dXJuZWQgdGFzayBpbiB0aGUgY2FzZSBvZlxuICAgICAqIHJlY3VycmVuY2UuIElmIGl0IGlzIGEgcmVjdXJyaW5nIHRhc2ssIHRoZSB0b2dnbGVkIHRhc2sgd2lsbCBiZSByZXR1cm5lZFxuICAgICAqIHRvZ2V0aGVyIHdpdGggdGhlIG5leHQgb2NjdXJyZW5jZSBpbiB0aGUgb3JkZXIgYFtuZXh0LCB0b2dnbGVkXWAuIElmIHRoZVxuICAgICAqIHRhc2sgaXMgbm90IHJlY3VycmluZywgaXQgd2lsbCByZXR1cm4gYFt0b2dnbGVkXWAuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiBUYXNrW10ge1xuICAgICAgICBjb25zdCBuZXdTdGF0dXM6IFN0YXR1cyA9XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlRvZG8gPyBTdGF0dXMuRG9uZSA6IFN0YXR1cy5Ub2RvO1xuXG4gICAgICAgIGxldCBuZXdEb25lRGF0ZSA9IG51bGw7XG5cbiAgICAgICAgbGV0IG5leHRPY2N1cnJlbmNlOiB7XG4gICAgICAgICAgICBzdGFydERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChuZXdTdGF0dXMgIT09IFN0YXR1cy5Ub2RvKSB7XG4gICAgICAgICAgICBuZXdEb25lRGF0ZSA9IHdpbmRvdy5tb21lbnQoKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhpcyB0YXNrIGlzIG5vIGxvbmdlciB0b2RvLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIHJlY3VycmluZzpcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY3VycmVuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXh0T2NjdXJyZW5jZSA9IHRoaXMucmVjdXJyZW5jZS5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2dnbGVkVGFzayA9IG5ldyBUYXNrKHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBzdGF0dXM6IG5ld1N0YXR1cyxcbiAgICAgICAgICAgIGRvbmVEYXRlOiBuZXdEb25lRGF0ZSxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhdHVzQ2hhcmFjdGVyOiBuZXdTdGF0dXMgPT09IFN0YXR1cy5Eb25lID8gJ3gnIDogJyAnLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBuZXdUYXNrczogVGFza1tdID0gW107XG5cbiAgICAgICAgaWYgKG5leHRPY2N1cnJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0VGFzayA9IG5ldyBUYXNrKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgICAgIC4uLm5leHRPY2N1cnJlbmNlLFxuICAgICAgICAgICAgICAgIC8vIE5ldyBvY2N1cnJlbmNlcyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBibG9jayBsaW5rLlxuICAgICAgICAgICAgICAgIC8vIEFuZCByYW5kb20gYmxvY2sgbGlua3MgZG9uJ3QgaGVscC5cbiAgICAgICAgICAgICAgICBibG9ja0xpbms6ICcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdUYXNrcy5wdXNoKG5leHRUYXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIG5leHQgb2NjdXJyZW5jZSBiZWZvcmUgcHJldmlvdXMgb2NjdXJyZW5jZS5cbiAgICAgICAgbmV3VGFza3MucHVzaCh0b2dnbGVkVGFzayk7XG5cbiAgICAgICAgcmV0dXJuIG5ld1Rhc2tzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXJnZW5jeSgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fdXJnZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdXJnZW5jeSA9IFVyZ2VuY3kuY2FsY3VsYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyZ2VuY3k7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUb29sdGlwKHsgZWxlbWVudCB9OiB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50IH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5yZWN1cnJlbmNlIHx8XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSB8fFxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlIHx8XG4gICAgICAgICAgICB0aGlzLmR1ZURhdGUgfHxcbiAgICAgICAgICAgIHRoaXMuZG9uZURhdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbHRpcCA9IGVsZW1lbnQuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICAgICAgdG9vbHRpcC5hZGRDbGFzc2VzKFsndG9vbHRpcCcsICdtb2QtcmlnaHQnXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWN1cnJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VEaXYgPSB0b29sdGlwLmNyZWF0ZURpdigpO1xuICAgICAgICAgICAgICAgICAgICByZWN1cnJlbmNlRGl2LnNldFRleHQoYPCflIEgJHt0aGlzLnJlY3VycmVuY2UudG9UZXh0KCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZURpdi5zZXRUZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgVGFzay50b1Rvb2x0aXBEYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduaWZpZXI6ICfwn5urJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVkRGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGVEaXYuc2V0VGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhc2sudG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWVyOiAn4o+zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiB0aGlzLnNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kdWVEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1ZURhdGVEaXYgPSB0b29sdGlwLmNyZWF0ZURpdigpO1xuICAgICAgICAgICAgICAgICAgICBkdWVEYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBUYXNrLnRvVG9vbHRpcERhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogJ/Cfk4UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IHRoaXMuZHVlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmVEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbmVEYXRlRGl2ID0gdG9vbHRpcC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZURhdGVEaXYuc2V0VGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhc2sudG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWVyOiAn4pyFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiB0aGlzLmRvbmVEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0b29sdGlwLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyB0b1Rvb2x0aXBEYXRlKHtcbiAgICAgICAgc2lnbmlmaWVyLFxuICAgICAgICBkYXRlLFxuICAgIH06IHtcbiAgICAgICAgc2lnbmlmaWVyOiBzdHJpbmc7XG4gICAgICAgIGRhdGU6IE1vbWVudDtcbiAgICB9KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3NpZ25pZmllcn0gJHtkYXRlLmZvcm1hdChUYXNrLmRhdGVGb3JtYXQpfSAoJHtkYXRlLmZyb20oXG4gICAgICAgICAgICB3aW5kb3cubW9tZW50KCkuc3RhcnRPZignZGF5JyksXG4gICAgICAgICl9KWA7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBFdmVudFJlZixcbiAgICBNZXRhZGF0YUNhY2hlLFxuICAgIFNlY3Rpb25DYWNoZSxcbiAgICBUQWJzdHJhY3RGaWxlLFxuICAgIFRGaWxlLFxuICAgIFZhdWx0LFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcblxuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50cyB9IGZyb20gJy4vRXZlbnRzJztcblxuZXhwb3J0IGVudW0gU3RhdGUge1xuICAgIENvbGQgPSAnQ29sZCcsXG4gICAgSW5pdGlhbGl6aW5nID0gJ0luaXRpYWxpemluZycsXG4gICAgV2FybSA9ICdXYXJtJyxcbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhQ2FjaGU6IE1ldGFkYXRhQ2FjaGU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUNhY2hlRXZlbnRSZWZlcmVuY2VzOiBFdmVudFJlZltdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmF1bHQ6IFZhdWx0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmF1bHRFdmVudFJlZmVyZW5jZXM6IEV2ZW50UmVmW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IEV2ZW50cztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50c0V2ZW50UmVmZXJlbmNlczogRXZlbnRSZWZbXTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza3NNdXRleDogTXV0ZXg7XG4gICAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU7XG4gICAgcHJpdmF0ZSB0YXNrczogVGFza1tdO1xuXG4gICAgLyoqXG4gICAgICogV2UgY2Fubm90IGtub3cgaWYgdGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBiZWNhdXNlIG9ic2lkaWFuIHN0YXJ0ZWRcbiAgICAgKiBvciBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIGFjdGl2YXRlZCBsYXRlci4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGxvYWQgdGhlXG4gICAgICogd2hvbGUgdmF1bHQgb25jZSBhZnRlciB0aGUgZmlyc3QgbWV0YWRhdGEgY2FjaGUgcmVzb2x2ZSB0byBlbnN1cmUgdGhhdCB3ZVxuICAgICAqIGxvYWQgdGhlIGVudGlyZSB2YXVsdCBpbiBjYXNlIG9ic2lkaWFuIGlzIHN0YXJ0aW5nIHVwLiBJbiB0aGUgY2FzZSBvZlxuICAgICAqIG9ic2lkaWFuIHN0YXJ0aW5nLCB0aGUgdGFzayBjYWNoZSdzIGluaXRpYWwgbG9hZCB3b3VsZCBlbmQgdXAgd2l0aCAwIHRhc2tzLFxuICAgICAqIGFzIHRoZSBtZXRhZGF0YSBjYWNoZSB3b3VsZCBzdGlsbCBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBtZXRhZGF0YUNhY2hlLFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZXZlbnRzLFxuICAgIH06IHtcbiAgICAgICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICAgICAgdmF1bHQ6IFZhdWx0O1xuICAgICAgICBldmVudHM6IEV2ZW50cztcbiAgICB9KSB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZSA9IG1ldGFkYXRhQ2FjaGU7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLnZhdWx0ID0gdmF1bHQ7XG4gICAgICAgIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7XG4gICAgICAgIHRoaXMuZXZlbnRzRXZlbnRSZWZlcmVuY2VzID0gW107XG5cbiAgICAgICAgdGhpcy50YXNrc011dGV4ID0gbmV3IE11dGV4KCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5Db2xkO1xuICAgICAgICB0aGlzLnRhc2tzID0gW107XG5cbiAgICAgICAgdGhpcy5sb2FkZWRBZnRlckZpcnN0UmVzb2x2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9DYWNoZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0V2ZW50cygpO1xuXG4gICAgICAgIHRoaXMubG9hZFZhdWx0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVubG9hZCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudFJlZmVyZW5jZSBvZiB0aGlzLm1ldGFkYXRhQ2FjaGVFdmVudFJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZS5vZmZyZWYoZXZlbnRSZWZlcmVuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudFJlZmVyZW5jZSBvZiB0aGlzLnZhdWx0RXZlbnRSZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnZhdWx0Lm9mZnJlZihldmVudFJlZmVyZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmZXJlbmNlIG9mIHRoaXMuZXZlbnRzRXZlbnRSZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5vZmYoZXZlbnRSZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhc2tzKCk6IFRhc2tbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0ZSgpOiBTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5U3Vic2NyaWJlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRzLnRyaWdnZXJDYWNoZVVwZGF0ZSh7XG4gICAgICAgICAgICB0YXNrczogdGhpcy50YXNrcyxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvQ2FjaGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkRXZlbnRlUmVmZXJlbmNlID0gdGhpcy5tZXRhZGF0YUNhY2hlLm9uKFxuICAgICAgICAgICAgJ3Jlc29sdmVkJyxcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlZCBmaXJlcyBvbiBldmVyeSBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIGluaXRpYWxpemUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWRBZnRlckZpcnN0UmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1ldGFkYXRhQ2FjaGVFdmVudFJlZmVyZW5jZXMucHVzaChyZXNvbHZlZEV2ZW50ZVJlZmVyZW5jZSk7XG5cbiAgICAgICAgLy8gRG9lcyBub3QgZmlyZSB3aGVuIHN0YXJ0aW5nIHVwIG9ic2lkaWFuIGFuZCBvbmx5IHdvcmtzIGZvciBjaGFuZ2VzLlxuICAgICAgICBjb25zdCBjaGFuZ2VkRXZlbnRSZWZlcmVuY2UgPSB0aGlzLm1ldGFkYXRhQ2FjaGUub24oXG4gICAgICAgICAgICAnY2hhbmdlZCcsXG4gICAgICAgICAgICAoZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1ldGFkYXRhQ2FjaGVFdmVudFJlZmVyZW5jZXMucHVzaChjaGFuZ2VkRXZlbnRSZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9WYXVsdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEV2ZW50UmVmZXJlbmNlID0gdGhpcy52YXVsdC5vbihcbiAgICAgICAgICAgICdjcmVhdGUnLFxuICAgICAgICAgICAgKGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhdWx0RXZlbnRSZWZlcmVuY2VzLnB1c2goY3JlYXRlZEV2ZW50UmVmZXJlbmNlKTtcblxuICAgICAgICBjb25zdCBkZWxldGVkRXZlbnRSZWZlcmVuY2UgPSB0aGlzLnZhdWx0Lm9uKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICAoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5maWx0ZXIoKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnBhdGggIT09IGZpbGUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YXVsdEV2ZW50UmVmZXJlbmNlcy5wdXNoKGRlbGV0ZWRFdmVudFJlZmVyZW5jZSk7XG5cbiAgICAgICAgY29uc3QgcmVuYW1lZEV2ZW50UmVmZXJlbmNlID0gdGhpcy52YXVsdC5vbihcbiAgICAgICAgICAgICdyZW5hbWUnLFxuICAgICAgICAgICAgKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5tYXAoKHRhc2s6IFRhc2spOiBUYXNrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhc2soeyAuLi50YXNrLCBwYXRoOiBmaWxlLnBhdGggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhdWx0RXZlbnRSZWZlcmVuY2VzLnB1c2gocmVuYW1lZEV2ZW50UmVmZXJlbmNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1ZXN0UmVmZXJlbmNlID0gdGhpcy5ldmVudHMub25SZXF1ZXN0Q2FjaGVVcGRhdGUoKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZXIoeyB0YXNrczogdGhpcy50YXNrcywgc3RhdGU6IHRoaXMuc3RhdGUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50c0V2ZW50UmVmZXJlbmNlcy5wdXNoKHJlcXVlc3RSZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFZhdWx0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc011dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuSW5pdGlhbGl6aW5nO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgdGhpcy52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCkubWFwKChmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleEZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLldhcm07XG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUgY2FjaGUgaXMgbm93IHdhcm06XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5kZXhGaWxlKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZpbGVDYWNoZSA9IHRoaXMubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgICAgIGlmIChmaWxlQ2FjaGUgPT09IG51bGwgfHwgZmlsZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaXN0SXRlbXMgPSBmaWxlQ2FjaGUubGlzdEl0ZW1zO1xuICAgICAgICBpZiAobGlzdEl0ZW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gbGlzdCBpdGVtcyBjYWNoZSwgdGhlcmUgYXJlIG5vIHRhc2tzLlxuICAgICAgICAgICAgLy8gU3RpbGwgY29udGludWUgdG8gbm90aWZ5IHdhdGNoZXJzIG9mIHJlbW92YWwuXG4gICAgICAgICAgICBsaXN0SXRlbXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdGhpcy52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlTGluZXMgPSBmaWxlQ29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFsbCB0YXNrcyBmcm9tIHRoaXMgZmlsZSBmcm9tIHRoZSBjYWNoZSBiZWZvcmVcbiAgICAgICAgLy8gYWRkaW5nIHRoZSBvbmVzIHRoYXQgYXJlIGN1cnJlbnRseSBpbiB0aGUgZmlsZS5cbiAgICAgICAgdGhpcy50YXNrcyA9IHRoaXMudGFza3MuZmlsdGVyKCh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5wYXRoICE9PSBmaWxlLnBhdGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gc3RvcmUgc2VjdGlvbiBpbmZvcm1hdGlvbiB3aXRoIGV2ZXJ5IHRhc2sgc29cbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gdXNlIHRoYXQgd2hlbiB3ZSBwb3N0IHByb2Nlc3MgdGhlIG1hcmtkb3duXG4gICAgICAgIC8vIHJlbmRlcmVkIGxpc3RzLlxuICAgICAgICBsZXQgY3VycmVudFNlY3Rpb246IFNlY3Rpb25DYWNoZSB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2VjdGlvbkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0SXRlbSBvZiBsaXN0SXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChsaXN0SXRlbS50YXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLnBvc2l0aW9uLmVuZC5saW5lIDxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnBvc2l0aW9uLnN0YXJ0LmxpbmVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2VudCBwYXN0IHRoZSBjdXJyZW50IHNlY3Rpb24gKG9yIHRoaXMgaXMgdGhlIGZpcnN0IHRhc2spLlxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIHRoYXQgaXMgcmVsZXZhbnQgZm9yIHRoaXMgdGFzayBhbmQgdGhlIGZvbGxvd2luZyBvZiB0aGUgc2FtZSBzZWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9IHRoaXMuZ2V0U2VjdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyVGFzazogbGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zOiBmaWxlQ2FjaGUuc2VjdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcHJvY2VzcyBhIHRhc2sgd2l0aG91dCBhIHNlY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBmaWxlTGluZXNbbGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IFRhc2suZnJvbUxpbmUoe1xuICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25TdGFydDogY3VycmVudFNlY3Rpb24ucG9zaXRpb24uc3RhcnQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IHRoaXMuZ2V0UHJlY2VkaW5nSGVhZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJUYXNrOiBsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnM6IGZpbGVDYWNoZS5zZWN0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbCB1cGRhdGVkLCBpbmZvcm0gb3VyIHN1YnNjcmliZXJzLlxuICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWN0aW9uKHtcbiAgICAgICAgbGluZU51bWJlclRhc2ssXG4gICAgICAgIHNlY3Rpb25zLFxuICAgIH06IHtcbiAgICAgICAgbGluZU51bWJlclRhc2s6IG51bWJlcjtcbiAgICAgICAgc2VjdGlvbnM6IFNlY3Rpb25DYWNoZVtdIHwgdW5kZWZpbmVkO1xuICAgIH0pOiBTZWN0aW9uQ2FjaGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHNlY3Rpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2VjdGlvbi50eXBlID09PSAnbGlzdCcgJiZcbiAgICAgICAgICAgICAgICBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmUgPD0gbGluZU51bWJlclRhc2sgJiZcbiAgICAgICAgICAgICAgICBzZWN0aW9uLnBvc2l0aW9uLmVuZC5saW5lID49IGxpbmVOdW1iZXJUYXNrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJlY2VkaW5nSGVhZGVyKHtcbiAgICAgICAgbGluZU51bWJlclRhc2ssXG4gICAgICAgIHNlY3Rpb25zLFxuICAgICAgICBmaWxlTGluZXMsXG4gICAgfToge1xuICAgICAgICBsaW5lTnVtYmVyVGFzazogbnVtYmVyO1xuICAgICAgICBzZWN0aW9uczogU2VjdGlvbkNhY2hlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGZpbGVMaW5lczogc3RyaW5nW107XG4gICAgfSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoc2VjdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJlY2VkaW5nSGVhZGVyU2VjdGlvbjogU2VjdGlvbkNhY2hlIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnR5cGUgPT09ICdoZWFkaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmUgPiBsaW5lTnVtYmVyVGFzaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIGxvb3AgYXMgdGhlIGxhc3QgaGVhZGVyIHdhcyB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZWNlZGluZ0hlYWRlclNlY3Rpb24gPSBzZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVjZWRpbmdIZWFkZXJTZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZU51bWJlclByZWNlZGluZ0hlYWRlciA9XG4gICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXJTZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmU7XG5cbiAgICAgICAgY29uc3QgbGluZVByZWNlZGluZ0hlYWRlciA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyUHJlY2VkaW5nSGVhZGVyXTtcblxuICAgICAgICBjb25zdCBoZWFkZXJSZWdleCA9IC9eIysgKyguKikvdTtcbiAgICAgICAgY29uc3QgaGVhZGVyTWF0Y2ggPSBsaW5lUHJlY2VkaW5nSGVhZGVyLm1hdGNoKGhlYWRlclJlZ2V4KTtcbiAgICAgICAgaWYgKGhlYWRlck1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJNYXRjaFsxXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImZ1bmN0aW9uIG5vb3AoKSB7IH1cbmNvbnN0IGlkZW50aXR5ID0geCA9PiB4O1xuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAoY29uc3QgayBpbiBzcmMpXG4gICAgICAgIHRhcltrXSA9IHNyY1trXTtcbiAgICByZXR1cm4gdGFyO1xufVxuZnVuY3Rpb24gaXNfcHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gYWRkX2xvY2F0aW9uKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuICAgIGVsZW1lbnQuX19zdmVsdGVfbWV0YSA9IHtcbiAgICAgICAgbG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmxldCBzcmNfdXJsX2VxdWFsX2FuY2hvcjtcbmZ1bmN0aW9uIHNyY191cmxfZXF1YWwoZWxlbWVudF9zcmMsIHVybCkge1xuICAgIGlmICghc3JjX3VybF9lcXVhbF9hbmNob3IpIHtcbiAgICAgICAgc3JjX3VybF9lcXVhbF9hbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuICAgIHNyY191cmxfZXF1YWxfYW5jaG9yLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGVsZW1lbnRfc3JjID09PSBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmO1xufVxuZnVuY3Rpb24gbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYjtcbn1cbmZ1bmN0aW9uIGlzX2VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3N0b3JlKHN0b3JlLCBuYW1lKSB7XG4gICAgaWYgKHN0b3JlICE9IG51bGwgJiYgdHlwZW9mIHN0b3JlLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25hbWV9JyBpcyBub3QgYSBzdG9yZSB3aXRoIGEgJ3N1YnNjcmliZScgbWV0aG9kYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc3Vic2NyaWJlKHN0b3JlLCAuLi5jYWxsYmFja3MpIHtcbiAgICBpZiAoc3RvcmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICB9XG4gICAgY29uc3QgdW5zdWIgPSBzdG9yZS5zdWJzY3JpYmUoLi4uY2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdW5zdWIudW5zdWJzY3JpYmUgPyAoKSA9PiB1bnN1Yi51bnN1YnNjcmliZSgpIDogdW5zdWI7XG59XG5mdW5jdGlvbiBnZXRfc3RvcmVfdmFsdWUoc3RvcmUpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgc3Vic2NyaWJlKHN0b3JlLCBfID0+IHZhbHVlID0gXykoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjb21wb25lbnRfc3Vic2NyaWJlKGNvbXBvbmVudCwgc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kucHVzaChzdWJzY3JpYmUoc3RvcmUsIGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV0gJiYgZm5cbiAgICAgICAgPyBhc3NpZ24oJCRzY29wZS5jdHguc2xpY2UoKSwgZGVmaW5pdGlvblsxXShmbihjdHgpKSlcbiAgICAgICAgOiAkJHNjb3BlLmN0eDtcbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NoYW5nZXMoZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHtcbiAgICAgICAgY29uc3QgbGV0cyA9IGRlZmluaXRpb25bMl0oZm4oZGlydHkpKTtcbiAgICAgICAgaWYgKCQkc2NvcGUuZGlydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCgkJHNjb3BlLmRpcnR5Lmxlbmd0aCwgbGV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCRzY29wZS5kaXJ0eSB8IGxldHM7XG4gICAgfVxuICAgIHJldHVybiAkJHNjb3BlLmRpcnR5O1xufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3RfYmFzZShzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgc2xvdF9jaGFuZ2VzLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgaWYgKHNsb3RfY2hhbmdlcykge1xuICAgICAgICBjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbiAgICAgICAgc2xvdC5wKHNsb3RfY29udGV4dCwgc2xvdF9jaGFuZ2VzKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdChzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG59XG5mdW5jdGlvbiBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUoJCRzY29wZSkge1xuICAgIGlmICgkJHNjb3BlLmN0eC5sZW5ndGggPiAzMikge1xuICAgICAgICBjb25zdCBkaXJ0eSA9IFtdO1xuICAgICAgICBjb25zdCBsZW5ndGggPSAkJHNjb3BlLmN0eC5sZW5ndGggLyAzMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZGlydHlbaV0gPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMocHJvcHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmIChrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN1bHRba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9yZXN0X3Byb3BzKHByb3BzLCBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHt9O1xuICAgIGtleXMgPSBuZXcgU2V0KGtleXMpO1xuICAgIGZvciAoY29uc3QgayBpbiBwcm9wcylcbiAgICAgICAgaWYgKCFrZXlzLmhhcyhrKSAmJiBrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3Q7XG59XG5mdW5jdGlvbiBjb21wdXRlX3Nsb3RzKHNsb3RzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb25jZShmbikge1xuICAgIGxldCByYW4gPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHJhbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbnVsbF90b19lbXB0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9zdG9yZV92YWx1ZShzdG9yZSwgcmV0LCB2YWx1ZSkge1xuICAgIHN0b3JlLnNldCh2YWx1ZSk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGhhc19wcm9wID0gKG9iaiwgcHJvcCkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG5mdW5jdGlvbiBhY3Rpb25fZGVzdHJveWVyKGFjdGlvbl9yZXN1bHQpIHtcbiAgICByZXR1cm4gYWN0aW9uX3Jlc3VsdCAmJiBpc19mdW5jdGlvbihhY3Rpb25fcmVzdWx0LmRlc3Ryb3kpID8gYWN0aW9uX3Jlc3VsdC5kZXN0cm95IDogbm9vcDtcbn1cblxuY29uc3QgaXNfY2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5sZXQgbm93ID0gaXNfY2xpZW50XG4gICAgPyAoKSA9PiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClcbiAgICA6ICgpID0+IERhdGUubm93KCk7XG5sZXQgcmFmID0gaXNfY2xpZW50ID8gY2IgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKSA6IG5vb3A7XG4vLyB1c2VkIGludGVybmFsbHkgZm9yIHRlc3RpbmdcbmZ1bmN0aW9uIHNldF9ub3coZm4pIHtcbiAgICBub3cgPSBmbjtcbn1cbmZ1bmN0aW9uIHNldF9yYWYoZm4pIHtcbiAgICByYWYgPSBmbjtcbn1cblxuY29uc3QgdGFza3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBydW5fdGFza3Mobm93KSB7XG4gICAgdGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmMobm93KSkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICAgICAgdGFzay5mKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGFza3Muc2l6ZSAhPT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG59XG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhXG4gKi9cbmZ1bmN0aW9uIGNsZWFyX2xvb3BzKCkge1xuICAgIHRhc2tzLmNsZWFyKCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGFzayB0aGF0IHJ1bnMgb24gZWFjaCByYWYgZnJhbWVcbiAqIHVudGlsIGl0IHJldHVybnMgYSBmYWxzeSB2YWx1ZSBvciBpcyBhYm9ydGVkXG4gKi9cbmZ1bmN0aW9uIGxvb3AoY2FsbGJhY2spIHtcbiAgICBsZXQgdGFzaztcbiAgICBpZiAodGFza3Muc2l6ZSA9PT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVsZmlsbCA9PiB7XG4gICAgICAgICAgICB0YXNrcy5hZGQodGFzayA9IHsgYzogY2FsbGJhY2ssIGY6IGZ1bGZpbGwgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBhYm9ydCgpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRyYWNrIHdoaWNoIG5vZGVzIGFyZSBjbGFpbWVkIGR1cmluZyBoeWRyYXRpb24uIFVuY2xhaW1lZCBub2RlcyBjYW4gdGhlbiBiZSByZW1vdmVkIGZyb20gdGhlIERPTVxuLy8gYXQgdGhlIGVuZCBvZiBoeWRyYXRpb24gd2l0aG91dCB0b3VjaGluZyB0aGUgcmVtYWluaW5nIG5vZGVzLlxubGV0IGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc3RhcnRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IHRydWU7XG59XG5mdW5jdGlvbiBlbmRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gdXBwZXJfYm91bmQobG93LCBoaWdoLCBrZXksIHZhbHVlKSB7XG4gICAgLy8gUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlIGxhcmdlciB0aGFuIGlucHV0IHZhbHVlIGluIHRoZSByYW5nZSBbbG93LCBoaWdoKVxuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7XG4gICAgICAgIGlmIChrZXkobWlkKSA8PSB2YWx1ZSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbn1cbmZ1bmN0aW9uIGluaXRfaHlkcmF0ZSh0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0Lmh5ZHJhdGVfaW5pdClcbiAgICAgICAgcmV0dXJuO1xuICAgIHRhcmdldC5oeWRyYXRlX2luaXQgPSB0cnVlO1xuICAgIC8vIFdlIGtub3cgdGhhdCBhbGwgY2hpbGRyZW4gaGF2ZSBjbGFpbV9vcmRlciB2YWx1ZXMgc2luY2UgdGhlIHVuY2xhaW1lZCBoYXZlIGJlZW4gZGV0YWNoZWQgaWYgdGFyZ2V0IGlzIG5vdCA8aGVhZD5cbiAgICBsZXQgY2hpbGRyZW4gPSB0YXJnZXQuY2hpbGROb2RlcztcbiAgICAvLyBJZiB0YXJnZXQgaXMgPGhlYWQ+LCB0aGVyZSBtYXkgYmUgY2hpbGRyZW4gd2l0aG91dCBjbGFpbV9vcmRlclxuICAgIGlmICh0YXJnZXQubm9kZU5hbWUgPT09ICdIRUFEJykge1xuICAgICAgICBjb25zdCBteUNoaWxkcmVuID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBteUNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSBteUNoaWxkcmVuO1xuICAgIH1cbiAgICAvKlxuICAgICogUmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseS5cbiAgICAqIFdlIGNhbiByZW9yZGVyIGNsYWltZWQgY2hpbGRyZW4gb3B0aW1hbGx5IGJ5IGZpbmRpbmcgdGhlIGxvbmdlc3Qgc3Vic2VxdWVuY2Ugb2ZcbiAgICAqIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgY2xhaW1lZCBpbiBvcmRlciBhbmQgb25seSBtb3ZpbmcgdGhlIHJlc3QuIFRoZSBsb25nZXN0XG4gICAgKiBzdWJzZXF1ZW5jZSBzdWJzZXF1ZW5jZSBvZiBub2RlcyB0aGF0IGFyZSBjbGFpbWVkIGluIG9yZGVyIGNhbiBiZSBmb3VuZCBieVxuICAgICogY29tcHV0aW5nIHRoZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgLmNsYWltX29yZGVyIHZhbHVlcy5cbiAgICAqXG4gICAgKiBUaGlzIGFsZ29yaXRobSBpcyBvcHRpbWFsIGluIGdlbmVyYXRpbmcgdGhlIGxlYXN0IGFtb3VudCBvZiByZW9yZGVyIG9wZXJhdGlvbnNcbiAgICAqIHBvc3NpYmxlLlxuICAgICpcbiAgICAqIFByb29mOlxuICAgICogV2Uga25vdyB0aGF0LCBnaXZlbiBhIHNldCBvZiByZW9yZGVyaW5nIG9wZXJhdGlvbnMsIHRoZSBub2RlcyB0aGF0IGRvIG5vdCBtb3ZlXG4gICAgKiBhbHdheXMgZm9ybSBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLCBzaW5jZSB0aGV5IGRvIG5vdCBtb3ZlIGFtb25nIGVhY2ggb3RoZXJcbiAgICAqIG1lYW5pbmcgdGhhdCB0aGV5IG11c3QgYmUgYWxyZWFkeSBvcmRlcmVkIGFtb25nIGVhY2ggb3RoZXIuIFRodXMsIHRoZSBtYXhpbWFsXG4gICAgKiBzZXQgb2Ygbm9kZXMgdGhhdCBkbyBub3QgbW92ZSBmb3JtIGEgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLlxuICAgICovXG4gICAgLy8gQ29tcHV0ZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2VcbiAgICAvLyBtOiBzdWJzZXF1ZW5jZSBsZW5ndGggaiA9PiBpbmRleCBrIG9mIHNtYWxsZXN0IHZhbHVlIHRoYXQgZW5kcyBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIGxlbmd0aCBqXG4gICAgY29uc3QgbSA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCArIDEpO1xuICAgIC8vIFByZWRlY2Vzc29yIGluZGljZXMgKyAxXG4gICAgY29uc3QgcCA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgbVswXSA9IC0xO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjaGlsZHJlbltpXS5jbGFpbV9vcmRlcjtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFyZ2VzdCBzdWJzZXF1ZW5jZSBsZW5ndGggc3VjaCB0aGF0IGl0IGVuZHMgaW4gYSB2YWx1ZSBsZXNzIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgLy8gdXBwZXJfYm91bmQgcmV0dXJucyBmaXJzdCBncmVhdGVyIHZhbHVlLCBzbyB3ZSBzdWJ0cmFjdCBvbmVcbiAgICAgICAgLy8gd2l0aCBmYXN0IHBhdGggZm9yIHdoZW4gd2UgYXJlIG9uIHRoZSBjdXJyZW50IGxvbmdlc3Qgc3Vic2VxdWVuY2VcbiAgICAgICAgY29uc3Qgc2VxTGVuID0gKChsb25nZXN0ID4gMCAmJiBjaGlsZHJlblttW2xvbmdlc3RdXS5jbGFpbV9vcmRlciA8PSBjdXJyZW50KSA/IGxvbmdlc3QgKyAxIDogdXBwZXJfYm91bmQoMSwgbG9uZ2VzdCwgaWR4ID0+IGNoaWxkcmVuW21baWR4XV0uY2xhaW1fb3JkZXIsIGN1cnJlbnQpKSAtIDE7XG4gICAgICAgIHBbaV0gPSBtW3NlcUxlbl0gKyAxO1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBzZXFMZW4gKyAxO1xuICAgICAgICAvLyBXZSBjYW4gZ3VhcmFudGVlIHRoYXQgY3VycmVudCBpcyB0aGUgc21hbGxlc3QgdmFsdWUuIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSBnZW5lcmF0ZWQgYSBsb25nZXIgc2VxdWVuY2UuXG4gICAgICAgIG1bbmV3TGVuXSA9IGk7XG4gICAgICAgIGxvbmdlc3QgPSBNYXRoLm1heChuZXdMZW4sIGxvbmdlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIG5vZGVzIChpbml0aWFsbHkgcmV2ZXJzZWQpXG4gICAgY29uc3QgbGlzID0gW107XG4gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIG5vZGVzLCBub2RlcyB0aGF0IHdpbGwgYmUgbW92ZWRcbiAgICBjb25zdCB0b01vdmUgPSBbXTtcbiAgICBsZXQgbGFzdCA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgZm9yIChsZXQgY3VyID0gbVtsb25nZXN0XSArIDE7IGN1ciAhPSAwOyBjdXIgPSBwW2N1ciAtIDFdKSB7XG4gICAgICAgIGxpcy5wdXNoKGNoaWxkcmVuW2N1ciAtIDFdKTtcbiAgICAgICAgZm9yICg7IGxhc3QgPj0gY3VyOyBsYXN0LS0pIHtcbiAgICAgICAgICAgIHRvTW92ZS5wdXNoKGNoaWxkcmVuW2xhc3RdKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0LS07XG4gICAgfVxuICAgIGZvciAoOyBsYXN0ID49IDA7IGxhc3QtLSkge1xuICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgfVxuICAgIGxpcy5yZXZlcnNlKCk7XG4gICAgLy8gV2Ugc29ydCB0aGUgbm9kZXMgYmVpbmcgbW92ZWQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIG1hdGNoZXMgdGhlIGNsYWltIG9yZGVyXG4gICAgdG9Nb3ZlLnNvcnQoKGEsIGIpID0+IGEuY2xhaW1fb3JkZXIgLSBiLmNsYWltX29yZGVyKTtcbiAgICAvLyBGaW5hbGx5LCB3ZSBtb3ZlIHRoZSBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHRvTW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3aGlsZSAoaiA8IGxpcy5sZW5ndGggJiYgdG9Nb3ZlW2ldLmNsYWltX29yZGVyID49IGxpc1tqXS5jbGFpbV9vcmRlcikge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGogPCBsaXMubGVuZ3RoID8gbGlzW2pdIDogbnVsbDtcbiAgICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0b01vdmVbaV0sIGFuY2hvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9zdHlsZXModGFyZ2V0LCBzdHlsZV9zaGVldF9pZCwgc3R5bGVzKSB7XG4gICAgY29uc3QgYXBwZW5kX3N0eWxlc190byA9IGdldF9yb290X2Zvcl9zdHlsZSh0YXJnZXQpO1xuICAgIGlmICghYXBwZW5kX3N0eWxlc190by5nZXRFbGVtZW50QnlJZChzdHlsZV9zaGVldF9pZCkpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pZCA9IHN0eWxlX3NoZWV0X2lkO1xuICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgICAgICAgYXBwZW5kX3N0eWxlc2hlZXQoYXBwZW5kX3N0eWxlc190bywgc3R5bGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9yb290X2Zvcl9zdHlsZShub2RlKSB7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgY29uc3Qgcm9vdCA9IG5vZGUuZ2V0Um9vdE5vZGUgPyBub2RlLmdldFJvb3ROb2RlKCkgOiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKHJvb3QgJiYgcm9vdC5ob3N0KSB7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQobm9kZSkge1xuICAgIGNvbnN0IHN0eWxlX2VsZW1lbnQgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgIGFwcGVuZF9zdHlsZXNoZWV0KGdldF9yb290X2Zvcl9zdHlsZShub2RlKSwgc3R5bGVfZWxlbWVudCk7XG4gICAgcmV0dXJuIHN0eWxlX2VsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzaGVldChub2RlLCBzdHlsZSkge1xuICAgIGFwcGVuZChub2RlLmhlYWQgfHwgbm9kZSwgc3R5bGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nKSB7XG4gICAgICAgIGluaXRfaHlkcmF0ZSh0YXJnZXQpO1xuICAgICAgICBpZiAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID09PSB1bmRlZmluZWQpIHx8ICgodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgIT09IG51bGwpICYmICh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZC5wYXJlbnRFbGVtZW50ICE9PSB0YXJnZXQpKSkge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIG5vZGVzIG9mIHVuZGVmaW5lZCBvcmRlcmluZ1xuICAgICAgICB3aGlsZSAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQuY2xhaW1fb3JkZXIgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgIT09IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKSB7XG4gICAgICAgICAgICAvLyBXZSBvbmx5IGluc2VydCBpZiB0aGUgb3JkZXJpbmcgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBtb2RpZmllZCBvciB0aGUgcGFyZW50IG5vZGUgaXMgbm90IHRhcmdldFxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhaW1fb3JkZXIgIT09IHVuZGVmaW5lZCB8fCBub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGlmIChpc19oeWRyYXRpbmcgJiYgIWFuY2hvcikge1xuICAgICAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT0gYW5jaG9yKSB7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG4gICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gZGVzdHJveV9lYWNoKGl0ZXJhdGlvbnMsIGRldGFjaGluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoaXRlcmF0aW9uc1tpXSlcbiAgICAgICAgICAgIGl0ZXJhdGlvbnNbaV0uZChkZXRhY2hpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gZWxlbWVudF9pcyhuYW1lLCBpcykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUsIHsgaXMgfSk7XG59XG5mdW5jdGlvbiBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKG9iaiwgZXhjbHVkZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc19wcm9wKG9iaiwgaylcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICYmIGV4Y2x1ZGUuaW5kZXhPZihrKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRhcmdldFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc3ZnX2VsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbmFtZSk7XG59XG5mdW5jdGlvbiB0ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7XG59XG5mdW5jdGlvbiBzcGFjZSgpIHtcbiAgICByZXR1cm4gdGV4dCgnICcpO1xufVxuZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRleHQoJycpO1xufVxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRfZGVmYXVsdChmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0b3BfcHJvcGFnYXRpb24oZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2VsZihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzKVxuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRydXN0ZWQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LmlzVHJ1c3RlZClcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobm9kZS5fX3Byb3RvX18pO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ19fdmFsdWUnKSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlID0gbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3JzW2tleV0gJiYgZGVzY3JpcHRvcnNba2V5XS5zZXQpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N2Z19hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhKG5vZGUsIHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKHByb3AgaW4gbm9kZSkge1xuICAgICAgICBub2RlW3Byb3BdID0gdHlwZW9mIG5vZGVbcHJvcF0gPT09ICdib29sZWFuJyAmJiB2YWx1ZSA9PT0gJycgPyB0cnVlIDogdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB4bGlua19hdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRfYmluZGluZ19ncm91cF92YWx1ZShncm91cCwgX192YWx1ZSwgY2hlY2tlZCkge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5hZGQoZ3JvdXBbaV0uX192YWx1ZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZS5kZWxldGUoX192YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvX251bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgPyBudWxsIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGluaXRfY2xhaW1faW5mbyhub2Rlcykge1xuICAgIGlmIChub2Rlcy5jbGFpbV9pbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mbyA9IHsgbGFzdF9pbmRleDogMCwgdG90YWxfY2xhaW1lZDogMCB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsYWltX25vZGUobm9kZXMsIHByZWRpY2F0ZSwgcHJvY2Vzc05vZGUsIGNyZWF0ZU5vZGUsIGRvbnRVcGRhdGVMYXN0SW5kZXggPSBmYWxzZSkge1xuICAgIC8vIFRyeSB0byBmaW5kIG5vZGVzIGluIGFuIG9yZGVyIHN1Y2ggdGhhdCB3ZSBsZW5ndGhlbiB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgaW5pdF9jbGFpbV9pbmZvKG5vZGVzKTtcbiAgICBjb25zdCByZXN1bHROb2RlID0gKCgpID0+IHtcbiAgICAgICAgLy8gV2UgZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZWxlbWVudCBhZnRlciB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXg7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2UgdHJ5IHRvIGZpbmQgb25lIGJlZm9yZVxuICAgICAgICAvLyBXZSBpdGVyYXRlIGluIHJldmVyc2Ugc28gdGhhdCB3ZSBkb24ndCBnbyB0b28gZmFyIGJhY2tcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBwcm9jZXNzTm9kZShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1tpXSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRvbnRVcGRhdGVMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBzcGxpY2VkIGJlZm9yZSB0aGUgbGFzdF9pbmRleCwgd2UgZGVjcmVhc2UgaXRcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW55IG1hdGNoaW5nIG5vZGUsIHdlIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoKTtcbiAgICB9KSgpO1xuICAgIHJlc3VsdE5vZGUuY2xhaW1fb3JkZXIgPSBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQ7XG4gICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgcmV0dXJuIHJlc3VsdE5vZGU7XG59XG5mdW5jdGlvbiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGNyZWF0ZV9lbGVtZW50KSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVOYW1lID09PSBuYW1lLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGUuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlLmZvckVhY2godiA9PiBub2RlLnJlbW92ZUF0dHJpYnV0ZSh2KSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSwgKCkgPT4gY3JlYXRlX2VsZW1lbnQobmFtZSkpO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudChub2RlcywgbmFtZSwgYXR0cmlidXRlcykge1xuICAgIHJldHVybiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fc3ZnX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmdfZWxlbWVudCk7XG59XG5mdW5jdGlvbiBjbGFpbV90ZXh0KG5vZGVzLCBkYXRhKSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVUeXBlID09PSAzLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhU3RyID0gJycgKyBkYXRhO1xuICAgICAgICBpZiAobm9kZS5kYXRhLnN0YXJ0c1dpdGgoZGF0YVN0cikpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRhdGEubGVuZ3RoICE9PSBkYXRhU3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnNwbGl0VGV4dChkYXRhU3RyLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSBkYXRhU3RyO1xuICAgICAgICB9XG4gICAgfSwgKCkgPT4gdGV4dChkYXRhKSwgdHJ1ZSAvLyBUZXh0IG5vZGVzIHNob3VsZCBub3QgdXBkYXRlIGxhc3QgaW5kZXggc2luY2UgaXQgaXMgbGlrZWx5IG5vdCB3b3J0aCBpdCB0byBlbGltaW5hdGUgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBhY3R1YWwgZWxlbWVudHNcbiAgICApO1xufVxuZnVuY3Rpb24gY2xhaW1fc3BhY2Uobm9kZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fdGV4dChub2RlcywgJyAnKTtcbn1cbmZ1bmN0aW9uIGZpbmRfY29tbWVudChub2RlcywgdGV4dCwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4IC8qIGNvbW1lbnQgbm9kZSAqLyAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKSA9PT0gdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNsYWltX2h0bWxfdGFnKG5vZGVzKSB7XG4gICAgLy8gZmluZCBodG1sIG9wZW5pbmcgdGFnXG4gICAgY29uc3Qgc3RhcnRfaW5kZXggPSBmaW5kX2NvbW1lbnQobm9kZXMsICdIVE1MX1RBR19TVEFSVCcsIDApO1xuICAgIGNvbnN0IGVuZF9pbmRleCA9IGZpbmRfY29tbWVudChub2RlcywgJ0hUTUxfVEFHX0VORCcsIHN0YXJ0X2luZGV4KTtcbiAgICBpZiAoc3RhcnRfaW5kZXggPT09IGVuZF9pbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IEh0bWxUYWdIeWRyYXRpb24oKTtcbiAgICB9XG4gICAgaW5pdF9jbGFpbV9pbmZvKG5vZGVzKTtcbiAgICBjb25zdCBodG1sX3RhZ19ub2RlcyA9IG5vZGVzLnNwbGljZShzdGFydF9pbmRleCwgZW5kX2luZGV4ICsgMSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzWzBdKTtcbiAgICBkZXRhY2goaHRtbF90YWdfbm9kZXNbaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGNsYWltZWRfbm9kZXMgPSBodG1sX3RhZ19ub2Rlcy5zbGljZSgxLCBodG1sX3RhZ19ub2Rlcy5sZW5ndGggLSAxKTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgY2xhaW1lZF9ub2Rlcykge1xuICAgICAgICBuLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKGNsYWltZWRfbm9kZXMpO1xufVxuZnVuY3Rpb24gc2V0X2RhdGEodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ICE9PSBkYXRhKVxuICAgICAgICB0ZXh0LmRhdGEgPSBkYXRhO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3ZhbHVlKGlucHV0LCB2YWx1ZSkge1xuICAgIGlucHV0LnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfaW5wdXRfdHlwZShpbnB1dCwgdHlwZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGlucHV0LnR5cGUgPSB0eXBlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N0eWxlKG5vZGUsIGtleSwgdmFsdWUsIGltcG9ydGFudCkge1xuICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSwgaW1wb3J0YW50ID8gJ2ltcG9ydGFudCcgOiAnJyk7XG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9uKHNlbGVjdCwgdmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdC5vcHRpb25zW2ldO1xuICAgICAgICBpZiAob3B0aW9uLl9fdmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gLTE7IC8vIG5vIG9wdGlvbiBzaG91bGQgYmUgc2VsZWN0ZWRcbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb25zKHNlbGVjdCwgdmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdC5vcHRpb25zW2ldO1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB+dmFsdWUuaW5kZXhPZihvcHRpb24uX192YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0X3ZhbHVlKHNlbGVjdCkge1xuICAgIGNvbnN0IHNlbGVjdGVkX29wdGlvbiA9IHNlbGVjdC5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpIHx8IHNlbGVjdC5vcHRpb25zWzBdO1xuICAgIHJldHVybiBzZWxlY3RlZF9vcHRpb24gJiYgc2VsZWN0ZWRfb3B0aW9uLl9fdmFsdWU7XG59XG5mdW5jdGlvbiBzZWxlY3RfbXVsdGlwbGVfdmFsdWUoc2VsZWN0KSB7XG4gICAgcmV0dXJuIFtdLm1hcC5jYWxsKHNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCc6Y2hlY2tlZCcpLCBvcHRpb24gPT4gb3B0aW9uLl9fdmFsdWUpO1xufVxuLy8gdW5mb3J0dW5hdGVseSB0aGlzIGNhbid0IGJlIGEgY29uc3RhbnQgYXMgdGhhdCB3b3VsZG4ndCBiZSB0cmVlLXNoYWtlYWJsZVxuLy8gc28gd2UgY2FjaGUgdGhlIHJlc3VsdCBpbnN0ZWFkXG5sZXQgY3Jvc3NvcmlnaW47XG5mdW5jdGlvbiBpc19jcm9zc29yaWdpbigpIHtcbiAgICBpZiAoY3Jvc3NvcmlnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjcm9zc29yaWdpbiA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjcm9zc29yaWdpbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNyb3Nzb3JpZ2luO1xufVxuZnVuY3Rpb24gYWRkX3Jlc2l6ZV9saXN0ZW5lcihub2RlLCBmbikge1xuICAgIGNvbnN0IGNvbXB1dGVkX3N0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoY29tcHV0ZWRfc3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgICBjb25zdCBpZnJhbWUgPSBlbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7ICcgK1xuICAgICAgICAnb3ZlcmZsb3c6IGhpZGRlbjsgYm9yZGVyOiAwOyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogLTE7Jyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGlmcmFtZS50YWJJbmRleCA9IC0xO1xuICAgIGNvbnN0IGNyb3Nzb3JpZ2luID0gaXNfY3Jvc3NvcmlnaW4oKTtcbiAgICBsZXQgdW5zdWJzY3JpYmU7XG4gICAgaWYgKGNyb3Nzb3JpZ2luKSB7XG4gICAgICAgIGlmcmFtZS5zcmMgPSBcImRhdGE6dGV4dC9odG1sLDxzY3JpcHQ+b25yZXNpemU9ZnVuY3Rpb24oKXtwYXJlbnQucG9zdE1lc3NhZ2UoMCwnKicpfTwvc2NyaXB0PlwiO1xuICAgICAgICB1bnN1YnNjcmliZSA9IGxpc3Rlbih3aW5kb3csICdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBpZnJhbWUuY29udGVudFdpbmRvdylcbiAgICAgICAgICAgICAgICBmbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmcmFtZS5zcmMgPSAnYWJvdXQ6YmxhbmsnO1xuICAgICAgICBpZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4oaWZyYW1lLmNvbnRlbnRXaW5kb3csICdyZXNpemUnLCBmbik7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFwcGVuZChub2RlLCBpZnJhbWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1bnN1YnNjcmliZSAmJiBpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXRhY2goaWZyYW1lKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9nZ2xlX2NsYXNzKGVsZW1lbnQsIG5hbWUsIHRvZ2dsZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0W3RvZ2dsZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xufVxuZnVuY3Rpb24gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCwgYnViYmxlcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGJ1YmJsZXMsIGZhbHNlLCBkZXRhaWwpO1xuICAgIHJldHVybiBlO1xufVxuZnVuY3Rpb24gcXVlcnlfc2VsZWN0b3JfYWxsKHNlbGVjdG9yLCBwYXJlbnQgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbn1cbmNsYXNzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgIH1cbiAgICBjKGh0bWwpIHtcbiAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgIH1cbiAgICBtKGh0bWwsIHRhcmdldCwgYW5jaG9yID0gbnVsbCkge1xuICAgICAgICBpZiAoIXRoaXMuZSkge1xuICAgICAgICAgICAgdGhpcy5lID0gZWxlbWVudCh0YXJnZXQubm9kZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy50ID0gdGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5jKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaShhbmNob3IpO1xuICAgIH1cbiAgICBoKGh0bWwpIHtcbiAgICAgICAgdGhpcy5lLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHRoaXMubiA9IEFycmF5LmZyb20odGhpcy5lLmNoaWxkTm9kZXMpO1xuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0KHRoaXMudCwgdGhpcy5uW2ldLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHAoaHRtbCkge1xuICAgICAgICB0aGlzLmQoKTtcbiAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgICAgICB0aGlzLmkodGhpcy5hKTtcbiAgICB9XG4gICAgZCgpIHtcbiAgICAgICAgdGhpcy5uLmZvckVhY2goZGV0YWNoKTtcbiAgICB9XG59XG5jbGFzcyBIdG1sVGFnSHlkcmF0aW9uIGV4dGVuZHMgSHRtbFRhZyB7XG4gICAgY29uc3RydWN0b3IoY2xhaW1lZF9ub2Rlcykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgICAgICB0aGlzLmwgPSBjbGFpbWVkX25vZGVzO1xuICAgIH1cbiAgICBjKGh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMubCkge1xuICAgICAgICAgICAgdGhpcy5uID0gdGhpcy5sO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIuYyhodG1sKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0X2h5ZHJhdGlvbih0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJpYnV0ZV90b19vYmplY3QoYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmVzdWx0W2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdFtub2RlLnNsb3QgfHwgJ2RlZmF1bHQnXSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgYWN0aXZlX2RvY3MgPSBuZXcgU2V0KCk7XG5sZXQgYWN0aXZlID0gMDtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJrc2t5YXBwL3N0cmluZy1oYXNoL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNoKHN0cikge1xuICAgIGxldCBoYXNoID0gNTM4MTtcbiAgICBsZXQgaSA9IHN0ci5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpIF4gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGhhc2ggPj4+IDA7XG59XG5mdW5jdGlvbiBjcmVhdGVfcnVsZShub2RlLCBhLCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2UsIGZuLCB1aWQgPSAwKSB7XG4gICAgY29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuICAgIGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhICsgKGIgLSBhKSAqIGVhc2UocCk7XG4gICAgICAgIGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xuICAgIGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuICAgIGNvbnN0IGRvYyA9IGdldF9yb290X2Zvcl9zdHlsZShub2RlKTtcbiAgICBhY3RpdmVfZG9jcy5hZGQoZG9jKTtcbiAgICBjb25zdCBzdHlsZXNoZWV0ID0gZG9jLl9fc3ZlbHRlX3N0eWxlc2hlZXQgfHwgKGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0ID0gYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQobm9kZSkuc2hlZXQpO1xuICAgIGNvbnN0IGN1cnJlbnRfcnVsZXMgPSBkb2MuX19zdmVsdGVfcnVsZXMgfHwgKGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9KTtcbiAgICBpZiAoIWN1cnJlbnRfcnVsZXNbbmFtZV0pIHtcbiAgICAgICAgY3VycmVudF9ydWxlc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShgQGtleWZyYW1lcyAke25hbWV9ICR7cnVsZX1gLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1hdGlvbiA9IG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnO1xuICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gYCR7YW5pbWF0aW9uID8gYCR7YW5pbWF0aW9ufSwgYCA6ICcnfSR7bmFtZX0gJHtkdXJhdGlvbn1tcyBsaW5lYXIgJHtkZWxheX1tcyAxIGJvdGhgO1xuICAgIGFjdGl2ZSArPSAxO1xuICAgIHJldHVybiBuYW1lO1xufVxuZnVuY3Rpb24gZGVsZXRlX3J1bGUobm9kZSwgbmFtZSkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gKG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnKS5zcGxpdCgnLCAnKTtcbiAgICBjb25zdCBuZXh0ID0gcHJldmlvdXMuZmlsdGVyKG5hbWVcbiAgICAgICAgPyBhbmltID0+IGFuaW0uaW5kZXhPZihuYW1lKSA8IDAgLy8gcmVtb3ZlIHNwZWNpZmljIGFuaW1hdGlvblxuICAgICAgICA6IGFuaW0gPT4gYW5pbS5pbmRleE9mKCdfX3N2ZWx0ZScpID09PSAtMSAvLyByZW1vdmUgYWxsIFN2ZWx0ZSBhbmltYXRpb25zXG4gICAgKTtcbiAgICBjb25zdCBkZWxldGVkID0gcHJldmlvdXMubGVuZ3RoIC0gbmV4dC5sZW5ndGg7XG4gICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBuZXh0LmpvaW4oJywgJyk7XG4gICAgICAgIGFjdGl2ZSAtPSBkZWxldGVkO1xuICAgICAgICBpZiAoIWFjdGl2ZSlcbiAgICAgICAgICAgIGNsZWFyX3J1bGVzKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJfcnVsZXMoKSB7XG4gICAgcmFmKCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgYWN0aXZlX2RvY3MuZm9yRWFjaChkb2MgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0O1xuICAgICAgICAgICAgbGV0IGkgPSBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICAgICAgZG9jLl9fc3ZlbHRlX3J1bGVzID0ge307XG4gICAgICAgIH0pO1xuICAgICAgICBhY3RpdmVfZG9jcy5jbGVhcigpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVfYW5pbWF0aW9uKG5vZGUsIGZyb20sIGZuLCBwYXJhbXMpIHtcbiAgICBpZiAoIWZyb20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHRvID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoZnJvbS5sZWZ0ID09PSB0by5sZWZ0ICYmIGZyb20ucmlnaHQgPT09IHRvLnJpZ2h0ICYmIGZyb20udG9wID09PSB0by50b3AgJiYgZnJvbS5ib3R0b20gPT09IHRvLmJvdHRvbSlcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgXG4gICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBzaG91bGQgdGhpcyBiZSBzZXBhcmF0ZWQgZnJvbSBkZXN0cnVjdHVyaW5nPyBPciBzdGFydC9lbmQgYWRkZWQgdG8gcHVibGljIGFwaSBhbmQgZG9jdW1lbnRhdGlvbj9cbiAgICBzdGFydDogc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzpcbiAgICBlbmQgPSBzdGFydF90aW1lICsgZHVyYXRpb24sIHRpY2sgPSBub29wLCBjc3MgfSA9IGZuKG5vZGUsIHsgZnJvbSwgdG8gfSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBsZXQgbmFtZTtcbiAgICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXkpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBuYW1lKTtcbiAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgIGlmICghc3RhcnRlZCAmJiBub3cgPj0gc3RhcnRfdGltZSkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgbm93ID49IGVuZCkge1xuICAgICAgICAgICAgdGljaygxLCAwKTtcbiAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHN0YXJ0X3RpbWU7XG4gICAgICAgICAgICBjb25zdCB0ID0gMCArIDEgKiBlYXNpbmcocCAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIHN0YXJ0KCk7XG4gICAgdGljaygwLCAxKTtcbiAgICByZXR1cm4gc3RvcDtcbn1cbmZ1bmN0aW9uIGZpeF9wb3NpdGlvbihub2RlKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgIGlmIChzdHlsZS5wb3NpdGlvbiAhPT0gJ2Fic29sdXRlJyAmJiBzdHlsZS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHN0eWxlO1xuICAgICAgICBjb25zdCBhID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIG5vZGUuc3R5bGUud2lkdGggPSB3aWR0aDtcbiAgICAgICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGFkZF90cmFuc2Zvcm0obm9kZSwgYSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkX3RyYW5zZm9ybShub2RlLCBhKSB7XG4gICAgY29uc3QgYiA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGEubGVmdCAhPT0gYi5sZWZ0IHx8IGEudG9wICE9PSBiLnRvcCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBzdHlsZS50cmFuc2Zvcm07XG4gICAgICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYCR7dHJhbnNmb3JtfSB0cmFuc2xhdGUoJHthLmxlZnQgLSBiLmxlZnR9cHgsICR7YS50b3AgLSBiLnRvcH1weClgO1xuICAgIH1cbn1cblxubGV0IGN1cnJlbnRfY29tcG9uZW50O1xuZnVuY3Rpb24gc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIGN1cnJlbnRfY29tcG9uZW50ID0gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkge1xuICAgIGlmICghY3VycmVudF9jb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY2FsbGVkIG91dHNpZGUgY29tcG9uZW50IGluaXRpYWxpemF0aW9uJyk7XG4gICAgcmV0dXJuIGN1cnJlbnRfY29tcG9uZW50O1xufVxuZnVuY3Rpb24gYmVmb3JlVXBkYXRlKGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuYmVmb3JlX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uTW91bnQoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5vbl9tb3VudC5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGFmdGVyVXBkYXRlKGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuYWZ0ZXJfdXBkYXRlLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gb25EZXN0cm95KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fZGVzdHJveS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlcigpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICByZXR1cm4gKHR5cGUsIGRldGFpbCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW3R5cGVdO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBUT0RPIGFyZSB0aGVyZSBzaXR1YXRpb25zIHdoZXJlIGV2ZW50cyBjb3VsZCBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICAvLyBpbiBhIHNlcnZlciAobm9uLURPTSkgZW52aXJvbm1lbnQ/XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpO1xuICAgICAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChjb21wb25lbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNldENvbnRleHQoa2V5LCBjb250ZXh0KSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5zZXQoa2V5LCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoa2V5KSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuZ2V0KGtleSk7XG59XG5mdW5jdGlvbiBnZXRBbGxDb250ZXh0cygpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dDtcbn1cbmZ1bmN0aW9uIGhhc0NvbnRleHQoa2V5KSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuaGFzKGtleSk7XG59XG4vLyBUT0RPIGZpZ3VyZSBvdXQgaWYgd2Ugc3RpbGwgd2FudCB0byBzdXBwb3J0XG4vLyBzaG9ydGhhbmQgZXZlbnRzLCBvciBpZiB3ZSB3YW50IHRvIGltcGxlbWVudFxuLy8gYSByZWFsIGJ1YmJsaW5nIG1lY2hhbmlzbVxuZnVuY3Rpb24gYnViYmxlKGNvbXBvbmVudCwgZXZlbnQpIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW2V2ZW50LnR5cGVdO1xuICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuLmNhbGwodGhpcywgZXZlbnQpKTtcbiAgICB9XG59XG5cbmNvbnN0IGRpcnR5X2NvbXBvbmVudHMgPSBbXTtcbmNvbnN0IGludHJvcyA9IHsgZW5hYmxlZDogZmFsc2UgfTtcbmNvbnN0IGJpbmRpbmdfY2FsbGJhY2tzID0gW107XG5jb25zdCByZW5kZXJfY2FsbGJhY2tzID0gW107XG5jb25zdCBmbHVzaF9jYWxsYmFja3MgPSBbXTtcbmNvbnN0IHJlc29sdmVkX3Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbmxldCB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZV91cGRhdGUoKSB7XG4gICAgaWYgKCF1cGRhdGVfc2NoZWR1bGVkKSB7XG4gICAgICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlZF9wcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRpY2soKSB7XG4gICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgcmV0dXJuIHJlc29sdmVkX3Byb21pc2U7XG59XG5mdW5jdGlvbiBhZGRfcmVuZGVyX2NhbGxiYWNrKGZuKSB7XG4gICAgcmVuZGVyX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGFkZF9mbHVzaF9jYWxsYmFjayhmbikge1xuICAgIGZsdXNoX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmxldCBmbHVzaGluZyA9IGZhbHNlO1xuY29uc3Qgc2Vlbl9jYWxsYmFja3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAoZmx1c2hpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgZG8ge1xuICAgICAgICAvLyBmaXJzdCwgY2FsbCBiZWZvcmVVcGRhdGUgZnVuY3Rpb25zXG4gICAgICAgIC8vIGFuZCB1cGRhdGUgY29tcG9uZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShjb21wb25lbnQuJCQpO1xuICAgICAgICB9XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgICB3aGlsZSAoYmluZGluZ19jYWxsYmFja3MubGVuZ3RoKVxuICAgICAgICAgICAgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgLy8gdGhlbiwgb25jZSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBjYWxsXG4gICAgICAgIC8vIGFmdGVyVXBkYXRlIGZ1bmN0aW9ucy4gVGhpcyBtYXkgY2F1c2VcbiAgICAgICAgLy8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZW5kZXJfY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWVuX2NhbGxiYWNrcy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uc28gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBsb29wc1xuICAgICAgICAgICAgICAgIHNlZW5fY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgfSB3aGlsZSAoZGlydHlfY29tcG9uZW50cy5sZW5ndGgpO1xuICAgIHdoaWxlIChmbHVzaF9jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGZsdXNoX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgIH1cbiAgICB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICBzZWVuX2NhbGxiYWNrcy5jbGVhcigpO1xufVxuZnVuY3Rpb24gdXBkYXRlKCQkKSB7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICQkLnVwZGF0ZSgpO1xuICAgICAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgICAgICBjb25zdCBkaXJ0eSA9ICQkLmRpcnR5O1xuICAgICAgICAkJC5kaXJ0eSA9IFstMV07XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LnAoJCQuY3R4LCBkaXJ0eSk7XG4gICAgICAgICQkLmFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xuICAgIH1cbn1cblxubGV0IHByb21pc2U7XG5mdW5jdGlvbiB3YWl0KCkge1xuICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2gobm9kZSwgZGlyZWN0aW9uLCBraW5kKSB7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudChgJHtkaXJlY3Rpb24gPyAnaW50cm8nIDogJ291dHJvJ30ke2tpbmR9YCkpO1xufVxuY29uc3Qgb3V0cm9pbmcgPSBuZXcgU2V0KCk7XG5sZXQgb3V0cm9zO1xuZnVuY3Rpb24gZ3JvdXBfb3V0cm9zKCkge1xuICAgIG91dHJvcyA9IHtcbiAgICAgICAgcjogMCxcbiAgICAgICAgYzogW10sXG4gICAgICAgIHA6IG91dHJvcyAvLyBwYXJlbnQgZ3JvdXBcbiAgICB9O1xufVxuZnVuY3Rpb24gY2hlY2tfb3V0cm9zKCkge1xuICAgIGlmICghb3V0cm9zLnIpIHtcbiAgICAgICAgcnVuX2FsbChvdXRyb3MuYyk7XG4gICAgfVxuICAgIG91dHJvcyA9IG91dHJvcy5wO1xufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9pbihibG9jaywgbG9jYWwpIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2suaSkge1xuICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICBibG9jay5pKGxvY2FsKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2l0aW9uX291dChibG9jaywgbG9jYWwsIGRldGFjaCwgY2FsbGJhY2spIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2subykge1xuICAgICAgICBpZiAob3V0cm9pbmcuaGFzKGJsb2NrKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgb3V0cm9pbmcuYWRkKGJsb2NrKTtcbiAgICAgICAgb3V0cm9zLmMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgICAgICAgICAgYmxvY2suZCgxKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmxvY2subyhsb2NhbCk7XG4gICAgfVxufVxuY29uc3QgbnVsbF90cmFuc2l0aW9uID0geyBkdXJhdGlvbjogMCB9O1xuZnVuY3Rpb24gY3JlYXRlX2luX3RyYW5zaXRpb24obm9kZSwgZm4sIHBhcmFtcykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGxldCB0YXNrO1xuICAgIGxldCB1aWQgPSAwO1xuICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MsIHVpZCsrKTtcbiAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXk7XG4gICAgICAgIGNvbnN0IGVuZF90aW1lID0gc3RhcnRfdGltZSArIGR1cmF0aW9uO1xuICAgICAgICBpZiAodGFzaylcbiAgICAgICAgICAgIHRhc2suYWJvcnQoKTtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ3N0YXJ0JykpO1xuICAgICAgICB0YXNrID0gbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHRydWUsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydCgpIHtcbiAgICAgICAgICAgIGlmIChzdGFydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSk7XG4gICAgICAgICAgICBpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgIHdhaXQoKS50aGVuKGdvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgICAgICBzdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfb3V0X3RyYW5zaXRpb24obm9kZSwgZm4sIHBhcmFtcykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gdHJ1ZTtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWU7XG4gICAgY29uc3QgZ3JvdXAgPSBvdXRyb3M7XG4gICAgZ3JvdXAuciArPSAxO1xuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAxLCAwLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgY29uc3Qgc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXk7XG4gICAgICAgIGNvbnN0IGVuZF90aW1lID0gc3RhcnRfdGltZSArIGR1cmF0aW9uO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnc3RhcnQnKSk7XG4gICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIS0tZ3JvdXAucikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHJlc3VsdCBpbiBgZW5kKClgIGJlaW5nIGNhbGxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gY2xlYW4gdXAgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChncm91cC5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gc3RhcnRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZWFzaW5nKChub3cgLSBzdGFydF90aW1lKSAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGljaygxIC0gdCwgdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgIGdvKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ28oKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW5kKHJlc2V0KSB7XG4gICAgICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLnRpY2spIHtcbiAgICAgICAgICAgICAgICBjb25maWcudGljaygxLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24obm9kZSwgZm4sIHBhcmFtcywgaW50cm8pIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgdCA9IGludHJvID8gMCA6IDE7XG4gICAgbGV0IHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgbGV0IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lID0gbnVsbDtcbiAgICBmdW5jdGlvbiBjbGVhcl9hbmltYXRpb24oKSB7XG4gICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdChwcm9ncmFtLCBkdXJhdGlvbikge1xuICAgICAgICBjb25zdCBkID0gKHByb2dyYW0uYiAtIHQpO1xuICAgICAgICBkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGE6IHQsXG4gICAgICAgICAgICBiOiBwcm9ncmFtLmIsXG4gICAgICAgICAgICBkLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBzdGFydDogcHJvZ3JhbS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcHJvZ3JhbS5zdGFydCArIGR1cmF0aW9uLFxuICAgICAgICAgICAgZ3JvdXA6IHByb2dyYW0uZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oYikge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0ge1xuICAgICAgICAgICAgc3RhcnQ6IG5vdygpICsgZGVsYXksXG4gICAgICAgICAgICBiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG4gICAgICAgICAgICBvdXRyb3MuciArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbnRybywgYW5kIHRoZXJlJ3MgYSBkZWxheSwgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW4gaW5pdGlhbCB0aWNrIGFuZC9vciBhcHBseSBDU1MgYW5pbWF0aW9uIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiKVxuICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHByb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgYiwgJ3N0YXJ0JykpO1xuICAgICAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nX3Byb2dyYW0gJiYgbm93ID4gcGVuZGluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocGVuZGluZ19wcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnc3RhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIHJ1bm5pbmdfcHJvZ3JhbS5iLCBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24sIDAsIGVhc2luZywgY29uZmlnLmNzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCA9IHJ1bm5pbmdfcHJvZ3JhbS5iLCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbS5iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvIOKAlCB3ZSBjYW4gdGlkeSB1cCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHJvIOKAlCBuZWVkcyB0byBiZSBjb29yZGluYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS0tcnVubmluZ19wcm9ncmFtLmdyb3VwLnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKHJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBydW5uaW5nX3Byb2dyYW0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gcnVubmluZ19wcm9ncmFtLmEgKyBydW5uaW5nX3Byb2dyYW0uZCAqIGVhc2luZyhwIC8gcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhIShydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJ1bihiKSB7XG4gICAgICAgICAgICBpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlX3Byb21pc2UocHJvbWlzZSwgaW5mbykge1xuICAgIGNvbnN0IHRva2VuID0gaW5mby50b2tlbiA9IHt9O1xuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0eXBlLCBpbmRleCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSB2YWx1ZTtcbiAgICAgICAgbGV0IGNoaWxkX2N0eCA9IGluZm8uY3R4O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoaWxkX2N0eCA9IGNoaWxkX2N0eC5zbGljZSgpO1xuICAgICAgICAgICAgY2hpbGRfY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBuZWVkc19mbHVzaCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5mby5ibG9jaykge1xuICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4ICYmIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzW2ldID09PSBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja19vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9jay5kKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgICAgICBibG9jay5tKGluZm8ubW91bnQoKSwgaW5mby5hbmNob3IpO1xuICAgICAgICAgICAgbmVlZHNfZmx1c2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgIGlmIChuZWVkc19mbHVzaCkge1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNfcHJvbWlzZShwcm9taXNlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50X2NvbXBvbmVudCA9IGdldF9jdXJyZW50X2NvbXBvbmVudCgpO1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLmNhdGNoLCAyLCBpbmZvLmVycm9yLCBlcnJvcik7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgICAgICBpZiAoIWluZm8uaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0gcHJvbWlzZTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVfYXdhaXRfYmxvY2tfYnJhbmNoKGluZm8sIGN0eCwgZGlydHkpIHtcbiAgICBjb25zdCBjaGlsZF9jdHggPSBjdHguc2xpY2UoKTtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSBpbmZvO1xuICAgIGlmIChpbmZvLmN1cnJlbnQgPT09IGluZm8udGhlbikge1xuICAgICAgICBjaGlsZF9jdHhbaW5mby52YWx1ZV0gPSByZXNvbHZlZDtcbiAgICB9XG4gICAgaWYgKGluZm8uY3VycmVudCA9PT0gaW5mby5jYXRjaCkge1xuICAgICAgICBjaGlsZF9jdHhbaW5mby5lcnJvcl0gPSByZXNvbHZlZDtcbiAgICB9XG4gICAgaW5mby5ibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xufVxuXG5jb25zdCBnbG9iYWxzID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgPyB3aW5kb3dcbiAgICA6IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IGdsb2JhbFRoaXNcbiAgICAgICAgOiBnbG9iYWwpO1xuXG5mdW5jdGlvbiBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5kKDEpO1xuICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbn1cbmZ1bmN0aW9uIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gZml4X2FuZF9vdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gdXBkYXRlX2tleWVkX2VhY2gob2xkX2Jsb2NrcywgZGlydHksIGdldF9rZXksIGR5bmFtaWMsIGN0eCwgbGlzdCwgbG9va3VwLCBub2RlLCBkZXN0cm95LCBjcmVhdGVfZWFjaF9ibG9jaywgbmV4dCwgZ2V0X2NvbnRleHQpIHtcbiAgICBsZXQgbyA9IG9sZF9ibG9ja3MubGVuZ3RoO1xuICAgIGxldCBuID0gbGlzdC5sZW5ndGg7XG4gICAgbGV0IGkgPSBvO1xuICAgIGNvbnN0IG9sZF9pbmRleGVzID0ge307XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgb2xkX2luZGV4ZXNbb2xkX2Jsb2Nrc1tpXS5rZXldID0gaTtcbiAgICBjb25zdCBuZXdfYmxvY2tzID0gW107XG4gICAgY29uc3QgbmV3X2xvb2t1cCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZWx0YXMgPSBuZXcgTWFwKCk7XG4gICAgaSA9IG47XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBjaGlsZF9jdHggPSBnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpO1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRfa2V5KGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBibG9jayA9IGxvb2t1cC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSBjcmVhdGVfZWFjaF9ibG9jayhrZXksIGNoaWxkX2N0eCk7XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZHluYW1pYykge1xuICAgICAgICAgICAgYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdfbG9va3VwLnNldChrZXksIG5ld19ibG9ja3NbaV0gPSBibG9jayk7XG4gICAgICAgIGlmIChrZXkgaW4gb2xkX2luZGV4ZXMpXG4gICAgICAgICAgICBkZWx0YXMuc2V0KGtleSwgTWF0aC5hYnMoaSAtIG9sZF9pbmRleGVzW2tleV0pKTtcbiAgICB9XG4gICAgY29uc3Qgd2lsbF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGRpZF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGZ1bmN0aW9uIGluc2VydChibG9jaykge1xuICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgYmxvY2subShub2RlLCBuZXh0KTtcbiAgICAgICAgbG9va3VwLnNldChibG9jay5rZXksIGJsb2NrKTtcbiAgICAgICAgbmV4dCA9IGJsb2NrLmZpcnN0O1xuICAgICAgICBuLS07XG4gICAgfVxuICAgIHdoaWxlIChvICYmIG4pIHtcbiAgICAgICAgY29uc3QgbmV3X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuIC0gMV07XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3NbbyAtIDFdO1xuICAgICAgICBjb25zdCBuZXdfa2V5ID0gbmV3X2Jsb2NrLmtleTtcbiAgICAgICAgY29uc3Qgb2xkX2tleSA9IG9sZF9ibG9jay5rZXk7XG4gICAgICAgIGlmIChuZXdfYmxvY2sgPT09IG9sZF9ibG9jaykge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgbmV4dCA9IG5ld19ibG9jay5maXJzdDtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgICAgIG4tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgYmxvY2tcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFsb29rdXAuaGFzKG5ld19rZXkpIHx8IHdpbGxfbW92ZS5oYXMobmV3X2tleSkpIHtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpZF9tb3ZlLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlbHRhcy5nZXQobmV3X2tleSkgPiBkZWx0YXMuZ2V0KG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBkaWRfbW92ZS5hZGQobmV3X2tleSk7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpbGxfbW92ZS5hZGQob2xkX2tleSk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKG8tLSkge1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW29dO1xuICAgICAgICBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9ibG9jay5rZXkpKVxuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgfVxuICAgIHdoaWxlIChuKVxuICAgICAgICBpbnNlcnQobmV3X2Jsb2Nrc1tuIC0gMV0pO1xuICAgIHJldHVybiBuZXdfYmxvY2tzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfZWFjaF9rZXlzKGN0eCwgbGlzdCwgZ2V0X2NvbnRleHQsIGdldF9rZXkpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRfa2V5KGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSkpO1xuICAgICAgICBpZiAoa2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaGF2ZSBkdXBsaWNhdGUga2V5cyBpbiBhIGtleWVkIGVhY2gnKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0X3NwcmVhZF91cGRhdGUobGV2ZWxzLCB1cGRhdGVzKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge307XG4gICAgY29uc3QgdG9fbnVsbF9vdXQgPSB7fTtcbiAgICBjb25zdCBhY2NvdW50ZWRfZm9yID0geyAkJHNjb3BlOiAxIH07XG4gICAgbGV0IGkgPSBsZXZlbHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgbyA9IGxldmVsc1tpXTtcbiAgICAgICAgY29uc3QgbiA9IHVwZGF0ZXNbaV07XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIG4pKVxuICAgICAgICAgICAgICAgICAgICB0b19udWxsX291dFtrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjY291bnRlZF9mb3Jba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVba2V5XSA9IG5ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXZlbHNbaV0gPSBuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9fbnVsbF9vdXQpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHVwZGF0ZSkpXG4gICAgICAgICAgICB1cGRhdGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGdldF9zcHJlYWRfb2JqZWN0KHNwcmVhZF9wcm9wcykge1xuICAgIHJldHVybiB0eXBlb2Ygc3ByZWFkX3Byb3BzID09PSAnb2JqZWN0JyAmJiBzcHJlYWRfcHJvcHMgIT09IG51bGwgPyBzcHJlYWRfcHJvcHMgOiB7fTtcbn1cblxuLy8gc291cmNlOiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmRpY2VzLmh0bWxcbmNvbnN0IGJvb2xlYW5fYXR0cmlidXRlcyA9IG5ldyBTZXQoW1xuICAgICdhbGxvd2Z1bGxzY3JlZW4nLFxuICAgICdhbGxvd3BheW1lbnRyZXF1ZXN0JyxcbiAgICAnYXN5bmMnLFxuICAgICdhdXRvZm9jdXMnLFxuICAgICdhdXRvcGxheScsXG4gICAgJ2NoZWNrZWQnLFxuICAgICdjb250cm9scycsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkZWZlcicsXG4gICAgJ2Rpc2FibGVkJyxcbiAgICAnZm9ybW5vdmFsaWRhdGUnLFxuICAgICdoaWRkZW4nLFxuICAgICdpc21hcCcsXG4gICAgJ2xvb3AnLFxuICAgICdtdWx0aXBsZScsXG4gICAgJ211dGVkJyxcbiAgICAnbm9tb2R1bGUnLFxuICAgICdub3ZhbGlkYXRlJyxcbiAgICAnb3BlbicsXG4gICAgJ3BsYXlzaW5saW5lJyxcbiAgICAncmVhZG9ubHknLFxuICAgICdyZXF1aXJlZCcsXG4gICAgJ3JldmVyc2VkJyxcbiAgICAnc2VsZWN0ZWQnXG5dKTtcblxuY29uc3QgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIgPSAvW1xccydcIj4vPVxcdXtGREQwfS1cXHV7RkRFRn1cXHV7RkZGRX1cXHV7RkZGRn1cXHV7MUZGRkV9XFx1ezFGRkZGfVxcdXsyRkZGRX1cXHV7MkZGRkZ9XFx1ezNGRkZFfVxcdXszRkZGRn1cXHV7NEZGRkV9XFx1ezRGRkZGfVxcdXs1RkZGRX1cXHV7NUZGRkZ9XFx1ezZGRkZFfVxcdXs2RkZGRn1cXHV7N0ZGRkV9XFx1ezdGRkZGfVxcdXs4RkZGRX1cXHV7OEZGRkZ9XFx1ezlGRkZFfVxcdXs5RkZGRn1cXHV7QUZGRkV9XFx1e0FGRkZGfVxcdXtCRkZGRX1cXHV7QkZGRkZ9XFx1e0NGRkZFfVxcdXtDRkZGRn1cXHV7REZGRkV9XFx1e0RGRkZGfVxcdXtFRkZGRX1cXHV7RUZGRkZ9XFx1e0ZGRkZFfVxcdXtGRkZGRn1cXHV7MTBGRkZFfVxcdXsxMEZGRkZ9XS91O1xuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jbm9uY2hhcmFjdGVyXG5mdW5jdGlvbiBzcHJlYWQoYXJncywgY2xhc3Nlc190b19hZGQpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyk7XG4gICAgaWYgKGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLmNsYXNzID09IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc2VzX3RvX2FkZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgKz0gJyAnICsgY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3Rlci50ZXN0KG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgIHN0ciArPSAnICcgKyBuYW1lO1xuICAgICAgICBlbHNlIGlmIChib29sZWFuX2F0dHJpYnV0ZXMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzdHIgKz0gYCAke25hbWV9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgZXNjYXBlZCA9IHtcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5mdW5jdGlvbiBlc2NhcGUoaHRtbCkge1xuICAgIHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvW1wiJyY8Pl0vZywgbWF0Y2ggPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuZnVuY3Rpb24gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gZXNjYXBlKHZhbHVlKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gZXNjYXBlX29iamVjdChvYmopIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlKG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGVhY2goaXRlbXMsIGZuKSB7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGZuKGl0ZW1zW2ldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IG1pc3NpbmdfY29tcG9uZW50ID0ge1xuICAgICQkcmVuZGVyOiAoKSA9PiAnJ1xufTtcbmZ1bmN0aW9uIHZhbGlkYXRlX2NvbXBvbmVudChjb21wb25lbnQsIG5hbWUpIHtcbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhY29tcG9uZW50LiQkcmVuZGVyKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnc3ZlbHRlOmNvbXBvbmVudCcpXG4gICAgICAgICAgICBuYW1lICs9ICcgdGhpcz17Li4ufSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPCR7bmFtZX0+IGlzIG5vdCBhIHZhbGlkIFNTUiBjb21wb25lbnQuIFlvdSBtYXkgbmVlZCB0byByZXZpZXcgeW91ciBidWlsZCBjb25maWcgdG8gZW5zdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCwgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYXMgcHJlLWNvbXBpbGVkIG1vZHVsZXNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGRlYnVnKGZpbGUsIGxpbmUsIGNvbHVtbiwgdmFsdWVzKSB7XG4gICAgY29uc29sZS5sb2coYHtAZGVidWd9ICR7ZmlsZSA/IGZpbGUgKyAnICcgOiAnJ30oJHtsaW5lfToke2NvbHVtbn0pYCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKHZhbHVlcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIHJldHVybiAnJztcbn1cbmxldCBvbl9kZXN0cm95O1xuZnVuY3Rpb24gY3JlYXRlX3Nzcl9jb21wb25lbnQoZm4pIHtcbiAgICBmdW5jdGlvbiAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCBiaW5kaW5ncywgc2xvdHMsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgICAgICBjb25zdCAkJCA9IHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3ksXG4gICAgICAgICAgICBjb250ZXh0OiBuZXcgTWFwKGNvbnRleHQgfHwgKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSkpLFxuICAgICAgICAgICAgLy8gdGhlc2Ugd2lsbCBiZSBpbW1lZGlhdGVseSBkaXNjYXJkZWRcbiAgICAgICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgICAgIGJlZm9yZV91cGRhdGU6IFtdLFxuICAgICAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KClcbiAgICAgICAgfTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHsgJCQgfSk7XG4gICAgICAgIGNvbnN0IGh0bWwgPSBmbihyZXN1bHQsIHByb3BzLCBiaW5kaW5ncywgc2xvdHMpO1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQocGFyZW50X2NvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZW5kZXI6IChwcm9wcyA9IHt9LCB7ICQkc2xvdHMgPSB7fSwgY29udGV4dCA9IG5ldyBNYXAoKSB9ID0ge30pID0+IHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3kgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdGl0bGU6ICcnLCBoZWFkOiAnJywgY3NzOiBuZXcgU2V0KCkgfTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCB7fSwgJCRzbG90cywgY29udGV4dCk7XG4gICAgICAgICAgICBydW5fYWxsKG9uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBBcnJheS5mcm9tKHJlc3VsdC5jc3MpLm1hcChjc3MgPT4gY3NzLmNvZGUpLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IG51bGwgLy8gVE9ET1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZDogcmVzdWx0LnRpdGxlICsgcmVzdWx0LmhlYWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgICQkcmVuZGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZF9hdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAoYm9vbGVhbiAmJiAhdmFsdWUpKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGAgJHtuYW1lfSR7dmFsdWUgPT09IHRydWUgPyAnJyA6IGA9JHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkoZXNjYXBlKHZhbHVlKSkgOiBgXCIke3ZhbHVlfVwiYH1gfWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6ICcnO1xufVxuXG5mdW5jdGlvbiBiaW5kKGNvbXBvbmVudCwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbXBvbmVudC4kJC5wcm9wc1tuYW1lXTtcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21wb25lbnQuJCQuYm91bmRbaW5kZXhdID0gY2FsbGJhY2s7XG4gICAgICAgIGNhbGxiYWNrKGNvbXBvbmVudC4kJC5jdHhbaW5kZXhdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVfY29tcG9uZW50KGJsb2NrKSB7XG4gICAgYmxvY2sgJiYgYmxvY2suYygpO1xufVxuZnVuY3Rpb24gY2xhaW1fY29tcG9uZW50KGJsb2NrLCBwYXJlbnRfbm9kZXMpIHtcbiAgICBibG9jayAmJiBibG9jay5sKHBhcmVudF9ub2Rlcyk7XG59XG5mdW5jdGlvbiBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCB0YXJnZXQsIGFuY2hvciwgY3VzdG9tRWxlbWVudCkge1xuICAgIGNvbnN0IHsgZnJhZ21lbnQsIG9uX21vdW50LCBvbl9kZXN0cm95LCBhZnRlcl91cGRhdGUgfSA9IGNvbXBvbmVudC4kJDtcbiAgICBmcmFnbWVudCAmJiBmcmFnbWVudC5tKHRhcmdldCwgYW5jaG9yKTtcbiAgICBpZiAoIWN1c3RvbUVsZW1lbnQpIHtcbiAgICAgICAgLy8gb25Nb3VudCBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbCBhZnRlclVwZGF0ZVxuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld19vbl9kZXN0cm95ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgICAgIGlmIChvbl9kZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgb25fZGVzdHJveS5wdXNoKC4uLm5ld19vbl9kZXN0cm95KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVkZ2UgY2FzZSAtIGNvbXBvbmVudCB3YXMgZGVzdHJveWVkIGltbWVkaWF0ZWx5LFxuICAgICAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIGEgYmluZGluZyBpbml0aWFsaXNpbmdcbiAgICAgICAgICAgICAgICBydW5fYWxsKG5ld19vbl9kZXN0cm95KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC4kJC5vbl9tb3VudCA9IFtdO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWZ0ZXJfdXBkYXRlLmZvckVhY2goYWRkX3JlbmRlcl9jYWxsYmFjayk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2NvbXBvbmVudChjb21wb25lbnQsIGRldGFjaGluZykge1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkO1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICBydW5fYWxsKCQkLm9uX2Rlc3Ryb3kpO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5kKGRldGFjaGluZyk7XG4gICAgICAgIC8vIFRPRE8gbnVsbCBvdXQgb3RoZXIgcmVmcywgaW5jbHVkaW5nIGNvbXBvbmVudC4kJCAoYnV0IG5lZWQgdG9cbiAgICAgICAgLy8gcHJlc2VydmUgZmluYWwgc3RhdGU/KVxuICAgICAgICAkJC5vbl9kZXN0cm95ID0gJCQuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICAkJC5jdHggPSBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYWtlX2RpcnR5KGNvbXBvbmVudCwgaSkge1xuICAgIGlmIChjb21wb25lbnQuJCQuZGlydHlbMF0gPT09IC0xKSB7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICBzY2hlZHVsZV91cGRhdGUoKTtcbiAgICAgICAgY29tcG9uZW50LiQkLmRpcnR5LmZpbGwoMCk7XG4gICAgfVxuICAgIGNvbXBvbmVudC4kJC5kaXJ0eVsoaSAvIDMxKSB8IDBdIHw9ICgxIDw8IChpICUgMzEpKTtcbn1cbmZ1bmN0aW9uIGluaXQoY29tcG9uZW50LCBvcHRpb25zLCBpbnN0YW5jZSwgY3JlYXRlX2ZyYWdtZW50LCBub3RfZXF1YWwsIHByb3BzLCBhcHBlbmRfc3R5bGVzLCBkaXJ0eSA9IFstMV0pIHtcbiAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQgPSB7XG4gICAgICAgIGZyYWdtZW50OiBudWxsLFxuICAgICAgICBjdHg6IG51bGwsXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHByb3BzLFxuICAgICAgICB1cGRhdGU6IG5vb3AsXG4gICAgICAgIG5vdF9lcXVhbCxcbiAgICAgICAgYm91bmQ6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICAvLyBsaWZlY3ljbGVcbiAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICBvbl9kZXN0cm95OiBbXSxcbiAgICAgICAgb25fZGlzY29ubmVjdDogW10sXG4gICAgICAgIGJlZm9yZV91cGRhdGU6IFtdLFxuICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICBjb250ZXh0OiBuZXcgTWFwKG9wdGlvbnMuY29udGV4dCB8fCAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSksXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICBkaXJ0eSxcbiAgICAgICAgc2tpcF9ib3VuZDogZmFsc2UsXG4gICAgICAgIHJvb3Q6IG9wdGlvbnMudGFyZ2V0IHx8IHBhcmVudF9jb21wb25lbnQuJCQucm9vdFxuICAgIH07XG4gICAgYXBwZW5kX3N0eWxlcyAmJiBhcHBlbmRfc3R5bGVzKCQkLnJvb3QpO1xuICAgIGxldCByZWFkeSA9IGZhbHNlO1xuICAgICQkLmN0eCA9IGluc3RhbmNlXG4gICAgICAgID8gaW5zdGFuY2UoY29tcG9uZW50LCBvcHRpb25zLnByb3BzIHx8IHt9LCAoaSwgcmV0LCAuLi5yZXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3QubGVuZ3RoID8gcmVzdFswXSA6IHJldDtcbiAgICAgICAgICAgIGlmICgkJC5jdHggJiYgbm90X2VxdWFsKCQkLmN0eFtpXSwgJCQuY3R4W2ldID0gdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEkJC5za2lwX2JvdW5kICYmICQkLmJvdW5kW2ldKVxuICAgICAgICAgICAgICAgICAgICAkJC5ib3VuZFtpXSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWR5KVxuICAgICAgICAgICAgICAgICAgICBtYWtlX2RpcnR5KGNvbXBvbmVudCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuICAgICQkLnVwZGF0ZSgpO1xuICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgIC8vIGBmYWxzZWAgYXMgYSBzcGVjaWFsIGNhc2Ugb2Ygbm8gRE9NIGNvbXBvbmVudFxuICAgICQkLmZyYWdtZW50ID0gY3JlYXRlX2ZyYWdtZW50ID8gY3JlYXRlX2ZyYWdtZW50KCQkLmN0eCkgOiBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICAgICAgc3RhcnRfaHlkcmF0aW5nKCk7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IGNoaWxkcmVuKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5sKG5vZGVzKTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goZGV0YWNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cm8pXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGNvbXBvbmVudC4kJC5mcmFnbWVudCk7XG4gICAgICAgIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmFuY2hvciwgb3B0aW9ucy5jdXN0b21FbGVtZW50KTtcbiAgICAgICAgZW5kX2h5ZHJhdGluZygpO1xuICAgICAgICBmbHVzaCgpO1xuICAgIH1cbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQocGFyZW50X2NvbXBvbmVudCk7XG59XG5sZXQgU3ZlbHRlRWxlbWVudDtcbmlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBTdmVsdGVFbGVtZW50ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgeyBvbl9tb3VudCB9ID0gdGhpcy4kJDtcbiAgICAgICAgICAgIHRoaXMuJCQub25fZGlzY29ubmVjdCA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy4kJC5zbG90dGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuJCQuc2xvdHRlZFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgX29sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpc1thdHRyXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgcnVuX2FsbCh0aGlzLiQkLm9uX2Rpc2Nvbm5lY3QpO1xuICAgICAgICB9XG4gICAgICAgICRkZXN0cm95KCkge1xuICAgICAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICAgICAgfVxuICAgICAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHRoaXMgZGVsZWdhdGUgdG8gYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgJHNldCgkJHByb3BzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuJCRzZXQoJCRwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cy4gVXNlZCB3aGVuIGRldj1mYWxzZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgIH1cbiAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgJHNldCgkJHByb3BzKSB7XG4gICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuJCRzZXQoJCRwcm9wcyk7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hfZGV2KHR5cGUsIGRldGFpbCkge1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KHR5cGUsIE9iamVjdC5hc3NpZ24oeyB2ZXJzaW9uOiAnMy40NC4wJyB9LCBkZXRhaWwpLCB0cnVlKSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfZGV2KHRhcmdldCwgbm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUgfSk7XG4gICAgYXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9kZXYodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG4gICAgaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb25fZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2Rldihub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmUnLCB7IG5vZGUgfSk7XG4gICAgZGV0YWNoKG5vZGUpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2JldHdlZW5fZGV2KGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9iZWZvcmVfZGV2KGFmdGVyKSB7XG4gICAgd2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGFmdGVyLnByZXZpb3VzU2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2FmdGVyX2RldihiZWZvcmUpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5fZGV2KG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zLCBoYXNfcHJldmVudF9kZWZhdWx0LCBoYXNfc3RvcF9wcm9wYWdhdGlvbikge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG9wdGlvbnMgPT09IHRydWUgPyBbJ2NhcHR1cmUnXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUFkZEV2ZW50TGlzdGVuZXInLCB7IG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBtb2RpZmllcnMgfSk7XG4gICAgY29uc3QgZGlzcG9zZSA9IGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZUF0dHJpYnV0ZScsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBwcm9wX2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0UHJvcGVydHknLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIGRhdGFzZXRfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGUuZGF0YXNldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGFzZXQnLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgPT09IGRhdGEpXG4gICAgICAgIHJldHVybjtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGEnLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnICYmICEoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFyZykpIHtcbiAgICAgICAgbGV0IG1zZyA9ICd7I2VhY2h9IG9ubHkgaXRlcmF0ZXMgb3ZlciBhcnJheS1saWtlIG9iamVjdHMuJztcbiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgYXJnICYmIFN5bWJvbC5pdGVyYXRvciBpbiBhcmcpIHtcbiAgICAgICAgICAgIG1zZyArPSAnIFlvdSBjYW4gdXNlIGEgc3ByZWFkIHRvIGNvbnZlcnQgdGhpcyBpdGVyYWJsZSBpbnRvIGFuIGFycmF5Lic7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVfc2xvdHMobmFtZSwgc2xvdCwga2V5cykge1xuICAgIGZvciAoY29uc3Qgc2xvdF9rZXkgb2YgT2JqZWN0LmtleXMoc2xvdCkpIHtcbiAgICAgICAgaWYgKCF+a2V5cy5pbmRleE9mKHNsb3Rfa2V5KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGA8JHtuYW1lfT4gcmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBzbG90IFwiJHtzbG90X2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMgd2l0aCBzb21lIG1pbm9yIGRldi1lbmhhbmNlbWVudHMuIFVzZWQgd2hlbiBkZXY9dHJ1ZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAoIW9wdGlvbnMudGFyZ2V0ICYmICFvcHRpb25zLiQkaW5saW5lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLiRkZXN0cm95KCk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgICRjYXB0dXJlX3N0YXRlKCkgeyB9XG4gICAgJGluamVjdF9zdGF0ZSgpIHsgfVxufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHRvIGNyZWF0ZSBzdHJvbmdseSB0eXBlZCBTdmVsdGUgY29tcG9uZW50cy5cbiAqIFRoaXMgb25seSBleGlzdHMgZm9yIHR5cGluZyBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gYC5kLnRzYCBmaWxlcy5cbiAqXG4gKiAjIyMgRXhhbXBsZTpcbiAqXG4gKiBZb3UgaGF2ZSBjb21wb25lbnQgbGlicmFyeSBvbiBucG0gY2FsbGVkIGBjb21wb25lbnQtbGlicmFyeWAsIGZyb20gd2hpY2hcbiAqIHlvdSBleHBvcnQgYSBjb21wb25lbnQgY2FsbGVkIGBNeUNvbXBvbmVudGAuIEZvciBTdmVsdGUrVHlwZVNjcmlwdCB1c2VycyxcbiAqIHlvdSB3YW50IHRvIHByb3ZpZGUgdHlwaW5ncy4gVGhlcmVmb3JlIHlvdSBjcmVhdGUgYSBgaW5kZXguZC50c2A6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50VHlwZWQgfSBmcm9tIFwic3ZlbHRlXCI7XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnRUeXBlZDx7Zm9vOiBzdHJpbmd9PiB7fVxuICogYGBgXG4gKiBUeXBpbmcgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgSURFcyBsaWtlIFZTIENvZGUgd2l0aCB0aGUgU3ZlbHRlIGV4dGVuc2lvblxuICogdG8gcHJvdmlkZSBpbnRlbGxpc2Vuc2UgYW5kIHRvIHVzZSB0aGUgY29tcG9uZW50IGxpa2UgdGhpcyBpbiBhIFN2ZWx0ZSBmaWxlXG4gKiB3aXRoIFR5cGVTY3JpcHQ6XG4gKiBgYGBzdmVsdGVcbiAqIDxzY3JpcHQgbGFuZz1cInRzXCI+XG4gKiBcdGltcG9ydCB7IE15Q29tcG9uZW50IH0gZnJvbSBcImNvbXBvbmVudC1saWJyYXJ5XCI7XG4gKiA8L3NjcmlwdD5cbiAqIDxNeUNvbXBvbmVudCBmb289eydiYXInfSAvPlxuICogYGBgXG4gKlxuICogIyMjIyBXaHkgbm90IG1ha2UgdGhpcyBwYXJ0IG9mIGBTdmVsdGVDb21wb25lbnQoRGV2KWA/XG4gKiBCZWNhdXNlXG4gKiBgYGB0c1xuICogY2xhc3MgQVN1YmNsYXNzT2ZTdmVsdGVDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGNvbnN0IGNvbXBvbmVudDogdHlwZW9mIFN2ZWx0ZUNvbXBvbmVudCA9IEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50O1xuICogYGBgXG4gKiB3aWxsIHRocm93IGEgdHlwZSBlcnJvciwgc28gd2UgbmVlZCB0byBzZXBhcmF0ZSB0aGUgbW9yZSBzdHJpY3RseSB0eXBlZCBjbGFzcy5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50VHlwZWQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbG9vcF9ndWFyZCh0aW1lb3V0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiB0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZmluaXRlIGxvb3AgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIEh0bWxUYWdIeWRyYXRpb24sIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVDb21wb25lbnRUeXBlZCwgU3ZlbHRlRWxlbWVudCwgYWN0aW9uX2Rlc3Ryb3llciwgYWRkX2F0dHJpYnV0ZSwgYWRkX2NsYXNzZXMsIGFkZF9mbHVzaF9jYWxsYmFjaywgYWRkX2xvY2F0aW9uLCBhZGRfcmVuZGVyX2NhbGxiYWNrLCBhZGRfcmVzaXplX2xpc3RlbmVyLCBhZGRfdHJhbnNmb3JtLCBhZnRlclVwZGF0ZSwgYXBwZW5kLCBhcHBlbmRfZGV2LCBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldCwgYXBwZW5kX2h5ZHJhdGlvbiwgYXBwZW5kX2h5ZHJhdGlvbl9kZXYsIGFwcGVuZF9zdHlsZXMsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGF0dHJpYnV0ZV90b19vYmplY3QsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9jb21wb25lbnQsIGNsYWltX2VsZW1lbnQsIGNsYWltX2h0bWxfdGFnLCBjbGFpbV9zcGFjZSwgY2xhaW1fc3ZnX2VsZW1lbnQsIGNsYWltX3RleHQsIGNsZWFyX2xvb3BzLCBjb21wb25lbnRfc3Vic2NyaWJlLCBjb21wdXRlX3Jlc3RfcHJvcHMsIGNvbXB1dGVfc2xvdHMsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2NvbXBvbmVudCwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZW5kX2h5ZHJhdGluZywgZXNjYXBlLCBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlLCBlc2NhcGVfb2JqZWN0LCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldEFsbENvbnRleHRzLCBnZXRDb250ZXh0LCBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMsIGdldF9yb290X2Zvcl9zdHlsZSwgZ2V0X3Nsb3RfY2hhbmdlcywgZ2V0X3NwcmVhZF9vYmplY3QsIGdldF9zcHJlYWRfdXBkYXRlLCBnZXRfc3RvcmVfdmFsdWUsIGdsb2JhbHMsIGdyb3VwX291dHJvcywgaGFuZGxlX3Byb21pc2UsIGhhc0NvbnRleHQsIGhhc19wcm9wLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnNlcnRfaHlkcmF0aW9uLCBpbnNlcnRfaHlkcmF0aW9uX2RldiwgaW50cm9zLCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciwgaXNfY2xpZW50LCBpc19jcm9zc29yaWdpbiwgaXNfZW1wdHksIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIGxvb3BfZ3VhcmQsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCBxdWVyeV9zZWxlY3Rvcl9hbGwsIHJhZiwgcnVuLCBydW5fYWxsLCBzYWZlX25vdF9lcXVhbCwgc2NoZWR1bGVfdXBkYXRlLCBzZWxlY3RfbXVsdGlwbGVfdmFsdWUsIHNlbGVjdF9vcHRpb24sIHNlbGVjdF9vcHRpb25zLCBzZWxlY3RfdmFsdWUsIHNlbGYsIHNldENvbnRleHQsIHNldF9hdHRyaWJ1dGVzLCBzZXRfY3VycmVudF9jb21wb25lbnQsIHNldF9jdXN0b21fZWxlbWVudF9kYXRhLCBzZXRfZGF0YSwgc2V0X2RhdGFfZGV2LCBzZXRfaW5wdXRfdHlwZSwgc2V0X2lucHV0X3ZhbHVlLCBzZXRfbm93LCBzZXRfcmFmLCBzZXRfc3RvcmVfdmFsdWUsIHNldF9zdHlsZSwgc2V0X3N2Z19hdHRyaWJ1dGVzLCBzcGFjZSwgc3ByZWFkLCBzcmNfdXJsX2VxdWFsLCBzdGFydF9oeWRyYXRpbmcsIHN0b3BfcHJvcGFnYXRpb24sIHN1YnNjcmliZSwgc3ZnX2VsZW1lbnQsIHRleHQsIHRpY2ssIHRpbWVfcmFuZ2VzX3RvX2FycmF5LCB0b19udW1iZXIsIHRvZ2dsZV9jbGFzcywgdHJhbnNpdGlvbl9pbiwgdHJhbnNpdGlvbl9vdXQsIHRydXN0ZWQsIHVwZGF0ZV9hd2FpdF9ibG9ja19icmFuY2gsIHVwZGF0ZV9rZXllZF9lYWNoLCB1cGRhdGVfc2xvdCwgdXBkYXRlX3Nsb3RfYmFzZSwgdmFsaWRhdGVfY29tcG9uZW50LCB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50LCB2YWxpZGF0ZV9lYWNoX2tleXMsIHZhbGlkYXRlX3Nsb3RzLCB2YWxpZGF0ZV9zdG9yZSwgeGxpbmtfYXR0ciB9O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1hdGNoQW55UGF0dGVybiA9IGV4cG9ydHMuZXh0cmFjdFRlcm1zID0gZXhwb3J0cy5yZXBlYXRlZFRpbWV1bml0UGF0dGVybiA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlcGVhdGVkVGltZXVuaXRQYXR0ZXJuKHByZWZpeCwgc2luZ2xlVGltZXVuaXRQYXR0ZXJuKSB7XG4gICAgY29uc3Qgc2luZ2xlVGltZXVuaXRQYXR0ZXJuTm9DYXB0dXJlID0gc2luZ2xlVGltZXVuaXRQYXR0ZXJuLnJlcGxhY2UoL1xcKCg/IVxcPykvZywgXCIoPzpcIik7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3NpbmdsZVRpbWV1bml0UGF0dGVybk5vQ2FwdHVyZX1cXFxccyooPzosP1xcXFxzezAsNX0ke3NpbmdsZVRpbWV1bml0UGF0dGVybk5vQ2FwdHVyZX0pezAsMTB9YDtcbn1cbmV4cG9ydHMucmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4gPSByZXBlYXRlZFRpbWV1bml0UGF0dGVybjtcbmZ1bmN0aW9uIGV4dHJhY3RUZXJtcyhkaWN0aW9uYXJ5KSB7XG4gICAgbGV0IGtleXM7XG4gICAgaWYgKGRpY3Rpb25hcnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBrZXlzID0gWy4uLmRpY3Rpb25hcnldO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaWN0aW9uYXJ5IGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIGtleXMgPSBBcnJheS5mcm9tKGRpY3Rpb25hcnkua2V5cygpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhkaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5leHBvcnRzLmV4dHJhY3RUZXJtcyA9IGV4dHJhY3RUZXJtcztcbmZ1bmN0aW9uIG1hdGNoQW55UGF0dGVybihkaWN0aW9uYXJ5KSB7XG4gICAgY29uc3Qgam9pbmVkVGVybXMgPSBleHRyYWN0VGVybXMoZGljdGlvbmFyeSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpXG4gICAgICAgIC5qb2luKFwifFwiKVxuICAgICAgICAucmVwbGFjZSgvXFwuL2csIFwiXFxcXC5cIik7XG4gICAgcmV0dXJuIGAoPzoke2pvaW5lZFRlcm1zfSlgO1xufVxuZXhwb3J0cy5tYXRjaEFueVBhdHRlcm4gPSBtYXRjaEFueVBhdHRlcm47XG4iLCIhZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKToodD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLmRheWpzPWUoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgdD0xZTMsZT02ZTQsbj0zNmU1LHI9XCJtaWxsaXNlY29uZFwiLGk9XCJzZWNvbmRcIixzPVwibWludXRlXCIsdT1cImhvdXJcIixhPVwiZGF5XCIsbz1cIndlZWtcIixmPVwibW9udGhcIixoPVwicXVhcnRlclwiLGM9XCJ5ZWFyXCIsZD1cImRhdGVcIiwkPVwiSW52YWxpZCBEYXRlXCIsbD0vXihcXGR7NH0pWy0vXT8oXFxkezEsMn0pP1stL10/KFxcZHswLDJ9KVtUdFxcc10qKFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Oj8oXFxkezEsMn0pP1suOl0/KFxcZCspPyQvLHk9L1xcWyhbXlxcXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE09e25hbWU6XCJlblwiLHdlZWtkYXlzOlwiU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXlcIi5zcGxpdChcIl9cIiksbW9udGhzOlwiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlclwiLnNwbGl0KFwiX1wiKX0sbT1mdW5jdGlvbih0LGUsbil7dmFyIHI9U3RyaW5nKHQpO3JldHVybiFyfHxyLmxlbmd0aD49ZT90OlwiXCIrQXJyYXkoZSsxLXIubGVuZ3RoKS5qb2luKG4pK3R9LGc9e3M6bSx6OmZ1bmN0aW9uKHQpe3ZhciBlPS10LnV0Y09mZnNldCgpLG49TWF0aC5hYnMoZSkscj1NYXRoLmZsb29yKG4vNjApLGk9biU2MDtyZXR1cm4oZTw9MD9cIitcIjpcIi1cIikrbShyLDIsXCIwXCIpK1wiOlwiK20oaSwyLFwiMFwiKX0sbTpmdW5jdGlvbiB0KGUsbil7aWYoZS5kYXRlKCk8bi5kYXRlKCkpcmV0dXJuLXQobixlKTt2YXIgcj0xMioobi55ZWFyKCktZS55ZWFyKCkpKyhuLm1vbnRoKCktZS5tb250aCgpKSxpPWUuY2xvbmUoKS5hZGQocixmKSxzPW4taTwwLHU9ZS5jbG9uZSgpLmFkZChyKyhzPy0xOjEpLGYpO3JldHVybisoLShyKyhuLWkpLyhzP2ktdTp1LWkpKXx8MCl9LGE6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCl8fDA6TWF0aC5mbG9vcih0KX0scDpmdW5jdGlvbih0KXtyZXR1cm57TTpmLHk6Yyx3Om8sZDphLEQ6ZCxoOnUsbTpzLHM6aSxtczpyLFE6aH1bdF18fFN0cmluZyh0fHxcIlwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLyxcIlwiKX0sdTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH19LEQ9XCJlblwiLHY9e307dltEXT1NO3ZhciBwPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgX30sUz1mdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIXQpcmV0dXJuIEQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdlt0XSYmKHI9dCksZSYmKHZbdF09ZSxyPXQpO2Vsc2V7dmFyIGk9dC5uYW1lO3ZbaV09dCxyPWl9cmV0dXJuIW4mJnImJihEPXIpLHJ8fCFuJiZEfSx3PWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBlP2U6e307cmV0dXJuIG4uZGF0ZT10LG4uYXJncz1hcmd1bWVudHMsbmV3IF8obil9LE89ZztPLmw9UyxPLmk9cCxPLnc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdyh0LHtsb2NhbGU6ZS4kTCx1dGM6ZS4kdSx4OmUuJHgsJG9mZnNldDplLiRvZmZzZXR9KX07dmFyIF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBNKHQpe3RoaXMuJEw9Uyh0LmxvY2FsZSxudWxsLCEwKSx0aGlzLnBhcnNlKHQpfXZhciBtPU0ucHJvdG90eXBlO3JldHVybiBtLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMuJGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRlLG49dC51dGM7aWYobnVsbD09PWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoTy51KGUpKXJldHVybiBuZXcgRGF0ZTtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJiEvWiQvaS50ZXN0KGUpKXt2YXIgcj1lLm1hdGNoKGwpO2lmKHIpe3ZhciBpPXJbMl0tMXx8MCxzPShyWzddfHxcIjBcIikuc3Vic3RyaW5nKDAsMyk7cmV0dXJuIG4/bmV3IERhdGUoRGF0ZS5VVEMoclsxXSxpLHJbM118fDEscls0XXx8MCxyWzVdfHwwLHJbNl18fDAscykpOm5ldyBEYXRlKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpfX1yZXR1cm4gbmV3IERhdGUoZSl9KHQpLHRoaXMuJHg9dC54fHx7fSx0aGlzLmluaXQoKX0sbS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZDt0aGlzLiR5PXQuZ2V0RnVsbFllYXIoKSx0aGlzLiRNPXQuZ2V0TW9udGgoKSx0aGlzLiREPXQuZ2V0RGF0ZSgpLHRoaXMuJFc9dC5nZXREYXkoKSx0aGlzLiRIPXQuZ2V0SG91cnMoKSx0aGlzLiRtPXQuZ2V0TWludXRlcygpLHRoaXMuJHM9dC5nZXRTZWNvbmRzKCksdGhpcy4kbXM9dC5nZXRNaWxsaXNlY29uZHMoKX0sbS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gT30sbS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLiRkLnRvU3RyaW5nKCk9PT0kKX0sbS5pc1NhbWU9ZnVuY3Rpb24odCxlKXt2YXIgbj13KHQpO3JldHVybiB0aGlzLnN0YXJ0T2YoZSk8PW4mJm48PXRoaXMuZW5kT2YoZSl9LG0uaXNBZnRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB3KHQpPHRoaXMuc3RhcnRPZihlKX0sbS5pc0JlZm9yZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVuZE9mKGUpPHcodCl9LG0uJGc9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPLnUodCk/dGhpc1tlXTp0aGlzLnNldChuLHQpfSxtLnVuaXg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfSxtLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCl9LG0uc3RhcnRPZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj0hIU8udShlKXx8ZSxoPU8ucCh0KSwkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Ty53KG4uJHU/RGF0ZS5VVEMobi4keSxlLHQpOm5ldyBEYXRlKG4uJHksZSx0KSxuKTtyZXR1cm4gcj9pOmkuZW5kT2YoYSl9LGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTy53KG4udG9EYXRlKClbdF0uYXBwbHkobi50b0RhdGUoXCJzXCIpLChyP1swLDAsMCwwXTpbMjMsNTksNTksOTk5XSkuc2xpY2UoZSkpLG4pfSx5PXRoaXMuJFcsTT10aGlzLiRNLG09dGhpcy4kRCxnPVwic2V0XCIrKHRoaXMuJHU/XCJVVENcIjpcIlwiKTtzd2l0Y2goaCl7Y2FzZSBjOnJldHVybiByPyQoMSwwKTokKDMxLDExKTtjYXNlIGY6cmV0dXJuIHI/JCgxLE0pOiQoMCxNKzEpO2Nhc2Ugbzp2YXIgRD10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsdj0oeTxEP3krNzp5KS1EO3JldHVybiAkKHI/bS12Om0rKDYtdiksTSk7Y2FzZSBhOmNhc2UgZDpyZXR1cm4gbChnK1wiSG91cnNcIiwwKTtjYXNlIHU6cmV0dXJuIGwoZytcIk1pbnV0ZXNcIiwxKTtjYXNlIHM6cmV0dXJuIGwoZytcIlNlY29uZHNcIiwyKTtjYXNlIGk6cmV0dXJuIGwoZytcIk1pbGxpc2Vjb25kc1wiLDMpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuY2xvbmUoKX19LG0uZW5kT2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3RhcnRPZih0LCExKX0sbS4kc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1PLnAodCksaD1cInNldFwiKyh0aGlzLiR1P1wiVVRDXCI6XCJcIiksJD0obj17fSxuW2FdPWgrXCJEYXRlXCIsbltkXT1oK1wiRGF0ZVwiLG5bZl09aCtcIk1vbnRoXCIsbltjXT1oK1wiRnVsbFllYXJcIixuW3VdPWgrXCJIb3Vyc1wiLG5bc109aCtcIk1pbnV0ZXNcIixuW2ldPWgrXCJTZWNvbmRzXCIsbltyXT1oK1wiTWlsbGlzZWNvbmRzXCIsbilbb10sbD1vPT09YT90aGlzLiREKyhlLXRoaXMuJFcpOmU7aWYobz09PWZ8fG89PT1jKXt2YXIgeT10aGlzLmNsb25lKCkuc2V0KGQsMSk7eS4kZFskXShsKSx5LmluaXQoKSx0aGlzLiRkPXkuc2V0KGQsTWF0aC5taW4odGhpcy4kRCx5LmRheXNJbk1vbnRoKCkpKS4kZH1lbHNlICQmJnRoaXMuJGRbJF0obCk7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9LG0uc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQsZSl9LG0uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW08ucCh0KV0oKX0sbS5hZGQ9ZnVuY3Rpb24ocixoKXt2YXIgZCwkPXRoaXM7cj1OdW1iZXIocik7dmFyIGw9Ty5wKGgpLHk9ZnVuY3Rpb24odCl7dmFyIGU9dygkKTtyZXR1cm4gTy53KGUuZGF0ZShlLmRhdGUoKStNYXRoLnJvdW5kKHQqcikpLCQpfTtpZihsPT09ZilyZXR1cm4gdGhpcy5zZXQoZix0aGlzLiRNK3IpO2lmKGw9PT1jKXJldHVybiB0aGlzLnNldChjLHRoaXMuJHkrcik7aWYobD09PWEpcmV0dXJuIHkoMSk7aWYobD09PW8pcmV0dXJuIHkoNyk7dmFyIE09KGQ9e30sZFtzXT1lLGRbdV09bixkW2ldPXQsZClbbF18fDEsbT10aGlzLiRkLmdldFRpbWUoKStyKk07cmV0dXJuIE8udyhtLHRoaXMpfSxtLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKC0xKnQsZSl9LG0uZm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG4uaW52YWxpZERhdGV8fCQ7dmFyIHI9dHx8XCJZWVlZLU1NLUREVEhIOm1tOnNzWlwiLGk9Ty56KHRoaXMpLHM9dGhpcy4kSCx1PXRoaXMuJG0sYT10aGlzLiRNLG89bi53ZWVrZGF5cyxmPW4ubW9udGhzLGg9ZnVuY3Rpb24odCxuLGkscyl7cmV0dXJuIHQmJih0W25dfHx0KGUscikpfHxpW25dLnN1YnN0cigwLHMpfSxjPWZ1bmN0aW9uKHQpe3JldHVybiBPLnMocyUxMnx8MTIsdCxcIjBcIil9LGQ9bi5tZXJpZGllbXx8ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQ8MTI/XCJBTVwiOlwiUE1cIjtyZXR1cm4gbj9yLnRvTG93ZXJDYXNlKCk6cn0sbD17WVk6U3RyaW5nKHRoaXMuJHkpLnNsaWNlKC0yKSxZWVlZOnRoaXMuJHksTTphKzEsTU06Ty5zKGErMSwyLFwiMFwiKSxNTU06aChuLm1vbnRoc1Nob3J0LGEsZiwzKSxNTU1NOmgoZixhKSxEOnRoaXMuJEQsREQ6Ty5zKHRoaXMuJEQsMixcIjBcIiksZDpTdHJpbmcodGhpcy4kVyksZGQ6aChuLndlZWtkYXlzTWluLHRoaXMuJFcsbywyKSxkZGQ6aChuLndlZWtkYXlzU2hvcnQsdGhpcy4kVyxvLDMpLGRkZGQ6b1t0aGlzLiRXXSxIOlN0cmluZyhzKSxISDpPLnMocywyLFwiMFwiKSxoOmMoMSksaGg6YygyKSxhOmQocyx1LCEwKSxBOmQocyx1LCExKSxtOlN0cmluZyh1KSxtbTpPLnModSwyLFwiMFwiKSxzOlN0cmluZyh0aGlzLiRzKSxzczpPLnModGhpcy4kcywyLFwiMFwiKSxTU1M6Ty5zKHRoaXMuJG1zLDMsXCIwXCIpLFo6aX07cmV0dXJuIHIucmVwbGFjZSh5LChmdW5jdGlvbih0LGUpe3JldHVybiBlfHxsW3RdfHxpLnJlcGxhY2UoXCI6XCIsXCJcIil9KSl9LG0udXRjT2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKHRoaXMuJGQuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9LG0uZGlmZj1mdW5jdGlvbihyLGQsJCl7dmFyIGwseT1PLnAoZCksTT13KHIpLG09KE0udXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqZSxnPXRoaXMtTSxEPU8ubSh0aGlzLE0pO3JldHVybiBEPShsPXt9LGxbY109RC8xMixsW2ZdPUQsbFtoXT1ELzMsbFtvXT0oZy1tKS82MDQ4ZTUsbFthXT0oZy1tKS84NjRlNSxsW3VdPWcvbixsW3NdPWcvZSxsW2ldPWcvdCxsKVt5XXx8ZywkP0Q6Ty5hKEQpfSxtLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoZikuJER9LG0uJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiB2W3RoaXMuJExdfSxtLmxvY2FsZT1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLiRMO3ZhciBuPXRoaXMuY2xvbmUoKSxyPVModCxlLCEwKTtyZXR1cm4gciYmKG4uJEw9ciksbn0sbS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPLncodGhpcy4kZCx0aGlzKX0sbS50b0RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpfSxtLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH0sbS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvSVNPU3RyaW5nKCl9LG0udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpfSxNfSgpLGI9Xy5wcm90b3R5cGU7cmV0dXJuIHcucHJvdG90eXBlPWIsW1tcIiRtc1wiLHJdLFtcIiRzXCIsaV0sW1wiJG1cIixzXSxbXCIkSFwiLHVdLFtcIiRXXCIsYV0sW1wiJE1cIixmXSxbXCIkeVwiLGNdLFtcIiREXCIsZF1dLmZvckVhY2goKGZ1bmN0aW9uKHQpe2JbdFsxXV09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGcoZSx0WzBdLHRbMV0pfX0pKSx3LmV4dGVuZD1mdW5jdGlvbih0LGUpe3JldHVybiB0LiRpfHwodChlLF8sdyksdC4kaT0hMCksd30sdy5sb2NhbGU9Uyx3LmlzRGF5anM9cCx3LnVuaXg9ZnVuY3Rpb24odCl7cmV0dXJuIHcoMWUzKnQpfSx3LmVuPXZbRF0sdy5Mcz12LHcucD17fSx3fSkpOyIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maW5kWWVhckNsb3Nlc3RUb1JlZiA9IGV4cG9ydHMuZmluZE1vc3RMaWtlbHlBRFllYXIgPSB2b2lkIDA7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5mdW5jdGlvbiBmaW5kTW9zdExpa2VseUFEWWVhcih5ZWFyTnVtYmVyKSB7XG4gICAgaWYgKHllYXJOdW1iZXIgPCAxMDApIHtcbiAgICAgICAgaWYgKHllYXJOdW1iZXIgPiA1MCkge1xuICAgICAgICAgICAgeWVhck51bWJlciA9IHllYXJOdW1iZXIgKyAxOTAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWVhck51bWJlciA9IHllYXJOdW1iZXIgKyAyMDAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5ZWFyTnVtYmVyO1xufVxuZXhwb3J0cy5maW5kTW9zdExpa2VseUFEWWVhciA9IGZpbmRNb3N0TGlrZWx5QURZZWFyO1xuZnVuY3Rpb24gZmluZFllYXJDbG9zZXN0VG9SZWYocmVmRGF0ZSwgZGF5LCBtb250aCkge1xuICAgIGNvbnN0IHJlZk1vbWVudCA9IGRheWpzXzEuZGVmYXVsdChyZWZEYXRlKTtcbiAgICBsZXQgZGF0ZU1vbWVudCA9IHJlZk1vbWVudDtcbiAgICBkYXRlTW9tZW50ID0gZGF0ZU1vbWVudC5tb250aChtb250aCAtIDEpO1xuICAgIGRhdGVNb21lbnQgPSBkYXRlTW9tZW50LmRhdGUoZGF5KTtcbiAgICBkYXRlTW9tZW50ID0gZGF0ZU1vbWVudC55ZWFyKHJlZk1vbWVudC55ZWFyKCkpO1xuICAgIGNvbnN0IG5leHRZZWFyID0gZGF0ZU1vbWVudC5hZGQoMSwgXCJ5XCIpO1xuICAgIGNvbnN0IGxhc3RZZWFyID0gZGF0ZU1vbWVudC5hZGQoLTEsIFwieVwiKTtcbiAgICBpZiAoTWF0aC5hYnMobmV4dFllYXIuZGlmZihyZWZNb21lbnQpKSA8IE1hdGguYWJzKGRhdGVNb21lbnQuZGlmZihyZWZNb21lbnQpKSkge1xuICAgICAgICBkYXRlTW9tZW50ID0gbmV4dFllYXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKE1hdGguYWJzKGxhc3RZZWFyLmRpZmYocmVmTW9tZW50KSkgPCBNYXRoLmFicyhkYXRlTW9tZW50LmRpZmYocmVmTW9tZW50KSkpIHtcbiAgICAgICAgZGF0ZU1vbWVudCA9IGxhc3RZZWFyO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZU1vbWVudC55ZWFyKCk7XG59XG5leHBvcnRzLmZpbmRZZWFyQ2xvc2VzdFRvUmVmID0gZmluZFllYXJDbG9zZXN0VG9SZWY7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VUaW1lVW5pdHMgPSBleHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VZZWFyID0gZXhwb3J0cy5ZRUFSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSBleHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWSA9IGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSBleHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSBleHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZID0gZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB2b2lkIDA7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5leHBvcnRzLldFRUtEQVlfRElDVElPTkFSWSA9IHtcbiAgICBzdW5kYXk6IDAsXG4gICAgc3VuOiAwLFxuICAgIFwic3VuLlwiOiAwLFxuICAgIG1vbmRheTogMSxcbiAgICBtb246IDEsXG4gICAgXCJtb24uXCI6IDEsXG4gICAgdHVlc2RheTogMixcbiAgICB0dWU6IDIsXG4gICAgXCJ0dWUuXCI6IDIsXG4gICAgd2VkbmVzZGF5OiAzLFxuICAgIHdlZDogMyxcbiAgICBcIndlZC5cIjogMyxcbiAgICB0aHVyc2RheTogNCxcbiAgICB0aHVyczogNCxcbiAgICBcInRodXJzLlwiOiA0LFxuICAgIHRodXI6IDQsXG4gICAgXCJ0aHVyLlwiOiA0LFxuICAgIHRodTogNCxcbiAgICBcInRodS5cIjogNCxcbiAgICBmcmlkYXk6IDUsXG4gICAgZnJpOiA1LFxuICAgIFwiZnJpLlwiOiA1LFxuICAgIHNhdHVyZGF5OiA2LFxuICAgIHNhdDogNixcbiAgICBcInNhdC5cIjogNixcbn07XG5leHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZID0ge1xuICAgIGphbnVhcnk6IDEsXG4gICAgZmVicnVhcnk6IDIsXG4gICAgbWFyY2g6IDMsXG4gICAgYXByaWw6IDQsXG4gICAgbWF5OiA1LFxuICAgIGp1bmU6IDYsXG4gICAganVseTogNyxcbiAgICBhdWd1c3Q6IDgsXG4gICAgc2VwdGVtYmVyOiA5LFxuICAgIG9jdG9iZXI6IDEwLFxuICAgIG5vdmVtYmVyOiAxMSxcbiAgICBkZWNlbWJlcjogMTIsXG59O1xuZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZKSwgeyBqYW46IDEsIFwiamFuLlwiOiAxLCBmZWI6IDIsIFwiZmViLlwiOiAyLCBtYXI6IDMsIFwibWFyLlwiOiAzLCBhcHI6IDQsIFwiYXByLlwiOiA0LCBqdW46IDYsIFwianVuLlwiOiA2LCBqdWw6IDcsIFwianVsLlwiOiA3LCBhdWc6IDgsIFwiYXVnLlwiOiA4LCBzZXA6IDksIFwic2VwLlwiOiA5LCBzZXB0OiA5LCBcInNlcHQuXCI6IDksIG9jdDogMTAsIFwib2N0LlwiOiAxMCwgbm92OiAxMSwgXCJub3YuXCI6IDExLCBkZWM6IDEyLCBcImRlYy5cIjogMTIgfSk7XG5leHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZID0ge1xuICAgIG9uZTogMSxcbiAgICB0d286IDIsXG4gICAgdGhyZWU6IDMsXG4gICAgZm91cjogNCxcbiAgICBmaXZlOiA1LFxuICAgIHNpeDogNixcbiAgICBzZXZlbjogNyxcbiAgICBlaWdodDogOCxcbiAgICBuaW5lOiA5LFxuICAgIHRlbjogMTAsXG4gICAgZWxldmVuOiAxMSxcbiAgICB0d2VsdmU6IDEyLFxufTtcbmV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgZmlyc3Q6IDEsXG4gICAgc2Vjb25kOiAyLFxuICAgIHRoaXJkOiAzLFxuICAgIGZvdXJ0aDogNCxcbiAgICBmaWZ0aDogNSxcbiAgICBzaXh0aDogNixcbiAgICBzZXZlbnRoOiA3LFxuICAgIGVpZ2h0aDogOCxcbiAgICBuaW50aDogOSxcbiAgICB0ZW50aDogMTAsXG4gICAgZWxldmVudGg6IDExLFxuICAgIHR3ZWxmdGg6IDEyLFxuICAgIHRoaXJ0ZWVudGg6IDEzLFxuICAgIGZvdXJ0ZWVudGg6IDE0LFxuICAgIGZpZnRlZW50aDogMTUsXG4gICAgc2l4dGVlbnRoOiAxNixcbiAgICBzZXZlbnRlZW50aDogMTcsXG4gICAgZWlnaHRlZW50aDogMTgsXG4gICAgbmluZXRlZW50aDogMTksXG4gICAgdHdlbnRpZXRoOiAyMCxcbiAgICBcInR3ZW50eSBmaXJzdFwiOiAyMSxcbiAgICBcInR3ZW50eS1maXJzdFwiOiAyMSxcbiAgICBcInR3ZW50eSBzZWNvbmRcIjogMjIsXG4gICAgXCJ0d2VudHktc2Vjb25kXCI6IDIyLFxuICAgIFwidHdlbnR5IHRoaXJkXCI6IDIzLFxuICAgIFwidHdlbnR5LXRoaXJkXCI6IDIzLFxuICAgIFwidHdlbnR5IGZvdXJ0aFwiOiAyNCxcbiAgICBcInR3ZW50eS1mb3VydGhcIjogMjQsXG4gICAgXCJ0d2VudHkgZmlmdGhcIjogMjUsXG4gICAgXCJ0d2VudHktZmlmdGhcIjogMjUsXG4gICAgXCJ0d2VudHkgc2l4dGhcIjogMjYsXG4gICAgXCJ0d2VudHktc2l4dGhcIjogMjYsXG4gICAgXCJ0d2VudHkgc2V2ZW50aFwiOiAyNyxcbiAgICBcInR3ZW50eS1zZXZlbnRoXCI6IDI3LFxuICAgIFwidHdlbnR5IGVpZ2h0aFwiOiAyOCxcbiAgICBcInR3ZW50eS1laWdodGhcIjogMjgsXG4gICAgXCJ0d2VudHkgbmludGhcIjogMjksXG4gICAgXCJ0d2VudHktbmludGhcIjogMjksXG4gICAgXCJ0aGlydGlldGhcIjogMzAsXG4gICAgXCJ0aGlydHkgZmlyc3RcIjogMzEsXG4gICAgXCJ0aGlydHktZmlyc3RcIjogMzEsXG59O1xuZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IHtcbiAgICBzZWM6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWluOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnM6IFwibWludXRlXCIsXG4gICAgbWludXRlOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZXM6IFwibWludXRlXCIsXG4gICAgaDogXCJob3VyXCIsXG4gICAgaHI6IFwiaG91clwiLFxuICAgIGhyczogXCJob3VyXCIsXG4gICAgaG91cjogXCJob3VyXCIsXG4gICAgaG91cnM6IFwiaG91clwiLFxuICAgIGRheTogXCJkXCIsXG4gICAgZGF5czogXCJkXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgd2Vla3M6IFwid2Vla1wiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbW9udGhzOiBcIm1vbnRoXCIsXG4gICAgeTogXCJ5ZWFyXCIsXG4gICAgeXI6IFwieWVhclwiLFxuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbn07XG5leHBvcnRzLk5VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZKX18WzAtOV0rfFswLTldK1xcXFwuWzAtOV0rfGhhbGYoPzpcXFxccyphbj8pP3xhbj8oPzpcXFxccypmZXcpP3xmZXd8c2V2ZXJhbHxhP1xcXFxzKmNvdXBsZVxcXFxzKig/Om9mKT8pYDtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IG1hdGNoLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZW251bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bSA9PT0gXCJhXCIgfHwgbnVtID09PSBcImFuXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvZmV3LykpIHtcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvaGFsZi8pKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvY291cGxlLykpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvc2V2ZXJhbC8pKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW0pO1xufVxuZXhwb3J0cy5wYXJzZU51bWJlclBhdHRlcm4gPSBwYXJzZU51bWJlclBhdHRlcm47XG5leHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBgKD86JHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUlkpfXxbMC05XXsxLDJ9KD86c3R8bmR8cmR8dGgpPylgO1xuZnVuY3Rpb24gcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGxldCBudW0gPSBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZW251bV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWVtudW1dO1xuICAgIH1cbiAgICBudW0gPSBudW0ucmVwbGFjZSgvKD86c3R8bmR8cmR8dGgpJC9pLCBcIlwiKTtcbiAgICByZXR1cm4gcGFyc2VJbnQobnVtKTtcbn1cbmV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm47XG5leHBvcnRzLllFQVJfUEFUVEVSTiA9IGAoPzpbMS05XVswLTldezAsM31cXFxccyooPzpCRXxBRHxCQyl8WzEtMl1bMC05XXszfXxbNS05XVswLTldKWA7XG5mdW5jdGlvbiBwYXJzZVllYXIobWF0Y2gpIHtcbiAgICBpZiAoL0JFL2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9CRS9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoKSAtIDU0MztcbiAgICB9XG4gICAgaWYgKC9CQy9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvQkMvaSwgXCJcIik7XG4gICAgICAgIHJldHVybiAtcGFyc2VJbnQobWF0Y2gpO1xuICAgIH1cbiAgICBpZiAoL0FEL2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9BRC9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoKTtcbiAgICB9XG4gICAgY29uc3QgcmF3WWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICByZXR1cm4geWVhcnNfMS5maW5kTW9zdExpa2VseUFEWWVhcihyYXdZZWFyTnVtYmVyKTtcbn1cbmV4cG9ydHMucGFyc2VZZWFyID0gcGFyc2VZZWFyO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOID0gYCgke2V4cG9ydHMuTlVNQkVSX1BBVFRFUk59KVxcXFxzezAsNX0oJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkpfSlcXFxcc3swLDV9YDtcbmNvbnN0IFNJTkdMRV9USU1FX1VOSVRfUkVHRVggPSBuZXcgUmVnRXhwKFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiwgXCJpXCIpO1xuZXhwb3J0cy5USU1FX1VOSVRTX1BBVFRFUk4gPSBwYXR0ZXJuXzEucmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4oYCg/Oig/OmFib3V0fGFyb3VuZClcXFxccyopP2AsIFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTik7XG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0cyh0aW1ldW5pdFRleHQpIHtcbiAgICBjb25zdCBmcmFnbWVudHMgPSB7fTtcbiAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRpbWV1bml0VGV4dDtcbiAgICBsZXQgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpO1xuICAgICAgICByZW1haW5pbmdUZXh0ID0gcmVtYWluaW5nVGV4dC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudHM7XG59XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gcGFyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKTtcbiAgICBjb25zdCB1bml0ID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFsyXS50b0xvd2VyQ2FzZSgpXTtcbiAgICBmcmFnbWVudHNbdW5pdF0gPSBudW07XG59XG4iLCIhZnVuY3Rpb24odCxuKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1uKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShuKToodD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLmRheWpzX3BsdWdpbl9xdWFydGVyT2ZZZWFyPW4oKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgdD1cIm1vbnRoXCIsbj1cInF1YXJ0ZXJcIjtyZXR1cm4gZnVuY3Rpb24oZSxpKXt2YXIgcj1pLnByb3RvdHlwZTtyLnF1YXJ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuJHV0aWxzKCkudSh0KT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKHRoaXMubW9udGgoKSUzKzMqKHQtMSkpfTt2YXIgcz1yLmFkZDtyLmFkZD1mdW5jdGlvbihlLGkpe3JldHVybiBlPU51bWJlcihlKSx0aGlzLiR1dGlscygpLnAoaSk9PT1uP3RoaXMuYWRkKDMqZSx0KTpzLmJpbmQodGhpcykoZSxpKX07dmFyIHU9ci5zdGFydE9mO3Iuc3RhcnRPZj1mdW5jdGlvbihlLGkpe3ZhciByPXRoaXMuJHV0aWxzKCkscz0hIXIudShpKXx8aTtpZihyLnAoZSk9PT1uKXt2YXIgbz10aGlzLnF1YXJ0ZXIoKS0xO3JldHVybiBzP3RoaXMubW9udGgoMypvKS5zdGFydE9mKHQpLnN0YXJ0T2YoXCJkYXlcIik6dGhpcy5tb250aCgzKm8rMikuZW5kT2YodCkuZW5kT2YoXCJkYXlcIil9cmV0dXJuIHUuYmluZCh0aGlzKShlLGkpfX19KSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmltcGx5U2ltaWxhclRpbWUgPSBleHBvcnRzLmFzc2lnblNpbWlsYXJUaW1lID0gZXhwb3J0cy5hc3NpZ25TaW1pbGFyRGF0ZSA9IGV4cG9ydHMuYXNzaWduVGhlTmV4dERheSA9IHZvaWQgMDtcbmZ1bmN0aW9uIGFzc2lnblRoZU5leHREYXkoY29tcG9uZW50LCB0YXJnZXREYXlKcykge1xuICAgIHRhcmdldERheUpzID0gdGFyZ2V0RGF5SnMuYWRkKDEsIFwiZGF5XCIpO1xuICAgIGFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF5SnMpO1xuICAgIGltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXlKcyk7XG59XG5leHBvcnRzLmFzc2lnblRoZU5leHREYXkgPSBhc3NpZ25UaGVOZXh0RGF5O1xuZnVuY3Rpb24gYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXlKcykge1xuICAgIGNvbXBvbmVudC5hc3NpZ24oXCJkYXlcIiwgdGFyZ2V0RGF5SnMuZGF0ZSgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibW9udGhcIiwgdGFyZ2V0RGF5SnMubW9udGgoKSArIDEpO1xuICAgIGNvbXBvbmVudC5hc3NpZ24oXCJ5ZWFyXCIsIHRhcmdldERheUpzLnllYXIoKSk7XG59XG5leHBvcnRzLmFzc2lnblNpbWlsYXJEYXRlID0gYXNzaWduU2ltaWxhckRhdGU7XG5mdW5jdGlvbiBhc3NpZ25TaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERheUpzKSB7XG4gICAgY29tcG9uZW50LmFzc2lnbihcImhvdXJcIiwgdGFyZ2V0RGF5SnMuaG91cigpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibWludXRlXCIsIHRhcmdldERheUpzLm1pbnV0ZSgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwic2Vjb25kXCIsIHRhcmdldERheUpzLnNlY29uZCgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibWlsbGlzZWNvbmRcIiwgdGFyZ2V0RGF5SnMubWlsbGlzZWNvbmQoKSk7XG4gICAgY29tcG9uZW50LmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIHRhcmdldERheUpzLnV0Y09mZnNldCgpKTtcbn1cbmV4cG9ydHMuYXNzaWduU2ltaWxhclRpbWUgPSBhc3NpZ25TaW1pbGFyVGltZTtcbmZ1bmN0aW9uIGltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXlKcykge1xuICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgdGFyZ2V0RGF5SnMuaG91cigpKTtcbiAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgdGFyZ2V0RGF5SnMubWludXRlKCkpO1xuICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCB0YXJnZXREYXlKcy5zZWNvbmQoKSk7XG4gICAgY29tcG9uZW50LmltcGx5KFwibWlsbGlzZWNvbmRcIiwgdGFyZ2V0RGF5SnMubWlsbGlzZWNvbmQoKSk7XG4gICAgY29tcG9uZW50LmltcGx5KFwidGltZXpvbmVPZmZzZXRcIiwgdGFyZ2V0RGF5SnMudXRjT2Zmc2V0KCkpO1xufVxuZXhwb3J0cy5pbXBseVNpbWlsYXJUaW1lID0gaW1wbHlTaW1pbGFyVGltZTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QYXJzaW5nUmVzdWx0ID0gZXhwb3J0cy5QYXJzaW5nQ29tcG9uZW50cyA9IHZvaWQgMDtcbmNvbnN0IHF1YXJ0ZXJPZlllYXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXJcIikpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuL3V0aWxzL2RheWpzXCIpO1xuZGF5anNfMS5kZWZhdWx0LmV4dGVuZChxdWFydGVyT2ZZZWFyXzEuZGVmYXVsdCk7XG5jbGFzcyBQYXJzaW5nQ29tcG9uZW50cyB7XG4gICAgY29uc3RydWN0b3IocmVmRGF0ZSwga25vd25Db21wb25lbnRzKSB7XG4gICAgICAgIHRoaXMua25vd25WYWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5pbXBsaWVkVmFsdWVzID0ge307XG4gICAgICAgIGlmIChrbm93bkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGtub3duQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMua25vd25WYWx1ZXNba2V5XSA9IGtub3duQ29tcG9uZW50c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZkRheUpzID0gZGF5anNfMS5kZWZhdWx0KHJlZkRhdGUpO1xuICAgICAgICB0aGlzLmltcGx5KFwiZGF5XCIsIHJlZkRheUpzLmRhdGUoKSk7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJtb250aFwiLCByZWZEYXlKcy5tb250aCgpICsgMSk7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJ5ZWFyXCIsIHJlZkRheUpzLnllYXIoKSk7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgdGhpcy5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgdGhpcy5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgdGhpcy5pbXBseShcIm1pbGxpc2Vjb25kXCIsIDApO1xuICAgIH1cbiAgICBnZXQoY29tcG9uZW50KSB7XG4gICAgICAgIGlmIChjb21wb25lbnQgaW4gdGhpcy5rbm93blZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMua25vd25WYWx1ZXNbY29tcG9uZW50XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50IGluIHRoaXMuaW1wbGllZFZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wbGllZFZhbHVlc1tjb21wb25lbnRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpc0NlcnRhaW4oY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQgaW4gdGhpcy5rbm93blZhbHVlcztcbiAgICB9XG4gICAgZ2V0Q2VydGFpbkNvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmtub3duVmFsdWVzKTtcbiAgICB9XG4gICAgaW1wbHkoY29tcG9uZW50LCB2YWx1ZSkge1xuICAgICAgICBpZiAoY29tcG9uZW50IGluIHRoaXMua25vd25WYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1wbGllZFZhbHVlc1tjb21wb25lbnRdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBhc3NpZ24oY29tcG9uZW50LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmtub3duVmFsdWVzW2NvbXBvbmVudF0gPSB2YWx1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW1wbGllZFZhbHVlc1tjb21wb25lbnRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGNvbXBvbmVudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5rbm93blZhbHVlc1tjb21wb25lbnRdO1xuICAgICAgICBkZWxldGUgdGhpcy5pbXBsaWVkVmFsdWVzW2NvbXBvbmVudF07XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgUGFyc2luZ0NvbXBvbmVudHMobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbXBvbmVudC5rbm93blZhbHVlcyA9IHt9O1xuICAgICAgICBjb21wb25lbnQuaW1wbGllZFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmtub3duVmFsdWVzKSB7XG4gICAgICAgICAgICBjb21wb25lbnQua25vd25WYWx1ZXNba2V5XSA9IHRoaXMua25vd25WYWx1ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmltcGxpZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbXBsaWVkVmFsdWVzW2tleV0gPSB0aGlzLmltcGxpZWRWYWx1ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgICBpc09ubHlEYXRlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNDZXJ0YWluKFwiaG91clwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJtaW51dGVcIikgJiYgIXRoaXMuaXNDZXJ0YWluKFwic2Vjb25kXCIpO1xuICAgIH1cbiAgICBpc09ubHlUaW1lKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNDZXJ0YWluKFwid2Vla2RheVwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJkYXlcIikgJiYgIXRoaXMuaXNDZXJ0YWluKFwibW9udGhcIik7XG4gICAgfVxuICAgIGlzT25seVdlZWtkYXlDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ2VydGFpbihcIndlZWtkYXlcIikgJiYgIXRoaXMuaXNDZXJ0YWluKFwiZGF5XCIpICYmICF0aGlzLmlzQ2VydGFpbihcIm1vbnRoXCIpO1xuICAgIH1cbiAgICBpc09ubHlEYXlNb250aENvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDZXJ0YWluKFwiZGF5XCIpICYmIHRoaXMuaXNDZXJ0YWluKFwibW9udGhcIikgJiYgIXRoaXMuaXNDZXJ0YWluKFwieWVhclwiKTtcbiAgICB9XG4gICAgaXNWYWxpZERhdGUoKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmlzQ2VydGFpbihcInRpbWV6b25lT2Zmc2V0XCIpID8gdGhpcy5kYXRlV2l0aG91dFRpbWV6b25lQWRqdXN0bWVudCgpIDogdGhpcy5kYXRlKCk7XG4gICAgICAgIGlmIChkYXRlLmdldEZ1bGxZZWFyKCkgIT09IHRoaXMuZ2V0KFwieWVhclwiKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRhdGUuZ2V0TW9udGgoKSAhPT0gdGhpcy5nZXQoXCJtb250aFwiKSAtIDEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSAhPT0gdGhpcy5nZXQoXCJkYXlcIikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmdldChcImhvdXJcIikgIT0gbnVsbCAmJiBkYXRlLmdldEhvdXJzKCkgIT0gdGhpcy5nZXQoXCJob3VyXCIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5nZXQoXCJtaW51dGVcIikgIT0gbnVsbCAmJiBkYXRlLmdldE1pbnV0ZXMoKSAhPSB0aGlzLmdldChcIm1pbnV0ZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYFtQYXJzaW5nQ29tcG9uZW50cyB7a25vd25WYWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5rbm93blZhbHVlcyl9LCBpbXBsaWVkVmFsdWVzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuaW1wbGllZFZhbHVlcyl9fV1gO1xuICAgIH1cbiAgICBkYXlqcygpIHtcbiAgICAgICAgcmV0dXJuIGRheWpzXzEuZGVmYXVsdCh0aGlzLmRhdGUoKSk7XG4gICAgfVxuICAgIGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVXaXRob3V0VGltZXpvbmVBZGp1c3RtZW50KCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArIHRoaXMuZ2V0VGltZXpvbmVBZGp1c3RtZW50TWludXRlKGRhdGUpICogNjAwMDApO1xuICAgIH1cbiAgICBkYXRlV2l0aG91dFRpbWV6b25lQWRqdXN0bWVudCgpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0KFwieWVhclwiKSwgdGhpcy5nZXQoXCJtb250aFwiKSAtIDEsIHRoaXMuZ2V0KFwiZGF5XCIpLCB0aGlzLmdldChcImhvdXJcIiksIHRoaXMuZ2V0KFwibWludXRlXCIpLCB0aGlzLmdldChcInNlY29uZFwiKSwgdGhpcy5nZXQoXCJtaWxsaXNlY29uZFwiKSk7XG4gICAgICAgIGRhdGUuc2V0RnVsbFllYXIodGhpcy5nZXQoXCJ5ZWFyXCIpKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGdldFRpbWV6b25lQWRqdXN0bWVudE1pbnV0ZShkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZGF0ZSA9IGRhdGUgIT09IG51bGwgJiYgZGF0ZSAhPT0gdm9pZCAwID8gZGF0ZSA6IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lem9uZU9mZnNldCA9IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFRpbWV6b25lT2Zmc2V0ID0gKF9hID0gdGhpcy5nZXQoXCJ0aW1lem9uZU9mZnNldFwiKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3VycmVudFRpbWV6b25lT2Zmc2V0O1xuICAgICAgICByZXR1cm4gY3VycmVudFRpbWV6b25lT2Zmc2V0IC0gdGFyZ2V0VGltZXpvbmVPZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKHJlZkRhdGUsIGZyYWdtZW50cykge1xuICAgICAgICBsZXQgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZEYXRlKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJhZ21lbnRzKSB7XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5hZGQoZnJhZ21lbnRzW2tleV0sIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG5ldyBQYXJzaW5nQ29tcG9uZW50cyhyZWZEYXRlKTtcbiAgICAgICAgaWYgKGZyYWdtZW50c1tcImhvdXJcIl0gfHwgZnJhZ21lbnRzW1wibWludXRlXCJdIHx8IGZyYWdtZW50c1tcInNlY29uZFwiXSkge1xuICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyVGltZShjb21wb25lbnRzLCBkYXRlKTtcbiAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50cywgZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXlqc18yLmltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50cywgZGF0ZSk7XG4gICAgICAgICAgICBpZiAoZnJhZ21lbnRzW1wiZFwiXSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiZGF5XCIsIGRhdGUuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnRzW1wid2Vla1wiXSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwid2Vla2RheVwiLCBkYXRlLmRheSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50c1tcIm1vbnRoXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudHNbXCJ5ZWFyXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyc2luZ0NvbXBvbmVudHMgPSBQYXJzaW5nQ29tcG9uZW50cztcbmNsYXNzIFBhcnNpbmdSZXN1bHQge1xuICAgIGNvbnN0cnVjdG9yKHJlZkRhdGUsIGluZGV4LCB0ZXh0LCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMucmVmRGF0ZSA9IHJlZkRhdGU7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IG5ldyBQYXJzaW5nQ29tcG9uZW50cyh0aGlzLnJlZkRhdGUpO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQYXJzaW5nUmVzdWx0KHRoaXMucmVmRGF0ZSwgdGhpcy5pbmRleCwgdGhpcy50ZXh0KTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0ID0gdGhpcy5zdGFydCA/IHRoaXMuc3RhcnQuY2xvbmUoKSA6IG51bGw7XG4gICAgICAgIHJlc3VsdC5lbmQgPSB0aGlzLmVuZCA/IHRoaXMuZW5kLmNsb25lKCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5kYXRlKCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYFtQYXJzaW5nUmVzdWx0IHtpbmRleDogJHt0aGlzLmluZGV4fSwgdGV4dDogJyR7dGhpcy50ZXh0fScsIC4uLn1dYDtcbiAgICB9XG59XG5leHBvcnRzLlBhcnNpbmdSZXN1bHQgPSBQYXJzaW5nUmVzdWx0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nID0gdm9pZCAwO1xuY2xhc3MgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNhY2hlZElubmVyUGF0dGVybiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVkUGF0dGVybiA9IG51bGw7XG4gICAgfVxuICAgIHBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICBjb25zdCBpbm5lclBhdHRlcm4gPSB0aGlzLmlubmVyUGF0dGVybihjb250ZXh0KTtcbiAgICAgICAgaWYgKGlubmVyUGF0dGVybiA9PSB0aGlzLmNhY2hlZElubmVyUGF0dGVybikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGF0dGVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm4gPSBuZXcgUmVnRXhwKGAoXFxcXFd8Xikke2lubmVyUGF0dGVybi5zb3VyY2V9YCwgaW5uZXJQYXR0ZXJuLmZsYWdzKTtcbiAgICAgICAgdGhpcy5jYWNoZWRJbm5lclBhdHRlcm4gPSBpbm5lclBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhdHRlcm47XG4gICAgfVxuICAgIGV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gbWF0Y2hbMV07XG4gICAgICAgIG1hdGNoLmluZGV4ID0gbWF0Y2guaW5kZXggKyBoZWFkZXIubGVuZ3RoO1xuICAgICAgICBtYXRjaFswXSA9IG1hdGNoWzBdLnN1YnN0cmluZyhoZWFkZXIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbWF0Y2hbaSAtIDFdID0gbWF0Y2hbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKTtcbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nID0gQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmc7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTl9XSVRIX1BSRUZJWCA9IG5ldyBSZWdFeHAoYCg/OndpdGhpbnxpbnxmb3IpXFxcXHMqYCArXG4gICAgYCg/Oig/OmFib3V0fGFyb3VuZHxyb3VnaGx5fGFwcHJveGltYXRlbHl8anVzdClcXFxccyooPzp+XFxcXHMqKT8pPygke2NvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTn0pKD89XFxcXFd8JClgLCBcImlcIik7XG5jb25zdCBQQVRURVJOX1dJVEhPVVRfUFJFRklYID0gbmV3IFJlZ0V4cChgKD86KD86YWJvdXR8YXJvdW5kfHJvdWdobHl8YXBwcm94aW1hdGVseXxqdXN0KVxcXFxzKig/On5cXFxccyopPyk/KCR7Y29uc3RhbnRzXzEuVElNRV9VTklUU19QQVRURVJOfSkoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbmNsYXNzIEVOVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQub3B0aW9uLmZvcndhcmREYXRlID8gUEFUVEVSTl9XSVRIT1VUX1BSRUZJWCA6IFBBVFRFUk5fV0lUSF9QUkVGSVg7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsxXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMuY3JlYXRlUmVsYXRpdmVGcm9tUmVmRGF0ZShjb250ZXh0LnJlZkRhdGUsIHRpbWVVbml0cyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5UaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IGNvbnN0YW50c18yID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IGNvbnN0YW50c18zID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzpvblxcXFxzKj8pP1wiICtcbiAgICBgKCR7Y29uc3RhbnRzXzMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTn0pYCArXG4gICAgXCIoPzpcXFxccypcIiArXG4gICAgXCIoPzp0b3xcXFxcLXxcXFxc4oCTfHVudGlsfHRocm91Z2h8dGlsbHxcXFxccylcXFxccypcIiArXG4gICAgYCgke2NvbnN0YW50c18zLk9SRElOQUxfTlVNQkVSX1BBVFRFUk59KWAgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPzotfC98XFxcXHMqKD86b2YpP1xcXFxzKilcIiArXG4gICAgXCIoXCIgK1xuICAgIHBhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSkgK1xuICAgIFwiKVwiICtcbiAgICBcIig/OlwiICtcbiAgICBcIig/Oi18L3wsP1xcXFxzKilcIiArXG4gICAgYCgke2NvbnN0YW50c18yLllFQVJfUEFUVEVSTn0oPyFbXlxcXFxzXVxcXFxkKSlgICtcbiAgICBcIik/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBEQVRFX1RPX0dST1VQID0gMjtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAzO1xuY29uc3QgWUVBUl9HUk9VUCA9IDQ7XG5jbGFzcyBFTk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KG1hdGNoLmluZGV4LCBtYXRjaFswXSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29uc3QgZGF5ID0gY29uc3RhbnRzXzMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX0dST1VQXSk7XG4gICAgICAgIGlmIChkYXkgPiAzMSkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoW0RBVEVfR1JPVVBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJtb250aFwiLCBtb250aCk7XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJkYXlcIiwgZGF5KTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyTnVtYmVyID0gY29uc3RhbnRzXzIucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ5ZWFyXCIsIHllYXJOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW0RBVEVfVE9fR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCBlbmREYXRlID0gY29uc3RhbnRzXzMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX1RPX0dST1VQXSk7XG4gICAgICAgICAgICByZXN1bHQuZW5kID0gcmVzdWx0LnN0YXJ0LmNsb25lKCk7XG4gICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcImRheVwiLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pYCArXG4gICAgXCIoPzotfC98XFxcXHMqLD9cXFxccyopXCIgK1xuICAgIGAoJHtjb25zdGFudHNfMi5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSkoPyFcXFxccyooPzphbXxwbSkpXFxcXHMqYCArXG4gICAgXCIoPzpcIiArXG4gICAgXCIoPzp0b3xcXFxcLSlcXFxccypcIiArXG4gICAgYCgke2NvbnN0YW50c18yLk9SRElOQUxfTlVNQkVSX1BBVFRFUk59KVxcXFxzKmAgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPzpcIiArXG4gICAgXCIoPzotfC98XFxcXHMqLD9cXFxccyopXCIgK1xuICAgIGAoJHtjb25zdGFudHNfMy5ZRUFSX1BBVFRFUk59KWAgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPz1cXFxcV3wkKSg/IVxcXFw6XFxcXGQpXCIsIFwiaVwiKTtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAxO1xuY29uc3QgREFURV9HUk9VUCA9IDI7XG5jb25zdCBEQVRFX1RPX0dST1VQID0gMztcbmNvbnN0IFlFQVJfR1JPVVAgPSA0O1xuY2xhc3MgRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29uc3QgZGF5ID0gY29uc3RhbnRzXzIucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX0dST1VQXSk7XG4gICAgICAgIGlmIChkYXkgPiAzMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoe1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSBjb25zdGFudHNfMy5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBjb25zdGFudHNfMi5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfVE9fR1JPVVBdKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KG1hdGNoLmluZGV4LCBtYXRjaFswXSk7XG4gICAgICAgIHJlc3VsdC5zdGFydCA9IGNvbXBvbmVudHM7XG4gICAgICAgIHJlc3VsdC5lbmQgPSBjb21wb25lbnRzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwiZGF5XCIsIGVuZERhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChgKCg/OmluKVxcXFxzKik/YCArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSl9KWAgK1xuICAgIGBcXFxccypgICtcbiAgICBgKD86YCArXG4gICAgYFssLV0/XFxcXHMqKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSk/YCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/PVteXFxcXHNcXFxcd118XFxcXHMrW14wLTldfFxcXFxzKyR8JClcIiwgXCJpXCIpO1xuY29uc3QgUFJFRklYX0dST1VQID0gMTtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAyO1xuY29uc3QgWUVBUl9HUk9VUCA9IDM7XG5jbGFzcyBFTk1vbnRoTmFtZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbW9udGhOYW1lID0gbWF0Y2hbTU9OVEhfTkFNRV9HUk9VUF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG1hdGNoWzBdLmxlbmd0aCA8PSAzICYmICFjb25zdGFudHNfMS5GVUxMX01PTlRIX05BTUVfRElDVElPTkFSWVttb250aE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXggKyAobWF0Y2hbUFJFRklYX0dST1VQXSB8fCBcIlwiKS5sZW5ndGgsIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwiZGF5XCIsIDEpO1xuICAgICAgICBjb25zdCBtb250aCA9IGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUllbbW9udGhOYW1lXTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gY29uc3RhbnRzXzIucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCAxLCBtb250aCk7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5Nb250aE5hbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYChbMC05XXs0fSlbXFxcXC5cXFxcL1xcXFxzXWAgK1xuICAgIGAoPzooJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSl8KFswLTldezEsMn0pKVtcXFxcLlxcXFwvXFxcXHNdYCArXG4gICAgYChbMC05XXsxLDJ9KWAgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgWUVBUl9OVU1CRVJfR1JPVVAgPSAxO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDI7XG5jb25zdCBNT05USF9OVU1CRVJfR1JPVVAgPSAzO1xuY29uc3QgREFURV9OVU1CRVJfR1JPVVAgPSA0O1xuY2xhc3MgRU5DYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbWF0Y2hbTU9OVEhfTlVNQkVSX0dST1VQXVxuICAgICAgICAgICAgPyBwYXJzZUludChtYXRjaFtNT05USF9OVU1CRVJfR1JPVVBdKVxuICAgICAgICAgICAgOiBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtZRUFSX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtEQVRFX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIihbMC05XXwwWzEtOV18MVswMTJdKS8oWzAtOV17NH0pXCIgKyBcIlwiLCBcImlcIik7XG5jb25zdCBNT05USF9HUk9VUCA9IDE7XG5jb25zdCBZRUFSX0dST1VQID0gMjtcbmNsYXNzIEVOU2xhc2hNb250aEZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChtYXRjaFtNT05USF9HUk9VUF0pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpLmltcGx5KFwiZGF5XCIsIDEpLmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKS5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOU2xhc2hNb250aEZvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyID0gdm9pZCAwO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmZ1bmN0aW9uIHByaW1hcnlUaW1lUGF0dGVybihwcmltYXJ5UHJlZml4LCBwcmltYXJ5U3VmZml4KSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnxcXFxcc3xUfFxcXFxiKVwiICtcbiAgICAgICAgYCR7cHJpbWFyeVByZWZpeH1gICtcbiAgICAgICAgXCIoXFxcXGR7MSw0fSlcIiArXG4gICAgICAgIFwiKD86XCIgK1xuICAgICAgICBcIig/OlxcXFwufFxcXFw6fFxcXFzvvJopXCIgK1xuICAgICAgICBcIihcXFxcZHsxLDJ9KVwiICtcbiAgICAgICAgXCIoPzpcIiArXG4gICAgICAgIFwiKD86XFxcXDp8XFxcXO+8milcIiArXG4gICAgICAgIFwiKFxcXFxkezJ9KVwiICtcbiAgICAgICAgXCIoPzpcXFxcLihcXFxcZHsxLDZ9KSk/XCIgK1xuICAgICAgICBcIik/XCIgK1xuICAgICAgICBcIik/XCIgK1xuICAgICAgICBcIig/OlxcXFxzKihhXFxcXC5tXFxcXC58cFxcXFwubVxcXFwufGFtP3xwbT8pKT9cIiArXG4gICAgICAgIGAke3ByaW1hcnlTdWZmaXh9YCwgXCJpXCIpO1xufVxuZnVuY3Rpb24gZm9sbG93aW5nVGltZVBhdHRlbihmb2xsb3dpbmdQaGFzZSwgZm9sbG93aW5nU3VmZml4KSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4oJHtmb2xsb3dpbmdQaGFzZX0pYCArXG4gICAgICAgIFwiKFxcXFxkezEsNH0pXCIgK1xuICAgICAgICBcIig/OlwiICtcbiAgICAgICAgXCIoPzpcXFxcLnxcXFxcOnxcXFxc77yaKVwiICtcbiAgICAgICAgXCIoXFxcXGR7MSwyfSlcIiArXG4gICAgICAgIFwiKD86XCIgK1xuICAgICAgICBcIig/OlxcXFwufFxcXFw6fFxcXFzvvJopXCIgK1xuICAgICAgICBcIihcXFxcZHsxLDJ9KSg/OlxcXFwuKFxcXFxkezEsNn0pKT9cIiArXG4gICAgICAgIFwiKT9cIiArXG4gICAgICAgIFwiKT9cIiArXG4gICAgICAgIFwiKD86XFxcXHMqKGFcXFxcLm1cXFxcLnxwXFxcXC5tXFxcXC58YW0/fHBtPykpP1wiICtcbiAgICAgICAgYCR7Zm9sbG93aW5nU3VmZml4fWAsIFwiaVwiKTtcbn1cbmNvbnN0IEhPVVJfR1JPVVAgPSAyO1xuY29uc3QgTUlOVVRFX0dST1VQID0gMztcbmNvbnN0IFNFQ09ORF9HUk9VUCA9IDQ7XG5jb25zdCBNSUxMSV9TRUNPTkRfR1JPVVAgPSA1O1xuY29uc3QgQU1fUE1fSE9VUl9HUk9VUCA9IDY7XG5jbGFzcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpY3RNb2RlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jYWNoZWRQcmltYXJ5UHJlZml4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZWRQcmltYXJ5U3VmZml4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZWRQcmltYXJ5VGltZVBhdHRlcm4gPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlZEZvbGxvd2luZ1BoYXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdTdWZmaXggPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlZEZvbGxvd2luZ1RpbWVQYXR0ZW4gPSBudWxsO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBwcmltYXJ5U3VmZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPz1cXFxcV3wkKVwiO1xuICAgIH1cbiAgICBmb2xsb3dpbmdTdWZmaXgoKSB7XG4gICAgICAgIHJldHVybiBcIig/PVxcXFxXfCQpXCI7XG4gICAgfVxuICAgIHBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmltYXJ5VGltZVBhdHRlcm5UaHJvdWdoQ2FjaGUoKTtcbiAgICB9XG4gICAgZXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydENvbXBvbmVudHMgPSB0aGlzLmV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpO1xuICAgICAgICBpZiAoIXN0YXJ0Q29tcG9uZW50cykge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzFdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdGV4dCA9IG1hdGNoWzBdLnN1YnN0cmluZyhtYXRjaFsxXS5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQoaW5kZXgsIHRleHQsIHN0YXJ0Q29tcG9uZW50cyk7XG4gICAgICAgIG1hdGNoLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nVGV4dCA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXgpO1xuICAgICAgICBjb25zdCBmb2xsb3dpbmdQYXR0ZXJuID0gdGhpcy5nZXRGb2xsb3dpbmdUaW1lUGF0dGVyblRocm91Z2hDYWNoZSgpO1xuICAgICAgICBjb25zdCBmb2xsb3dpbmdNYXRjaCA9IGZvbGxvd2luZ1BhdHRlcm4uZXhlYyhyZW1haW5pbmdUZXh0KTtcbiAgICAgICAgaWYgKCFmb2xsb3dpbmdNYXRjaCB8fFxuICAgICAgICAgICAgZm9sbG93aW5nTWF0Y2hbMF0ubWF0Y2goL15cXHMqKFsrLV0pXFxzKlxcZHszLDR9JC8pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0FuZFJldHVybldpdGhvdXRGb2xsb3dpbmdQYXR0ZXJuKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LmVuZCA9IHRoaXMuZXh0cmFjdEZvbGxvd2luZ1RpbWVDb21wb25lbnRzKGNvbnRleHQsIGZvbGxvd2luZ01hdGNoLCByZXN1bHQpO1xuICAgICAgICBpZiAocmVzdWx0LmVuZCkge1xuICAgICAgICAgICAgcmVzdWx0LnRleHQgKz0gZm9sbG93aW5nTWF0Y2hbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBbmRSZXR1cm5XaXRoRm9sbG93aW5nUGF0dGVybihyZXN1bHQpO1xuICAgIH1cbiAgICBleHRyYWN0UHJpbWFyeVRpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoLCBzdHJpY3QgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBsZXQgbWludXRlID0gMDtcbiAgICAgICAgbGV0IG1lcmlkaWVtID0gbnVsbDtcbiAgICAgICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaFtIT1VSX0dST1VQXSk7XG4gICAgICAgIGlmIChob3VyID4gMTAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpY3RNb2RlIHx8IG1hdGNoW01JTlVURV9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWludXRlID0gaG91ciAlIDEwMDtcbiAgICAgICAgICAgIGhvdXIgPSBNYXRoLmZsb29yKGhvdXIgLyAxMDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChob3VyID4gMjQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtNSU5VVEVfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaFtNSU5VVEVfR1JPVVBdLmxlbmd0aCA9PSAxICYmICFtYXRjaFtBTV9QTV9IT1VSX0dST1VQXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWludXRlID0gcGFyc2VJbnQobWF0Y2hbTUlOVVRFX0dST1VQXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbnV0ZSA+PSA2MCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvdXIgPiAxMikge1xuICAgICAgICAgICAgbWVyaWRpZW0gPSBpbmRleF8xLk1lcmlkaWVtLlBNO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtBTV9QTV9IT1VSX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+IDEyKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgYW1wbSA9IG1hdGNoW0FNX1BNX0hPVVJfR1JPVVBdWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYW1wbSA9PSBcImFcIikge1xuICAgICAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5BTTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA9PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW1wbSA9PSBcInBcIikge1xuICAgICAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5QTTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciAhPSAxMikge1xuICAgICAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcImhvdXJcIiwgaG91cik7XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWludXRlXCIsIG1pbnV0ZSk7XG4gICAgICAgIGlmIChtZXJpZGllbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBtZXJpZGllbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtNSUxMSV9TRUNPTkRfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hbTUlMTElfU0VDT05EX0dST1VQXS5zdWJzdHJpbmcoMCwgMykpO1xuICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kID49IDEwMDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1pbGxpc2Vjb25kXCIsIG1pbGxpc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbU0VDT05EX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSBwYXJzZUludChtYXRjaFtTRUNPTkRfR1JPVVBdKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gNjApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInNlY29uZFwiLCBzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbiAgICBleHRyYWN0Rm9sbG93aW5nVGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gsIHJlc3VsdCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBpZiAobWF0Y2hbTUlMTElfU0VDT05EX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBtaWxsaXNlY29uZCA9IHBhcnNlSW50KG1hdGNoW01JTExJX1NFQ09ORF9HUk9VUF0uc3Vic3RyaW5nKDAsIDMpKTtcbiAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZCA+PSAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtaWxsaXNlY29uZFwiLCBtaWxsaXNlY29uZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW1NFQ09ORF9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hbU0VDT05EX0dST1VQXSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kID49IDYwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJzZWNvbmRcIiwgc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaG91ciA9IHBhcnNlSW50KG1hdGNoW0hPVVJfR1JPVVBdKTtcbiAgICAgICAgbGV0IG1pbnV0ZSA9IDA7XG4gICAgICAgIGxldCBtZXJpZGllbSA9IC0xO1xuICAgICAgICBpZiAobWF0Y2hbTUlOVVRFX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtaW51dGUgPSBwYXJzZUludChtYXRjaFtNSU5VVEVfR1JPVVBdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChob3VyID4gMTAwKSB7XG4gICAgICAgICAgICBtaW51dGUgPSBob3VyICUgMTAwO1xuICAgICAgICAgICAgaG91ciA9IE1hdGguZmxvb3IoaG91ciAvIDEwMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbnV0ZSA+PSA2MCB8fCBob3VyID4gMjQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChob3VyID49IDEyKSB7XG4gICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uUE07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW0FNX1BNX0hPVVJfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3VyID4gMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFtcG0gPSBtYXRjaFtBTV9QTV9IT1VSX0dST1VQXVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJhXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uQU07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5pc0NlcnRhaW4oXCJkYXlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgY29tcG9uZW50cy5nZXQoXCJkYXlcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbXBtID09IFwicFwiKSB7XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPSBpbmRleF8xLk1lcmlkaWVtLlBNO1xuICAgICAgICAgICAgICAgIGlmIChob3VyICE9IDEyKVxuICAgICAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwibWVyaWRpZW1cIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobWVyaWRpZW0gPT0gaW5kZXhfMS5NZXJpZGllbS5BTSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5nZXQoXCJob3VyXCIpID09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhcnQuZ2V0KFwiaG91clwiKSAhPSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImhvdXJcIiwgcmVzdWx0LnN0YXJ0LmdldChcImhvdXJcIikgKyAxMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGhvdXIpO1xuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICAgICAgICBpZiAobWVyaWRpZW0gPj0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBtZXJpZGllbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydEF0UE0gPSByZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwibWVyaWRpZW1cIikgJiYgcmVzdWx0LnN0YXJ0LmdldChcImhvdXJcIikgPiAxMjtcbiAgICAgICAgICAgIGlmIChzdGFydEF0UE0pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmdldChcImhvdXJcIikgLSAxMiA+IGhvdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChob3VyIDw9IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBob3VyICsgMTIpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhvdXIgPiAxMikge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhvdXIgPD0gMTIpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvbmVudHMuZGF0ZSgpLmdldFRpbWUoKSA8IHJlc3VsdC5zdGFydC5kYXRlKCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIGNvbXBvbmVudHMuZ2V0KFwiZGF5XCIpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxuICAgIGNoZWNrQW5kUmV0dXJuV2l0aG91dEZvbGxvd2luZ1BhdHRlcm4ocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQudGV4dC5tYXRjaCgvXlxcZCQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kaW5nV2l0aE51bWJlcnMgPSByZXN1bHQudGV4dC5tYXRjaCgvW15cXGQ6Ll0oXFxkW1xcZC5dKykkLyk7XG4gICAgICAgIGlmIChlbmRpbmdXaXRoTnVtYmVycykge1xuICAgICAgICAgICAgY29uc3QgZW5kaW5nTnVtYmVycyA9IGVuZGluZ1dpdGhOdW1iZXJzWzFdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWN0TW9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZGluZ051bWJlcnMuaW5jbHVkZXMoXCIuXCIpICYmICFlbmRpbmdOdW1iZXJzLm1hdGNoKC9cXGQoXFwuXFxkezJ9KSskLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuZGluZ051bWJlclZhbCA9IHBhcnNlSW50KGVuZGluZ051bWJlcnMpO1xuICAgICAgICAgICAgaWYgKGVuZGluZ051bWJlclZhbCA+IDI0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2hlY2tBbmRSZXR1cm5XaXRoRm9sbG93aW5nUGF0dGVybihyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdC50ZXh0Lm1hdGNoKC9eXFxkKy1cXGQrJC8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmRpbmdXaXRoTnVtYmVycyA9IHJlc3VsdC50ZXh0Lm1hdGNoKC9bXlxcZDouXShcXGRbXFxkLl0rKVxccyotXFxzKihcXGRbXFxkLl0rKSQvKTtcbiAgICAgICAgaWYgKGVuZGluZ1dpdGhOdW1iZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGFydGluZ051bWJlcnMgPSBlbmRpbmdXaXRoTnVtYmVyc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGVuZGluZ051bWJlcnMgPSBlbmRpbmdXaXRoTnVtYmVyc1syXTtcbiAgICAgICAgICAgIGlmIChlbmRpbmdOdW1iZXJzLmluY2x1ZGVzKFwiLlwiKSAmJiAhZW5kaW5nTnVtYmVycy5tYXRjaCgvXFxkKFxcLlxcZHsyfSkrJC8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbmRpbmdOdW1iZXJWYWwgPSBwYXJzZUludChlbmRpbmdOdW1iZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nTnVtYmVyVmFsID0gcGFyc2VJbnQoc3RhcnRpbmdOdW1iZXJzKTtcbiAgICAgICAgICAgIGlmIChlbmRpbmdOdW1iZXJWYWwgPiAyNCB8fCBzdGFydGluZ051bWJlclZhbCA+IDI0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0UHJpbWFyeVRpbWVQYXR0ZXJuVGhyb3VnaENhY2hlKCkge1xuICAgICAgICBjb25zdCBwcmltYXJ5UHJlZml4ID0gdGhpcy5wcmltYXJ5UHJlZml4KCk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlTdWZmaXggPSB0aGlzLnByaW1hcnlTdWZmaXgoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkUHJpbWFyeVByZWZpeCA9PT0gcHJpbWFyeVByZWZpeCAmJiB0aGlzLmNhY2hlZFByaW1hcnlTdWZmaXggPT09IHByaW1hcnlTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFByaW1hcnlUaW1lUGF0dGVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlZFByaW1hcnlUaW1lUGF0dGVybiA9IHByaW1hcnlUaW1lUGF0dGVybihwcmltYXJ5UHJlZml4LCBwcmltYXJ5U3VmZml4KTtcbiAgICAgICAgdGhpcy5jYWNoZWRQcmltYXJ5UHJlZml4ID0gcHJpbWFyeVByZWZpeDtcbiAgICAgICAgdGhpcy5jYWNoZWRQcmltYXJ5U3VmZml4ID0gcHJpbWFyeVN1ZmZpeDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUHJpbWFyeVRpbWVQYXR0ZXJuO1xuICAgIH1cbiAgICBnZXRGb2xsb3dpbmdUaW1lUGF0dGVyblRocm91Z2hDYWNoZSgpIHtcbiAgICAgICAgY29uc3QgZm9sbG93aW5nUGhhc2UgPSB0aGlzLmZvbGxvd2luZ1BoYXNlKCk7XG4gICAgICAgIGNvbnN0IGZvbGxvd2luZ1N1ZmZpeCA9IHRoaXMuZm9sbG93aW5nU3VmZml4KCk7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlZEZvbGxvd2luZ1BoYXNlID09PSBmb2xsb3dpbmdQaGFzZSAmJiB0aGlzLmNhY2hlZEZvbGxvd2luZ1N1ZmZpeCA9PT0gZm9sbG93aW5nU3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRGb2xsb3dpbmdUaW1lUGF0dGVuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVkRm9sbG93aW5nVGltZVBhdHRlbiA9IGZvbGxvd2luZ1RpbWVQYXR0ZW4oZm9sbG93aW5nUGhhc2UsIGZvbGxvd2luZ1N1ZmZpeCk7XG4gICAgICAgIHRoaXMuY2FjaGVkRm9sbG93aW5nUGhhc2UgPSBmb2xsb3dpbmdQaGFzZTtcbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdTdWZmaXggPSBmb2xsb3dpbmdTdWZmaXg7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEZvbGxvd2luZ1RpbWVQYXR0ZW47XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyID0gQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpO1xuY2xhc3MgRU5UaW1lRXhwcmVzc2lvblBhcnNlciBleHRlbmRzIEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMS5BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpY3RNb2RlKSB7XG4gICAgICAgIHN1cGVyKHN0cmljdE1vZGUpO1xuICAgIH1cbiAgICBmb2xsb3dpbmdQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxcXHMqKD86XFxcXC18XFxcXOKAk3xcXFxcfnxcXFxc44CcfHRvfFxcXFw/KVxcXFxzKlwiO1xuICAgIH1cbiAgICBwcmltYXJ5UHJlZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPzooPzphdHxmcm9tKVxcXFxzKik/P1wiO1xuICAgIH1cbiAgICBwcmltYXJ5U3VmZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPzpcXFxccyooPzpvXFxcXFcqY2xvY2t8YXRcXFxccypuaWdodHxpblxcXFxzKnRoZVxcXFxzKig/Om1vcm5pbmd8YWZ0ZXJub29uKSkpPyg/IS8pKD89XFxcXFd8JClcIjtcbiAgICB9XG4gICAgZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc3VwZXIuZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCk7XG4gICAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMF0uZW5kc1dpdGgoXCJuaWdodFwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBjb21wb25lbnRzLmdldChcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPj0gNiAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKSArIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaG91ciA8IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbMF0uZW5kc1dpdGgoXCJhZnRlcm5vb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBjb21wb25lbnRzLmdldChcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPj0gMCAmJiBob3VyIDw9IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKSArIDEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbMF0uZW5kc1dpdGgoXCJtb3JuaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3VyID0gY29tcG9uZW50cy5nZXQoXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOVGltZUV4cHJlc3Npb25QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYWRkSW1wbGllZFRpbWVVbml0cyA9IGV4cG9ydHMucmV2ZXJzZVRpbWVVbml0cyA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJldmVyc2VUaW1lVW5pdHModGltZVVuaXRzKSB7XG4gICAgY29uc3QgcmV2ZXJzZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aW1lVW5pdHMpIHtcbiAgICAgICAgcmV2ZXJzZWRba2V5XSA9IC10aW1lVW5pdHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJldmVyc2VkO1xufVxuZXhwb3J0cy5yZXZlcnNlVGltZVVuaXRzID0gcmV2ZXJzZVRpbWVVbml0cztcbmZ1bmN0aW9uIGFkZEltcGxpZWRUaW1lVW5pdHMoY29tcG9uZW50cywgdGltZVVuaXRzKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gY29tcG9uZW50cy5jbG9uZSgpO1xuICAgIGxldCBkYXRlID0gY29tcG9uZW50cy5kYXlqcygpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRpbWVVbml0cykge1xuICAgICAgICBkYXRlID0gZGF0ZS5hZGQodGltZVVuaXRzW2tleV0sIGtleSk7XG4gICAgfVxuICAgIGlmIChcImRheVwiIGluIHRpbWVVbml0cyB8fCBcImRcIiBpbiB0aW1lVW5pdHMgfHwgXCJ3ZWVrXCIgaW4gdGltZVVuaXRzIHx8IFwibW9udGhcIiBpbiB0aW1lVW5pdHMgfHwgXCJ5ZWFyXCIgaW4gdGltZVVuaXRzKSB7XG4gICAgICAgIG91dHB1dC5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSk7XG4gICAgICAgIG91dHB1dC5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICBvdXRwdXQuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICB9XG4gICAgaWYgKFwic2Vjb25kXCIgaW4gdGltZVVuaXRzIHx8IFwibWludXRlXCIgaW4gdGltZVVuaXRzIHx8IFwiaG91clwiIGluIHRpbWVVbml0cykge1xuICAgICAgICBvdXRwdXQuaW1wbHkoXCJzZWNvbmRcIiwgZGF0ZS5zZWNvbmQoKSk7XG4gICAgICAgIG91dHB1dC5pbXBseShcIm1pbnV0ZVwiLCBkYXRlLm1pbnV0ZSgpKTtcbiAgICAgICAgb3V0cHV0LmltcGx5KFwiaG91clwiLCBkYXRlLmhvdXIoKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5leHBvcnRzLmFkZEltcGxpZWRUaW1lVW5pdHMgPSBhZGRJbXBsaWVkVGltZVVuaXRzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHRpbWV1bml0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3RpbWV1bml0c1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiXCIgKyBcIihcIiArIGNvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTiArIFwiKVwiICsgXCIoPzphZ298YmVmb3JlfGVhcmxpZXIpKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNvbnN0IFNUUklDVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIlwiICsgXCIoXCIgKyBjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk4gKyBcIilcIiArIFwiYWdvKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNsYXNzIEVOVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmljdE1vZGUgPyBTVFJJQ1RfUEFUVEVSTiA6IFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IG91dHB1dFRpbWVVbml0cyA9IHRpbWV1bml0c18xLnJldmVyc2VUaW1lVW5pdHModGltZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgb3V0cHV0VGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiXCIgKyBcIihcIiArIGNvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTiArIFwiKVwiICsgXCIobGF0ZXJ8YWZ0ZXJ8ZnJvbSBub3d8aGVuY2Vmb3J0aHxmb3J3YXJkfG91dClcIiArIFwiKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNvbnN0IFNUUklDVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIlwiICsgXCIoXCIgKyBjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk4gKyBcIilcIiArIFwiKGxhdGVyfGZyb20gbm93KVwiICsgXCIoPz0oPzpcXFxcV3wkKSlcIiwgXCJpXCIpO1xuY29uc3QgR1JPVVBfTlVNX1RJTUVVTklUUyA9IDE7XG5jbGFzcyBFTlRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmljdE1vZGUgPyBTVFJJQ1RfUEFUVEVSTiA6IFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBmcmFnbWVudHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFtHUk9VUF9OVU1fVElNRVVOSVRTXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMuY3JlYXRlUmVsYXRpdmVGcm9tUmVmRGF0ZShjb250ZXh0LnJlZkRhdGUsIGZyYWdtZW50cyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lcmdpbmdSZWZpbmVyID0gZXhwb3J0cy5GaWx0ZXIgPSB2b2lkIDA7XG5jbGFzcyBGaWx0ZXIge1xuICAgIHJlZmluZShjb250ZXh0LCByZXN1bHRzKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigocikgPT4gdGhpcy5pc1ZhbGlkKGNvbnRleHQsIHIpKTtcbiAgICB9XG59XG5leHBvcnRzLkZpbHRlciA9IEZpbHRlcjtcbmNsYXNzIE1lcmdpbmdSZWZpbmVyIHtcbiAgICByZWZpbmUoY29udGV4dCwgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXJnZWRSZXN1bHRzID0gW107XG4gICAgICAgIGxldCBjdXJSZXN1bHQgPSByZXN1bHRzWzBdO1xuICAgICAgICBsZXQgbmV4dFJlc3VsdCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV4dFJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICBjb25zdCB0ZXh0QmV0d2VlbiA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcoY3VyUmVzdWx0LmluZGV4ICsgY3VyUmVzdWx0LnRleHQubGVuZ3RoLCBuZXh0UmVzdWx0LmluZGV4KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRNZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1clJlc3VsdCwgbmV4dFJlc3VsdCwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRSZXN1bHRzLnB1c2goY3VyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBjdXJSZXN1bHQgPSBuZXh0UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IGN1clJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IG5leHRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkUmVzdWx0ID0gdGhpcy5tZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGxlZnQsIHJpZ2h0LCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtZXJnZWQgJHtsZWZ0fSBhbmQgJHtyaWdodH0gaW50byAke21lcmdlZFJlc3VsdH1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdXJSZXN1bHQgPSBtZXJnZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1clJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtZXJnZWRSZXN1bHRzLnB1c2goY3VyUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0cztcbiAgICB9XG59XG5leHBvcnRzLk1lcmdpbmdSZWZpbmVyID0gTWVyZ2luZ1JlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFic3RyYWN0UmVmaW5lcnNfMSA9IHJlcXVpcmUoXCIuLi9hYnN0cmFjdFJlZmluZXJzXCIpO1xuY2xhc3MgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXIgZXh0ZW5kcyBhYnN0cmFjdFJlZmluZXJzXzEuTWVyZ2luZ1JlZmluZXIge1xuICAgIHNob3VsZE1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VycmVudFJlc3VsdCwgbmV4dFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gIWN1cnJlbnRSZXN1bHQuZW5kICYmICFuZXh0UmVzdWx0LmVuZCAmJiB0ZXh0QmV0d2Vlbi5tYXRjaCh0aGlzLnBhdHRlcm5CZXR3ZWVuKCkpICE9IG51bGw7XG4gICAgfVxuICAgIG1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgZnJvbVJlc3VsdCwgdG9SZXN1bHQpIHtcbiAgICAgICAgaWYgKCFmcm9tUmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSAmJiAhdG9SZXN1bHQuc3RhcnQuaXNPbmx5V2Vla2RheUNvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICB0b1Jlc3VsdC5zdGFydC5nZXRDZXJ0YWluQ29tcG9uZW50cygpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZnJvbVJlc3VsdC5zdGFydC5pc0NlcnRhaW4oa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tUmVzdWx0LnN0YXJ0LmFzc2lnbihrZXksIHRvUmVzdWx0LnN0YXJ0LmdldChrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZyb21SZXN1bHQuc3RhcnQuZ2V0Q2VydGFpbkNvbXBvbmVudHMoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRvUmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvUmVzdWx0LnN0YXJ0LmFzc2lnbihrZXksIGZyb21SZXN1bHQuc3RhcnQuZ2V0KGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tUmVzdWx0LnN0YXJ0LmRhdGUoKS5nZXRUaW1lKCkgPiB0b1Jlc3VsdC5zdGFydC5kYXRlKCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBsZXQgZnJvbU1vbWVudCA9IGZyb21SZXN1bHQuc3RhcnQuZGF5anMoKTtcbiAgICAgICAgICAgIGxldCB0b01vbWVudCA9IHRvUmVzdWx0LnN0YXJ0LmRheWpzKCk7XG4gICAgICAgICAgICBpZiAoZnJvbVJlc3VsdC5zdGFydC5pc09ubHlXZWVrZGF5Q29tcG9uZW50KCkgJiYgZnJvbU1vbWVudC5hZGQoLTcsIFwiZGF5c1wiKS5pc0JlZm9yZSh0b01vbWVudCkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTW9tZW50ID0gZnJvbU1vbWVudC5hZGQoLTcsIFwiZGF5c1wiKTtcbiAgICAgICAgICAgICAgICBmcm9tUmVzdWx0LnN0YXJ0LmltcGx5KFwiZGF5XCIsIGZyb21Nb21lbnQuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBmcm9tUmVzdWx0LnN0YXJ0LmltcGx5KFwibW9udGhcIiwgZnJvbU1vbWVudC5tb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgZnJvbVJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgZnJvbU1vbWVudC55ZWFyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9SZXN1bHQuc3RhcnQuaXNPbmx5V2Vla2RheUNvbXBvbmVudCgpICYmIHRvTW9tZW50LmFkZCg3LCBcImRheXNcIikuaXNBZnRlcihmcm9tTW9tZW50KSkge1xuICAgICAgICAgICAgICAgIHRvTW9tZW50ID0gdG9Nb21lbnQuYWRkKDcsIFwiZGF5c1wiKTtcbiAgICAgICAgICAgICAgICB0b1Jlc3VsdC5zdGFydC5pbXBseShcImRheVwiLCB0b01vbWVudC5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIHRvUmVzdWx0LnN0YXJ0LmltcGx5KFwibW9udGhcIiwgdG9Nb21lbnQubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgIHRvUmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCB0b01vbWVudC55ZWFyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgW3RvUmVzdWx0LCBmcm9tUmVzdWx0XSA9IFtmcm9tUmVzdWx0LCB0b1Jlc3VsdF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZnJvbVJlc3VsdC5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuc3RhcnQgPSBmcm9tUmVzdWx0LnN0YXJ0O1xuICAgICAgICByZXN1bHQuZW5kID0gdG9SZXN1bHQuc3RhcnQ7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IE1hdGgubWluKGZyb21SZXN1bHQuaW5kZXgsIHRvUmVzdWx0LmluZGV4KTtcbiAgICAgICAgaWYgKGZyb21SZXN1bHQuaW5kZXggPCB0b1Jlc3VsdC5pbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0LnRleHQgPSBmcm9tUmVzdWx0LnRleHQgKyB0ZXh0QmV0d2VlbiArIHRvUmVzdWx0LnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQudGV4dCA9IHRvUmVzdWx0LnRleHQgKyB0ZXh0QmV0d2VlbiArIGZyb21SZXN1bHQudGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY2xhc3MgRU5NZXJnZURhdGVSYW5nZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gL15cXHMqKHRvfC0pXFxzKiQvaTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTk1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tZXJnZURhdGVUaW1lQ29tcG9uZW50ID0gZXhwb3J0cy5tZXJnZURhdGVUaW1lUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcbmZ1bmN0aW9uIG1lcmdlRGF0ZVRpbWVSZXN1bHQoZGF0ZVJlc3VsdCwgdGltZVJlc3VsdCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGRhdGVSZXN1bHQuY2xvbmUoKTtcbiAgICBjb25zdCBiZWdpbkRhdGUgPSBkYXRlUmVzdWx0LnN0YXJ0O1xuICAgIGNvbnN0IGJlZ2luVGltZSA9IHRpbWVSZXN1bHQuc3RhcnQ7XG4gICAgcmVzdWx0LnN0YXJ0ID0gbWVyZ2VEYXRlVGltZUNvbXBvbmVudChiZWdpbkRhdGUsIGJlZ2luVGltZSk7XG4gICAgaWYgKGRhdGVSZXN1bHQuZW5kICE9IG51bGwgfHwgdGltZVJlc3VsdC5lbmQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlbmREYXRlID0gZGF0ZVJlc3VsdC5lbmQgPT0gbnVsbCA/IGRhdGVSZXN1bHQuc3RhcnQgOiBkYXRlUmVzdWx0LmVuZDtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHRpbWVSZXN1bHQuZW5kID09IG51bGwgPyB0aW1lUmVzdWx0LnN0YXJ0IDogdGltZVJlc3VsdC5lbmQ7XG4gICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gbWVyZ2VEYXRlVGltZUNvbXBvbmVudChlbmREYXRlLCBlbmRUaW1lKTtcbiAgICAgICAgaWYgKGRhdGVSZXN1bHQuZW5kID09IG51bGwgJiYgZW5kRGF0ZVRpbWUuZGF0ZSgpLmdldFRpbWUoKSA8IHJlc3VsdC5zdGFydC5kYXRlKCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBpZiAoZW5kRGF0ZVRpbWUuaXNDZXJ0YWluKFwiZGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWUuYXNzaWduKFwiZGF5XCIsIGVuZERhdGVUaW1lLmdldChcImRheVwiKSArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWUuaW1wbHkoXCJkYXlcIiwgZW5kRGF0ZVRpbWUuZ2V0KFwiZGF5XCIpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LmVuZCA9IGVuZERhdGVUaW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5tZXJnZURhdGVUaW1lUmVzdWx0ID0gbWVyZ2VEYXRlVGltZVJlc3VsdDtcbmZ1bmN0aW9uIG1lcmdlRGF0ZVRpbWVDb21wb25lbnQoZGF0ZUNvbXBvbmVudCwgdGltZUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGRhdGVUaW1lQ29tcG9uZW50ID0gZGF0ZUNvbXBvbmVudC5jbG9uZSgpO1xuICAgIGlmICh0aW1lQ29tcG9uZW50LmlzQ2VydGFpbihcImhvdXJcIikpIHtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwiaG91clwiLCB0aW1lQ29tcG9uZW50LmdldChcImhvdXJcIikpO1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5hc3NpZ24oXCJtaW51dGVcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJtaW51dGVcIikpO1xuICAgICAgICBpZiAodGltZUNvbXBvbmVudC5pc0NlcnRhaW4oXCJzZWNvbmRcIikpIHtcbiAgICAgICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmFzc2lnbihcInNlY29uZFwiLCB0aW1lQ29tcG9uZW50LmdldChcInNlY29uZFwiKSk7XG4gICAgICAgICAgICBpZiAodGltZUNvbXBvbmVudC5pc0NlcnRhaW4oXCJtaWxsaXNlY29uZFwiKSkge1xuICAgICAgICAgICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmFzc2lnbihcIm1pbGxpc2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWlsbGlzZWNvbmRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJtaWxsaXNlY29uZFwiLCB0aW1lQ29tcG9uZW50LmdldChcIm1pbGxpc2Vjb25kXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwic2Vjb25kXCIpKTtcbiAgICAgICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwibWlsbGlzZWNvbmRcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJtaWxsaXNlY29uZFwiKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwiaG91clwiLCB0aW1lQ29tcG9uZW50LmdldChcImhvdXJcIikpO1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCB0aW1lQ29tcG9uZW50LmdldChcIm1pbnV0ZVwiKSk7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwic2Vjb25kXCIpKTtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJtaWxsaXNlY29uZFwiLCB0aW1lQ29tcG9uZW50LmdldChcIm1pbGxpc2Vjb25kXCIpKTtcbiAgICB9XG4gICAgaWYgKHRpbWVDb21wb25lbnQuaXNDZXJ0YWluKFwidGltZXpvbmVPZmZzZXRcIikpIHtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwidGltZXpvbmVPZmZzZXRcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJ0aW1lem9uZU9mZnNldFwiKSk7XG4gICAgfVxuICAgIGlmICh0aW1lQ29tcG9uZW50LmlzQ2VydGFpbihcIm1lcmlkaWVtXCIpKSB7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmFzc2lnbihcIm1lcmlkaWVtXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWVyaWRpZW1cIikpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aW1lQ29tcG9uZW50LmdldChcIm1lcmlkaWVtXCIpICE9IG51bGwgJiYgZGF0ZVRpbWVDb21wb25lbnQuZ2V0KFwibWVyaWRpZW1cIikgPT0gbnVsbCkge1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWVyaWRpZW1cIikpO1xuICAgIH1cbiAgICBpZiAoZGF0ZVRpbWVDb21wb25lbnQuZ2V0KFwibWVyaWRpZW1cIikgPT0gaW5kZXhfMS5NZXJpZGllbS5QTSAmJiBkYXRlVGltZUNvbXBvbmVudC5nZXQoXCJob3VyXCIpIDwgMTIpIHtcbiAgICAgICAgaWYgKHRpbWVDb21wb25lbnQuaXNDZXJ0YWluKFwiaG91clwiKSkge1xuICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwiaG91clwiLCBkYXRlVGltZUNvbXBvbmVudC5nZXQoXCJob3VyXCIpICsgMTIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIGRhdGVUaW1lQ29tcG9uZW50LmdldChcImhvdXJcIikgKyAxMik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGVUaW1lQ29tcG9uZW50O1xufVxuZXhwb3J0cy5tZXJnZURhdGVUaW1lQ29tcG9uZW50ID0gbWVyZ2VEYXRlVGltZUNvbXBvbmVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYWJzdHJhY3RSZWZpbmVyc18xID0gcmVxdWlyZShcIi4uL2Fic3RyYWN0UmVmaW5lcnNcIik7XG5jb25zdCBtZXJnaW5nQ2FsY3VsYXRpb25fMSA9IHJlcXVpcmUoXCIuLi8uLi9jYWxjdWxhdGlvbi9tZXJnaW5nQ2FsY3VsYXRpb25cIik7XG5jbGFzcyBFTk1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgYWJzdHJhY3RSZWZpbmVyc18xLk1lcmdpbmdSZWZpbmVyIHtcbiAgICBzaG91bGRNZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuICgoKGN1cnJlbnRSZXN1bHQuc3RhcnQuaXNPbmx5RGF0ZSgpICYmIG5leHRSZXN1bHQuc3RhcnQuaXNPbmx5VGltZSgpKSB8fFxuICAgICAgICAgICAgKG5leHRSZXN1bHQuc3RhcnQuaXNPbmx5RGF0ZSgpICYmIGN1cnJlbnRSZXN1bHQuc3RhcnQuaXNPbmx5VGltZSgpKSkgJiZcbiAgICAgICAgICAgIHRleHRCZXR3ZWVuLm1hdGNoKHRoaXMucGF0dGVybkJldHdlZW4oKSkgIT0gbnVsbCk7XG4gICAgfVxuICAgIG1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VycmVudFJlc3VsdCwgbmV4dFJlc3VsdCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50UmVzdWx0LnN0YXJ0LmlzT25seURhdGUoKVxuICAgICAgICAgICAgPyBtZXJnaW5nQ2FsY3VsYXRpb25fMS5tZXJnZURhdGVUaW1lUmVzdWx0KGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpXG4gICAgICAgICAgICA6IG1lcmdpbmdDYWxjdWxhdGlvbl8xLm1lcmdlRGF0ZVRpbWVSZXN1bHQobmV4dFJlc3VsdCwgY3VycmVudFJlc3VsdCk7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IGN1cnJlbnRSZXN1bHQuaW5kZXg7XG4gICAgICAgIHJlc3VsdC50ZXh0ID0gY3VycmVudFJlc3VsdC50ZXh0ICsgdGV4dEJldHdlZW4gKyBuZXh0UmVzdWx0LnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5NZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jbGFzcyBFTk1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl5cXFxccyooVHxhdHxhZnRlcnxiZWZvcmV8b258b2Z8LHwtKT9cXFxccyokXCIpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOTWVyZ2VEYXRlVGltZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IFRJTUVaT05FX05BTUVfUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCJeXFxcXHMqXFxcXCg/KFtBLVpdezIsNH0pXFxcXCk/KD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgREVGQVVMVF9USU1FWk9ORV9BQkJSX01BUCA9IHtcbiAgICBBQ0RUOiA2MzAsXG4gICAgQUNTVDogNTcwLFxuICAgIEFEVDogLTE4MCxcbiAgICBBRURUOiA2NjAsXG4gICAgQUVTVDogNjAwLFxuICAgIEFGVDogMjcwLFxuICAgIEFLRFQ6IC00ODAsXG4gICAgQUtTVDogLTU0MCxcbiAgICBBTE1UOiAzNjAsXG4gICAgQU1TVDogLTE4MCxcbiAgICBBTVQ6IC0yNDAsXG4gICAgQU5BU1Q6IDcyMCxcbiAgICBBTkFUOiA3MjAsXG4gICAgQVFUVDogMzAwLFxuICAgIEFSVDogLTE4MCxcbiAgICBBU1Q6IC0yNDAsXG4gICAgQVdEVDogNTQwLFxuICAgIEFXU1Q6IDQ4MCxcbiAgICBBWk9TVDogMCxcbiAgICBBWk9UOiAtNjAsXG4gICAgQVpTVDogMzAwLFxuICAgIEFaVDogMjQwLFxuICAgIEJOVDogNDgwLFxuICAgIEJPVDogLTI0MCxcbiAgICBCUlNUOiAtMTIwLFxuICAgIEJSVDogLTE4MCxcbiAgICBCU1Q6IDYwLFxuICAgIEJUVDogMzYwLFxuICAgIENBU1Q6IDQ4MCxcbiAgICBDQVQ6IDEyMCxcbiAgICBDQ1Q6IDM5MCxcbiAgICBDRFQ6IC0zMDAsXG4gICAgQ0VTVDogMTIwLFxuICAgIENFVDogNjAsXG4gICAgQ0hBRFQ6IDgyNSxcbiAgICBDSEFTVDogNzY1LFxuICAgIENLVDogLTYwMCxcbiAgICBDTFNUOiAtMTgwLFxuICAgIENMVDogLTI0MCxcbiAgICBDT1Q6IC0zMDAsXG4gICAgQ1NUOiAtMzYwLFxuICAgIENWVDogLTYwLFxuICAgIENYVDogNDIwLFxuICAgIENoU1Q6IDYwMCxcbiAgICBEQVZUOiA0MjAsXG4gICAgRUFTU1Q6IC0zMDAsXG4gICAgRUFTVDogLTM2MCxcbiAgICBFQVQ6IDE4MCxcbiAgICBFQ1Q6IC0zMDAsXG4gICAgRURUOiAtMjQwLFxuICAgIEVFU1Q6IDE4MCxcbiAgICBFRVQ6IDEyMCxcbiAgICBFR1NUOiAwLFxuICAgIEVHVDogLTYwLFxuICAgIEVTVDogLTMwMCxcbiAgICBFVDogLTMwMCxcbiAgICBGSlNUOiA3ODAsXG4gICAgRkpUOiA3MjAsXG4gICAgRktTVDogLTE4MCxcbiAgICBGS1Q6IC0yNDAsXG4gICAgRk5UOiAtMTIwLFxuICAgIEdBTFQ6IC0zNjAsXG4gICAgR0FNVDogLTU0MCxcbiAgICBHRVQ6IDI0MCxcbiAgICBHRlQ6IC0xODAsXG4gICAgR0lMVDogNzIwLFxuICAgIEdNVDogMCxcbiAgICBHU1Q6IDI0MCxcbiAgICBHWVQ6IC0yNDAsXG4gICAgSEFBOiAtMTgwLFxuICAgIEhBQzogLTMwMCxcbiAgICBIQURUOiAtNTQwLFxuICAgIEhBRTogLTI0MCxcbiAgICBIQVA6IC00MjAsXG4gICAgSEFSOiAtMzYwLFxuICAgIEhBU1Q6IC02MDAsXG4gICAgSEFUOiAtOTAsXG4gICAgSEFZOiAtNDgwLFxuICAgIEhLVDogNDgwLFxuICAgIEhMVjogLTIxMCxcbiAgICBITkE6IC0yNDAsXG4gICAgSE5DOiAtMzYwLFxuICAgIEhORTogLTMwMCxcbiAgICBITlA6IC00ODAsXG4gICAgSE5SOiAtNDIwLFxuICAgIEhOVDogLTE1MCxcbiAgICBITlk6IC01NDAsXG4gICAgSE9WVDogNDIwLFxuICAgIElDVDogNDIwLFxuICAgIElEVDogMTgwLFxuICAgIElPVDogMzYwLFxuICAgIElSRFQ6IDI3MCxcbiAgICBJUktTVDogNTQwLFxuICAgIElSS1Q6IDU0MCxcbiAgICBJUlNUOiAyMTAsXG4gICAgSVNUOiAzMzAsXG4gICAgSlNUOiA1NDAsXG4gICAgS0dUOiAzNjAsXG4gICAgS1JBU1Q6IDQ4MCxcbiAgICBLUkFUOiA0ODAsXG4gICAgS1NUOiA1NDAsXG4gICAgS1VZVDogMjQwLFxuICAgIExIRFQ6IDY2MCxcbiAgICBMSFNUOiA2MzAsXG4gICAgTElOVDogODQwLFxuICAgIE1BR1NUOiA3MjAsXG4gICAgTUFHVDogNzIwLFxuICAgIE1BUlQ6IC01MTAsXG4gICAgTUFXVDogMzAwLFxuICAgIE1EVDogLTM2MCxcbiAgICBNRVNaOiAxMjAsXG4gICAgTUVaOiA2MCxcbiAgICBNSFQ6IDcyMCxcbiAgICBNTVQ6IDM5MCxcbiAgICBNU0Q6IDI0MCxcbiAgICBNU0s6IDI0MCxcbiAgICBNU1Q6IC00MjAsXG4gICAgTVVUOiAyNDAsXG4gICAgTVZUOiAzMDAsXG4gICAgTVlUOiA0ODAsXG4gICAgTkNUOiA2NjAsXG4gICAgTkRUOiAtOTAsXG4gICAgTkZUOiA2OTAsXG4gICAgTk9WU1Q6IDQyMCxcbiAgICBOT1ZUOiAzNjAsXG4gICAgTlBUOiAzNDUsXG4gICAgTlNUOiAtMTUwLFxuICAgIE5VVDogLTY2MCxcbiAgICBOWkRUOiA3ODAsXG4gICAgTlpTVDogNzIwLFxuICAgIE9NU1NUOiA0MjAsXG4gICAgT01TVDogNDIwLFxuICAgIFBEVDogLTQyMCxcbiAgICBQRVQ6IC0zMDAsXG4gICAgUEVUU1Q6IDcyMCxcbiAgICBQRVRUOiA3MjAsXG4gICAgUEdUOiA2MDAsXG4gICAgUEhPVDogNzgwLFxuICAgIFBIVDogNDgwLFxuICAgIFBLVDogMzAwLFxuICAgIFBNRFQ6IC0xMjAsXG4gICAgUE1TVDogLTE4MCxcbiAgICBQT05UOiA2NjAsXG4gICAgUFNUOiAtNDgwLFxuICAgIFBUOiAtNDgwLFxuICAgIFBXVDogNTQwLFxuICAgIFBZU1Q6IC0xODAsXG4gICAgUFlUOiAtMjQwLFxuICAgIFJFVDogMjQwLFxuICAgIFNBTVQ6IDI0MCxcbiAgICBTQVNUOiAxMjAsXG4gICAgU0JUOiA2NjAsXG4gICAgU0NUOiAyNDAsXG4gICAgU0dUOiA0ODAsXG4gICAgU1JUOiAtMTgwLFxuICAgIFNTVDogLTY2MCxcbiAgICBUQUhUOiAtNjAwLFxuICAgIFRGVDogMzAwLFxuICAgIFRKVDogMzAwLFxuICAgIFRLVDogNzgwLFxuICAgIFRMVDogNTQwLFxuICAgIFRNVDogMzAwLFxuICAgIFRWVDogNzIwLFxuICAgIFVMQVQ6IDQ4MCxcbiAgICBVVEM6IDAsXG4gICAgVVlTVDogLTEyMCxcbiAgICBVWVQ6IC0xODAsXG4gICAgVVpUOiAzMDAsXG4gICAgVkVUOiAtMjEwLFxuICAgIFZMQVNUOiA2NjAsXG4gICAgVkxBVDogNjYwLFxuICAgIFZVVDogNjYwLFxuICAgIFdBU1Q6IDEyMCxcbiAgICBXQVQ6IDYwLFxuICAgIFdFU1Q6IDYwLFxuICAgIFdFU1o6IDYwLFxuICAgIFdFVDogMCxcbiAgICBXRVo6IDAsXG4gICAgV0ZUOiA3MjAsXG4gICAgV0dTVDogLTEyMCxcbiAgICBXR1Q6IC0xODAsXG4gICAgV0lCOiA0MjAsXG4gICAgV0lUOiA1NDAsXG4gICAgV0lUQTogNDgwLFxuICAgIFdTVDogNzgwLFxuICAgIFdUOiAwLFxuICAgIFlBS1NUOiA2MDAsXG4gICAgWUFLVDogNjAwLFxuICAgIFlBUFQ6IDYwMCxcbiAgICBZRUtTVDogMzYwLFxuICAgIFlFS1Q6IDM2MCxcbn07XG5jbGFzcyBFeHRyYWN0VGltZXpvbmVBYmJyUmVmaW5lciB7XG4gICAgY29uc3RydWN0b3IodGltZXpvbmVPdmVycmlkZXMpIHtcbiAgICAgICAgdGhpcy50aW1lem9uZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9USU1FWk9ORV9BQkJSX01BUCksIHRpbWV6b25lT3ZlcnJpZGVzKTtcbiAgICB9XG4gICAgcmVmaW5lKGNvbnRleHQsIHJlc3VsdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB0aW1lem9uZU92ZXJyaWRlcyA9IChfYSA9IGNvbnRleHQub3B0aW9uLnRpbWV6b25lcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gY29udGV4dC50ZXh0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXggKyByZXN1bHQudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBUSU1FWk9ORV9OQU1FX1BBVFRFUk4uZXhlYyhzdWZmaXgpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpbWV6b25lQWJiciA9IG1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRUaW1lem9uZU9mZnNldCA9IChfYiA9IChfYSA9IHRpbWV6b25lT3ZlcnJpZGVzW3RpbWV6b25lQWJicl0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMudGltZXpvbmVbdGltZXpvbmVBYmJyXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRUaW1lem9uZU9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeHRyYWN0aW5nIHRpbWV6b25lOiAnJHt0aW1lem9uZUFiYnJ9JyBpbnRvIDogJHtleHRyYWN0ZWRUaW1lem9uZU9mZnNldH1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRpbWV6b25lT2Zmc2V0ID0gcmVzdWx0LnN0YXJ0LmdldChcInRpbWV6b25lT2Zmc2V0XCIpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lem9uZU9mZnNldCAhPT0gbnVsbCAmJiBleHRyYWN0ZWRUaW1lem9uZU9mZnNldCAhPSBjdXJyZW50VGltZXpvbmVPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQudGV4dCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcInRpbWV6b25lT2Zmc2V0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIGV4dHJhY3RlZFRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kICE9IG51bGwgJiYgIXJlc3VsdC5lbmQuaXNDZXJ0YWluKFwidGltZXpvbmVPZmZzZXRcIikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIGV4dHJhY3RlZFRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEV4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBUSU1FWk9ORV9PRkZTRVRfUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCJeXFxcXHMqKD86KD86R01UfFVUQylcXFxccz8pPyhbKy1dKShcXFxcZHsxLDJ9KSg/Ojo/KFxcXFxkezJ9KSk/XCIsIFwiaVwiKTtcbmNvbnN0IFRJTUVaT05FX09GRlNFVF9TSUdOX0dST1VQID0gMTtcbmNvbnN0IFRJTUVaT05FX09GRlNFVF9IT1VSX09GRlNFVF9HUk9VUCA9IDI7XG5jb25zdCBUSU1FWk9ORV9PRkZTRVRfTUlOVVRFX09GRlNFVF9HUk9VUCA9IDM7XG5jbGFzcyBFeHRyYWN0VGltZXpvbmVPZmZzZXRSZWZpbmVyIHtcbiAgICByZWZpbmUoY29udGV4dCwgcmVzdWx0cykge1xuICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5pc0NlcnRhaW4oXCJ0aW1lem9uZU9mZnNldFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcocmVzdWx0LmluZGV4ICsgcmVzdWx0LnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gVElNRVpPTkVfT0ZGU0VUX1BBVFRFUk4uZXhlYyhzdWZmaXgpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeHRyYWN0aW5nIHRpbWV6b25lOiAnJHttYXRjaFswXX0nIGludG8gOiAke3Jlc3VsdH1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaG91ck9mZnNldCA9IHBhcnNlSW50KG1hdGNoW1RJTUVaT05FX09GRlNFVF9IT1VSX09GRlNFVF9HUk9VUF0pO1xuICAgICAgICAgICAgY29uc3QgbWludXRlT2Zmc2V0ID0gcGFyc2VJbnQobWF0Y2hbVElNRVpPTkVfT0ZGU0VUX01JTlVURV9PRkZTRVRfR1JPVVBdIHx8IFwiMFwiKTtcbiAgICAgICAgICAgIGxldCB0aW1lem9uZU9mZnNldCA9IGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldDtcbiAgICAgICAgICAgIGlmIChtYXRjaFtUSU1FWk9ORV9PRkZTRVRfU0lHTl9HUk9VUF0gPT09IFwiLVwiKSB7XG4gICAgICAgICAgICAgICAgdGltZXpvbmVPZmZzZXQgPSAtdGltZXpvbmVPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVuZC5hc3NpZ24oXCJ0aW1lem9uZU9mZnNldFwiLCB0aW1lem9uZU9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwidGltZXpvbmVPZmZzZXRcIiwgdGltZXpvbmVPZmZzZXQpO1xuICAgICAgICAgICAgcmVzdWx0LnRleHQgKz0gbWF0Y2hbMF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFeHRyYWN0VGltZXpvbmVPZmZzZXRSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jbGFzcyBPdmVybGFwUmVtb3ZhbFJlZmluZXIge1xuICAgIHJlZmluZShjb250ZXh0LCByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUmVzdWx0cyA9IFtdO1xuICAgICAgICBsZXQgcHJldlJlc3VsdCA9IHJlc3VsdHNbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaW5kZXggPCBwcmV2UmVzdWx0LmluZGV4ICsgcHJldlJlc3VsdC50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudGV4dC5sZW5ndGggPiBwcmV2UmVzdWx0LnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRSZXN1bHRzLnB1c2gocHJldlJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcHJldlJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldlJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFJlc3VsdHMucHVzaChwcmV2UmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRSZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE92ZXJsYXBSZW1vdmFsUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY2xhc3MgRm9yd2FyZERhdGVSZWZpbmVyIHtcbiAgICByZWZpbmUoY29udGV4dCwgcmVzdWx0cykge1xuICAgICAgICBpZiAoIWNvbnRleHQub3B0aW9uLmZvcndhcmREYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgbGV0IHJlZk1vbWVudCA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5pc09ubHlEYXlNb250aENvbXBvbmVudCgpICYmIHJlZk1vbWVudC5pc0FmdGVyKHJlc3VsdC5zdGFydC5kYXlqcygpKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMyAmJiByZWZNb21lbnQuaXNBZnRlcihyZXN1bHQuc3RhcnQuZGF5anMoKSk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJ5ZWFyXCIsIHJlc3VsdC5zdGFydC5nZXQoXCJ5ZWFyXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZvcndhcmQgeWVhcmx5IGFkanVzdGVkIGZvciAke3Jlc3VsdH0gKCR7cmVzdWx0LnN0YXJ0fSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kICYmICFyZXN1bHQuZW5kLmlzQ2VydGFpbihcInllYXJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5lbmQuaW1wbHkoXCJ5ZWFyXCIsIHJlc3VsdC5lbmQuZ2V0KFwieWVhclwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZvcndhcmQgeWVhcmx5IGFkanVzdGVkIGZvciAke3Jlc3VsdH0gKCR7cmVzdWx0LmVuZH0pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhcnQuaXNPbmx5V2Vla2RheUNvbXBvbmVudCgpICYmIHJlZk1vbWVudC5pc0FmdGVyKHJlc3VsdC5zdGFydC5kYXlqcygpKSkge1xuICAgICAgICAgICAgICAgIGlmIChyZWZNb21lbnQuZGF5KCkgPiByZXN1bHQuc3RhcnQuZ2V0KFwid2Vla2RheVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZWZNb21lbnQgPSByZWZNb21lbnQuZGF5KHJlc3VsdC5zdGFydC5nZXQoXCJ3ZWVrZGF5XCIpICsgNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZNb21lbnQgPSByZWZNb21lbnQuZGF5KHJlc3VsdC5zdGFydC5nZXQoXCJ3ZWVrZGF5XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwiZGF5XCIsIHJlZk1vbWVudC5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcIm1vbnRoXCIsIHJlZk1vbWVudC5tb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCByZWZNb21lbnQueWVhcigpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZvcndhcmQgd2Vla2x5IGFkanVzdGVkIGZvciAke3Jlc3VsdH0gKCR7cmVzdWx0LnN0YXJ0fSlgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVuZCAmJiByZXN1bHQuZW5kLmlzT25seVdlZWtkYXlDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmTW9tZW50LmRheSgpID4gcmVzdWx0LmVuZC5nZXQoXCJ3ZWVrZGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZNb21lbnQgPSByZWZNb21lbnQuZGF5KHJlc3VsdC5lbmQuZ2V0KFwid2Vla2RheVwiKSArIDcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmTW9tZW50ID0gcmVmTW9tZW50LmRheShyZXN1bHQuZW5kLmdldChcIndlZWtkYXlcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5lbmQuaW1wbHkoXCJkYXlcIiwgcmVmTW9tZW50LmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5lbmQuaW1wbHkoXCJtb250aFwiLCByZWZNb21lbnQubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmltcGx5KFwieWVhclwiLCByZWZNb21lbnQueWVhcigpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRm9yd2FyZCB3ZWVrbHkgYWRqdXN0ZWQgZm9yICR7cmVzdWx0fSAoJHtyZXN1bHQuZW5kfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRm9yd2FyZERhdGVSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhYnN0cmFjdFJlZmluZXJzXzEgPSByZXF1aXJlKFwiLi4vYWJzdHJhY3RSZWZpbmVyc1wiKTtcbmNsYXNzIFVubGlrZWx5Rm9ybWF0RmlsdGVyIGV4dGVuZHMgYWJzdHJhY3RSZWZpbmVyc18xLkZpbHRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBpc1ZhbGlkKGNvbnRleHQsIHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LnRleHQucmVwbGFjZShcIiBcIiwgXCJcIikubWF0Y2goL15cXGQqKFxcLlxcZCopPyQvKSkge1xuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIHVubGlrZWx5IHJlc3VsdCAnJHtyZXN1bHQudGV4dH0nYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydC5pc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgaW52YWxpZCByZXN1bHQ6ICR7cmVzdWx0fSAoJHtyZXN1bHQuc3RhcnR9KWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5lbmQgJiYgIXJlc3VsdC5lbmQuaXNWYWxpZERhdGUoKSkge1xuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIGludmFsaWQgcmVzdWx0OiAke3Jlc3VsdH0gKCR7cmVzdWx0LmVuZH0pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N0cmljdE1vZGVWYWxpZChjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpc1N0cmljdE1vZGVWYWxpZChjb250ZXh0LCByZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5pc09ubHlXZWVrZGF5Q29tcG9uZW50KCkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAoU3RyaWN0KSBSZW1vdmluZyB3ZWVrZGF5IG9ubHkgY29tcG9uZW50OiAke3Jlc3VsdH0gKCR7cmVzdWx0LmVuZH0pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmlzT25seVRpbWUoKSAmJiAoIXJlc3VsdC5zdGFydC5pc0NlcnRhaW4oXCJob3VyXCIpIHx8ICFyZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwibWludXRlXCIpKSkge1xuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYChTdHJpY3QpIFJlbW92aW5nIHVuY2VydGFpbiB0aW1lIGNvbXBvbmVudDogJHtyZXN1bHR9ICgke3Jlc3VsdC5lbmR9KWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gVW5saWtlbHlGb3JtYXRGaWx0ZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4vQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoWzAtOV17NH0pXFxcXC0oWzAtOV17MSwyfSlcXFxcLShbMC05XXsxLDJ9KVwiICtcbiAgICBcIig/OlRcIiArXG4gICAgXCIoWzAtOV17MSwyfSk6KFswLTldezEsMn0pXCIgK1xuICAgIFwiKD86XCIgK1xuICAgIFwiOihbMC05XXsxLDJ9KSg/OlxcXFwuKFxcXFxkezEsNH0pKT9cIiArXG4gICAgXCIpP1wiICtcbiAgICBcIig/OlwiICtcbiAgICBcIlp8KFsrLV1cXFxcZHsyfSk6PyhcXFxcZHsyfSk/XCIgK1xuICAgIFwiKT9cIiArXG4gICAgXCIpP1wiICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFlFQVJfTlVNQkVSX0dST1VQID0gMTtcbmNvbnN0IE1PTlRIX05VTUJFUl9HUk9VUCA9IDI7XG5jb25zdCBEQVRFX05VTUJFUl9HUk9VUCA9IDM7XG5jb25zdCBIT1VSX05VTUJFUl9HUk9VUCA9IDQ7XG5jb25zdCBNSU5VVEVfTlVNQkVSX0dST1VQID0gNTtcbmNvbnN0IFNFQ09ORF9OVU1CRVJfR1JPVVAgPSA2O1xuY29uc3QgTUlMTElTRUNPTkRfTlVNQkVSX0dST1VQID0gNztcbmNvbnN0IFRaRF9IT1VSX09GRlNFVF9HUk9VUCA9IDg7XG5jb25zdCBUWkRfTUlOVVRFX09GRlNFVF9HUk9VUCA9IDk7XG5jbGFzcyBJU09Gb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB7fTtcbiAgICAgICAgY29tcG9uZW50c1tcInllYXJcIl0gPSBwYXJzZUludChtYXRjaFtZRUFSX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICBjb21wb25lbnRzW1wibW9udGhcIl0gPSBwYXJzZUludChtYXRjaFtNT05USF9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgY29tcG9uZW50c1tcImRheVwiXSA9IHBhcnNlSW50KG1hdGNoW0RBVEVfTlVNQkVSX0dST1VQXSk7XG4gICAgICAgIGlmIChtYXRjaFtIT1VSX05VTUJFUl9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50c1tcImhvdXJcIl0gPSBwYXJzZUludChtYXRjaFtIT1VSX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICAgICAgY29tcG9uZW50c1tcIm1pbnV0ZVwiXSA9IHBhcnNlSW50KG1hdGNoW01JTlVURV9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgICAgIGlmIChtYXRjaFtTRUNPTkRfTlVNQkVSX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50c1tcInNlY29uZFwiXSA9IHBhcnNlSW50KG1hdGNoW1NFQ09ORF9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFtNSUxMSVNFQ09ORF9OVU1CRVJfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzW1wibWlsbGlzZWNvbmRcIl0gPSBwYXJzZUludChtYXRjaFtNSUxMSVNFQ09ORF9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFtUWkRfSE9VUl9PRkZTRVRfR1JPVVBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzW1widGltZXpvbmVPZmZzZXRcIl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ck9mZnNldCA9IHBhcnNlSW50KG1hdGNoW1RaRF9IT1VSX09GRlNFVF9HUk9VUF0pO1xuICAgICAgICAgICAgICAgIGxldCBtaW51dGVPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFtUWkRfTUlOVVRFX09GRlNFVF9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBtaW51dGVPZmZzZXQgPSBwYXJzZUludChtYXRjaFtUWkRfTUlOVVRFX09GRlNFVF9HUk9VUF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gaG91ck9mZnNldCAqIDYwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBtaW51dGVPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbWludXRlT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb25lbnRzW1widGltZXpvbmVPZmZzZXRcIl0gPSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gSVNPRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhYnN0cmFjdFJlZmluZXJzXzEgPSByZXF1aXJlKFwiLi4vYWJzdHJhY3RSZWZpbmVyc1wiKTtcbmNsYXNzIE1lcmdlV2Vla2RheUNvbXBvbmVudFJlZmluZXIgZXh0ZW5kcyBhYnN0cmFjdFJlZmluZXJzXzEuTWVyZ2luZ1JlZmluZXIge1xuICAgIG1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VycmVudFJlc3VsdCwgbmV4dFJlc3VsdCkge1xuICAgICAgICBjb25zdCBuZXdSZXN1bHQgPSBuZXh0UmVzdWx0LmNsb25lKCk7XG4gICAgICAgIG5ld1Jlc3VsdC5pbmRleCA9IGN1cnJlbnRSZXN1bHQuaW5kZXg7XG4gICAgICAgIG5ld1Jlc3VsdC50ZXh0ID0gY3VycmVudFJlc3VsdC50ZXh0ICsgdGV4dEJldHdlZW4gKyBuZXdSZXN1bHQudGV4dDtcbiAgICAgICAgbmV3UmVzdWx0LnN0YXJ0LmFzc2lnbihcIndlZWtkYXlcIiwgY3VycmVudFJlc3VsdC5zdGFydC5nZXQoXCJ3ZWVrZGF5XCIpKTtcbiAgICAgICAgaWYgKG5ld1Jlc3VsdC5lbmQpIHtcbiAgICAgICAgICAgIG5ld1Jlc3VsdC5lbmQuYXNzaWduKFwid2Vla2RheVwiLCBjdXJyZW50UmVzdWx0LnN0YXJ0LmdldChcIndlZWtkYXlcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdSZXN1bHQ7XG4gICAgfVxuICAgIHNob3VsZE1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VycmVudFJlc3VsdCwgbmV4dFJlc3VsdCkge1xuICAgICAgICBjb25zdCB3ZWVrZGF5VGhlbk5vcm1hbERhdGUgPSBjdXJyZW50UmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSAmJlxuICAgICAgICAgICAgIWN1cnJlbnRSZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwiaG91clwiKSAmJlxuICAgICAgICAgICAgbmV4dFJlc3VsdC5zdGFydC5pc0NlcnRhaW4oXCJkYXlcIik7XG4gICAgICAgIHJldHVybiB3ZWVrZGF5VGhlbk5vcm1hbERhdGUgJiYgdGV4dEJldHdlZW4ubWF0Y2goL14sP1xccyokLykgIT0gbnVsbDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBNZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uID0gdm9pZCAwO1xuY29uc3QgRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcmVmaW5lcnMvRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXJcIikpO1xuY29uc3QgRXh0cmFjdFRpbWV6b25lT2Zmc2V0UmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9yZWZpbmVycy9FeHRyYWN0VGltZXpvbmVPZmZzZXRSZWZpbmVyXCIpKTtcbmNvbnN0IE92ZXJsYXBSZW1vdmFsUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9yZWZpbmVycy9PdmVybGFwUmVtb3ZhbFJlZmluZXJcIikpO1xuY29uc3QgRm9yd2FyZERhdGVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vY29tbW9uL3JlZmluZXJzL0ZvcndhcmREYXRlUmVmaW5lclwiKSk7XG5jb25zdCBVbmxpa2VseUZvcm1hdEZpbHRlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9yZWZpbmVycy9Vbmxpa2VseUZvcm1hdEZpbHRlclwiKSk7XG5jb25zdCBJU09Gb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcGFyc2Vycy9JU09Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9yZWZpbmVycy9NZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyXCIpKTtcbmZ1bmN0aW9uIGluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24sIHN0cmljdE1vZGUgPSBmYWxzZSkge1xuICAgIGNvbmZpZ3VyYXRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBJU09Gb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIGNvbmZpZ3VyYXRpb24ucmVmaW5lcnMudW5zaGlmdChuZXcgTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lcl8xLmRlZmF1bHQoKSk7XG4gICAgY29uZmlndXJhdGlvbi5yZWZpbmVycy51bnNoaWZ0KG5ldyBFeHRyYWN0VGltZXpvbmVBYmJyUmVmaW5lcl8xLmRlZmF1bHQoKSk7XG4gICAgY29uZmlndXJhdGlvbi5yZWZpbmVycy51bnNoaWZ0KG5ldyBFeHRyYWN0VGltZXpvbmVPZmZzZXRSZWZpbmVyXzEuZGVmYXVsdCgpKTtcbiAgICBjb25maWd1cmF0aW9uLnJlZmluZXJzLnVuc2hpZnQobmV3IE92ZXJsYXBSZW1vdmFsUmVmaW5lcl8xLmRlZmF1bHQoKSk7XG4gICAgY29uZmlndXJhdGlvbi5yZWZpbmVycy5wdXNoKG5ldyBPdmVybGFwUmVtb3ZhbFJlZmluZXJfMS5kZWZhdWx0KCkpO1xuICAgIGNvbmZpZ3VyYXRpb24ucmVmaW5lcnMucHVzaChuZXcgRm9yd2FyZERhdGVSZWZpbmVyXzEuZGVmYXVsdCgpKTtcbiAgICBjb25maWd1cmF0aW9uLnJlZmluZXJzLnB1c2gobmV3IFVubGlrZWx5Rm9ybWF0RmlsdGVyXzEuZGVmYXVsdChzdHJpY3RNb2RlKSk7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG59XG5leHBvcnRzLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uID0gaW5jbHVkZUNvbW1vbkNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9uaWdodCA9IGV4cG9ydHMudG9tb3Jyb3cgPSBleHBvcnRzLnllc3RlcmRheSA9IGV4cG9ydHMudG9kYXkgPSBleHBvcnRzLm5vdyA9IHZvaWQgMDtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi9yZXN1bHRzXCIpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vaW5kZXhcIik7XG5mdW5jdGlvbiBub3cocmVmRGF0ZSkge1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmRGF0ZSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cyhyZWZEYXRlLCB7fSk7XG4gICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgIGRheWpzXzIuYXNzaWduU2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZXhwb3J0cy5ub3cgPSBub3c7XG5mdW5jdGlvbiB0b2RheShyZWZEYXRlKSB7XG4gICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZEYXRlKTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzKHJlZkRhdGUsIHt9KTtcbiAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgZGF5anNfMi5pbXBseVNpbWlsYXJUaW1lKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydHMudG9kYXkgPSB0b2RheTtcbmZ1bmN0aW9uIHllc3RlcmRheShyZWZEYXRlKSB7XG4gICAgbGV0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmRGF0ZSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cyhyZWZEYXRlLCB7fSk7XG4gICAgdGFyZ2V0RGF0ZSA9IHRhcmdldERhdGUuYWRkKC0xLCBcImRheVwiKTtcbiAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgZGF5anNfMi5pbXBseVNpbWlsYXJUaW1lKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydHMueWVzdGVyZGF5ID0geWVzdGVyZGF5O1xuZnVuY3Rpb24gdG9tb3Jyb3cocmVmRGF0ZSkge1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmRGF0ZSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cyhyZWZEYXRlLCB7fSk7XG4gICAgZGF5anNfMi5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydHMudG9tb3Jyb3cgPSB0b21vcnJvdztcbmZ1bmN0aW9uIHRvbmlnaHQocmVmRGF0ZSwgaW1wbHlIb3VyID0gMjIpIHtcbiAgICBjb25zdCB0YXJnZXREYXRlID0gZGF5anNfMS5kZWZhdWx0KHJlZkRhdGUpO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMocmVmRGF0ZSwge30pO1xuICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgaW1wbHlIb3VyKTtcbiAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydHMudG9uaWdodCA9IHRvbmlnaHQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNvbnN0IFBBVFRFUk4gPSAvKG5vd3x0b2RheXx0b25pZ2h0fHRvbW9ycm93fHRtcnx5ZXN0ZXJkYXl8bGFzdFxccypuaWdodCkoPz1cXFd8JCkvaTtcbmNsYXNzIEVOQ2FzdWFsRGF0ZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGxldCB0YXJnZXREYXRlID0gZGF5anNfMS5kZWZhdWx0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIGNvbnN0IGxvd2VyVGV4dCA9IG1hdGNoWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChsb3dlclRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJub3dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5ub3coY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0b2RheVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwieWVzdGVyZGF5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMueWVzdGVyZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwidG9tb3Jyb3dcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ0bXJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b21vcnJvdyhjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcInRvbmlnaHRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b25pZ2h0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChsb3dlclRleHQubWF0Y2goL2xhc3RcXHMqbmlnaHQvKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RGF0ZS5ob3VyKCkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTEsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTkNhc3VhbERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBkYXlqc18yID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL2RheWpzXCIpO1xuY29uc3QgUEFUVEVSTiA9IC8oPzp0aGlzKT9cXHMqKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHR8bWlkbmlnaHR8bm9vbikoPz1cXFd8JCkvaTtcbmNsYXNzIEVOQ2FzdWFsVGltZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIHN3aXRjaCAobWF0Y2hbMV0udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcImFmdGVybm9vblwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImV2ZW5pbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJuaWdodFwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMjApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1pZG5pZ2h0XCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vcm5pbmdcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vb25cIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOQ2FzdWFsVGltZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b0RheUpTQ2xvc2VzdFdlZWtkYXkgPSBleHBvcnRzLnRvRGF5SlNXZWVrZGF5ID0gdm9pZCAwO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuZnVuY3Rpb24gdG9EYXlKU1dlZWtkYXkocmVmRGF0ZSwgb2Zmc2V0LCBtb2RpZmllcikge1xuICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvRGF5SlNDbG9zZXN0V2Vla2RheShyZWZEYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgICBsZXQgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZEYXRlKTtcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICAgIGNhc2UgXCJ0aGlzXCI6XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5kYXkob2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibmV4dFwiOlxuICAgICAgICAgICAgZGF0ZSA9IGRhdGUuZGF5KG9mZnNldCArIDcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsYXN0XCI6XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5kYXkob2Zmc2V0IC0gNyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG59XG5leHBvcnRzLnRvRGF5SlNXZWVrZGF5ID0gdG9EYXlKU1dlZWtkYXk7XG5mdW5jdGlvbiB0b0RheUpTQ2xvc2VzdFdlZWtkYXkocmVmRGF0ZSwgb2Zmc2V0KSB7XG4gICAgbGV0IGRhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmRGF0ZSk7XG4gICAgY29uc3QgcmVmT2Zmc2V0ID0gZGF0ZS5kYXkoKTtcbiAgICBpZiAoTWF0aC5hYnMob2Zmc2V0IC0gNyAtIHJlZk9mZnNldCkgPCBNYXRoLmFicyhvZmZzZXQgLSByZWZPZmZzZXQpKSB7XG4gICAgICAgIGRhdGUgPSBkYXRlLmRheShvZmZzZXQgLSA3KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoTWF0aC5hYnMob2Zmc2V0ICsgNyAtIHJlZk9mZnNldCkgPCBNYXRoLmFicyhvZmZzZXQgLSByZWZPZmZzZXQpKSB7XG4gICAgICAgIGRhdGUgPSBkYXRlLmRheShvZmZzZXQgKyA3KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRhdGUgPSBkYXRlLmRheShvZmZzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cbmV4cG9ydHMudG9EYXlKU0Nsb3Nlc3RXZWVrZGF5ID0gdG9EYXlKU0Nsb3Nlc3RXZWVrZGF5O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHdlZWtzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24vd2Vla3NcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Oig/OlxcXFwsfFxcXFwofFxcXFzvvIgpXFxcXHMqKT9cIiArXG4gICAgXCIoPzpvblxcXFxzKj8pP1wiICtcbiAgICBcIig/Oih0aGlzfGxhc3R8cGFzdHxuZXh0KVxcXFxzKik/XCIgK1xuICAgIGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWSl9KWAgK1xuICAgIFwiKD86XFxcXHMqKD86XFxcXCx8XFxcXCl8XFxcXO+8iSkpP1wiICtcbiAgICBcIig/OlxcXFxzKih0aGlzfGxhc3R8cGFzdHxuZXh0KVxcXFxzKndlZWspP1wiICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFBSRUZJWF9HUk9VUCA9IDE7XG5jb25zdCBXRUVLREFZX0dST1VQID0gMjtcbmNvbnN0IFBPU1RGSVhfR1JPVVAgPSAzO1xuY2xhc3MgRU5XZWVrZGF5UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBtYXRjaFtXRUVLREFZX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUllbZGF5T2ZXZWVrXTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbUFJFRklYX0dST1VQXTtcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IG1hdGNoW1BPU1RGSVhfR1JPVVBdO1xuICAgICAgICBsZXQgbW9kaWZpZXJXb3JkID0gcHJlZml4IHx8IHBvc3RmaXg7XG4gICAgICAgIG1vZGlmaWVyV29yZCA9IG1vZGlmaWVyV29yZCB8fCBcIlwiO1xuICAgICAgICBtb2RpZmllcldvcmQgPSBtb2RpZmllcldvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gbnVsbDtcbiAgICAgICAgaWYgKG1vZGlmaWVyV29yZCA9PSBcImxhc3RcIiB8fCBtb2RpZmllcldvcmQgPT0gXCJwYXN0XCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJsYXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kaWZpZXJXb3JkID09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibmV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyV29yZCA9PSBcInRoaXNcIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcInRoaXNcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gd2Vla3NfMS50b0RheUpTV2Vla2RheShjb250ZXh0LnJlZkRhdGUsIG9mZnNldCwgbW9kaWZpZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKClcbiAgICAgICAgICAgIC5hc3NpZ24oXCJ3ZWVrZGF5XCIsIG9mZnNldClcbiAgICAgICAgICAgIC5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSlcbiAgICAgICAgICAgIC5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpXG4gICAgICAgICAgICAuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTldlZWtkYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChgKHRoaXN8bmV4dHxsYXN0fHBhc3QpXFxcXHMqKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5USU1FX1VOSVRfRElDVElPTkFSWSl9KSg/PVxcXFxzKilgICsgXCIoPz1cXFxcV3wkKVwiLCBcImlcIik7XG5jb25zdCBNT0RJRklFUl9XT1JEX0dST1VQID0gMTtcbmNvbnN0IFJFTEFUSVZFX1dPUkRfR1JPVVAgPSAyO1xuY2xhc3MgRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gbWF0Y2hbTU9ESUZJRVJfV09SRF9HUk9VUF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgdW5pdFdvcmQgPSBtYXRjaFtSRUxBVElWRV9XT1JEX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1ldW5pdCA9IGNvbnN0YW50c18xLlRJTUVfVU5JVF9ESUNUSU9OQVJZW3VuaXRXb3JkXTtcbiAgICAgICAgaWYgKG1vZGlmaWVyID09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSB7fTtcbiAgICAgICAgICAgIHRpbWVVbml0c1t0aW1ldW5pdF0gPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXIgPT0gXCJsYXN0XCIgfHwgbW9kaWZpZXIgPT0gXCJwYXN0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVVbml0cyA9IHt9O1xuICAgICAgICAgICAgdGltZVVuaXRzW3RpbWV1bml0XSA9IC0xO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBsZXQgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBpZiAodW5pdFdvcmQubWF0Y2goL3dlZWsvaSkpIHtcbiAgICAgICAgICAgIGRhdGUgPSBkYXRlLmFkZCgtZGF0ZS5nZXQoXCJkXCIpLCBcImRcIik7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1bml0V29yZC5tYXRjaCgvbW9udGgvaSkpIHtcbiAgICAgICAgICAgIGRhdGUgPSBkYXRlLmFkZCgtZGF0ZS5kYXRlKCkgKyAxLCBcImRcIik7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXRXb3JkLm1hdGNoKC95ZWFyL2kpKSB7XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5hZGQoLWRhdGUuZGF0ZSgpICsgMSwgXCJkXCIpO1xuICAgICAgICAgICAgZGF0ZSA9IGRhdGUuYWRkKC1kYXRlLm1vbnRoKCksIFwibW9udGhcIik7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFyc2luZ0NvbnRleHQgPSBleHBvcnRzLkNocm9ubyA9IHZvaWQgMDtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuL3Jlc3VsdHNcIik7XG5jb25zdCBlbl8xID0gcmVxdWlyZShcIi4vbG9jYWxlcy9lblwiKTtcbmNsYXNzIENocm9ubyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbikge1xuICAgICAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbiB8fCBlbl8xLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgdGhpcy5wYXJzZXJzID0gWy4uLmNvbmZpZ3VyYXRpb24ucGFyc2Vyc107XG4gICAgICAgIHRoaXMucmVmaW5lcnMgPSBbLi4uY29uZmlndXJhdGlvbi5yZWZpbmVyc107XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IENocm9ubyh7XG4gICAgICAgICAgICBwYXJzZXJzOiBbLi4udGhpcy5wYXJzZXJzXSxcbiAgICAgICAgICAgIHJlZmluZXJzOiBbLi4udGhpcy5yZWZpbmVyc10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXJzZURhdGUodGV4dCwgcmVmZXJlbmNlRGF0ZSwgb3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLnBhcnNlKHRleHQsIHJlZmVyZW5jZURhdGUsIG9wdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzWzBdLnN0YXJ0LmRhdGUoKSA6IG51bGw7XG4gICAgfVxuICAgIHBhcnNlKHRleHQsIHJlZmVyZW5jZURhdGUsIG9wdGlvbikge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFBhcnNpbmdDb250ZXh0KHRleHQsIHJlZmVyZW5jZURhdGUgfHwgbmV3IERhdGUoKSwgb3B0aW9uIHx8IHt9KTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5wYXJzZXJzLmZvckVhY2goKHBhcnNlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVzdWx0cyA9IENocm9uby5leGVjdXRlUGFyc2VyKGNvbnRleHQsIHBhcnNlcik7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQocGFyc2VkUmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVmaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAocmVmaW5lcikge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZmluZXIucmVmaW5lKGNvbnRleHQsIHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHN0YXRpYyBleGVjdXRlUGFyc2VyKGNvbnRleHQsIHBhcnNlcikge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXJzZXIucGF0dGVybihjb250ZXh0KTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gY29udGV4dC50ZXh0O1xuICAgICAgICBsZXQgcmVtYWluaW5nVGV4dCA9IGNvbnRleHQudGV4dDtcbiAgICAgICAgbGV0IG1hdGNoID0gcGF0dGVybi5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgICAgICB3aGlsZSAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2guaW5kZXggKyBvcmlnaW5hbFRleHQubGVuZ3RoIC0gcmVtYWluaW5nVGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLmV4dHJhY3QoY29udGV4dCwgbWF0Y2gpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdUZXh0ID0gb3JpZ2luYWxUZXh0LnN1YnN0cmluZyhtYXRjaC5pbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBhcnNlZFJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgcmVzdWx0c18xLlBhcnNpbmdSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRSZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdKTtcbiAgICAgICAgICAgICAgICBwYXJzZWRSZXN1bHQuc3RhcnQgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRSZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiBjb25zb2xlLmxvZyhgJHtwYXJzZXIuY29uc3RydWN0b3IubmFtZX0gZXh0cmFjdGVkIHJlc3VsdCAke3BhcnNlZFJlc3VsdH1gKSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocGFyc2VkUmVzdWx0KTtcbiAgICAgICAgICAgIHJlbWFpbmluZ1RleHQgPSBvcmlnaW5hbFRleHQuc3Vic3RyaW5nKGluZGV4ICsgcGFyc2VkUmVzdWx0LnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2hyb25vID0gQ2hyb25vO1xuY2xhc3MgUGFyc2luZ0NvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIHJlZkRhdGUsIG9wdGlvbikge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLnJlZkRhdGUgPSByZWZEYXRlO1xuICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoY29tcG9uZW50cykge1xuICAgICAgICBpZiAoY29tcG9uZW50cyBpbnN0YW5jZW9mIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHModGhpcy5yZWZEYXRlLCBjb21wb25lbnRzKTtcbiAgICB9XG4gICAgY3JlYXRlUGFyc2luZ1Jlc3VsdChpbmRleCwgdGV4dE9yRW5kSW5kZXgsIHN0YXJ0Q29tcG9uZW50cywgZW5kQ29tcG9uZW50cykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIHRleHRPckVuZEluZGV4ID09PSBcInN0cmluZ1wiID8gdGV4dE9yRW5kSW5kZXggOiB0aGlzLnRleHQuc3Vic3RyaW5nKGluZGV4LCB0ZXh0T3JFbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRDb21wb25lbnRzID8gdGhpcy5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cyhzdGFydENvbXBvbmVudHMpIDogbnVsbDtcbiAgICAgICAgY29uc3QgZW5kID0gZW5kQ29tcG9uZW50cyA/IHRoaXMuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoZW5kQ29tcG9uZW50cykgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IHJlc3VsdHNfMS5QYXJzaW5nUmVzdWx0KHRoaXMucmVmRGF0ZSwgaW5kZXgsIHRleHQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBkZWJ1ZyhibG9jaykge1xuICAgICAgICBpZiAodGhpcy5vcHRpb24uZGVidWcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbi5kZWJ1ZyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24uZGVidWcoYmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub3B0aW9uLmRlYnVnO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIuZGVidWcoYmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5QYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoW15cXFxcZF18XilcIiArXG4gICAgXCIoWzAtM117MCwxfVswLTldezF9KVtcXFxcL1xcXFwuXFxcXC1dKFswLTNdezAsMX1bMC05XXsxfSlcIiArXG4gICAgXCIoPzpbXFxcXC9cXFxcLlxcXFwtXShbMC05XXs0fXxbMC05XXsyfSkpP1wiICtcbiAgICBcIihcXFxcV3wkKVwiLCBcImlcIik7XG5jb25zdCBPUEVOSU5HX0dST1VQID0gMTtcbmNvbnN0IEVORElOR19HUk9VUCA9IDU7XG5jb25zdCBGSVJTVF9OVU1CRVJTX0dST1VQID0gMjtcbmNvbnN0IFNFQ09ORF9OVU1CRVJTX0dST1VQID0gMztcbmNvbnN0IFlFQVJfR1JPVVAgPSA0O1xuY2xhc3MgU2xhc2hEYXRlRm9ybWF0UGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihsaXR0bGVFbmRpYW4pIHtcbiAgICAgICAgdGhpcy5ncm91cE51bWJlck1vbnRoID0gbGl0dGxlRW5kaWFuID8gU0VDT05EX05VTUJFUlNfR1JPVVAgOiBGSVJTVF9OVU1CRVJTX0dST1VQO1xuICAgICAgICB0aGlzLmdyb3VwTnVtYmVyRGF5ID0gbGl0dGxlRW5kaWFuID8gRklSU1RfTlVNQkVSU19HUk9VUCA6IFNFQ09ORF9OVU1CRVJTX0dST1VQO1xuICAgIH1cbiAgICBwYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgZXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBpZiAobWF0Y2hbT1BFTklOR19HUk9VUF0gPT0gXCIvXCIgfHwgbWF0Y2hbRU5ESU5HX0dST1VQXSA9PSBcIi9cIikge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFtPUEVOSU5HX0dST1VQXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFswXS5zdWJzdHIobWF0Y2hbT1BFTklOR19HUk9VUF0ubGVuZ3RoLCBtYXRjaFswXS5sZW5ndGggLSBtYXRjaFtPUEVOSU5HX0dST1VQXS5sZW5ndGggLSBtYXRjaFtFTkRJTkdfR1JPVVBdLmxlbmd0aCk7XG4gICAgICAgIGlmICh0ZXh0Lm1hdGNoKC9eXFxkXFwuXFxkJC8pIHx8IHRleHQubWF0Y2goL15cXGRcXC5cXGR7MSwyfVxcLlxcZHsxLDJ9XFxzKiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWF0Y2hbWUVBUl9HUk9VUF0gJiYgbWF0Y2hbMF0uaW5kZXhPZihcIi9cIikgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KGluZGV4LCB0ZXh0KTtcbiAgICAgICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbdGhpcy5ncm91cE51bWJlck1vbnRoXSk7XG4gICAgICAgIGxldCBkYXkgPSBwYXJzZUludChtYXRjaFt0aGlzLmdyb3VwTnVtYmVyRGF5XSk7XG4gICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikge1xuICAgICAgICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF5ID49IDEgJiYgZGF5IDw9IDEyICYmIG1vbnRoIDw9IDMxKSB7XG4gICAgICAgICAgICAgICAgICAgIFtkYXksIG1vbnRoXSA9IFttb250aCwgZGF5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImRheVwiLCBkYXkpO1xuICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwibW9udGhcIiwgbW9udGgpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHJhd1llYXJOdW1iZXIgPSBwYXJzZUludChtYXRjaFtZRUFSX0dST1VQXSk7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kTW9zdExpa2VseUFEWWVhcihyYXdZZWFyTnVtYmVyKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTbGFzaERhdGVGb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgdGltZXVuaXRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvdGltZXVuaXRzXCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYCh0aGlzfGxhc3R8cGFzdHxuZXh0fFxcXFwrfC0pXFxcXHMqKCR7Y29uc3RhbnRzXzEuVElNRV9VTklUU19QQVRURVJOfSkoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbmNsYXNzIEVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHRpbWVVbml0cyA9IGNvbnN0YW50c18xLnBhcnNlVGltZVVuaXRzKG1hdGNoWzJdKTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgXCJsYXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwicGFzdFwiOlxuICAgICAgICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgICAgICAgICB0aW1lVW5pdHMgPSB0aW1ldW5pdHNfMS5yZXZlcnNlVGltZVVuaXRzKHRpbWVVbml0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuR0IgPSBleHBvcnRzLnN0cmljdCA9IGV4cG9ydHMuY2FzdWFsID0gdm9pZCAwO1xuY29uc3QgRU5UaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBFTk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5Nb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJcIikpO1xuY29uc3QgRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IEVOTW9udGhOYW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTk1vbnRoTmFtZVBhcnNlclwiKSk7XG5jb25zdCBFTkNhc3VhbFllYXJNb250aERheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxZZWFyTW9udGhEYXlQYXJzZXJcIikpO1xuY29uc3QgRU5TbGFzaE1vbnRoRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlNsYXNoTW9udGhGb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgRU5UaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lRXhwcmVzc2lvblBhcnNlclwiKSk7XG5jb25zdCBFTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvRU5NZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY29uc3QgRU5NZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL0VOTWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY29uc3QgY29uZmlndXJhdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWd1cmF0aW9uc1wiKTtcbmNvbnN0IEVOQ2FzdWFsRGF0ZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxEYXRlUGFyc2VyXCIpKTtcbmNvbnN0IEVOQ2FzdWFsVGltZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmNvbnN0IEVOV2Vla2RheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5XZWVrZGF5UGFyc2VyXCIpKTtcbmNvbnN0IEVOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKGZhbHNlKSk7XG5leHBvcnRzLnN0cmljdCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbih0cnVlLCBmYWxzZSkpO1xuZXhwb3J0cy5HQiA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbihmYWxzZSwgdHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBvcHRpb24gPSBjcmVhdGVDb25maWd1cmF0aW9uKGZhbHNlLCBsaXR0bGVFbmRpYW4pO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEVOQ2FzdWFsRGF0ZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRU5DYXN1YWxUaW1lUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBFTk1vbnRoTmFtZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb247XG5mdW5jdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKHN0cmljdE1vZGUgPSB0cnVlLCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBFTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBFTkNhc3VhbFllYXJNb250aERheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBFTlNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgRU5UaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoc3RyaWN0TW9kZSksXG4gICAgICAgICAgICBuZXcgRU5UaW1lVW5pdEFnb0Zvcm1hdFBhcnNlcl8xLmRlZmF1bHQoc3RyaWN0TW9kZSksXG4gICAgICAgICAgICBuZXcgRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyXzEuZGVmYXVsdChzdHJpY3RNb2RlKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgRU5NZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IEVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNsYXNzIERFVGltZUV4cHJlc3Npb25QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgcHJpbWFyeVByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86KD86dW18dm9uKVxcXFxzKik/XCI7XG4gICAgfVxuICAgIGZvbGxvd2luZ1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gXCJcXFxccyooPzpcXFxcLXxcXFxc4oCTfFxcXFx+fFxcXFzjgJx8YmlzKVxcXFxzKlwiO1xuICAgIH1cbiAgICBwcmltYXJ5U3VmZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPzpcXFxccyp1aHIpPyg/OlxcXFxzKig/Om1vcmdlbnN8dm9ybWl0dGFnc3xuYWNobWl0dGFnc3xhYmVuZHN8bmFjaHRzKSk/KD89XFxcXFd8JClcIjtcbiAgICB9XG4gICAgZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc3VwZXIuZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCk7XG4gICAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMF0uZW5kc1dpdGgoXCJtb3JnZW5zXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwidm9ybWl0dGFnc1wiKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBjb21wb25lbnRzLmdldChcImhvdXJcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFswXS5lbmRzV2l0aChcIm5hY2htaXR0YWdzXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwiYWJlbmRzXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwibmFjaHRzXCIpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3VyID0gY29tcG9uZW50cy5nZXQoXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKSArIDEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gREVUaW1lRXhwcmVzc2lvblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVRpbWVVbml0cyA9IGV4cG9ydHMuVElNRV9VTklUU19QQVRURVJOID0gZXhwb3J0cy5wYXJzZVllYXIgPSBleHBvcnRzLllFQVJfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VOdW1iZXJQYXR0ZXJuID0gZXhwb3J0cy5OVU1CRVJfUEFUVEVSTiA9IGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkgPSBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZID0gZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0gZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB2b2lkIDA7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5leHBvcnRzLldFRUtEQVlfRElDVElPTkFSWSA9IHtcbiAgICBcInNvbm50YWdcIjogMCxcbiAgICBcInNvXCI6IDAsXG4gICAgXCJtb250YWdcIjogMSxcbiAgICBcIm1vXCI6IDEsXG4gICAgXCJkaWVuc3RhZ1wiOiAyLFxuICAgIFwiZGlcIjogMixcbiAgICBcIm1pdHR3b2NoXCI6IDMsXG4gICAgXCJtaVwiOiAzLFxuICAgIFwiZG9ubmVyc3RhZ1wiOiA0LFxuICAgIFwiZG9cIjogNCxcbiAgICBcImZyZWl0YWdcIjogNSxcbiAgICBcImZyXCI6IDUsXG4gICAgXCJzYW1zdGFnXCI6IDYsXG4gICAgXCJzYVwiOiA2LFxufTtcbmV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IHtcbiAgICBcImphbnVhclwiOiAxLFxuICAgIFwiamFuXCI6IDEsXG4gICAgXCJqYW4uXCI6IDEsXG4gICAgXCJmZWJydWFyXCI6IDIsXG4gICAgXCJmZWJcIjogMixcbiAgICBcImZlYi5cIjogMixcbiAgICBcIm3DpHJ6XCI6IDMsXG4gICAgXCJtYWVyelwiOiAzLFxuICAgIFwibcOkclwiOiAzLFxuICAgIFwibcOkci5cIjogMyxcbiAgICBcIm1yelwiOiAzLFxuICAgIFwibXJ6LlwiOiAzLFxuICAgIFwiYXByaWxcIjogNCxcbiAgICBcImFwclwiOiA0LFxuICAgIFwiYXByLlwiOiA0LFxuICAgIFwibWFpXCI6IDUsXG4gICAgXCJqdW5pXCI6IDYsXG4gICAgXCJqdW5cIjogNixcbiAgICBcImp1bi5cIjogNixcbiAgICBcImp1bGlcIjogNyxcbiAgICBcImp1bFwiOiA3LFxuICAgIFwianVsLlwiOiA3LFxuICAgIFwiYXVndXN0XCI6IDgsXG4gICAgXCJhdWdcIjogOCxcbiAgICBcImF1Zy5cIjogOCxcbiAgICBcInNlcHRlbWJlclwiOiA5LFxuICAgIFwic2VwXCI6IDksXG4gICAgXCJzZXAuXCI6IDksXG4gICAgXCJzZXB0XCI6IDksXG4gICAgXCJzZXB0LlwiOiA5LFxuICAgIFwib2t0b2JlclwiOiAxMCxcbiAgICBcIm9rdFwiOiAxMCxcbiAgICBcIm9rdC5cIjogMTAsXG4gICAgXCJub3ZlbWJlclwiOiAxMSxcbiAgICBcIm5vdlwiOiAxMSxcbiAgICBcIm5vdi5cIjogMTEsXG4gICAgXCJkZXplbWJlclwiOiAxMixcbiAgICBcImRlelwiOiAxMixcbiAgICBcImRlei5cIjogMTIsXG59O1xuZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSA9IHtcbiAgICBcImVpbnNcIjogMSxcbiAgICBcInp3ZWlcIjogMixcbiAgICBcImRyZWlcIjogMyxcbiAgICBcInZpZXJcIjogNCxcbiAgICBcImbDvG5mXCI6IDUsXG4gICAgXCJmdWVuZlwiOiA1LFxuICAgIFwic2VjaHNcIjogNixcbiAgICBcInNpZWJlblwiOiA3LFxuICAgIFwiYWNodFwiOiA4LFxuICAgIFwibmV1blwiOiA5LFxuICAgIFwiemVoblwiOiAxMCxcbiAgICBcImVsZlwiOiAxMSxcbiAgICBcInp3w7ZsZlwiOiAxMixcbiAgICBcInp3b2VsZlwiOiAxMixcbn07XG5leHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0ge1xuICAgIHNlYzogXCJzZWNvbmRcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaW46IFwibWludXRlXCIsXG4gICAgbWluczogXCJtaW51dGVcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBoOiBcImhvdXJcIixcbiAgICBocjogXCJob3VyXCIsXG4gICAgaHJzOiBcImhvdXJcIixcbiAgICBob3VyOiBcImhvdXJcIixcbiAgICBob3VyczogXCJob3VyXCIsXG4gICAgZGF5OiBcImRcIixcbiAgICBkYXlzOiBcImRcIixcbiAgICB3ZWVrOiBcIndlZWtcIixcbiAgICB3ZWVrczogXCJ3ZWVrXCIsXG4gICAgbW9udGg6IFwibW9udGhcIixcbiAgICBtb250aHM6IFwibW9udGhcIixcbiAgICB5OiBcInllYXJcIixcbiAgICB5cjogXCJ5ZWFyXCIsXG4gICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgeWVhcnM6IFwieWVhclwiLFxufTtcbmV4cG9ydHMuTlVNQkVSX1BBVFRFUk4gPSBgKD86JHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkpfXxbMC05XSt8WzAtOV0rXFxcXC5bMC05XSt8aGFsZig/OlxcXFxzKmFuPyk/fGFuPyg/OlxcXFxzKmZldyk/fGZld3xzZXZlcmFsfGE/XFxcXHMqY291cGxlXFxcXHMqKD86b2YpPylgO1xuZnVuY3Rpb24gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gbWF0Y2gudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWVtudW1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtID09PSBcImFcIiB8fCBudW0gPT09IFwiYW5cIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9mZXcvKSkge1xuICAgICAgICByZXR1cm4gMztcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9oYWxmLykpIHtcbiAgICAgICAgcmV0dXJuIDAuNTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9jb3VwbGUvKSkge1xuICAgICAgICByZXR1cm4gMjtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9zZXZlcmFsLykpIHtcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bSk7XG59XG5leHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IHBhcnNlTnVtYmVyUGF0dGVybjtcbmV4cG9ydHMuWUVBUl9QQVRURVJOID0gYCg/OlswLTldezEsNH0oPzpcXFxccypbdm5dXFxcXC4/XFxcXHMqQyg/OmhyKT9cXFxcLj8pPylgO1xuZnVuY3Rpb24gcGFyc2VZZWFyKG1hdGNoKSB7XG4gICAgaWYgKC92L2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaC5yZXBsYWNlKC9bXjAtOV0rL2dpLCBcIlwiKSk7XG4gICAgfVxuICAgIGlmICgvbi9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChtYXRjaC5yZXBsYWNlKC9bXjAtOV0rL2dpLCBcIlwiKSk7XG4gICAgfVxuICAgIGNvbnN0IHJhd1llYXJOdW1iZXIgPSBwYXJzZUludChtYXRjaCk7XG4gICAgcmV0dXJuIHllYXJzXzEuZmluZE1vc3RMaWtlbHlBRFllYXIocmF3WWVhck51bWJlcik7XG59XG5leHBvcnRzLnBhcnNlWWVhciA9IHBhcnNlWWVhcjtcbmNvbnN0IFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiA9IGAoJHtleHBvcnRzLk5VTUJFUl9QQVRURVJOfSlcXFxcc3swLDV9KCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZKX0pXFxcXHN7MCw1fWA7XG5jb25zdCBTSU5HTEVfVElNRV9VTklUX1JFR0VYID0gbmV3IFJlZ0V4cChTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4sIFwiaVwiKTtcbmV4cG9ydHMuVElNRV9VTklUU19QQVRURVJOID0gcGF0dGVybl8xLnJlcGVhdGVkVGltZXVuaXRQYXR0ZXJuKFwiXCIsIFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTik7XG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0cyh0aW1ldW5pdFRleHQpIHtcbiAgICBjb25zdCBmcmFnbWVudHMgPSB7fTtcbiAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRpbWV1bml0VGV4dDtcbiAgICBsZXQgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpO1xuICAgICAgICByZW1haW5pbmdUZXh0ID0gcmVtYWluaW5nVGV4dC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudHM7XG59XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gcGFyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKTtcbiAgICBjb25zdCB1bml0ID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFsyXS50b0xvd2VyQ2FzZSgpXTtcbiAgICBmcmFnbWVudHNbdW5pdF0gPSBudW07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3Qgd2Vla3NfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi93ZWVrc1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKD86KD86XFxcXCx8XFxcXCh8XFxcXO+8iClcXFxccyopP1wiICtcbiAgICBcIig/OmFbbW5dXFxcXHMqPyk/XCIgK1xuICAgIFwiKD86KGRpZXNlW21uXXxsZXR6dGVbbW5dfG4oPzrDpHxhZSljaHN0ZVttbl0pXFxcXHMqKT9cIiArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZKX0pYCArXG4gICAgXCIoPzpcXFxccyooPzpcXFxcLHxcXFxcKXxcXFxc77yJKSk/XCIgK1xuICAgIFwiKD86XFxcXHMqKGRpZXNlfGxldHp0ZXxuKD86w6R8YWUpY2hzdGUpXFxcXHMqd29jaGUpP1wiICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFBSRUZJWF9HUk9VUCA9IDE7XG5jb25zdCBTVUZGSVhfR1JPVVAgPSAzO1xuY29uc3QgV0VFS0RBWV9HUk9VUCA9IDI7XG5jbGFzcyBERVdlZWtkYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG1hdGNoW1dFRUtEQVlfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWVtkYXlPZldlZWtdO1xuICAgICAgICBjb25zdCBwcmVmaXggPSBtYXRjaFtQUkVGSVhfR1JPVVBdO1xuICAgICAgICBjb25zdCBwb3N0Zml4ID0gbWF0Y2hbU1VGRklYX0dST1VQXTtcbiAgICAgICAgbGV0IG1vZGlmaWVyV29yZCA9IHByZWZpeCB8fCBwb3N0Zml4O1xuICAgICAgICBtb2RpZmllcldvcmQgPSBtb2RpZmllcldvcmQgfHwgXCJcIjtcbiAgICAgICAgbW9kaWZpZXJXb3JkID0gbW9kaWZpZXJXb3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtb2RpZmllciA9IG51bGw7XG4gICAgICAgIGlmIChtb2RpZmllcldvcmQubWF0Y2goL2xldHp0ZS8pKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibGFzdFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyV29yZC5tYXRjaCgvY2hzdGUvKSkge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcIm5leHRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RpZmllcldvcmQubWF0Y2goL2RpZXNlLykpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJ0aGlzXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHdlZWtzXzEudG9EYXlKU1dlZWtkYXkoY29udGV4dC5yZWZEYXRlLCBvZmZzZXQsIG1vZGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICAgICAgICAgIC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpXG4gICAgICAgICAgICAuYXNzaWduKFwid2Vla2RheVwiLCBvZmZzZXQpXG4gICAgICAgICAgICAuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpXG4gICAgICAgICAgICAuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKVxuICAgICAgICAgICAgLmltcGx5KFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gREVXZWVrZGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY2xhc3MgREVNZXJnZURhdGVSYW5nZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gL15cXHMqKGJpcyg/OlxccyooPzphbXx6dW0pKT98LSlcXHMqJC9pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERFTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNsYXNzIERFTWVyZ2VEYXRlVGltZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXlxcXFxzKihUfHVtfGFtfCx8LSk/XFxcXHMqJFwiKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBERU1lcmdlRGF0ZVRpbWVSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IHRpbWV1bml0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3RpbWV1bml0c1wiKTtcbmNsYXNzIERFQ2FzdWFsVGltZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gLyhkaWVzZW4pP1xccyoobW9yZ2VufHZvcm1pdHRhZ3xtaXR0YWdzP3xuYWNobWl0dGFnfGFiZW5kfG5hY2h0fG1pdHRlcm5hY2h0KSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCB0aW1lS2V5d29yZFBhdHRlcm4gPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIGRheWpzXzIuaW1wbHlTaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICByZXR1cm4gREVDYXN1YWxUaW1lUGFyc2VyLmV4dHJhY3RUaW1lQ29tcG9uZW50cyhjb21wb25lbnQsIHRpbWVLZXl3b3JkUGF0dGVybik7XG4gICAgfVxuICAgIHN0YXRpYyBleHRyYWN0VGltZUNvbXBvbmVudHMoY29tcG9uZW50LCB0aW1lS2V5d29yZFBhdHRlcm4pIHtcbiAgICAgICAgc3dpdGNoICh0aW1lS2V5d29yZFBhdHRlcm4pIHtcbiAgICAgICAgICAgIGNhc2UgXCJtb3JnZW5cIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidm9ybWl0dGFnXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA5KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1pdHRhZ1wiOlxuICAgICAgICAgICAgY2FzZSBcIm1pdHRhZ3NcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5hY2htaXR0YWdcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE1KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImFiZW5kXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxOCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJuYWNodFwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMjIpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWl0dGVybmFjaHRcIjpcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldChcImhvdXJcIikgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHRpbWV1bml0c18xLmFkZEltcGxpZWRUaW1lVW5pdHMoY29tcG9uZW50LCB7IFwiZGF5XCI6IDEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERFQ2FzdWFsVGltZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBkYXlqc18yID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL2RheWpzXCIpO1xuY29uc3QgREVDYXN1YWxUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vREVDYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoamV0enR8aGV1dGV8bW9yZ2VufMO8YmVybW9yZ2VufHVlYmVybW9yZ2VufGdlc3Rlcm58dm9yZ2VzdGVybnxsZXR6dGVcXFxccypuYWNodClgICtcbiAgICBgKD86XFxcXHMqKG1vcmdlbnx2b3JtaXR0YWd8bWl0dGFncz98bmFjaG1pdHRhZ3xhYmVuZHxuYWNodHxtaXR0ZXJuYWNodCkpP2AgK1xuICAgIGAoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbmNvbnN0IERBVEVfR1JPVVAgPSAxO1xuY29uc3QgVElNRV9HUk9VUCA9IDI7XG5jbGFzcyBERUNhc3VhbERhdGVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBsZXQgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCBkYXRlS2V5d29yZCA9IChtYXRjaFtEQVRFX0dST1VQXSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1lS2V5d29yZCA9IChtYXRjaFtUSU1FX0dST1VQXSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKGRhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICBjYXNlIFwiamV0enRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSByZWZlcmVuY2VzLm5vdyhjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImhldXRlXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gcmVmZXJlbmNlcy50b2RheShjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vcmdlblwiOlxuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduVGhlTmV4dERheShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIsO8YmVybW9yZ2VuXCI6XG4gICAgICAgICAgICBjYXNlIFwidWViZXJtb3JnZW5cIjpcbiAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ2VzdGVyblwiOlxuICAgICAgICAgICAgICAgIHRhcmdldERhdGUgPSB0YXJnZXREYXRlLmFkZCgtMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGRheWpzXzIuaW1wbHlTaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZvcmdlc3Rlcm5cIjpcbiAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTIsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICBkYXlqc18yLmltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVLZXl3b3JkLm1hdGNoKC9sZXR6dGVcXHMqbmFjaHQvKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RGF0ZS5ob3VyKCkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTEsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVLZXl3b3JkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQgPSBERUNhc3VhbFRpbWVQYXJzZXJfMS5kZWZhdWx0LmV4dHJhY3RUaW1lQ29tcG9uZW50cyhjb21wb25lbnQsIHRpbWVLZXl3b3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERFQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IGNvbnN0YW50c18yID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzphbVxcXFxzKj8pP1wiICtcbiAgICBcIig/OmRlblxcXFxzKj8pP1wiICtcbiAgICBgKFswLTldezEsMn0pXFxcXC5gICtcbiAgICBgKD86XFxcXHMqKD86YmlzKD86XFxcXHMqKD86YW18enVtKSk/fFxcXFwtfFxcXFzigJN8XFxcXHMpXFxcXHMqKFswLTldezEsMn0pXFxcXC4/KT9cXFxccypgICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pYCArXG4gICAgYCg/Oig/Oi18L3wsP1xcXFxzKikoJHtjb25zdGFudHNfMi5ZRUFSX1BBVFRFUk59KD8hW15cXFxcc11cXFxcZCkpKT9gICtcbiAgICBgKD89XFxcXFd8JClgLCBcImlcIik7XG5jb25zdCBEQVRFX0dST1VQID0gMTtcbmNvbnN0IERBVEVfVE9fR1JPVVAgPSAyO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDM7XG5jb25zdCBZRUFSX0dST1VQID0gNDtcbmNsYXNzIERFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtEQVRFX0dST1VQXSk7XG4gICAgICAgIGlmIChkYXkgPiAzMSkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoW0RBVEVfR1JPVVBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJtb250aFwiLCBtb250aCk7XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJkYXlcIiwgZGF5KTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyTnVtYmVyID0gY29uc3RhbnRzXzIucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ5ZWFyXCIsIHllYXJOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW0RBVEVfVE9fR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCBlbmREYXRlID0gcGFyc2VJbnQobWF0Y2hbREFURV9UT19HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LmVuZCA9IHJlc3VsdC5zdGFydC5jbG9uZSgpO1xuICAgICAgICAgICAgcmVzdWx0LmVuZC5hc3NpZ24oXCJkYXlcIiwgZW5kRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBERU1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5zdHJpY3QgPSBleHBvcnRzLmNhc3VhbCA9IHZvaWQgMDtcbmNvbnN0IGNvbmZpZ3VyYXRpb25zXzEgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlndXJhdGlvbnNcIik7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IElTT0Zvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9jb21tb24vcGFyc2Vycy9JU09Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgREVUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvREVUaW1lRXhwcmVzc2lvblBhcnNlclwiKSk7XG5jb25zdCBERVdlZWtkYXlQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0RFV2Vla2RheVBhcnNlclwiKSk7XG5jb25zdCBERU1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL0RFTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXCIpKTtcbmNvbnN0IERFTWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9ERU1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNvbnN0IERFQ2FzdWFsRGF0ZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvREVDYXN1YWxEYXRlUGFyc2VyXCIpKTtcbmNvbnN0IERFQ2FzdWFsVGltZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvREVDYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmNvbnN0IERFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9ERU1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlclwiKSk7XG5leHBvcnRzLmNhc3VhbCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbigpKTtcbmV4cG9ydHMuc3RyaWN0ID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDb25maWd1cmF0aW9uKHRydWUpKTtcbmZ1bmN0aW9uIHBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKTtcbn1cbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbikge1xuICAgIHJldHVybiBleHBvcnRzLmNhc3VhbC5wYXJzZURhdGUodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZURhdGUgPSBwYXJzZURhdGU7XG5mdW5jdGlvbiBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKGxpdHRsZUVuZGlhbiA9IHRydWUpIHtcbiAgICBjb25zdCBvcHRpb24gPSBjcmVhdGVDb25maWd1cmF0aW9uKGZhbHNlLCBsaXR0bGVFbmRpYW4pO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IERFQ2FzdWFsVGltZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgREVDYXN1YWxEYXRlUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICByZXR1cm4gb3B0aW9uO1xufVxuZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbjtcbmZ1bmN0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oc3RyaWN0TW9kZSA9IHRydWUsIGxpdHRsZUVuZGlhbiA9IHRydWUpIHtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbnNfMS5pbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbih7XG4gICAgICAgIHBhcnNlcnM6IFtcbiAgICAgICAgICAgIG5ldyBJU09Gb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgU2xhc2hEYXRlRm9ybWF0UGFyc2VyXzEuZGVmYXVsdChsaXR0bGVFbmRpYW4pLFxuICAgICAgICAgICAgbmV3IERFVGltZUV4cHJlc3Npb25QYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgREVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgREVXZWVrZGF5UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICBdLFxuICAgICAgICByZWZpbmVyczogW25ldyBERU1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IERFTWVyZ2VEYXRlVGltZVJlZmluZXJfMS5kZWZhdWx0KCldLFxuICAgIH0sIHN0cmljdE1vZGUpO1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNsYXNzIEZSQ2FzdWFsRGF0ZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gLyhtYWludGVuYW50fGF1am91cmQnaHVpfGRlbWFpbnxoaWVyfGNldHRlXFxzKm51aXR8bGFcXHMqdmVpbGxlKSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgbGV0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgbG93ZXJUZXh0ID0gbWF0Y2hbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKGxvd2VyVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcIm1haW50ZW5hbnRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5ub3coY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgICAgIGNhc2UgXCJhdWpvdXJkJ2h1aVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwiaGllclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnllc3RlcmRheShjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcImRlbWFpblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbW9ycm93KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChsb3dlclRleHQubWF0Y2goL2NldHRlXFxzKm51aXQvKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMjIpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobG93ZXJUZXh0Lm1hdGNoKC9sYVxccyp2ZWlsbGUvKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTEsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgICAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJDYXN1YWxEYXRlUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY2xhc3MgRlJDYXN1YWxUaW1lUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybihjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAvKGNldD8pP1xccyoobWF0aW58c29pcnxhcHLDqHMtbWlkaXxhcHJlbXxhIG1pZGl8w6AgbWludWl0KSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4TG93ZXIgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIHN3aXRjaCAoc3VmZml4TG93ZXIpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhcHLDqHMtbWlkaVwiOlxuICAgICAgICAgICAgY2FzZSBcImFwcmVtXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxNCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNvaXJcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE4KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWF0aW5cIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDgpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhIG1pZGlcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiw6AgbWludWl0XCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZSQ2FzdWFsVGltZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJcIik7XG5jbGFzcyBGUlRpbWVFeHByZXNzaW9uUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xLkFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIge1xuICAgIHByaW1hcnlQcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBcIig/Oig/OlvDoGFdKVxcXFxzKik/XCI7XG4gICAgfVxuICAgIGZvbGxvd2luZ1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gXCJcXFxccyooPzpcXFxcLXxcXFxc4oCTfFxcXFx+fFxcXFzjgJx8W8OgYV18XFxcXD8pXFxcXHMqXCI7XG4gICAgfVxuICAgIGV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgaWYgKG1hdGNoWzBdLm1hdGNoKC9eXFxzKlxcZHs0fVxccyokLykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5leHRyYWN0UHJpbWFyeVRpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlRpbWVFeHByZXNzaW9uUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNsYXNzIEZSTWVyZ2VEYXRlVGltZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXlxcXFxzKihUfMOgfGF8dmVyc3xkZXwsfC0pP1xcXFxzKiRcIik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJNZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXCIpKTtcbmNsYXNzIEZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIC9eXFxzKijDoHxhfC0pXFxzKiQvaTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUk1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVRpbWVVbml0cyA9IGV4cG9ydHMuVElNRV9VTklUU19QQVRURVJOID0gZXhwb3J0cy5wYXJzZVllYXIgPSBleHBvcnRzLllFQVJfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VOdW1iZXJQYXR0ZXJuID0gZXhwb3J0cy5OVU1CRVJfUEFUVEVSTiA9IGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkgPSBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZID0gZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0gZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB2b2lkIDA7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0ge1xuICAgIFwiZGltYW5jaGVcIjogMCxcbiAgICBcImRpbVwiOiAwLFxuICAgIFwibHVuZGlcIjogMSxcbiAgICBcImx1blwiOiAxLFxuICAgIFwibWFyZGlcIjogMixcbiAgICBcIm1hclwiOiAyLFxuICAgIFwibWVyY3JlZGlcIjogMyxcbiAgICBcIm1lclwiOiAzLFxuICAgIFwiamV1ZGlcIjogNCxcbiAgICBcImpldVwiOiA0LFxuICAgIFwidmVuZHJlZGlcIjogNSxcbiAgICBcInZlblwiOiA1LFxuICAgIFwic2FtZWRpXCI6IDYsXG4gICAgXCJzYW1cIjogNixcbn07XG5leHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJqYW52aWVyXCI6IDEsXG4gICAgXCJqYW5cIjogMSxcbiAgICBcImphbi5cIjogMSxcbiAgICBcImbDqXZyaWVyXCI6IDIsXG4gICAgXCJmw6l2XCI6IDIsXG4gICAgXCJmw6l2LlwiOiAyLFxuICAgIFwiZmV2cmllclwiOiAyLFxuICAgIFwiZmV2XCI6IDIsXG4gICAgXCJmZXYuXCI6IDIsXG4gICAgXCJtYXJzXCI6IDMsXG4gICAgXCJtYXJcIjogMyxcbiAgICBcIm1hci5cIjogMyxcbiAgICBcImF2cmlsXCI6IDQsXG4gICAgXCJhdnJcIjogNCxcbiAgICBcImF2ci5cIjogNCxcbiAgICBcIm1haVwiOiA1LFxuICAgIFwianVpblwiOiA2LFxuICAgIFwianVuXCI6IDYsXG4gICAgXCJqdWlsbGV0XCI6IDcsXG4gICAgXCJqdWlsXCI6IDcsXG4gICAgXCJqdWxcIjogNyxcbiAgICBcImp1bC5cIjogNyxcbiAgICBcImFvw7t0XCI6IDgsXG4gICAgXCJhb3V0XCI6IDgsXG4gICAgXCJzZXB0ZW1icmVcIjogOSxcbiAgICBcInNlcFwiOiA5LFxuICAgIFwic2VwLlwiOiA5LFxuICAgIFwic2VwdFwiOiA5LFxuICAgIFwic2VwdC5cIjogOSxcbiAgICBcIm9jdG9icmVcIjogMTAsXG4gICAgXCJvY3RcIjogMTAsXG4gICAgXCJvY3QuXCI6IDEwLFxuICAgIFwibm92ZW1icmVcIjogMTEsXG4gICAgXCJub3ZcIjogMTEsXG4gICAgXCJub3YuXCI6IDExLFxuICAgIFwiZMOpY2VtYnJlXCI6IDEyLFxuICAgIFwiZGVjZW1icmVcIjogMTIsXG4gICAgXCJkZWNcIjogMTIsXG4gICAgXCJkZWMuXCI6IDEyLFxufTtcbmV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJ1blwiOiAxLFxuICAgIFwiZGV1eFwiOiAyLFxuICAgIFwidHJvaXNcIjogMyxcbiAgICBcInF1YXRyZVwiOiA0LFxuICAgIFwiY2lucVwiOiA1LFxuICAgIFwic2l4XCI6IDYsXG4gICAgXCJzZXB0XCI6IDcsXG4gICAgXCJodWl0XCI6IDgsXG4gICAgXCJuZXVmXCI6IDksXG4gICAgXCJkaXhcIjogMTAsXG4gICAgXCJvbnplXCI6IDExLFxuICAgIFwiZG91emVcIjogMTIsXG4gICAgXCJ0cmVpemVcIjogMTMsXG59O1xuZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IHtcbiAgICBcInNlY1wiOiBcInNlY29uZFwiLFxuICAgIFwic2Vjb25kZVwiOiBcInNlY29uZFwiLFxuICAgIFwic2Vjb25kZXNcIjogXCJzZWNvbmRcIixcbiAgICBcIm1pblwiOiBcIm1pbnV0ZVwiLFxuICAgIFwibWluc1wiOiBcIm1pbnV0ZVwiLFxuICAgIFwibWludXRlXCI6IFwibWludXRlXCIsXG4gICAgXCJtaW51dGVzXCI6IFwibWludXRlXCIsXG4gICAgXCJoXCI6IFwiaG91clwiLFxuICAgIFwiaHJcIjogXCJob3VyXCIsXG4gICAgXCJocnNcIjogXCJob3VyXCIsXG4gICAgXCJoZXVyZVwiOiBcImhvdXJcIixcbiAgICBcImhldXJlc1wiOiBcImhvdXJcIixcbiAgICBcImpvdXJcIjogXCJkXCIsXG4gICAgXCJqb3Vyc1wiOiBcImRcIixcbiAgICBcInNlbWFpbmVcIjogXCJ3ZWVrXCIsXG4gICAgXCJzZW1haW5lc1wiOiBcIndlZWtcIixcbiAgICBcIm1vaXNcIjogXCJtb250aFwiLFxuICAgIFwidHJpbWVzdHJlXCI6IFwicXVhcnRlclwiLFxuICAgIFwidHJpbWVzdHJlc1wiOiBcInF1YXJ0ZXJcIixcbiAgICBcImFuc1wiOiBcInllYXJcIixcbiAgICBcImFubsOpZVwiOiBcInllYXJcIixcbiAgICBcImFubsOpZXNcIjogXCJ5ZWFyXCIsXG59O1xuZXhwb3J0cy5OVU1CRVJfUEFUVEVSTiA9IGAoPzoke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSl9fFswLTldK3xbMC05XStcXFxcLlswLTldK3x1bmU/fHF1ZWxxdWVzP3xkZW1pLT8pYDtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IG1hdGNoLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZW251bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bSA9PT0gXCJ1bmVcIiB8fCBudW0gPT09IFwidW5cIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9xdWVscXVlcz8vKSkge1xuICAgICAgICByZXR1cm4gMztcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtLm1hdGNoKC9kZW1pLT8vKSkge1xuICAgICAgICByZXR1cm4gMC41O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW0pO1xufVxuZXhwb3J0cy5wYXJzZU51bWJlclBhdHRlcm4gPSBwYXJzZU51bWJlclBhdHRlcm47XG5leHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBgKD86WzAtOV17MSwyfSg/OmVyKT8pYDtcbmZ1bmN0aW9uIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4obWF0Y2gpIHtcbiAgICBsZXQgbnVtID0gbWF0Y2gudG9Mb3dlckNhc2UoKTtcbiAgICBudW0gPSBudW0ucmVwbGFjZSgvKD86ZXIpJC9pLCBcIlwiKTtcbiAgICByZXR1cm4gcGFyc2VJbnQobnVtKTtcbn1cbmV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm47XG5leHBvcnRzLllFQVJfUEFUVEVSTiA9IGAoPzpbMS05XVswLTldezAsM31cXFxccyooPzpBQ3xBRHxwXFxcXC5cXFxccypDKD86aHI/KT9cXFxcLlxcXFxzKm5cXFxcLil8WzEtMl1bMC05XXszfXxbNS05XVswLTldKWA7XG5mdW5jdGlvbiBwYXJzZVllYXIobWF0Y2gpIHtcbiAgICBpZiAoL0FDL2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9CQy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaCk7XG4gICAgfVxuICAgIGlmICgvQUQvaS50ZXN0KG1hdGNoKSB8fCAvQy9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvW15cXGRdKy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoKTtcbiAgICB9XG4gICAgbGV0IHllYXJOdW1iZXIgPSBwYXJzZUludChtYXRjaCk7XG4gICAgaWYgKHllYXJOdW1iZXIgPCAxMDApIHtcbiAgICAgICAgaWYgKHllYXJOdW1iZXIgPiA1MCkge1xuICAgICAgICAgICAgeWVhck51bWJlciA9IHllYXJOdW1iZXIgKyAxOTAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWVhck51bWJlciA9IHllYXJOdW1iZXIgKyAyMDAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5ZWFyTnVtYmVyO1xufVxuZXhwb3J0cy5wYXJzZVllYXIgPSBwYXJzZVllYXI7XG5jb25zdCBTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4gPSBgKCR7ZXhwb3J0cy5OVU1CRVJfUEFUVEVSTn0pXFxcXHN7MCw1fSgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSl9KVxcXFxzezAsNX1gO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9SRUdFWCA9IG5ldyBSZWdFeHAoU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOLCBcImlcIik7XG5leHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IHBhdHRlcm5fMS5yZXBlYXRlZFRpbWV1bml0UGF0dGVybihcIlwiLCBTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4pO1xuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdHModGltZXVuaXRUZXh0KSB7XG4gICAgY29uc3QgZnJhZ21lbnRzID0ge307XG4gICAgbGV0IHJlbWFpbmluZ1RleHQgPSB0aW1ldW5pdFRleHQ7XG4gICAgbGV0IG1hdGNoID0gU0lOR0xFX1RJTUVfVU5JVF9SRUdFWC5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKTtcbiAgICAgICAgcmVtYWluaW5nVGV4dCA9IHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgIG1hdGNoID0gU0lOR0xFX1RJTUVfVU5JVF9SRUdFWC5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRzO1xufVxuZXhwb3J0cy5wYXJzZVRpbWVVbml0cyA9IHBhcnNlVGltZVVuaXRzO1xuZnVuY3Rpb24gY29sbGVjdERhdGVUaW1lRnJhZ21lbnQoZnJhZ21lbnRzLCBtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaFsxXSk7XG4gICAgY29uc3QgdW5pdCA9IGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUllbbWF0Y2hbMl0udG9Mb3dlckNhc2UoKV07XG4gICAgZnJhZ21lbnRzW3VuaXRdID0gbnVtO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHdlZWtzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24vd2Vla3NcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Oig/OlxcXFwsfFxcXFwofFxcXFzvvIgpXFxcXHMqKT9cIiArXG4gICAgXCIoPzooPzpjZSlcXFxccyopP1wiICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUlkpfSlgICtcbiAgICBcIig/OlxcXFxzKig/OlxcXFwsfFxcXFwpfFxcXFzvvIkpKT9cIiArXG4gICAgXCIoPzpcXFxccyooZGVybmllcnxwcm9jaGFpbilcXFxccyopP1wiICtcbiAgICBcIig/PVxcXFxXfFxcXFxkfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFdFRUtEQVlfR1JPVVAgPSAxO1xuY29uc3QgUE9TVEZJWF9HUk9VUCA9IDI7XG5jbGFzcyBGUldlZWtkYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG1hdGNoW1dFRUtEQVlfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWVtkYXlPZldlZWtdO1xuICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdWZmaXggPSBtYXRjaFtQT1NURklYX0dST1VQXTtcbiAgICAgICAgc3VmZml4ID0gc3VmZml4IHx8IFwiXCI7XG4gICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgbW9kaWZpZXIgPSBudWxsO1xuICAgICAgICBpZiAoc3VmZml4ID09IFwiZGVybmllclwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibGFzdFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1ZmZpeCA9PSBcInByb2NoYWluXCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJuZXh0XCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHdlZWtzXzEudG9EYXlKU1dlZWtkYXkoY29udGV4dC5yZWZEYXRlLCBvZmZzZXQsIG1vZGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICAgICAgICAgIC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpXG4gICAgICAgICAgICAuYXNzaWduKFwid2Vla2RheVwiLCBvZmZzZXQpXG4gICAgICAgICAgICAuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpXG4gICAgICAgICAgICAuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKVxuICAgICAgICAgICAgLmltcGx5KFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJXZWVrZGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgRklSU1RfUkVHX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKF58XFxcXHN8VClcIiArXG4gICAgXCIoPzooPzpbw6BhXSlcXFxccyopP1wiICtcbiAgICBcIihcXFxcZHsxLDJ9KSg/Omh8Oik/XCIgK1xuICAgIFwiKD86KFxcXFxkezEsMn0pKD86bXw6KT8pP1wiICtcbiAgICBcIig/OihcXFxcZHsxLDJ9KSg/OnN8Oik/KT9cIiArXG4gICAgXCIoPzpcXFxccyooQVxcXFwuTVxcXFwufFBcXFxcLk1cXFxcLnxBTT98UE0/KSk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgU0VDT05EX1JFR19QQVRURVJOID0gbmV3IFJlZ0V4cChcIl5cXFxccyooXFxcXC18XFxcXOKAk3xcXFxcfnxcXFxc44CcfFvDoGFdfFxcXFw/KVxcXFxzKlwiICtcbiAgICBcIihcXFxcZHsxLDJ9KSg/Omh8Oik/XCIgK1xuICAgIFwiKD86KFxcXFxkezEsMn0pKD86bXw6KT8pP1wiICtcbiAgICBcIig/OihcXFxcZHsxLDJ9KSg/OnN8Oik/KT9cIiArXG4gICAgXCIoPzpcXFxccyooQVxcXFwuTVxcXFwufFBcXFxcLk1cXFxcLnxBTT98UE0/KSk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgSE9VUl9HUk9VUCA9IDI7XG5jb25zdCBNSU5VVEVfR1JPVVAgPSAzO1xuY29uc3QgU0VDT05EX0dST1VQID0gNDtcbmNvbnN0IEFNX1BNX0hPVVJfR1JPVVAgPSA1O1xuY2xhc3MgRlJTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyIHtcbiAgICBwYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIEZJUlNUX1JFR19QQVRURVJOO1xuICAgIH1cbiAgICBleHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCArIG1hdGNoWzFdLmxlbmd0aCwgbWF0Y2hbMF0uc3Vic3RyaW5nKG1hdGNoWzFdLmxlbmd0aCkpO1xuICAgICAgICBpZiAocmVzdWx0LnRleHQubWF0Y2goL15cXGR7NH0kLykpIHtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydCA9IEZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlci5leHRyYWN0VGltZUNvbXBvbmVudChyZXN1bHQuc3RhcnQuY2xvbmUoKSwgbWF0Y2gpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydCkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nVGV4dCA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBzZWNvbmRNYXRjaCA9IFNFQ09ORF9SRUdfUEFUVEVSTi5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgICAgICBpZiAoc2Vjb25kTWF0Y2gpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSBGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXIuZXh0cmFjdFRpbWVDb21wb25lbnQocmVzdWx0LnN0YXJ0LmNsb25lKCksIHNlY29uZE1hdGNoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRleHQgKz0gc2Vjb25kTWF0Y2hbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3RhdGljIGV4dHJhY3RUaW1lQ29tcG9uZW50KGV4dHJhY3RpbmdDb21wb25lbnRzLCBtYXRjaCkge1xuICAgICAgICBsZXQgaG91ciA9IDA7XG4gICAgICAgIGxldCBtaW51dGUgPSAwO1xuICAgICAgICBsZXQgbWVyaWRpZW0gPSBudWxsO1xuICAgICAgICBob3VyID0gcGFyc2VJbnQobWF0Y2hbSE9VUl9HUk9VUF0pO1xuICAgICAgICBpZiAobWF0Y2hbTUlOVVRFX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtaW51dGUgPSBwYXJzZUludChtYXRjaFtNSU5VVEVfR1JPVVBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWludXRlID49IDYwIHx8IGhvdXIgPiAyNCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvdXIgPj0gMTIpIHtcbiAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5QTTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbQU1fUE1fSE9VUl9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPiAxMilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFtcG0gPSBtYXRjaFtBTV9QTV9IT1VSX0dST1VQXVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJhXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uQU07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJwXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uUE07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgIT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBob3VyKTtcbiAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwibWludXRlXCIsIG1pbnV0ZSk7XG4gICAgICAgIGlmIChtZXJpZGllbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgbWVyaWRpZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RpbmdDb21wb25lbnRzLmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0aW5nQ29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtTRUNPTkRfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoW1NFQ09ORF9HUk9VUF0pO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSA2MClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGV4dHJhY3RpbmdDb21wb25lbnRzLmFzc2lnbihcInNlY29uZFwiLCBzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRyYWN0aW5nQ29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKD86b25cXFxccyo/KT9cIiArXG4gICAgYCgke2NvbnN0YW50c18zLk9SRElOQUxfTlVNQkVSX1BBVFRFUk59KWAgK1xuICAgIGAoPzpcXFxccyooPzphdXxcXFxcLXxcXFxc4oCTfGp1c3F1J2F1P3xcXFxccylcXFxccyooJHtjb25zdGFudHNfMy5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSkpP2AgK1xuICAgIGAoPzotfC98XFxcXHMqKD86ZGUpP1xcXFxzKilgICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pYCArXG4gICAgYCg/Oig/Oi18L3wsP1xcXFxzKikoJHtjb25zdGFudHNfMi5ZRUFSX1BBVFRFUk59KD8hW15cXFxcc11cXFxcZCkpKT9gICtcbiAgICBgKD89XFxcXFd8JClgLCBcImlcIik7XG5jb25zdCBEQVRFX0dST1VQID0gMTtcbmNvbnN0IERBVEVfVE9fR1JPVVAgPSAyO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDM7XG5jb25zdCBZRUFSX0dST1VQID0gNDtcbmNsYXNzIEZSTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb25zdCBkYXkgPSBjb25zdGFudHNfMy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbREFURV9HUk9VUF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImRheVwiLCBkYXkpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJOdW1iZXIgPSBjb25zdGFudHNfMi5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInllYXJcIiwgeWVhck51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBjb25zdGFudHNfMy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfVE9fR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSByZXN1bHQuc3RhcnQuY2xvbmUoKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwiZGF5XCIsIGVuZERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgdGltZXVuaXRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvdGltZXVuaXRzXCIpO1xuY2xhc3MgRlJUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgaWwgeSBhXFxcXHMqKCR7Y29uc3RhbnRzXzEuVElNRV9VTklUU19QQVRURVJOfSkoPz0oPzpcXFxcV3wkKSlgLCBcImlcIik7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IG91dHB1dFRpbWVVbml0cyA9IHRpbWV1bml0c18xLnJldmVyc2VUaW1lVW5pdHModGltZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgb3V0cHV0VGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNsYXNzIEZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgKD86ZGFuc3xlbnxwb3VyfHBlbmRhbnQpXFxcXHMqKCR7Y29uc3RhbnRzXzEuVElNRV9VTklUU19QQVRURVJOfSkoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVVbml0cyA9IGNvbnN0YW50c18xLnBhcnNlVGltZVVuaXRzKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHRpbWV1bml0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3RpbWV1bml0c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY2xhc3MgRlJUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgKD86bGVzP3xsYXxsJ3xkdXxkZXM/KVxcXFxzKmAgK1xuICAgICAgICAgICAgYCgke2NvbnN0YW50c18xLk5VTUJFUl9QQVRURVJOfSk/YCArXG4gICAgICAgICAgICBgKD86XFxcXHMqKHByb2NoYWluZT9zP3xkZXJuaVtlw6hdcmU/cz98cGFzc1vDqWVdZT9zP3xwclvDqWVdY1vDqWVdZGVudHM/fHN1aXZhbnRlP3M/KSk/YCArXG4gICAgICAgICAgICBgXFxcXHMqKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5USU1FX1VOSVRfRElDVElPTkFSWSl9KWAgK1xuICAgICAgICAgICAgYCg/OlxcXFxzKihwcm9jaGFpbmU/cz98ZGVybmlbZcOoXXJlP3M/fHBhc3Nbw6llXWU/cz98cHJbw6llXWNbw6llXWRlbnRzP3xzdWl2YW50ZT9zPykpP2AsIFwiaVwiKTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IG1hdGNoWzFdID8gY29uc3RhbnRzXzEucGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKSA6IDE7XG4gICAgICAgIGNvbnN0IHVuaXQgPSBjb25zdGFudHNfMS5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFszXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgbGV0IHRpbWVVbml0cyA9IHt9O1xuICAgICAgICB0aW1lVW5pdHNbdW5pdF0gPSBudW07XG4gICAgICAgIGxldCBtb2RpZmllciA9IG1hdGNoWzJdIHx8IG1hdGNoWzRdIHx8IFwiXCI7XG4gICAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvZGVybmlbZcOoXXJlP3M/Ly50ZXN0KG1vZGlmaWVyKSB8fCAvcGFzc1vDqWVdZT9zPy8udGVzdChtb2RpZmllcikgfHwgL3ByW8OpZV1jW8OpZV1kZW50cz8vLnRlc3QobW9kaWZpZXIpKSB7XG4gICAgICAgICAgICB0aW1lVW5pdHMgPSB0aW1ldW5pdHNfMS5yZXZlcnNlVGltZVVuaXRzKHRpbWVVbml0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvbmZpZ3VyYXRpb24gPSBleHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBleHBvcnRzLnBhcnNlRGF0ZSA9IGV4cG9ydHMucGFyc2UgPSBleHBvcnRzLnN0cmljdCA9IGV4cG9ydHMuY2FzdWFsID0gdm9pZCAwO1xuY29uc3QgY29uZmlndXJhdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWd1cmF0aW9uc1wiKTtcbmNvbnN0IGNocm9ub18xID0gcmVxdWlyZShcIi4uLy4uL2Nocm9ub1wiKTtcbmNvbnN0IEZSQ2FzdWFsRGF0ZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJDYXN1YWxEYXRlUGFyc2VyXCIpKTtcbmNvbnN0IEZSQ2FzdWFsVGltZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJDYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmNvbnN0IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9jb21tb24vcGFyc2Vycy9TbGFzaERhdGVGb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgRlJUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJUaW1lRXhwcmVzc2lvblBhcnNlclwiKSk7XG5jb25zdCBGUk1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvRlJNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jb25zdCBGUk1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL0ZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXCIpKTtcbmNvbnN0IEZSV2Vla2RheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJXZWVrZGF5UGFyc2VyXCIpKTtcbmNvbnN0IEZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IEZSTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlclwiKSk7XG5jb25zdCBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0ZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgRlJUaW1lVW5pdFJlbGF0aXZlRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUlRpbWVVbml0UmVsYXRpdmVGb3JtYXRQYXJzZXJcIikpO1xuZXhwb3J0cy5jYXN1YWwgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24oKSk7XG5leHBvcnRzLnN0cmljdCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbih0cnVlKSk7XG5mdW5jdGlvbiBwYXJzZSh0ZXh0LCByZWYsIG9wdGlvbikge1xuICAgIHJldHVybiBleHBvcnRzLmNhc3VhbC5wYXJzZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXJzZURhdGUodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKTtcbn1cbmV4cG9ydHMucGFyc2VEYXRlID0gcGFyc2VEYXRlO1xuZnVuY3Rpb24gY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbihsaXR0bGVFbmRpYW4gPSB0cnVlKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbihmYWxzZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBGUkNhc3VhbERhdGVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEZSQ2FzdWFsVGltZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRlJUaW1lVW5pdFJlbGF0aXZlRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICByZXR1cm4gb3B0aW9uO1xufVxuZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbjtcbmZ1bmN0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oc3RyaWN0TW9kZSA9IHRydWUsIGxpdHRsZUVuZGlhbiA9IHRydWUpIHtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbnNfMS5pbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbih7XG4gICAgICAgIHBhcnNlcnM6IFtcbiAgICAgICAgICAgIG5ldyBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KGxpdHRsZUVuZGlhbiksXG4gICAgICAgICAgICBuZXcgRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgRlJUaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgRlJUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBGUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEZSV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgRlJNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IEZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9IYW5rYWt1ID0gdm9pZCAwO1xuZnVuY3Rpb24gdG9IYW5rYWt1KHRleHQpIHtcbiAgICByZXR1cm4gU3RyaW5nKHRleHQpXG4gICAgICAgIC5yZXBsYWNlKC9cXHUyMDE5L2csIFwiXFx1MDAyN1wiKVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAxRC9nLCBcIlxcdTAwMjJcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdTMwMDAvZywgXCJcXHUwMDIwXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHVGRkU1L2csIFwiXFx1MDBBNVwiKVxuICAgICAgICAucmVwbGFjZSgvW1xcdUZGMDFcXHVGRjAzLVxcdUZGMDZcXHVGRjA4XFx1RkYwOVxcdUZGMEMtXFx1RkYxOVxcdUZGMUMtXFx1RkYxRlxcdUZGMjEtXFx1RkYzQlxcdUZGM0RcXHVGRjNGXFx1RkY0MS1cXHVGRjVCXFx1RkY1RFxcdUZGNUVdL2csIGFscGhhTnVtKTtcbn1cbmV4cG9ydHMudG9IYW5rYWt1ID0gdG9IYW5rYWt1O1xuZnVuY3Rpb24gYWxwaGFOdW0odG9rZW4pIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0b2tlbi5jaGFyQ29kZUF0KDApIC0gNjUyNDgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgUEFUVEVSTiA9IC8oPzooPzooW+WQjOS7iuacrF0pfCgo5pit5ZKMfOW5s+aIkHzku6TlkowpPyhbMC0577yQLe+8mV17MSw0fXzlhYMpKSnlubRcXHMqKT8oWzAtOe+8kC3vvJldezEsMn0p5pyIXFxzKihbMC0577yQLe+8mV17MSwyfSnml6UvaTtcbmNvbnN0IFNQRUNJQUxfWUVBUl9HUk9VUCA9IDE7XG5jb25zdCBUWVBJQ0FMX1lFQVJfR1JPVVAgPSAyO1xuY29uc3QgRVJBX0dST1VQID0gMztcbmNvbnN0IFlFQVJfTlVNQkVSX0dST1VQID0gNDtcbmNvbnN0IE1PTlRIX0dST1VQID0gNTtcbmNvbnN0IERBWV9HUk9VUCA9IDY7XG5jbGFzcyBKUFN0YW5kYXJkUGFyc2VyIHtcbiAgICBwYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgZXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KGNvbnN0YW50c18xLnRvSGFua2FrdShtYXRjaFtNT05USF9HUk9VUF0pKTtcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoY29uc3RhbnRzXzEudG9IYW5rYWt1KG1hdGNoW0RBWV9HUk9VUF0pKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoe1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobWF0Y2hbU1BFQ0lBTF9ZRUFSX0dST1VQXSAmJiBtYXRjaFtTUEVDSUFMX1lFQVJfR1JPVVBdLm1hdGNoKFwi5ZCMfOS7inzmnKxcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vbWVudCA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIG1vbWVudC55ZWFyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtUWVBJQ0FMX1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyTnVtVGV4dCA9IG1hdGNoW1lFQVJfTlVNQkVSX0dST1VQXTtcbiAgICAgICAgICAgIGxldCB5ZWFyID0geWVhck51bVRleHQgPT0gXCLlhYNcIiA/IDEgOiBwYXJzZUludChjb25zdGFudHNfMS50b0hhbmtha3UoeWVhck51bVRleHQpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaFtFUkFfR1JPVVBdID09IFwi5Luk5ZKMXCIpIHtcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDIwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtFUkFfR1JPVVBdID09IFwi5bmz5oiQXCIpIHtcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDE5ODg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtFUkFfR1JPVVBdID09IFwi5pit5ZKMXCIpIHtcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gSlBTdGFuZGFyZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXCIpKTtcbmNsYXNzIEpQTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIC9eXFxzKijjgYvjgol844O8fC0pXFxzKiQvaTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBKUE1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgcmVmZXJlbmNlcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL2Nhc3VhbFJlZmVyZW5jZXNcIikpO1xuY29uc3QgUEFUVEVSTiA9IC/ku4rml6V85b2T5pelfOaYqOaXpXzmmI7ml6V85LuK5aScfOS7iuWklXzku4rmmal85LuK5pydL2k7XG5jbGFzcyBKUENhc3VhbERhdGVQYXJzZXIge1xuICAgIHBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBleHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFswXTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKHRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCLmmKjml6VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy55ZXN0ZXJkYXkoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgICAgIGNhc2UgXCLmmI7ml6VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b21vcnJvdyhjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcIuS7iuaXpVwiOlxuICAgICAgICAgICAgY2FzZSBcIuW9k+aXpVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHQgPT0gXCLku4rlpJxcIiB8fCB0ZXh0ID09IFwi5LuK5aSVXCIgfHwgdGV4dCA9PSBcIuS7iuaZqVwiKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiaG91clwiLCAyMik7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRleHQubWF0Y2goXCLku4rmnJ1cIikpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcImRheVwiLCBkYXRlLmRhdGUoKSk7XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSk7XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEpQQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5zdHJpY3QgPSBleHBvcnRzLmNhc3VhbCA9IHZvaWQgMDtcbmNvbnN0IEpQU3RhbmRhcmRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0pQU3RhbmRhcmRQYXJzZXJcIikpO1xuY29uc3QgSlBNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9KUE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jb25zdCBKUENhc3VhbERhdGVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0pQQ2FzdWFsRGF0ZVBhcnNlclwiKSk7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5leHBvcnRzLmNhc3VhbCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbigpKTtcbmV4cG9ydHMuc3RyaWN0ID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDb25maWd1cmF0aW9uKCkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEpQQ2FzdWFsRGF0ZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb247XG5mdW5jdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHBhcnNlcnM6IFtuZXcgSlBTdGFuZGFyZFBhcnNlcl8xLmRlZmF1bHQoKV0sXG4gICAgICAgIHJlZmluZXJzOiBbbmV3IEpQTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9O1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVllYXIgPSBleHBvcnRzLllFQVJfUEFUVEVSTiA9IGV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IGV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0gdm9pZCAwO1xuZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJkb21pbmdvXCI6IDAsXG4gICAgXCJkb21cIjogMCxcbiAgICBcInNlZ3VuZGFcIjogMSxcbiAgICBcInNlZ3VuZGEtZmVpcmFcIjogMSxcbiAgICBcInNlZ1wiOiAxLFxuICAgIFwidGVyw6dhXCI6IDIsXG4gICAgXCJ0ZXLDp2EtZmVpcmFcIjogMixcbiAgICBcInRlclwiOiAyLFxuICAgIFwicXVhcnRhXCI6IDMsXG4gICAgXCJxdWFydGEtZmVpcmFcIjogMyxcbiAgICBcInF1YVwiOiAzLFxuICAgIFwicXVpbnRhXCI6IDQsXG4gICAgXCJxdWludGEtZmVpcmFcIjogNCxcbiAgICBcInF1aVwiOiA0LFxuICAgIFwic2V4dGFcIjogNSxcbiAgICBcInNleHRhLWZlaXJhXCI6IDUsXG4gICAgXCJzZXhcIjogNSxcbiAgICBcInPDoWJhZG9cIjogNixcbiAgICBcInNhYmFkb1wiOiA2LFxuICAgIFwic2FiXCI6IDYsXG59O1xuZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0ge1xuICAgIFwiamFuZWlyb1wiOiAxLFxuICAgIFwiamFuXCI6IDEsXG4gICAgXCJqYW4uXCI6IDEsXG4gICAgXCJmZXZlcmVpcm9cIjogMixcbiAgICBcImZldlwiOiAyLFxuICAgIFwiZmV2LlwiOiAyLFxuICAgIFwibWFyw6dvXCI6IDMsXG4gICAgXCJtYXJcIjogMyxcbiAgICBcIm1hci5cIjogMyxcbiAgICBcImFicmlsXCI6IDQsXG4gICAgXCJhYnJcIjogNCxcbiAgICBcImFici5cIjogNCxcbiAgICBcIm1haW9cIjogNSxcbiAgICBcIm1haVwiOiA1LFxuICAgIFwibWFpLlwiOiA1LFxuICAgIFwianVuaG9cIjogNixcbiAgICBcImp1blwiOiA2LFxuICAgIFwianVuLlwiOiA2LFxuICAgIFwianVsaG9cIjogNyxcbiAgICBcImp1bFwiOiA3LFxuICAgIFwianVsLlwiOiA3LFxuICAgIFwiYWdvc3RvXCI6IDgsXG4gICAgXCJhZ29cIjogOCxcbiAgICBcImFnby5cIjogOCxcbiAgICBcInNldGVtYnJvXCI6IDksXG4gICAgXCJzZXRcIjogOSxcbiAgICBcInNldC5cIjogOSxcbiAgICBcIm91dHVicm9cIjogMTAsXG4gICAgXCJvdXRcIjogMTAsXG4gICAgXCJvdXQuXCI6IDEwLFxuICAgIFwibm92ZW1icm9cIjogMTEsXG4gICAgXCJub3ZcIjogMTEsXG4gICAgXCJub3YuXCI6IDExLFxuICAgIFwiZGV6ZW1icm9cIjogMTIsXG4gICAgXCJkZXpcIjogMTIsXG4gICAgXCJkZXouXCI6IDEyLFxufTtcbmV4cG9ydHMuWUVBUl9QQVRURVJOID0gXCJbMC05XXsxLDR9KD8hW15cXFxcc11cXFxcZCkoPzpcXFxccypbYXxkXVxcXFwuP1xcXFxzKmNcXFxcLj98XFxcXHMqYVxcXFwuP1xcXFxzKmRcXFxcLj8pP1wiO1xuZnVuY3Rpb24gcGFyc2VZZWFyKG1hdGNoKSB7XG4gICAgaWYgKG1hdGNoLm1hdGNoKC9eWzAtOV17MSw0fSQvKSkge1xuICAgICAgICBsZXQgeWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICAgICAgaWYgKHllYXJOdW1iZXIgPCAxMDApIHtcbiAgICAgICAgICAgIGlmICh5ZWFyTnVtYmVyID4gNTApIHtcbiAgICAgICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDE5MDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDIwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXJOdW1iZXI7XG4gICAgfVxuICAgIGlmIChtYXRjaC5tYXRjaCgvYVxcLj9cXHMqY1xcLj8vaSkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9hXFwuP1xccypjXFwuPy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChtYXRjaCk7XG59XG5leHBvcnRzLnBhcnNlWWVhciA9IHBhcnNlWWVhcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCB3ZWVrc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3dlZWtzXCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzooPzpcXFxcLHxcXFxcKHxcXFxc77yIKVxcXFxzKik/XCIgK1xuICAgIFwiKD86KGVzdGV8ZXN0YXxwYXNzYWRvfHByW2/Ds114aW1vKVxcXFxzKik/XCIgK1xuICAgIGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWSl9KWAgK1xuICAgIFwiKD86XFxcXHMqKD86XFxcXCx8XFxcXCl8XFxcXO+8iSkpP1wiICtcbiAgICBcIig/OlxcXFxzKihlc3RlfGVzdGF8cGFzc2Fkb3xwclvDs29deGltbylcXFxccypzZW1hbmEpP1wiICtcbiAgICBcIig/PVxcXFxXfFxcXFxkfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFBSRUZJWF9HUk9VUCA9IDE7XG5jb25zdCBXRUVLREFZX0dST1VQID0gMjtcbmNvbnN0IFBPU1RGSVhfR1JPVVAgPSAzO1xuY2xhc3MgUFRXZWVrZGF5UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBtYXRjaFtXRUVLREFZX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUllbZGF5T2ZXZWVrXTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaXggPSBtYXRjaFtQUkVGSVhfR1JPVVBdO1xuICAgICAgICBjb25zdCBwb3N0Zml4ID0gbWF0Y2hbUE9TVEZJWF9HUk9VUF07XG4gICAgICAgIGxldCBub3JtID0gcHJlZml4IHx8IHBvc3RmaXggfHwgXCJcIjtcbiAgICAgICAgbm9ybSA9IG5vcm0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gbnVsbDtcbiAgICAgICAgaWYgKG5vcm0gPT0gXCJwYXNzYWRvXCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJ0aGlzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9ybSA9PSBcInByw7N4aW1vXCIgfHwgbm9ybSA9PSBcInByb3hpbW9cIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcIm5leHRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub3JtID09IFwiZXN0ZVwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwidGhpc1wiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGUgPSB3ZWVrc18xLnRvRGF5SlNXZWVrZGF5KGNvbnRleHQucmVmRGF0ZSwgb2Zmc2V0LCBtb2RpZmllcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0XG4gICAgICAgICAgICAuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKVxuICAgICAgICAgICAgLmFzc2lnbihcIndlZWtkYXlcIiwgb2Zmc2V0KVxuICAgICAgICAgICAgLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKVxuICAgICAgICAgICAgLmltcGx5KFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSlcbiAgICAgICAgICAgIC5pbXBseShcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUV2Vla2RheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJcIik7XG5jbGFzcyBQVFRpbWVFeHByZXNzaW9uUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xLkFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIge1xuICAgIHByaW1hcnlQcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBcIig/Oig/OmFvP3zDoHM/fGRhc3xkYXxkZXxkbylcXFxccyopP1wiO1xuICAgIH1cbiAgICBmb2xsb3dpbmdQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxcXHMqKD86XFxcXC18XFxcXOKAk3xcXFxcfnxcXFxc44CcfGEoPzpvKT98XFxcXD8pXFxcXHMqXCI7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUFRUaW1lRXhwcmVzc2lvblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jbGFzcyBQVE1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl5cXFxccyooPzosfMOgKT9cXFxccyokXCIpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUTWVyZ2VEYXRlVGltZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBQVE1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyooPzotKVxccyokL2k7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUFRNZXJnZURhdGVSYW5nZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSkoPzrCunzCqnzCsCk/YCArXG4gICAgXCIoPzpcXFxccyooPzpkZXNkZXxkZXxcXFxcLXxcXFxc4oCTfGFvP3xcXFxccylcXFxccyooWzAtOV17MSwyfSkoPzrCunzCqnzCsCk/KT9cXFxccyooPzpkZSk/XFxcXHMqXCIgK1xuICAgIGAoPzotfC98XFxcXHMqKD86ZGV8LCk/XFxcXHMqKWAgK1xuICAgIGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSlgICtcbiAgICBgKD86XFxcXHMqKD86ZGV8LCk/XFxcXHMqKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSkpP2AgK1xuICAgIGAoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbmNvbnN0IERBVEVfR1JPVVAgPSAxO1xuY29uc3QgREFURV9UT19HUk9VUCA9IDI7XG5jb25zdCBNT05USF9OQU1FX0dST1VQID0gMztcbmNvbnN0IFlFQVJfR1JPVVAgPSA0O1xuY2xhc3MgUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCwgbWF0Y2hbMF0pO1xuICAgICAgICBjb25zdCBtb250aCA9IGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUllbbWF0Y2hbTU9OVEhfTkFNRV9HUk9VUF0udG9Mb3dlckNhc2UoKV07XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbREFURV9HUk9VUF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImRheVwiLCBkYXkpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJOdW1iZXIgPSBjb25zdGFudHNfMi5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInllYXJcIiwgeWVhck51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBwYXJzZUludChtYXRjaFtEQVRFX1RPX0dST1VQXSk7XG4gICAgICAgICAgICByZXN1bHQuZW5kID0gcmVzdWx0LnN0YXJ0LmNsb25lKCk7XG4gICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcImRheVwiLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNsYXNzIFBUQ2FzdWFsRGF0ZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gLyhhZ29yYXxob2plfGFtYW5oYXxhbWFuaMOjfG9udGVtKSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbG93ZXJUZXh0ID0gbWF0Y2hbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKGxvd2VyVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcImFnb3JhXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMubm93KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwiaG9qZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwiYW1hbmhhXCI6XG4gICAgICAgICAgICBjYXNlIFwiYW1hbmjDo1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbW9ycm93KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgICAgICBjYXNlIFwib250ZW1cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy55ZXN0ZXJkYXkoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IGRheWpzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCBkYXlqc18yID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jbGFzcyBQVENhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gLyg/OmVzdGFcXHMqKT8obWFuaGF8bWFuaMOjfHRhcmRlfG1laWEtbm9pdGV8bWVpby1kaWF8bm9pdGUpKD89XFxXfCQpL2k7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0YXJnZXREYXRlID0gZGF5anNfMi5kZWZhdWx0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChtYXRjaFsxXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwidGFyZGVcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE1KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub2l0ZVwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMjIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hbmhhXCI6XG4gICAgICAgICAgICBjYXNlIFwibWFuaMOjXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZWlhLW5vaXRlXCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMS5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1laW8tZGlhXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQVENhc3VhbFRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuc3RyaWN0ID0gZXhwb3J0cy5jYXN1YWwgPSB2b2lkIDA7XG5jb25zdCBjb25maWd1cmF0aW9uc18xID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZ3VyYXRpb25zXCIpO1xuY29uc3QgY2hyb25vXzEgPSByZXF1aXJlKFwiLi4vLi4vY2hyb25vXCIpO1xuY29uc3QgU2xhc2hEYXRlRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NvbW1vbi9wYXJzZXJzL1NsYXNoRGF0ZUZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBQVFdlZWtkYXlQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL1BUV2Vla2RheVBhcnNlclwiKSk7XG5jb25zdCBQVFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9QVFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IFBUTWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9QVE1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNvbnN0IFBUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvUFRNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY29uc3QgUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL1BUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IFBUQ2FzdWFsRGF0ZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvUFRDYXN1YWxEYXRlUGFyc2VyXCIpKTtcbmNvbnN0IFBUQ2FzdWFsVGltZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvUFRDYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKCkpO1xuZXhwb3J0cy5zdHJpY3QgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNvbmZpZ3VyYXRpb24odHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oZmFsc2UsIGxpdHRsZUVuZGlhbik7XG4gICAgb3B0aW9uLnBhcnNlcnMucHVzaChuZXcgUFRDYXN1YWxEYXRlUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy5wdXNoKG5ldyBQVENhc3VhbFRpbWVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIHJldHVybiBvcHRpb247XG59XG5leHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uO1xuZnVuY3Rpb24gY3JlYXRlQ29uZmlndXJhdGlvbihzdHJpY3RNb2RlID0gdHJ1ZSwgbGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBQVFdlZWtkYXlQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgUFRUaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBQVE1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgUFRNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IFBUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyoodG90fC0pXFxzKiQvaTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jbGFzcyBOTE1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl5cXFxccyoob218bmF8dm9vcnxpbiBkZXwsfC0pP1xcXFxzKiRcIik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTkxNZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCByZWZlcmVuY2VzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vY2FzdWFsUmVmZXJlbmNlc1wiKSk7XG5jbGFzcyBOTENhc3VhbERhdGVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8obnV8dmFuZGFhZ3xtb3JnZW58bW9yZ2VuZHxnaXN0ZXJlbikoPz1cXFd8JCkvaTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyVGV4dCA9IG1hdGNoWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChsb3dlclRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLm5vdyhjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcInZhbmRhYWdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b2RheShjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcIm1vcmdlblwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vcmdlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b21vcnJvdyhjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICAgICAgY2FzZSBcImdpc3RlcmVuXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMueWVzdGVyZGF5KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTENhc3VhbERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBkYXlqc18yID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL2RheWpzXCIpO1xuY29uc3QgREFZX0dST1VQID0gMTtcbmNvbnN0IE1PTUVOVF9HUk9VUCA9IDI7XG5jbGFzcyBOTENhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gLyhkZXplKT9cXHMqKG5hbWlkZGFnfGF2b25kfG1pZGRlcm5hY2h0fG9jaHRlbmR8bWlkZGFnfCdzIG1pZGRhZ3N8J3MgYXZvbmRzfCdzIG9jaHRlbmRzKSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIGlmIChtYXRjaFtEQVlfR1JPVVBdID09PSBcImRlemVcIikge1xuICAgICAgICAgICAgY29tcG9uZW50LmFzc2lnbihcImRheVwiLCBjb250ZXh0LnJlZkRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5hc3NpZ24oXCJtb250aFwiLCBjb250ZXh0LnJlZkRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgY29tcG9uZW50LmFzc2lnbihcInllYXJcIiwgY29udGV4dC5yZWZEYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAobWF0Y2hbTU9NRU5UX0dST1VQXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwibmFtaWRkYWdcIjpcbiAgICAgICAgICAgIGNhc2UgXCIncyBuYW1pZGRhZ3NcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE1KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhdm9uZFwiOlxuICAgICAgICAgICAgY2FzZSBcIidzIGF2b25kcydcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDIwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkZXJuYWNodFwiOlxuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduVGhlTmV4dERheShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJvY2h0ZW5kXCI6XG4gICAgICAgICAgICBjYXNlIFwiJ3Mgb2NodGVuZHNcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1pZGRhZ1wiOlxuICAgICAgICAgICAgY2FzZSBcIidzIG1pZGRhZ3NcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MQ2FzdWFsVGltZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVRpbWVVbml0cyA9IGV4cG9ydHMuVElNRV9VTklUU19QQVRURVJOID0gZXhwb3J0cy5wYXJzZVllYXIgPSBleHBvcnRzLllFQVJfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VOdW1iZXJQYXR0ZXJuID0gZXhwb3J0cy5OVU1CRVJfUEFUVEVSTiA9IGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkgPSBleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZID0gZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSA9IGV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IGV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0gdm9pZCAwO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB7XG4gICAgem9uZGFnOiAwLFxuICAgIHpvbjogMCxcbiAgICBcInpvbi5cIjogMCxcbiAgICB6bzogMCxcbiAgICBcInpvLlwiOiAwLFxuICAgIG1hYW5kYWc6IDEsXG4gICAgbWE6IDEsXG4gICAgXCJtYS5cIjogMSxcbiAgICBkaW5zZGFnOiAyLFxuICAgIGRpbjogMixcbiAgICBcImRpbi5cIjogMixcbiAgICBkaTogMixcbiAgICBcImRpLlwiOiAyLFxuICAgIHdvZW5zZGFnOiAzLFxuICAgIHdvZTogMyxcbiAgICBcIndvZS5cIjogMyxcbiAgICB3bzogMyxcbiAgICBcIndvLlwiOiAzLFxuICAgIGRvbmRlcmRhZzogNCxcbiAgICBkb25kOiA0LFxuICAgIFwiZG9uZC5cIjogNCxcbiAgICBkbzogNCxcbiAgICBcImRvLlwiOiA0LFxuICAgIHZyaWpkYWc6IDUsXG4gICAgdnJpajogNSxcbiAgICBcInZyaWouXCI6IDUsXG4gICAgdnI6IDUsXG4gICAgXCJ2ci5cIjogNSxcbiAgICB6YXRlcmRhZzogNixcbiAgICB6YXQ6IDYsXG4gICAgXCJ6YXQuXCI6IDYsXG4gICAgXCJ6YVwiOiA2LFxuICAgIFwiemEuXCI6IDYsXG59O1xuZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0ge1xuICAgIGphbnVhcmk6IDEsXG4gICAgamFuOiAxLFxuICAgIFwiamFuLlwiOiAxLFxuICAgIGZlYnJ1YXJpOiAyLFxuICAgIGZlYjogMixcbiAgICBcImZlYi5cIjogMixcbiAgICBtYWFydDogMyxcbiAgICBtYXI6IDMsXG4gICAgXCJtYXIuXCI6IDMsXG4gICAgYXByaWw6IDQsXG4gICAgYXByOiA0LFxuICAgIFwiYXByLlwiOiA0LFxuICAgIG1laTogNSxcbiAgICBqdW5pOiA2LFxuICAgIGp1bjogNixcbiAgICBcImp1bi5cIjogNixcbiAgICBqdWxpOiA3LFxuICAgIGp1bDogNyxcbiAgICBcImp1bC5cIjogNyxcbiAgICBhdWd1c3R1czogOCxcbiAgICBhdWc6IDgsXG4gICAgXCJhdWcuXCI6IDgsXG4gICAgc2VwdGVtYmVyOiA5LFxuICAgIHNlcDogOSxcbiAgICBcInNlcC5cIjogOSxcbiAgICBzZXB0OiA5LFxuICAgIFwic2VwdC5cIjogOSxcbiAgICBva3RvYmVyOiAxMCxcbiAgICBva3Q6IDEwLFxuICAgIFwib2t0LlwiOiAxMCxcbiAgICBub3ZlbWJlcjogMTEsXG4gICAgbm92OiAxMSxcbiAgICBcIm5vdi5cIjogMTEsXG4gICAgZGVjZW1iZXI6IDEyLFxuICAgIGRlYzogMTIsXG4gICAgXCJkZWMuXCI6IDEyLFxufTtcbmV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgZWVuOiAxLFxuICAgIHR3ZWU6IDIsXG4gICAgZHJpZTogMyxcbiAgICB2aWVyOiA0LFxuICAgIHZpamY6IDUsXG4gICAgemVzOiA2LFxuICAgIHpldmVuOiA3LFxuICAgIGFjaHQ6IDgsXG4gICAgbmVnZW46IDksXG4gICAgdGllbjogMTAsXG4gICAgZWxmOiAxMSxcbiAgICB0d2FhbGY6IDEyLFxufTtcbmV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgZWVyc3RlOiAxLFxuICAgIHR3ZWVkZTogMixcbiAgICBkZXJkZTogMyxcbiAgICB2aWVyZGU6IDQsXG4gICAgdmlqZmRlOiA1LFxuICAgIHplc2RlOiA2LFxuICAgIHpldmVuZGU6IDcsXG4gICAgYWNodHN0ZTogOCxcbiAgICBuZWdlbmRlOiA5LFxuICAgIHRpZW5kZTogMTAsXG4gICAgZWxmZGU6IDExLFxuICAgIHR3YWFsZmRlOiAxMixcbiAgICBkZXJ0aWVuZGU6IDEzLFxuICAgIHZlZXJ0aWVuZGU6IDE0LFxuICAgIHZpamZ0aWVuZGU6IDE1LFxuICAgIHplc3RpZW5kZTogMTYsXG4gICAgemV2ZW50aWVuZGU6IDE3LFxuICAgIGFjaHR0aWVuZGU6IDE4LFxuICAgIG5lZ2VudGllbmRlOiAxOSxcbiAgICB0d2ludGlnc3RlOiAyMCxcbiAgICBcImVlbmVudHdpbnRpZ3N0ZVwiOiAyMSxcbiAgICBcInR3ZWXDq250d2ludGlnc3RlXCI6IDIyLFxuICAgIFwiZHJpZWVudHdpbnRpZ3N0ZVwiOiAyMyxcbiAgICBcInZpZXJlbnR3aW50aWdzdGVcIjogMjQsXG4gICAgXCJ2aWpmZW50d2ludGlnc3RlXCI6IDI1LFxuICAgIFwiemVzZW50d2ludGlnc3RlXCI6IDI2LFxuICAgIFwiemV2ZW5lbnR3aW50aWdzdGVcIjogMjcsXG4gICAgXCJhY2h0ZW50d2ludGlnXCI6IDI4LFxuICAgIFwibmVnZW5lbnR3aW50aWdcIjogMjksXG4gICAgXCJkZXJ0aWdzdGVcIjogMzAsXG4gICAgXCJlZW5lbmRlcnRpZ3N0ZVwiOiAzMSxcbn07XG5leHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0ge1xuICAgIHNlYzogXCJzZWNvbmRcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kZW46IFwic2Vjb25kXCIsXG4gICAgbWluOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnM6IFwibWludXRlXCIsXG4gICAgbWludXRlOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZW46IFwibWludXRlXCIsXG4gICAgaDogXCJob3VyXCIsXG4gICAgaHI6IFwiaG91clwiLFxuICAgIGhyczogXCJob3VyXCIsXG4gICAgdXVyOiBcImhvdXJcIixcbiAgICB1cmVuOiBcImhvdXJcIixcbiAgICBkYWc6IFwiZFwiLFxuICAgIGRhZ2VuOiBcImRcIixcbiAgICB3ZWVrOiBcIndlZWtcIixcbiAgICB3ZWtlbjogXCJ3ZWVrXCIsXG4gICAgbWFhbmQ6IFwibW9udGhcIixcbiAgICBtYWFuZGVuOiBcIm1vbnRoXCIsXG4gICAgamFhcjogXCJ5ZWFyXCIsXG4gICAganI6IFwieWVhclwiLFxuICAgIGphcmVuOiBcInllYXJcIixcbn07XG5leHBvcnRzLk5VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZKX18WzAtOV0rfFswLTldK1xcXFwuWzAtOV0rfGVlbj98aGFsdmU/KWA7XG5mdW5jdGlvbiBwYXJzZU51bWJlclBhdHRlcm4obWF0Y2gpIHtcbiAgICBjb25zdCBudW0gPSBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZW251bV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWVtudW1dO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW0gPT09IFwiZWVuXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvaGFsdmU/LykpIHtcbiAgICAgICAgcmV0dXJuIDAuNTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobnVtKTtcbn1cbmV4cG9ydHMucGFyc2VOdW1iZXJQYXR0ZXJuID0gcGFyc2VOdW1iZXJQYXR0ZXJuO1xuZXhwb3J0cy5PUkRJTkFMX05VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZKX18WzAtOV17MSwyfSg/OnN0ZXxkZSk/KWA7XG5mdW5jdGlvbiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoKSB7XG4gICAgbGV0IG51bSA9IG1hdGNoLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUllbbnVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZW251bV07XG4gICAgfVxuICAgIG51bSA9IG51bS5yZXBsYWNlKC8oPzpzdGV8ZGUpJC9pLCBcIlwiKTtcbiAgICByZXR1cm4gcGFyc2VJbnQobnVtKTtcbn1cbmV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm47XG5leHBvcnRzLllFQVJfUEFUVEVSTiA9IGAoPzpbMS05XVswLTldezAsM31cXFxccyooPzp2b29yIENocmlzdHVzfG5hIENocmlzdHVzKXxbMS0yXVswLTldezN9fFs1LTldWzAtOV0pYDtcbmZ1bmN0aW9uIHBhcnNlWWVhcihtYXRjaCkge1xuICAgIGlmICgvdm9vciBDaHJpc3R1cy9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvdm9vciBDaHJpc3R1cy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaCk7XG4gICAgfVxuICAgIGlmICgvbmEgQ2hyaXN0dXMvaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICBtYXRjaCA9IG1hdGNoLnJlcGxhY2UoL25hIENocmlzdHVzL2ksIFwiXCIpO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQobWF0Y2gpO1xuICAgIH1cbiAgICBjb25zdCByYXdZZWFyTnVtYmVyID0gcGFyc2VJbnQobWF0Y2gpO1xuICAgIHJldHVybiB5ZWFyc18xLmZpbmRNb3N0TGlrZWx5QURZZWFyKHJhd1llYXJOdW1iZXIpO1xufVxuZXhwb3J0cy5wYXJzZVllYXIgPSBwYXJzZVllYXI7XG5jb25zdCBTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4gPSBgKCR7ZXhwb3J0cy5OVU1CRVJfUEFUVEVSTn0pXFxcXHN7MCw1fSgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSl9KVxcXFxzezAsNX1gO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9SRUdFWCA9IG5ldyBSZWdFeHAoU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOLCBcImlcIik7XG5leHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IHBhdHRlcm5fMS5yZXBlYXRlZFRpbWV1bml0UGF0dGVybihgKD86KD86YmlubmVufGluKVxcXFxzKik/YCwgU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOKTtcbmZ1bmN0aW9uIHBhcnNlVGltZVVuaXRzKHRpbWV1bml0VGV4dCkge1xuICAgIGNvbnN0IGZyYWdtZW50cyA9IHt9O1xuICAgIGxldCByZW1haW5pbmdUZXh0ID0gdGltZXVuaXRUZXh0O1xuICAgIGxldCBtYXRjaCA9IFNJTkdMRV9USU1FX1VOSVRfUkVHRVguZXhlYyhyZW1haW5pbmdUZXh0KTtcbiAgICB3aGlsZSAobWF0Y2gpIHtcbiAgICAgICAgY29sbGVjdERhdGVUaW1lRnJhZ21lbnQoZnJhZ21lbnRzLCBtYXRjaCk7XG4gICAgICAgIHJlbWFpbmluZ1RleHQgPSByZW1haW5pbmdUZXh0LnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICBtYXRjaCA9IFNJTkdMRV9USU1FX1VOSVRfUkVHRVguZXhlYyhyZW1haW5pbmdUZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50cztcbn1cbmV4cG9ydHMucGFyc2VUaW1lVW5pdHMgPSBwYXJzZVRpbWVVbml0cztcbmZ1bmN0aW9uIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpIHtcbiAgICBjb25zdCBudW0gPSBwYXJzZU51bWJlclBhdHRlcm4obWF0Y2hbMV0pO1xuICAgIGNvbnN0IHVuaXQgPSBleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZW21hdGNoWzJdLnRvTG93ZXJDYXNlKCldO1xuICAgIGZyYWdtZW50c1t1bml0XSA9IG51bTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcmVzdWx0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3Jlc3VsdHNcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jbGFzcyBOTFRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYCg/OmJpbm5lbnxpbnxiaW5uZW4gZGV8dm9vcilcXFxccypgICsgXCIoXCIgKyBjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk4gKyBcIilcIiArIGAoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVVbml0cyA9IGNvbnN0YW50c18xLnBhcnNlVGltZVVuaXRzKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZEYXRlKGNvbnRleHQucmVmRGF0ZSwgdGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTFRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi8uLi9ubC9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHdlZWtzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24vd2Vla3NcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Oig/OlxcXFwsfFxcXFwofFxcXFzvvIgpXFxcXHMqKT9cIiArXG4gICAgXCIoPzpvcFxcXFxzKj8pP1wiICtcbiAgICBcIig/OihkZXplfHZvcmlnZXx2b2xnZW5kZSlcXFxccyooPzp3ZWVrXFxcXHMqKT8pP1wiICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUlkpfSlgICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFBSRUZJWF9HUk9VUCA9IDE7XG5jb25zdCBXRUVLREFZX0dST1VQID0gMjtcbmNvbnN0IFBPU1RGSVhfR1JPVVAgPSAzO1xuY2xhc3MgTkxXZWVrZGF5UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBtYXRjaFtXRUVLREFZX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUllbZGF5T2ZXZWVrXTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbUFJFRklYX0dST1VQXTtcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IG1hdGNoW1BPU1RGSVhfR1JPVVBdO1xuICAgICAgICBsZXQgbW9kaWZpZXJXb3JkID0gcHJlZml4IHx8IHBvc3RmaXg7XG4gICAgICAgIG1vZGlmaWVyV29yZCA9IG1vZGlmaWVyV29yZCB8fCBcIlwiO1xuICAgICAgICBtb2RpZmllcldvcmQgPSBtb2RpZmllcldvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gbnVsbDtcbiAgICAgICAgaWYgKG1vZGlmaWVyV29yZCA9PSBcInZvcmlnZVwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibGFzdFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyV29yZCA9PSBcInZvbGdlbmRlXCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJuZXh0XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kaWZpZXJXb3JkID09IFwiZGV6ZVwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwidGhpc1wiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGUgPSB3ZWVrc18xLnRvRGF5SlNXZWVrZGF5KGNvbnRleHQucmVmRGF0ZSwgb2Zmc2V0LCBtb2RpZmllcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0XG4gICAgICAgICAgICAuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKVxuICAgICAgICAgICAgLmFzc2lnbihcIndlZWtkYXlcIiwgb2Zmc2V0KVxuICAgICAgICAgICAgLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKVxuICAgICAgICAgICAgLmltcGx5KFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSlcbiAgICAgICAgICAgIC5pbXBseShcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MV2Vla2RheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IGNvbnN0YW50c18yID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IGNvbnN0YW50c18zID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzpvblxcXFxzKj8pP1wiICtcbiAgICBgKCR7Y29uc3RhbnRzXzIuT1JESU5BTF9OVU1CRVJfUEFUVEVSTn0pYCArXG4gICAgXCIoPzpcXFxccypcIiArXG4gICAgXCIoPzp0b3R8XFxcXC18XFxcXOKAk3x1bnRpbHx0aHJvdWdofHRpbGx8XFxcXHMpXFxcXHMqXCIgK1xuICAgIGAoJHtjb25zdGFudHNfMi5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSlgICtcbiAgICBcIik/XCIgK1xuICAgIFwiKD86LXwvfFxcXFxzKig/Om9mKT9cXFxccyopXCIgK1xuICAgIFwiKFwiICtcbiAgICBwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpICtcbiAgICBcIilcIiArXG4gICAgXCIoPzpcIiArXG4gICAgXCIoPzotfC98LD9cXFxccyopXCIgK1xuICAgIGAoJHtjb25zdGFudHNfMy5ZRUFSX1BBVFRFUk59KD8hW15cXFxcc11cXFxcZCkpYCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAzO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBEQVRFX1RPX0dST1VQID0gMjtcbmNvbnN0IFlFQVJfR1JPVVAgPSA0O1xuY2xhc3MgTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29uc3QgZGF5ID0gY29uc3RhbnRzXzIucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX0dST1VQXSk7XG4gICAgICAgIGlmIChkYXkgPiAzMSkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoW0RBVEVfR1JPVVBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKHtcbiAgICAgICAgICAgIGRheTogZGF5LFxuICAgICAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gY29uc3RhbnRzXzMucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSB5ZWFyc18xLmZpbmRZZWFyQ2xvc2VzdFRvUmVmKGNvbnRleHQucmVmRGF0ZSwgZGF5LCBtb250aCk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hdGNoW0RBVEVfVE9fR1JPVVBdKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmREYXRlID0gY29uc3RhbnRzXzIucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX1RPX0dST1VQXSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCwgbWF0Y2hbMF0pO1xuICAgICAgICByZXN1bHQuc3RhcnQgPSBjb21wb25lbnRzO1xuICAgICAgICByZXN1bHQuZW5kID0gY29tcG9uZW50cy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcImRheVwiLCBlbmREYXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSl9KWAgK1xuICAgIGBcXFxccypgICtcbiAgICBgKD86YCArXG4gICAgYFssLV0/XFxcXHMqKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSk/YCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/PVteXFxcXHNcXFxcd118XFxcXHMrW14wLTldfFxcXFxzKyR8JClcIiwgXCJpXCIpO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDE7XG5jb25zdCBZRUFSX0dST1VQID0gMjtcbmNsYXNzIE5MTW9udGhOYW1lUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIDEpO1xuICAgICAgICBjb25zdCBtb250aE5hbWUgPSBtYXRjaFtNT05USF9OQU1FX0dST1VQXTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21vbnRoTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtb250aFwiLCBtb250aCk7XG4gICAgICAgIGlmIChtYXRjaFtZRUFSX0dST1VQXSkge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IGNvbnN0YW50c18yLnBhcnNlWWVhcihtYXRjaFtZRUFSX0dST1VQXSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIDEsIG1vbnRoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MTW9udGhOYW1lUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIihbMC05XXwwWzEtOV18MVswMTJdKS8oWzAtOV17NH0pXCIgKyBcIlwiLCBcImlcIik7XG5jb25zdCBNT05USF9HUk9VUCA9IDE7XG5jb25zdCBZRUFSX0dST1VQID0gMjtcbmNsYXNzIE5MU2xhc2hNb250aEZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChtYXRjaFtNT05USF9HUk9VUF0pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpLmltcGx5KFwiZGF5XCIsIDEpLmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKS5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MU2xhc2hNb250aEZvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJcIik7XG5jbGFzcyBOTFRpbWVFeHByZXNzaW9uUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlcl8xLkFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIge1xuICAgIHByaW1hcnlQcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiBcIig/Oig/Om9tKVxcXFxzKik/XCI7XG4gICAgfVxuICAgIGZvbGxvd2luZ1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gXCJcXFxccyooPzpcXFxcLXxcXFxc4oCTfFxcXFx+fFxcXFzjgJx8b218XFxcXD8pXFxcXHMqXCI7XG4gICAgfVxuICAgIGV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgaWYgKG1hdGNoWzBdLm1hdGNoKC9eXFxzKlxcZHs0fVxccyokLykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5leHRyYWN0UHJpbWFyeVRpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTFRpbWVFeHByZXNzaW9uUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoWzAtOV17NH0pW1xcXFwuXFxcXC9cXFxcc11gICtcbiAgICBgKD86KCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pfChbMC05XXsxLDJ9KSlbXFxcXC5cXFxcL1xcXFxzXWAgK1xuICAgIGAoWzAtOV17MSwyfSlgICtcbiAgICBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IFlFQVJfTlVNQkVSX0dST1VQID0gMTtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAyO1xuY29uc3QgTU9OVEhfTlVNQkVSX0dST1VQID0gMztcbmNvbnN0IERBVEVfTlVNQkVSX0dST1VQID0gNDtcbmNsYXNzIE5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBtb250aCA9IG1hdGNoW01PTlRIX05VTUJFUl9HUk9VUF1cbiAgICAgICAgICAgID8gcGFyc2VJbnQobWF0Y2hbTU9OVEhfTlVNQkVSX0dST1VQXSlcbiAgICAgICAgICAgIDogY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hbWUVBUl9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQobWF0Y2hbREFURV9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheTogZGF5LFxuICAgICAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTENhc3VhbFllYXJNb250aERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IGRheWpzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCBkYXlqc18yID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBEQVRFX0dST1VQID0gMTtcbmNvbnN0IFRJTUVfT0ZfREFZX0dST1VQID0gMjtcbmNsYXNzIE5MQ2FzdWFsRGF0ZVRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8oZ2lzdGVyZW58bW9yZ2VufHZhbikob2NodGVuZHxtaWRkYWd8bmFtaWRkYWd8YXZvbmR8bmFjaHQpKD89XFxXfCQpL2k7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBkYXRlVGV4dCA9IG1hdGNoW0RBVEVfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVUZXh0ID0gbWF0Y2hbVElNRV9PRl9EQVlfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzIuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBzd2l0Y2ggKGRhdGVUZXh0KSB7XG4gICAgICAgICAgICBjYXNlIFwiZ2lzdGVyZW5cIjpcbiAgICAgICAgICAgICAgICBkYXlqc18xLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZS5hZGQoLTEsIFwiZGF5XCIpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ2YW5cIjpcbiAgICAgICAgICAgICAgICBkYXlqc18xLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibW9yZ2VuXCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMS5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aW1lVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcIm9jaHRlbmRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1pZGRhZ1wiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5hbWlkZGFnXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxNSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXZvbmRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDIwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MQ2FzdWFsRGF0ZVRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuc3RyaWN0ID0gZXhwb3J0cy5jYXN1YWwgPSB2b2lkIDA7XG5jb25zdCBjb25maWd1cmF0aW9uc18xID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZ3VyYXRpb25zXCIpO1xuY29uc3QgY2hyb25vXzEgPSByZXF1aXJlKFwiLi4vLi4vY2hyb25vXCIpO1xuY29uc3QgTkxNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9OTE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jb25zdCBOTE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvTkxNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jb25zdCBOTENhc3VhbERhdGVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MQ2FzdWFsRGF0ZVBhcnNlclwiKSk7XG5jb25zdCBOTENhc3VhbFRpbWVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MQ2FzdWFsVGltZVBhcnNlclwiKSk7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IE5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgTkxXZWVrZGF5UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTFdlZWtkYXlQYXJzZXJcIikpO1xuY29uc3QgTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IE5MTW9udGhOYW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTE1vbnRoTmFtZVBhcnNlclwiKSk7XG5jb25zdCBOTFNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MU2xhc2hNb250aEZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBOTFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IE5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTENhc3VhbFllYXJNb250aERheVBhcnNlclwiKSk7XG5jb25zdCBOTENhc3VhbERhdGVUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTENhc3VhbERhdGVUaW1lUGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKCkpO1xuZXhwb3J0cy5zdHJpY3QgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNvbmZpZ3VyYXRpb24odHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oZmFsc2UsIGxpdHRsZUVuZGlhbik7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgTkxDYXN1YWxEYXRlUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBOTENhc3VhbFRpbWVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IE5MQ2FzdWFsRGF0ZVRpbWVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIHJldHVybiBvcHRpb247XG59XG5leHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uO1xuZnVuY3Rpb24gY3JlYXRlQ29uZmlndXJhdGlvbihzdHJpY3RNb2RlID0gdHJ1ZSwgbGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBOTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTE1vbnRoTmFtZVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IE5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IE5MV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTENhc3VhbFllYXJNb250aERheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgTkxNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IE5MTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5jYXN1YWwgPSBleHBvcnRzLnN0cmljdCA9IGV4cG9ydHMubmwgPSBleHBvcnRzLnB0ID0gZXhwb3J0cy5qYSA9IGV4cG9ydHMuZnIgPSBleHBvcnRzLmRlID0gZXhwb3J0cy5NZXJpZGllbSA9IGV4cG9ydHMuQ2hyb25vID0gZXhwb3J0cy5lbiA9IHZvaWQgMDtcbmNvbnN0IGVuID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xvY2FsZXMvZW5cIikpO1xuZXhwb3J0cy5lbiA9IGVuO1xuY29uc3QgY2hyb25vXzEgPSByZXF1aXJlKFwiLi9jaHJvbm9cIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDaHJvbm9cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNocm9ub18xLkNocm9ubzsgfSB9KTtcbnZhciBNZXJpZGllbTtcbihmdW5jdGlvbiAoTWVyaWRpZW0pIHtcbiAgICBNZXJpZGllbVtNZXJpZGllbVtcIkFNXCJdID0gMF0gPSBcIkFNXCI7XG4gICAgTWVyaWRpZW1bTWVyaWRpZW1bXCJQTVwiXSA9IDFdID0gXCJQTVwiO1xufSkoTWVyaWRpZW0gPSBleHBvcnRzLk1lcmlkaWVtIHx8IChleHBvcnRzLk1lcmlkaWVtID0ge30pKTtcbmNvbnN0IGRlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xvY2FsZXMvZGVcIikpO1xuZXhwb3J0cy5kZSA9IGRlO1xuY29uc3QgZnIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vbG9jYWxlcy9mclwiKSk7XG5leHBvcnRzLmZyID0gZnI7XG5jb25zdCBqYSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9sb2NhbGVzL2phXCIpKTtcbmV4cG9ydHMuamEgPSBqYTtcbmNvbnN0IHB0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xvY2FsZXMvcHRcIikpO1xuZXhwb3J0cy5wdCA9IHB0O1xuY29uc3QgbmwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vbG9jYWxlcy9ubFwiKSk7XG5leHBvcnRzLm5sID0gbmw7XG5leHBvcnRzLnN0cmljdCA9IGVuLnN0cmljdDtcbmV4cG9ydHMuY2FzdWFsID0gZW4uY2FzdWFsO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0IGNocm9ubyBmcm9tICdjaHJvbm8tbm9kZSc7XG4gICAgaW1wb3J0IHsgb25Nb3VudCB9IGZyb20gJ3N2ZWx0ZSc7XG4gICAgaW1wb3J0IHsgUmVjdXJyZW5jZSB9IGZyb20gJy4uL1JlY3VycmVuY2UnO1xuICAgIGltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vU2V0dGluZ3MnO1xuICAgIGltcG9ydCB7IFByaW9yaXR5LCBTdGF0dXMsIFRhc2sgfSBmcm9tICcuLi9UYXNrJztcblxuICAgIGV4cG9ydCBsZXQgdGFzazogVGFzaztcbiAgICBleHBvcnQgbGV0IG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgbGV0IGRlc2NyaXB0aW9uSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IGVkaXRhYmxlVGFzazoge1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IFN0YXR1cztcbiAgICAgICAgcHJpb3JpdHk6ICdub25lJyB8ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCc7XG4gICAgICAgIHJlY3VycmVuY2VSdWxlOiBzdHJpbmc7XG4gICAgICAgIHN0YXJ0RGF0ZTogc3RyaW5nO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBzdHJpbmc7XG4gICAgICAgIGR1ZURhdGU6IHN0cmluZztcbiAgICAgICAgZG9uZURhdGU6IHN0cmluZztcbiAgICB9ID0ge1xuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHN0YXR1czogU3RhdHVzLlRvZG8sXG4gICAgICAgIHByaW9yaXR5OiAnbm9uZScsXG4gICAgICAgIHJlY3VycmVuY2VSdWxlOiAnJyxcbiAgICAgICAgc3RhcnREYXRlOiAnJyxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogJycsXG4gICAgICAgIGR1ZURhdGU6ICcnLFxuICAgICAgICBkb25lRGF0ZTogJycsXG4gICAgfTtcblxuICAgIGxldCBwYXJzZWRTdGFydERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWRTY2hlZHVsZWREYXRlOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgcGFyc2VkRHVlRGF0ZTogc3RyaW5nID0gJyc7XG4gICAgbGV0IHBhcnNlZFJlY3VycmVuY2U6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWREb25lOiBzdHJpbmcgPSAnJztcblxuICAgICQ6IHtcbiAgICAgICAgaWYgKCFlZGl0YWJsZVRhc2suc3RhcnREYXRlKSB7XG4gICAgICAgICAgICBwYXJzZWRTdGFydERhdGUgPSAnPGk+bm8gc3RhcnQgZGF0ZTwvPic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjaHJvbm8ucGFyc2VEYXRlKFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlVGFzay5zdGFydERhdGUsXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZvcndhcmREYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlZFN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQocGFyc2VkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkU3RhcnREYXRlID0gJzxpPmludmFsaWQgc3RhcnQgZGF0ZTwvaT4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAoIWVkaXRhYmxlVGFzay5zY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICBwYXJzZWRTY2hlZHVsZWREYXRlID0gJzxpPm5vIHNjaGVkdWxlZCBkYXRlPC8+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNocm9uby5wYXJzZURhdGUoXG4gICAgICAgICAgICAgICAgZWRpdGFibGVUYXNrLnNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZvcndhcmREYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlZFNjaGVkdWxlZERhdGUgPSB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgLm1vbWVudChwYXJzZWQpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2NoZWR1bGVkRGF0ZSA9ICc8aT5pbnZhbGlkIHNjaGVkdWxlZCBkYXRlPC9pPic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmICghZWRpdGFibGVUYXNrLmR1ZURhdGUpIHtcbiAgICAgICAgICAgIHBhcnNlZER1ZURhdGUgPSAnPGk+bm8gZHVlIGRhdGU8Lz4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY2hyb25vLnBhcnNlRGF0ZShlZGl0YWJsZVRhc2suZHVlRGF0ZSwgbmV3IERhdGUoKSwge1xuICAgICAgICAgICAgICAgIGZvcndhcmREYXRlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkRHVlRGF0ZSA9IHdpbmRvdy5tb21lbnQocGFyc2VkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkRHVlRGF0ZSA9ICc8aT5pbnZhbGlkIGR1ZSBkYXRlPC9pPic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmICghZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlKSB7XG4gICAgICAgICAgICBwYXJzZWRSZWN1cnJlbmNlID0gJzxpPm5vdCByZWN1cnJpbmc8Lz4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkUmVjdXJyZW5jZSA9XG4gICAgICAgICAgICAgICAgUmVjdXJyZW5jZS5mcm9tVGV4dCh7XG4gICAgICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZvciByZXByZXNlbnRhdGlvbiBpbiB0aGUgbW9kYWwsIG5vIGRhdGVzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk/LnRvVGV4dCgpID8/ICc8aT5pbnZhbGlkIHJlY3VycmVuY2UgcnVsZTwvaT4nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAoIWVkaXRhYmxlVGFzay5kb25lRGF0ZSkge1xuICAgICAgICAgICAgcGFyc2VkRG9uZSA9ICc8aT5ubyBkb25lIGRhdGU8L2k+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNocm9uby5wYXJzZURhdGUoZWRpdGFibGVUYXNrLmRvbmVEYXRlKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWREb25lID0gd2luZG93Lm1vbWVudChwYXJzZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZWREb25lID0gJzxpPmludmFsaWQgZG9uZSBkYXRlPC9pPic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vdW50KCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGFzay5kZXNjcmlwdGlvblxuICAgICAgICAgICAgLnJlcGxhY2UoZ2xvYmFsRmlsdGVyLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCcgICcsICcgJylcbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgbGV0IHByaW9yaXR5OiAnbm9uZScgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnID0gJ25vbmUnO1xuICAgICAgICBpZiAodGFzay5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTG93KSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9ICdsb3cnO1xuICAgICAgICB9IGVsc2UgaWYgKHRhc2sucHJpb3JpdHkgPT09IFByaW9yaXR5Lk1lZGl1bSkge1xuICAgICAgICAgICAgcHJpb3JpdHkgPSAnbWVkaXVtJztcbiAgICAgICAgfSBlbHNlIGlmICh0YXNrLnByaW9yaXR5ID09PSBQcmlvcml0eS5IaWdoKSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9ICdoaWdoJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVkaXRhYmxlVGFzayA9IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc3RhdHVzOiB0YXNrLnN0YXR1cyxcbiAgICAgICAgICAgIHByaW9yaXR5LFxuICAgICAgICAgICAgcmVjdXJyZW5jZVJ1bGU6IHRhc2sucmVjdXJyZW5jZSA/IHRhc2sucmVjdXJyZW5jZS50b1RleHQoKSA6ICcnLFxuICAgICAgICAgICAgc3RhcnREYXRlOiB0YXNrLnN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgID8gdGFzay5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZTogdGFzay5zY2hlZHVsZWREYXRlXG4gICAgICAgICAgICAgICAgPyB0YXNrLnNjaGVkdWxlZERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgZHVlRGF0ZTogdGFzay5kdWVEYXRlID8gdGFzay5kdWVEYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogJycsXG4gICAgICAgICAgICBkb25lRGF0ZTogdGFzay5kb25lRGF0ZSA/IHRhc2suZG9uZURhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbklucHV0LmZvY3VzKCk7XG4gICAgICAgIH0sIDEwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IF9vblN1Ym1pdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGVkaXRhYmxlVGFzay5kZXNjcmlwdGlvbi50cmltKCk7XG4gICAgICAgIGlmICghZGVzY3JpcHRpb24uaW5jbHVkZXMoZ2xvYmFsRmlsdGVyKSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnbG9iYWxGaWx0ZXIgKyAnICcgKyBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGFydERhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyc2VkU3RhcnREYXRlID0gY2hyb25vLnBhcnNlRGF0ZShcbiAgICAgICAgICAgIGVkaXRhYmxlVGFzay5zdGFydERhdGUsXG4gICAgICAgICAgICBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgeyBmb3J3YXJkRGF0ZTogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBpZiAocGFyc2VkU3RhcnREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGFydERhdGUgPSB3aW5kb3cubW9tZW50KHBhcnNlZFN0YXJ0RGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZTogbW9tZW50Lk1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBwYXJzZWRTY2hlZHVsZWREYXRlID0gY2hyb25vLnBhcnNlRGF0ZShcbiAgICAgICAgICAgIGVkaXRhYmxlVGFzay5zY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHsgZm9yd2FyZERhdGU6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhcnNlZFNjaGVkdWxlZERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSB3aW5kb3cubW9tZW50KHBhcnNlZFNjaGVkdWxlZERhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1ZURhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyc2VkRHVlRGF0ZSA9IGNocm9uby5wYXJzZURhdGUoXG4gICAgICAgICAgICBlZGl0YWJsZVRhc2suZHVlRGF0ZSxcbiAgICAgICAgICAgIG5ldyBEYXRlKCksXG4gICAgICAgICAgICB7IGZvcndhcmREYXRlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJzZWREdWVEYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkdWVEYXRlID0gd2luZG93Lm1vbWVudChwYXJzZWREdWVEYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWN1cnJlbmNlOiBSZWN1cnJlbmNlIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChlZGl0YWJsZVRhc2sucmVjdXJyZW5jZVJ1bGUpIHtcbiAgICAgICAgICAgIHJlY3VycmVuY2UgPSBSZWN1cnJlbmNlLmZyb21UZXh0KHtcbiAgICAgICAgICAgICAgICByZWN1cnJlbmNlUnVsZVRleHQ6IGVkaXRhYmxlVGFzay5yZWN1cnJlbmNlUnVsZSxcbiAgICAgICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkUHJpb3JpdHk6IFByaW9yaXR5O1xuICAgICAgICBzd2l0Y2ggKGVkaXRhYmxlVGFzay5wcmlvcml0eSkge1xuICAgICAgICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgICAgICAgICBwYXJzZWRQcmlvcml0eSA9IFByaW9yaXR5LkxvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgICAgICAgICAgcGFyc2VkUHJpb3JpdHkgPSBQcmlvcml0eS5NZWRpdW07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgICAgICAgICBwYXJzZWRQcmlvcml0eSA9IFByaW9yaXR5LkhpZ2g7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHBhcnNlZFByaW9yaXR5ID0gUHJpb3JpdHkuTm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRUYXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgLi4udGFzayxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc3RhdHVzOiBlZGl0YWJsZVRhc2suc3RhdHVzLFxuICAgICAgICAgICAgcHJpb3JpdHk6IHBhcnNlZFByaW9yaXR5LFxuICAgICAgICAgICAgcmVjdXJyZW5jZSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgZG9uZURhdGU6IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5tb21lbnQoZWRpdGFibGVUYXNrLmRvbmVEYXRlLCAnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgICAgICAgLmlzVmFsaWQoKVxuICAgICAgICAgICAgICAgID8gd2luZG93Lm1vbWVudChlZGl0YWJsZVRhc2suZG9uZURhdGUsICdZWVlZLU1NLUREJylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uU3VibWl0KFt1cGRhdGVkVGFza10pO1xuICAgIH07XG48L3NjcmlwdD5cblxuPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsXCI+XG4gICAgPGZvcm0gb246c3VibWl0fHByZXZlbnREZWZhdWx0PXtfb25TdWJtaXR9PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NyaXB0aW9uXCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgYmluZDp2YWx1ZT17ZWRpdGFibGVUYXNrLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17ZGVzY3JpcHRpb25JbnB1dH1cbiAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YXNrcy1tb2RhbC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYWtlIG91dCB0aGUgdHJhc2hcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByaW9yaXR5XCI+UHJpb3JpdHk8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5wcmlvcml0eX1cbiAgICAgICAgICAgICAgICBpZD1cInByaW9yaXR5XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaGlnaFwiPuKPqyBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1lZGl1bVwiPvCflLwgTWVkaXVtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImxvd1wiPvCflL0gTG93PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlY3VycmVuY2VcIj5SZWN1cnJlbmNlPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5yZWN1cnJlbmNlUnVsZX1cbiAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUcnkgJ2V2ZXJ5IDIgd2Vla3Mgb24gVGh1cnNkYXknLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGNvZGU+8J+UgSB7QGh0bWwgcGFyc2VkUmVjdXJyZW5jZX08L2NvZGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aHIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1kYXRlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImR1ZVwiPkR1ZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5kdWVEYXRlfVxuICAgICAgICAgICAgICAgICAgICBpZD1cImR1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUcnkgJ01vbmRheScgb3IgJ3RvbW9ycm93Jy5cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGNvZGU+8J+ThSB7QGh0bWwgcGFyc2VkRHVlRGF0ZX08L2NvZGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1kYXRlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNjaGVkdWxlZFwiPlNjaGVkdWxlZDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5zY2hlZHVsZWREYXRlfVxuICAgICAgICAgICAgICAgICAgICBpZD1cInNjaGVkdWxlZFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUcnkgJ01vbmRheScgb3IgJ3RvbW9ycm93Jy5cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGNvZGU+4o+zIHtAaHRtbCBwYXJzZWRTY2hlZHVsZWREYXRlfTwvY29kZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsLWRhdGVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhcnRcIj5TdGFydDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5zdGFydERhdGV9XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHJ5ICdNb25kYXknIG9yICd0b21vcnJvdycuXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxjb2RlPvCfm6sge0BodG1sIHBhcnNlZFN0YXJ0RGF0ZX08L2NvZGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICBTdGF0dXM6XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFzay1saXN0LWl0ZW0tY2hlY2tib3ggdGFza3MtbW9kYWwtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtlZGl0YWJsZVRhc2suc3RhdHVzID09PSBTdGF0dXMuRG9uZX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxjb2RlPntlZGl0YWJsZVRhc2suc3RhdHVzfTwvY29kZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICBEb25lIG9uOlxuICAgICAgICAgICAgICAgIDxjb2RlPntAaHRtbCBwYXJzZWREb25lfTwvY29kZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1zZWN0aW9uXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwibW9kLWN0YVwiPkFwcGx5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbjwvZGl2PlxuIiwiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBFZGl0VGFzayBmcm9tICcuL3VpL0VkaXRUYXNrLnN2ZWx0ZSc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgY2xhc3MgVGFza01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHB1YmxpYyByZWFkb25seSB0YXNrOiBUYXNrO1xuICAgIHB1YmxpYyByZWFkb25seSBvblN1Ym1pdDogKHVwZGF0ZWRUYXNrczogVGFza1tdKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBhcHAsXG4gICAgICAgIHRhc2ssXG4gICAgICAgIG9uU3VibWl0LFxuICAgIH06IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHRhc2s6IFRhc2s7XG4gICAgICAgIG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQ7XG4gICAgfSkge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIHRoaXMub25TdWJtaXQgPSAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHtcbiAgICAgICAgICAgIG9uU3VibWl0KHVwZGF0ZWRUYXNrcyk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3BlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aXRsZUVsLnNldFRleHQoJ0NyZWF0ZSBvciBlZGl0IFRhc2snKTtcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgICAgIG5ldyBFZGl0VGFzayh7XG4gICAgICAgICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcbiAgICAgICAgICAgIHByb3BzOiB7IHRhc2s6IHRoaXMudGFzaywgb25TdWJtaXQ6IHRoaXMub25TdWJtaXQgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBWaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgVGFza01vZGFsIH0gZnJvbSAnLi4vVGFza01vZGFsJztcbmltcG9ydCB7IFByaW9yaXR5LCBTdGF0dXMsIFRhc2sgfSBmcm9tICcuLi9UYXNrJztcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU9yRWRpdCA9IChcbiAgICBjaGVja2luZzogYm9vbGVhbixcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICB2aWV3OiBWaWV3LFxuICAgIGFwcDogQXBwLFxuKSA9PiB7XG4gICAgaWYgKGNoZWNraW5nKSB7XG4gICAgICAgIHJldHVybiB2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3O1xuICAgIH1cblxuICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gZHVlIHRvIGNoZWNrIGFib3ZlLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IHZpZXcuZmlsZT8ucGF0aDtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcbiAgICBjb25zdCBsaW5lTnVtYmVyID0gY3Vyc29yUG9zaXRpb24ubGluZTtcbiAgICBjb25zdCBsaW5lID0gZWRpdG9yLmdldExpbmUobGluZU51bWJlcik7XG4gICAgY29uc3QgdGFzayA9IHRhc2tGcm9tTGluZSh7IGxpbmUsIHBhdGggfSk7XG5cbiAgICBjb25zdCBvblN1Ym1pdCA9ICh1cGRhdGVkVGFza3M6IFRhc2tbXSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdXBkYXRlZFRhc2tzXG4gICAgICAgICAgICAubWFwKCh0YXNrOiBUYXNrKSA9PiB0YXNrLnRvRmlsZUxpbmVTdHJpbmcoKSlcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgZWRpdG9yLnNldExpbmUobGluZU51bWJlciwgc2VyaWFsaXplZCk7XG4gICAgfTtcblxuICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIGV2ZXJ5IHRpbWUsIGFzIGN1cnNvci90YXNrIGNhbiBjaGFuZ2UuXG4gICAgY29uc3QgdGFza01vZGFsID0gbmV3IFRhc2tNb2RhbCh7XG4gICAgICAgIGFwcCxcbiAgICAgICAgdGFzayxcbiAgICAgICAgb25TdWJtaXQsXG4gICAgfSk7XG4gICAgdGFza01vZGFsLm9wZW4oKTtcbn07XG5cbmNvbnN0IHRhc2tGcm9tTGluZSA9ICh7IGxpbmUsIHBhdGggfTogeyBsaW5lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9KTogVGFzayA9PiB7XG4gICAgY29uc3QgdGFzayA9IFRhc2suZnJvbUxpbmUoe1xuICAgICAgICBsaW5lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgIH0pO1xuXG4gICAgaWYgKHRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBvbiBhIGxpbmUgb2YgYSB0YXNrLCB3ZSB0YWtlIHdoYXQgd2UgaGF2ZS5cbiAgICAvLyBUaGUgbm9uLXRhc2sgbGluZSBjYW4gc3RpbGwgYmUgYSBjaGVja2xpc3QsIGZvciBleGFtcGxlIGlmIGl0IGlzIGxhY2tpbmcgdGhlIGdsb2JhbCBmaWx0ZXIuXG4gICAgY29uc3Qgbm9uVGFza1JlZ2V4OiBSZWdFeHAgPSAvXihbXFxzXFx0XSopWy0qXT8gKihcXFsoLilcXF0pPyAqKC4qKS91O1xuICAgIGNvbnN0IG5vblRhc2tNYXRjaCA9IGxpbmUubWF0Y2gobm9uVGFza1JlZ2V4KTtcbiAgICBpZiAobm9uVGFza01hdGNoID09PSBudWxsKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW47IGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2V4IGlzIG9wdGlvbmFsLlxuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogQ2Fubm90IGNyZWF0ZSB0YXNrIG9uIGxpbmU6JywgbGluZSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgICAgICBzdGF0dXM6IFN0YXR1cy5Ub2RvLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGluZGVudGF0aW9uOiAnJyxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhdHVzQ2hhcmFjdGVyOiAnICcsXG4gICAgICAgICAgICBwcmlvcml0eTogUHJpb3JpdHkuTm9uZSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGU6IG51bGwsXG4gICAgICAgICAgICBkdWVEYXRlOiBudWxsLFxuICAgICAgICAgICAgZG9uZURhdGU6IG51bGwsXG4gICAgICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBlZGl0IGhlcmUgaW4gdGhlIGVkaXRvci5cbiAgICAgICAgICAgIHNlY3Rpb25TdGFydDogMCxcbiAgICAgICAgICAgIHNlY3Rpb25JbmRleDogMCxcbiAgICAgICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCxcbiAgICAgICAgICAgIGJsb2NrTGluazogJycsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGVudGF0aW9uOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbMV07XG4gICAgY29uc3Qgc3RhdHVzU3RyaW5nOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbM10gPz8gJyAnO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN0YXR1c1N0cmluZyA9PT0gJyAnID8gU3RhdHVzLlRvZG8gOiBTdGF0dXMuRG9uZTtcbiAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyA9IG5vblRhc2tNYXRjaFs0XTtcblxuICAgIGNvbnN0IGJsb2NrTGlua01hdGNoID0gbGluZS5tYXRjaChUYXNrLmJsb2NrTGlua1JlZ2V4KTtcbiAgICBjb25zdCBibG9ja0xpbmsgPSBibG9ja0xpbmtNYXRjaCAhPT0gbnVsbCA/IGJsb2NrTGlua01hdGNoWzBdIDogJyc7XG5cbiAgICBpZiAoYmxvY2tMaW5rICE9PSAnJykge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoVGFzay5ibG9ja0xpbmtSZWdleCwgJycpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBvcmlnaW5hbFN0YXR1c0NoYXJhY3Rlcjogc3RhdHVzU3RyaW5nLFxuICAgICAgICBibG9ja0xpbmssXG4gICAgICAgIHByaW9yaXR5OiBQcmlvcml0eS5Ob25lLFxuICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgIHNjaGVkdWxlZERhdGU6IG51bGwsXG4gICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgIGRvbmVEYXRlOiBudWxsLFxuICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBmb2xsb3dpbmcgZmllbGRzIHRvIGVkaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgIHNlY3Rpb25JbmRleDogMCxcbiAgICAgICAgcHJlY2VkaW5nSGVhZGVyOiBudWxsLFxuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IEVkaXRvciwgTWFya2Rvd25WaWV3LCBWaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVEb25lID0gKGNoZWNraW5nOiBib29sZWFuLCBlZGl0b3I6IEVkaXRvciwgdmlldzogVmlldykgPT4ge1xuICAgIGlmIChjaGVja2luZykge1xuICAgICAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBhIG1hcmtkb3duIHZpZXcsIHRoZSBjb21tYW5kIHNob3VsZG4ndCBiZSBzaG93bi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBjb21tYW5kIHNob3VsZCBhbHdheXMgdHJpZ2dlciBpbiBhIG1hcmtkb3duIHZpZXc6XG4gICAgICAgIC8vIC0gQ29udmVydCBsaW5lcyB0byBsaXN0IGl0ZW1zLlxuICAgICAgICAvLyAtIENvbnZlcnQgbGlzdCBpdGVtcyB0byB0YXNrcy5cbiAgICAgICAgLy8gLSBUb2dnbGUgdGFza3MnIHN0YXR1cy5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBkdWUgdG8gY2hlY2sgYWJvdmUuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgY2VydGFpbiB3ZSBhcmUgaW4gdGhlIGVkaXRvciBkdWUgdG8gdGhlIGNoZWNrIGFib3ZlLlxuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZU51bWJlciA9IGN1cnNvclBvc2l0aW9uLmxpbmU7XG4gICAgY29uc3QgbGluZSA9IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpO1xuXG4gICAgY29uc3QgdG9nZ2xlZExpbmUgPSB0b2dnbGVMaW5lKHsgbGluZSwgcGF0aCB9KTtcbiAgICBlZGl0b3Iuc2V0TGluZShsaW5lTnVtYmVyLCB0b2dnbGVkTGluZSk7XG5cbiAgICAvLyBUaGUgY3Vyc29yIGlzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgYnkgZGVmYXVsdC5cbiAgICAvLyBJZiB0aGVyZSBpcyB0ZXh0IG9uIHRoZSBsaW5lLCBwdXQgdGhlIGN1cnNvciBiYWNrIHdoZXJlIGl0IHdhcyBvbiB0aGUgbGluZS5cbiAgICBpZiAoL1teIFtcXF0qLV0vLnRlc3QodG9nZ2xlZExpbmUpKSB7XG4gICAgICAgIGVkaXRvci5zZXRDdXJzb3Ioe1xuICAgICAgICAgICAgbGluZTogY3Vyc29yUG9zaXRpb24ubGluZSxcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gbW92ZSB0aGUgY3Vyc29yIGJ5IHRoZSBkaXN0YW5jZSB3ZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nLlxuICAgICAgICAgICAgY2g6IGN1cnNvclBvc2l0aW9uLmNoICsgdG9nZ2xlZExpbmUubGVuZ3RoIC0gbGluZS5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRvZ2dsZUxpbmUgPSAoeyBsaW5lLCBwYXRoIH06IHsgbGluZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gICAgbGV0IHRvZ2dsZWRMaW5lOiBzdHJpbmcgPSBsaW5lO1xuXG4gICAgY29uc3QgdGFzayA9IFRhc2suZnJvbUxpbmUoe1xuICAgICAgICBsaW5lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgIH0pO1xuICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgIHRvZ2dsZWRMaW5lID0gdG9nZ2xlVGFzayh7IHRhc2sgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHRhc2sgaXMgbnVsbCB0aGlzIG1lYW5zIHRoYXQgd2UgaGF2ZSBvbmUgb2Y6XG4gICAgICAgIC8vIDEuIGEgcmVndWxhciBjaGVja2xpc3QgaXRlbVxuICAgICAgICAvLyAyLiBhIGxpc3QgaXRlbVxuICAgICAgICAvLyAzLiBhIHNpbXBsZSB0ZXh0IGxpbmVcblxuICAgICAgICAvLyBUaGUgdGFzayByZWdleCB3aWxsIG1hdGNoIGNoZWNrbGlzdCBpdGVtcy5cbiAgICAgICAgY29uc3QgcmVnZXhNYXRjaCA9IGxpbmUubWF0Y2goVGFzay50YXNrUmVnZXgpO1xuICAgICAgICBpZiAocmVnZXhNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdG9nZ2xlZExpbmUgPSB0b2dnbGVDaGVja2xpc3RJdGVtKHsgcmVnZXhNYXRjaCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgY2hlY2tsaXN0IGl0ZW0uIEl0IGlzIG9uZSBvZjpcbiAgICAgICAgICAgIC8vIDEuIGEgbGlzdCBpdGVtXG4gICAgICAgICAgICAvLyAyLiBhIHNpbXBsZSB0ZXh0IGxpbmVcblxuICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1SZWdleCA9IC9eKFtcXHNcXHRdKikoWy0qXSkvO1xuICAgICAgICAgICAgaWYgKGxpc3RJdGVtUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIExldCdzIGNvbnZlcnQgdGhlIGxpc3QgaXRlbSB0byBhIGNoZWNrbGlzdCBpdGVtLlxuICAgICAgICAgICAgICAgIHRvZ2dsZWRMaW5lID0gbGluZS5yZXBsYWNlKGxpc3RJdGVtUmVnZXgsICckMSQyIFsgXScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBMZXQncyBjb252ZXJ0IHRoZSBsaW5lIHRvIGEgbGlzdCBpdGVtLlxuICAgICAgICAgICAgICAgIHRvZ2dsZWRMaW5lID0gbGluZS5yZXBsYWNlKC9eKFtcXHNcXHRdKikvLCAnJDEtICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvZ2dsZWRMaW5lO1xufTtcblxuY29uc3QgdG9nZ2xlVGFzayA9ICh7IHRhc2sgfTogeyB0YXNrOiBUYXNrIH0pOiBzdHJpbmcgPT4ge1xuICAgIC8vIFRvZ2dsZSBhIHJlZ3VsYXIgdGFzay5cbiAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0YXNrLnRvZ2dsZSgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0b2dnbGVkVGFza3NcbiAgICAgICAgLm1hcCgodGFzazogVGFzaykgPT4gdGFzay50b0ZpbGVMaW5lU3RyaW5nKCkpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVkO1xufTtcblxuY29uc3QgdG9nZ2xlQ2hlY2tsaXN0SXRlbSA9ICh7XG4gICAgcmVnZXhNYXRjaCxcbn06IHtcbiAgICByZWdleE1hdGNoOiBSZWdFeHBNYXRjaEFycmF5O1xufSk6IHN0cmluZyA9PiB7XG4gICAgLy8gSXQncyBhIGNoZWNrbGlzdCBpdGVtLCBsZXQncyB0b2dnbGUgaXQuXG4gICAgY29uc3QgaW5kZW50YXRpb24gPSByZWdleE1hdGNoWzFdO1xuICAgIGNvbnN0IHN0YXR1c1N0cmluZyA9IHJlZ2V4TWF0Y2hbMl0udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBib2R5ID0gcmVnZXhNYXRjaFszXTtcblxuICAgIGNvbnN0IHRvZ2dsZWRTdGF0dXNTdHJpbmcgPSBzdGF0dXNTdHJpbmcgPT09ICcgJyA/ICd4JyA6ICcgJztcblxuICAgIGNvbnN0IHRvZ2dsZWRMaW5lID0gYCR7aW5kZW50YXRpb259LSBbJHt0b2dnbGVkU3RhdHVzU3RyaW5nfV0gJHtib2R5fWA7XG5cbiAgICByZXR1cm4gdG9nZ2xlZExpbmU7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBBcHAsIEVkaXRvciwgUGx1Z2luLCBWaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgY3JlYXRlT3JFZGl0IH0gZnJvbSAnLi9DcmVhdGVPckVkaXQnO1xuXG5pbXBvcnQgeyB0b2dnbGVEb25lIH0gZnJvbSAnLi9Ub2dnbGVEb25lJztcblxuZXhwb3J0IGNsYXNzIENvbW1hbmRzIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gICAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoeyBwbHVnaW4gfTogeyBwbHVnaW46IFBsdWdpbiB9KSB7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnZWRpdC10YXNrJyxcbiAgICAgICAgICAgIG5hbWU6ICdDcmVhdGUgb3IgZWRpdCB0YXNrJyxcbiAgICAgICAgICAgIGljb246ICdwZW5jaWwnLFxuICAgICAgICAgICAgZWRpdG9yQ2hlY2tDYWxsYmFjazogKFxuICAgICAgICAgICAgICAgIGNoZWNraW5nOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIGVkaXRvcjogRWRpdG9yLFxuICAgICAgICAgICAgICAgIHZpZXc6IFZpZXcsXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlT3JFZGl0KGNoZWNraW5nLCBlZGl0b3IsIHZpZXcsIHRoaXMuYXBwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAndG9nZ2xlLWRvbmUnLFxuICAgICAgICAgICAgbmFtZTogJ1RvZ2dsZSB0YXNrIGRvbmUnLFxuICAgICAgICAgICAgaWNvbjogJ2NoZWNrLWluLWNpcmNsZScsXG4gICAgICAgICAgICBlZGl0b3JDaGVja0NhbGxiYWNrOiB0b2dnbGVEb25lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEV2ZW50UmVmLCBFdmVudHMgYXMgT2JzaWRpYW5FdmVudHMgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgU3RhdGUgfSBmcm9tICcuL0NhY2hlJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5cbmVudW0gRXZlbnQge1xuICAgIENhY2hlVXBkYXRlID0gJ29ic2lkaWFuLXRhc2tzLXBsdWdpbjpjYWNoZS11cGRhdGUnLFxuICAgIFJlcXVlc3RDYWNoZVVwZGF0ZSA9ICdvYnNpZGlhbi10YXNrcy1wbHVnaW46cmVxdWVzdC1jYWNoZS11cGRhdGUnLFxufVxuXG5pbnRlcmZhY2UgQ2FjaGVVcGRhdGVEYXRhIHtcbiAgICB0YXNrczogVGFza1tdO1xuICAgIHN0YXRlOiBTdGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XG4gICAgcHJpdmF0ZSBvYnNpZGlhbkV2ZW50czogT2JzaWRpYW5FdmVudHM7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IG9ic2lkaWFuRWVudHMgfTogeyBvYnNpZGlhbkVlbnRzOiBPYnNpZGlhbkV2ZW50cyB9KSB7XG4gICAgICAgIHRoaXMub2JzaWRpYW5FdmVudHMgPSBvYnNpZGlhbkVlbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNhY2hlVXBkYXRlKFxuICAgICAgICBoYW5kbGVyOiAoY2FjaGVEYXRhOiBDYWNoZVVwZGF0ZURhdGEpID0+IHZvaWQsXG4gICAgKTogRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbkV2ZW50cy5vbihFdmVudC5DYWNoZVVwZGF0ZSwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJDYWNoZVVwZGF0ZShjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9ic2lkaWFuRXZlbnRzLnRyaWdnZXIoRXZlbnQuQ2FjaGVVcGRhdGUsIGNhY2hlRGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVxdWVzdENhY2hlVXBkYXRlKFxuICAgICAgICBoYW5kbGVyOiAoZm46IChjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgICApOiBFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuRXZlbnRzLm9uKEV2ZW50LlJlcXVlc3RDYWNoZVVwZGF0ZSwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJSZXF1ZXN0Q2FjaGVVcGRhdGUoXG4gICAgICAgIGZuOiAoY2FjaGVEYXRhOiBDYWNoZVVwZGF0ZURhdGEpID0+IHZvaWQsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzaWRpYW5FdmVudHMudHJpZ2dlcihFdmVudC5SZXF1ZXN0Q2FjaGVVcGRhdGUsIGZuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50UmVmOiBFdmVudFJlZik6IHZvaWQge1xuICAgICAgICB0aGlzLm9ic2lkaWFuRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICdTZXR0aW5ncyc7XG5cbmltcG9ydCB0eXBlIHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVSZW5kZXJlciB7XG4gICAgY29uc3RydWN0b3IoeyBwbHVnaW4gfTogeyBwbHVnaW46IFBsdWdpbiB9KSB7XG4gICAgICAgIHBsdWdpbi5yZWdpc3Rlck1hcmtkb3duUG9zdFByb2Nlc3NvcihcbiAgICAgICAgICAgIHRoaXMuX21hcmtkb3duUG9zdFByb2Nlc3Nvci5iaW5kKHRoaXMpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXJrZG93blBvc3RQcm9jZXNzb3IgPSB0aGlzLl9tYXJrZG93blBvc3RQcm9jZXNzb3IuYmluZCh0aGlzKTtcblxuICAgIHByaXZhdGUgYXN5bmMgX21hcmtkb3duUG9zdFByb2Nlc3NvcihcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgZ2xvYmFsRmlsdGVyIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzID0gZWxlbWVudFxuICAgICAgICAgICAgLmZpbmRBbGwoJy50YXNrLWxpc3QtaXRlbScpXG4gICAgICAgICAgICAuZmlsdGVyKCh0YXNrSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzVGV4dCA9IHRhc2tJdGVtLnRleHRDb250ZW50Py5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzVGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBsaW5lLiBDYW4gYmUgbXVsdGlwbGUgbGluZXMgaWYgYW4gTEkgZWxlbWVudCBjb250YWlucyBhbiBVTC5cbiAgICAgICAgICAgICAgICAvLyBXYW50IHRvIG1hdGNoIHRoZSB0b3AgbGV2ZWwgTEkgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBmYWxzZSBwb3NpdGl2ZSwgd2hlbiB0aGUgTEkgd2Fzbid0IGEgdGFzayBpdHNlbGYsIGJ1dCBjb250YWluZWQgdGhlXG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGZpbHRlciBpbiBjaGlsZCBMSXMuXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0TGluZVRleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGxpbmUgaXMgdGhlIGZpcnN0IGxpbmUgdGhhdCBpcyBub3QgZW1wdHkuIEVtcHR5IGxpbmVzIGNhbiBleGlzdCB3aGVuXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNoZWNrbGlzdCBpbiBtYXJrZG93biBpbmNsdWRlcyBibGFuayBsaW5lcyAoc2VlICMzMTMpLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNUZXh0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1RleHRbaV0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdExpbmVUZXh0ID0gbGluZXNUZXh0W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RMaW5lVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0TGluZVRleHQuaW5jbHVkZXMoZ2xvYmFsRmlsdGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAocmVuZGVyZWRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIHRhc2tzIG1lYW5zIG5vdGhpbmcgdG8gZG8uXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXRoID0gY29udGV4dC5zb3VyY2VQYXRoO1xuICAgICAgICBjb25zdCBzZWN0aW9uID0gY29udGV4dC5nZXRTZWN0aW9uSW5mbyhlbGVtZW50KTtcblxuICAgICAgICBpZiAoc2VjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2UgY2Fubm90IHByb2Nlc3MgdGhlIHJlbmRlciB3aXRob3V0IHRoZSBzZWN0aW9uIGluZm8uXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlTGluZXMgPSBzZWN0aW9uLnRleHQuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICBjb25zdCBmaWxlVGFza3M6IFRhc2tbXSA9IFtdO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IGxpbmVOdW1iZXIgPSBzZWN0aW9uLmxpbmVTdGFydDtcbiAgICAgICAgICAgIGxpbmVOdW1iZXIgPD0gc2VjdGlvbi5saW5lRW5kO1xuICAgICAgICAgICAgbGluZU51bWJlcisrXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmQgdXAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIGZpbGUsXG4gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IHByb2Nlc3MgdGhpcyB0YXNrLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25TdGFydDogc2VjdGlvbi5saW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgcHJlY2VkaW5nIGhlYWRlciBmb3IgaW4tbGluZSByZW5kZXJpbmcuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZmlsZVRhc2tzLnB1c2godGFzayk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgc2VjdGlvbiBpbmRleCBpcyB0aGUgbnRoIHRhc2sgd2l0aGluIHRoaXMgc2VjdGlvbi5cbiAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICAgICAgc2VjdGlvbkluZGV4IDwgcmVuZGVyZWRFbGVtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBzZWN0aW9uSW5kZXgrK1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBmaWxlVGFza3Nbc2VjdGlvbkluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHNbc2VjdGlvbkluZGV4XTtcblxuICAgICAgICAgICAgaWYgKHRhc2sgPT09IHVuZGVmaW5lZCB8fCByZW5kZXJlZEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEFzc3VtaW5nIG1hdGNoIG9mIHRhc2tzIGluIGZpbGUgYW5kIHJlbmRlciBwcmV2aWV3LlxuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWlzLW1hdGNoIGluIHRoZSBudW1iZXJzLCB3ZSBzdGlsbCBwcm9jZXNzXG4gICAgICAgICAgICAgICAgLy8gd2hhdCB3ZSBjYW4uXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFMaW5lOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudC5nZXRBdHRyKCdkYXRhLWxpbmUnKSA/PyAnMCc7XG4gICAgICAgICAgICBjb25zdCBsaXN0SW5kZXg6IG51bWJlciA9IE51bWJlci5wYXJzZUludChkYXRhTGluZSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGFza0VsZW1lbnQgPSBhd2FpdCB0YXNrLnRvTGkoe1xuICAgICAgICAgICAgICAgIHBhcmVudFVsRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBsaXN0SW5kZXgsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgYSBzdWItbGlzdCBvciBzdWItZGl2IChlLmcuIHRoZVxuICAgICAgICAgICAgLy8gZm9sZGluZyBhcnJvdyksIHdlIG5lZWQgdG8ga2VlcCBpdC5cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGRyZW4gPSByZW5kZXJlZEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkaXYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tFbGVtZW50LnByZXBlbmQocmVuZGVyZWRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd1bCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza0VsZW1lbnQuYXBwZW5kKHJlbmRlcmVkQ2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmUtc2V0IHRoZSBvcmlnaW5hbCBmb290bm90ZXMuXG4gICAgICAgICAgICAvLyBUaGUgbmV3bHkgcmVuZGVyZWQgSFRNTCB3b24ndCBoYXZlIHRoZSBjb3JyZWN0IGluZGV4ZXMgYW5kIGxpbmtzXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRm9vdG5vdGVzID1cbiAgICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZm9vdG5vdGUtaWRdJyk7XG4gICAgICAgICAgICBjb25zdCBuZXdGb290bm90ZXMgPVxuICAgICAgICAgICAgICAgIHRhc2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZvb3Rub3RlLWlkXScpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsRm9vdG5vdGVzLmxlbmd0aCA9PT0gbmV3Rm9vdG5vdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZ2luYWxGb290bm90ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9vdG5vdGVzW2ldLnJlcGxhY2VXaXRoKG9yaWdpbmFsRm9vdG5vdGVzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudC5yZXBsYWNlV2l0aCh0YXNrRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgY2hyb25vIGZyb20gJ2Nocm9uby1ub2RlJztcblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IExheW91dE9wdGlvbnMgfSBmcm9tICcuL0xheW91dE9wdGlvbnMnO1xuaW1wb3J0IHsgUHJpb3JpdHksIFN0YXR1cywgVGFzayB9IGZyb20gJy4vVGFzayc7XG5cbmV4cG9ydCB0eXBlIFNvcnRpbmdQcm9wZXJ0eSA9XG4gICAgfCAndXJnZW5jeSdcbiAgICB8ICdzdGF0dXMnXG4gICAgfCAncHJpb3JpdHknXG4gICAgfCAnc3RhcnQnXG4gICAgfCAnc2NoZWR1bGVkJ1xuICAgIHwgJ2R1ZSdcbiAgICB8ICdkb25lJ1xuICAgIHwgJ3BhdGgnXG4gICAgfCAnZGVzY3JpcHRpb24nO1xudHlwZSBTb3J0aW5nID0geyBwcm9wZXJ0eTogU29ydGluZ1Byb3BlcnR5OyByZXZlcnNlOiBib29sZWFuIH07XG5cbmV4cG9ydCBjbGFzcyBRdWVyeSB7XG4gICAgcHJpdmF0ZSBfbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIF9sYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zID0gbmV3IExheW91dE9wdGlvbnMoKTtcbiAgICBwcml2YXRlIF9maWx0ZXJzOiAoKHRhc2s6IFRhc2spID0+IGJvb2xlYW4pW10gPSBbXTtcbiAgICBwcml2YXRlIF9lcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgX3NvcnRpbmc6IFNvcnRpbmdbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmlvcml0eVJlZ2V4cCA9XG4gICAgICAgIC9ecHJpb3JpdHkgKGlzICk/KGFib3ZlfGJlbG93KT8gPyhsb3d8bm9uZXxtZWRpdW18aGlnaCkvO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBub1N0YXJ0U3RyaW5nID0gJ25vIHN0YXJ0IGRhdGUnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRSZWdleHAgPSAvXnN0YXJ0cyAoYmVmb3JlfGFmdGVyfG9uKT8gPyguKikvO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBub1NjaGVkdWxlZFN0cmluZyA9ICdubyBzY2hlZHVsZWQgZGF0ZSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2hlZHVsZWRSZWdleHAgPSAvXnNjaGVkdWxlZCAoYmVmb3JlfGFmdGVyfG9uKT8gPyguKikvO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBub0R1ZVN0cmluZyA9ICdubyBkdWUgZGF0ZSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkdWVSZWdleHAgPSAvXmR1ZSAoYmVmb3JlfGFmdGVyfG9uKT8gPyguKikvO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb25lU3RyaW5nID0gJ2RvbmUnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbm90RG9uZVN0cmluZyA9ICdub3QgZG9uZSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkb25lUmVnZXhwID0gL15kb25lIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhdGhSZWdleHAgPSAvXnBhdGggKGluY2x1ZGVzfGRvZXMgbm90IGluY2x1ZGUpICguKikvO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb25SZWdleHAgPVxuICAgICAgICAvXmRlc2NyaXB0aW9uIChpbmNsdWRlc3xkb2VzIG5vdCBpbmNsdWRlKSAoLiopLztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvcnRCeVJlZ2V4cCA9XG4gICAgICAgIC9ec29ydCBieSAodXJnZW5jeXxzdGF0dXN8cHJpb3JpdHl8c3RhcnR8c2NoZWR1bGVkfGR1ZXxkb25lfHBhdGh8ZGVzY3JpcHRpb24pKCByZXZlcnNlKT8vO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWFkaW5nUmVnZXhwID1cbiAgICAgICAgL15oZWFkaW5nIChpbmNsdWRlc3xkb2VzIG5vdCBpbmNsdWRlKSAoLiopLztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlkZU9wdGlvbnNSZWdleHAgPVxuICAgICAgICAvXmhpZGUgKHRhc2sgY291bnR8YmFja2xpbmt8cHJpb3JpdHl8c3RhcnQgZGF0ZXxzY2hlZHVsZWQgZGF0ZXxkb25lIGRhdGV8ZHVlIGRhdGV8cmVjdXJyZW5jZSBydWxlfGVkaXQgYnV0dG9uKS87XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaG9ydE1vZGVSZWdleHAgPSAvXnNob3J0LztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVjdXJyaW5nU3RyaW5nID0gJ2lzIHJlY3VycmluZyc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBub3RSZWN1cnJpbmdTdHJpbmcgPSAnaXMgbm90IHJlY3VycmluZyc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpbWl0UmVnZXhwID0gL15saW1pdCAodG8gKT8oXFxkKykoIHRhc2tzPyk/LztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVTdWJJdGVtc1N0cmluZyA9ICdleGNsdWRlIHN1Yi1pdGVtcyc7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IHNvdXJjZSB9OiB7IHNvdXJjZTogc3RyaW5nIH0pIHtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgLmZvckVhY2goKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGxpbmUgPT09ICcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbGluZSA9PT0gdGhpcy5kb25lU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrKSA9PiB0YXNrLnN0YXR1cyA9PT0gU3RhdHVzLkRvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbGluZSA9PT0gdGhpcy5ub3REb25lU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrKSA9PiB0YXNrLnN0YXR1cyAhPT0gU3RhdHVzLkRvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbGluZSA9PT0gdGhpcy5yZWN1cnJpbmdTdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goKHRhc2spID0+IHRhc2sucmVjdXJyZW5jZSAhPT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaW5lID09PSB0aGlzLm5vdFJlY3VycmluZ1N0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaCgodGFzaykgPT4gdGFzay5yZWN1cnJlbmNlID09PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGxpbmUgPT09IHRoaXMuZXhjbHVkZVN1Ykl0ZW1zU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKCh0YXNrKSA9PiB0YXNrLmluZGVudGF0aW9uID09PSAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaW5lID09PSB0aGlzLm5vU3RhcnRTdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goKHRhc2spID0+IHRhc2suc3RhcnREYXRlID09PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGxpbmUgPT09IHRoaXMubm9TY2hlZHVsZWRTdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2spID0+IHRhc2suc2NoZWR1bGVkRGF0ZSA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaW5lID09PSB0aGlzLm5vRHVlU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKCh0YXNrKSA9PiB0YXNrLmR1ZURhdGUgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5zaG9ydE1vZGVSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuc2hvcnRNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMucHJpb3JpdHlSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VQcmlvcml0eUZpbHRlcih7IGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLnN0YXJ0UmVnZXhwLnRlc3QobGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU3RhcnRGaWx0ZXIoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5zY2hlZHVsZWRSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTY2hlZHVsZWRGaWx0ZXIoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5kdWVSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VEdWVGaWx0ZXIoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5kb25lUmVnZXhwLnRlc3QobGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRG9uZUZpbHRlcih7IGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLnBhdGhSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VQYXRoRmlsdGVyKHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZGVzY3JpcHRpb25SZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VEZXNjcmlwdGlvbkZpbHRlcih7IGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmhlYWRpbmdSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkaW5nRmlsdGVyKHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMubGltaXRSZWdleHAudGVzdChsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VMaW1pdCh7IGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLnNvcnRCeVJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvcnRCeSh7IGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmhpZGVPcHRpb25zUmVnZXhwLnRlc3QobGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlSGlkZU9wdGlvbnMoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGltaXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsYXlvdXRPcHRpb25zKCk6IExheW91dE9wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0T3B0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKTogKCh0YXNrOiBUYXNrKSA9PiBib29sZWFuKVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlSGlkZU9wdGlvbnMoeyBsaW5lIH06IHsgbGluZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGlkZU9wdGlvbnNNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5oaWRlT3B0aW9uc1JlZ2V4cCk7XG4gICAgICAgIGlmIChoaWRlT3B0aW9uc01hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBoaWRlT3B0aW9uc01hdGNoWzFdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Rhc2sgY291bnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVUYXNrQ291bnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdiYWNrbGluayc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZUJhY2tsaW5rcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ByaW9yaXR5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlUHJpb3JpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdGFydCBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlU3RhcnREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NoZWR1bGVkIGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVTY2hlZHVsZWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZHVlIGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVEdWVEYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZG9uZSBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlRG9uZURhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZWN1cnJlbmNlIHJ1bGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVSZWN1cnJlbmNlUnVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VkaXQgYnV0dG9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlRWRpdEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGhpZGUgb3B0aW9uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQcmlvcml0eUZpbHRlcih7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcmlvcml0eU1hdGNoID0gbGluZS5tYXRjaCh0aGlzLnByaW9yaXR5UmVnZXhwKTtcbiAgICAgICAgaWYgKHByaW9yaXR5TWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclByaW9yaXR5U3RyaW5nID0gcHJpb3JpdHlNYXRjaFszXTtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJQcmlvcml0eTogUHJpb3JpdHkgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgc3dpdGNoIChmaWx0ZXJQcmlvcml0eVN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclByaW9yaXR5ID0gUHJpb3JpdHkuTG93O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUHJpb3JpdHkgPSBQcmlvcml0eS5Ob25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQcmlvcml0eSA9IFByaW9yaXR5Lk1lZGl1bTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclByaW9yaXR5ID0gUHJpb3JpdHkuSGlnaDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJQcmlvcml0eSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHByaW9yaXR5JztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmaWx0ZXI7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHlNYXRjaFsyXSA9PT0gJ2Fib3ZlJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnByaW9yaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRhc2sucHJpb3JpdHkubG9jYWxlQ29tcGFyZShmaWx0ZXJQcmlvcml0eSEpIDwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJpb3JpdHlNYXRjaFsyXSA9PT0gJ2JlbG93Jykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnByaW9yaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRhc2sucHJpb3JpdHkubG9jYWxlQ29tcGFyZShmaWx0ZXJQcmlvcml0eSEpID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+XG4gICAgICAgICAgICAgICAgICAgIHRhc2sucHJpb3JpdHkgPyB0YXNrLnByaW9yaXR5ID09PSBmaWx0ZXJQcmlvcml0eSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAocHJpb3JpdHkgZGF0ZSknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVN0YXJ0RmlsdGVyKHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuc3RhcnRSZWdleHApO1xuICAgICAgICBpZiAoc3RhcnRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHN0YXJ0TWF0Y2hbMl0pO1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXJEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHN0YXJ0IGRhdGUnO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbHRlcjtcbiAgICAgICAgICAgIGlmIChzdGFydE1hdGNoWzFdID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnN0YXJ0RGF0ZSA/IHRhc2suc3RhcnREYXRlLmlzQmVmb3JlKGZpbHRlckRhdGUpIDogdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRNYXRjaFsxXSA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnN0YXJ0RGF0ZSA/IHRhc2suc3RhcnREYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSkgOiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5zdGFydERhdGUgPyB0YXNrLnN0YXJ0RGF0ZS5pc1NhbWUoZmlsdGVyRGF0ZSkgOiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoc3RhcnQgZGF0ZSknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVNjaGVkdWxlZEZpbHRlcih7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5zY2hlZHVsZWRSZWdleHApO1xuICAgICAgICBpZiAoc2NoZWR1bGVkTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRhdGUgPSB0aGlzLnBhcnNlRGF0ZShzY2hlZHVsZWRNYXRjaFsyXSk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlckRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgc2NoZWR1bGVkIGRhdGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsdGVyO1xuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZE1hdGNoWzFdID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnNjaGVkdWxlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFzay5zY2hlZHVsZWREYXRlLmlzQmVmb3JlKGZpbHRlckRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlZHVsZWRNYXRjaFsxXSA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnNjaGVkdWxlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFzay5zY2hlZHVsZWREYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLnNjaGVkdWxlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFzay5zY2hlZHVsZWREYXRlLmlzU2FtZShmaWx0ZXJEYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKHNjaGVkdWxlZCBkYXRlKSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlRHVlRmlsdGVyKHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGR1ZU1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmR1ZVJlZ2V4cCk7XG4gICAgICAgIGlmIChkdWVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGR1ZU1hdGNoWzJdKTtcbiAgICAgICAgICAgIGlmICghZmlsdGVyRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBkdWUgZGF0ZSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsdGVyO1xuICAgICAgICAgICAgaWYgKGR1ZU1hdGNoWzFdID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0YXNrLmR1ZURhdGUgPyB0YXNrLmR1ZURhdGUuaXNCZWZvcmUoZmlsdGVyRGF0ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZHVlTWF0Y2hbMV0gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5kdWVEYXRlID8gdGFzay5kdWVEYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+XG4gICAgICAgICAgICAgICAgICAgIHRhc2suZHVlRGF0ZSA/IHRhc2suZHVlRGF0ZS5pc1NhbWUoZmlsdGVyRGF0ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKGR1ZSBkYXRlKSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlRG9uZUZpbHRlcih7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBkb25lTWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZG9uZVJlZ2V4cCk7XG4gICAgICAgIGlmIChkb25lTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkb25lTWF0Y2hbMl0pO1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXJEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGRvbmUgZGF0ZSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsdGVyO1xuICAgICAgICAgICAgaWYgKGRvbmVNYXRjaFsxXSA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5kb25lRGF0ZSA/IHRhc2suZG9uZURhdGUuaXNCZWZvcmUoZmlsdGVyRGF0ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9uZU1hdGNoWzFdID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+XG4gICAgICAgICAgICAgICAgICAgIHRhc2suZG9uZURhdGUgPyB0YXNrLmRvbmVEYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+XG4gICAgICAgICAgICAgICAgICAgIHRhc2suZG9uZURhdGUgPyB0YXNrLmRvbmVEYXRlLmlzU2FtZShmaWx0ZXJEYXRlKSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQYXRoRmlsdGVyKHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5wYXRoUmVnZXhwKTtcbiAgICAgICAgaWYgKHBhdGhNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyTWV0aG9kID0gcGF0aE1hdGNoWzFdO1xuICAgICAgICAgICAgaWYgKGZpbHRlck1ldGhvZCA9PT0gJ2luY2x1ZGVzJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaCgodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJpbmdJbmNsdWRlc0Nhc2VJbnNlbnNpdGl2ZSh0YXNrLnBhdGgsIHBhdGhNYXRjaFsyXSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aE1hdGNoWzFdID09PSAnZG9lcyBub3QgaW5jbHVkZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3RyaW5nSW5jbHVkZXNDYXNlSW5zZW5zaXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhNYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyIChwYXRoKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKHBhdGgpJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZXNjcmlwdGlvbkZpbHRlcih7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbk1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmRlc2NyaXB0aW9uUmVnZXhwKTtcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlck1ldGhvZCA9IGRlc2NyaXB0aW9uTWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXIgPSBnZXRTZXR0aW5ncygpLmdsb2JhbEZpbHRlcjtcblxuICAgICAgICAgICAgaWYgKGZpbHRlck1ldGhvZCA9PT0gJ2luY2x1ZGVzJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaCgodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJpbmdJbmNsdWRlc0Nhc2VJbnNlbnNpdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBnbG9iYWwgZmlsdGVyIGZyb20gZGVzY3JpcHRpb24gbWF0Y2ggaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIG9ubHkgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHRhc2ssIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBmaWx0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmRlc2NyaXB0aW9uLnJlcGxhY2UoZ2xvYmFsRmlsdGVyLCAnJykudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25NYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbk1hdGNoWzFdID09PSAnZG9lcyBub3QgaW5jbHVkZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3RyaW5nSW5jbHVkZXNDYXNlSW5zZW5zaXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGdsb2JhbCBmaWx0ZXIgZnJvbSBkZXNjcmlwdGlvbiBtYXRjaCBpZiBwcmVzZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIG9ubHkgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHRhc2ssIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBnbG9iYWwgZmlsdGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVzY3JpcHRpb24ucmVwbGFjZShnbG9iYWxGaWx0ZXIsICcnKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25NYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyIChkZXNjcmlwdGlvbiknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyIChkZXNjcmlwdGlvbiknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUhlYWRpbmdGaWx0ZXIoeyBsaW5lIH06IHsgbGluZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGVhZGluZ01hdGNoID0gbGluZS5tYXRjaCh0aGlzLmhlYWRpbmdSZWdleHApO1xuICAgICAgICBpZiAoaGVhZGluZ01hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJNZXRob2QgPSBoZWFkaW5nTWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJNZXRob2QgPT09ICdpbmNsdWRlcycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICh0YXNrOiBUYXNrKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5wcmVjZWRpbmdIZWFkZXIgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nSW5jbHVkZXNDYXNlSW5zZW5zaXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5wcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZ01hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkaW5nTWF0Y2hbMV0gPT09ICdkb2VzIG5vdCBpbmNsdWRlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgKHRhc2s6IFRhc2spID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnByZWNlZGluZ0hlYWRlciA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3RyaW5nSW5jbHVkZXNDYXNlSW5zZW5zaXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5wcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZ01hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKGhlYWRpbmcpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoaGVhZGluZyknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUxpbWl0KHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMubGltaXRSZWdleHApO1xuICAgICAgICBpZiAobGltaXRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbGltaXRNYXRjaFsyXSBpcyBwZXIgcmVnZXggYWx3YXlzIGRpZ2l0cyBhbmQgdGhlcmVmb3JlIHBhcnNhYmxlLlxuICAgICAgICAgICAgY29uc3QgbGltaXQgPSBOdW1iZXIucGFyc2VJbnQobGltaXRNYXRjaFsyXSwgMTApO1xuICAgICAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGxpbWl0JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VTb3J0QnkoeyBsaW5lIH06IHsgbGluZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmllbGRNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5zb3J0QnlSZWdleHApO1xuICAgICAgICBpZiAoZmllbGRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fc29ydGluZy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogZmllbGRNYXRjaFsxXSBhcyBTb3J0aW5nUHJvcGVydHksXG4gICAgICAgICAgICAgICAgcmV2ZXJzZTogISFmaWVsZE1hdGNoWzJdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBzb3J0aW5nJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEYXRlKGlucHV0OiBzdHJpbmcpOiBtb21lbnQuTW9tZW50IHtcbiAgICAgICAgLy8gVXNpbmcgc3RhcnQgb2YgZGF5IHRvIGNvcnJlY3RseSBtYXRjaCBvbiBjb21wYXJpc29uIHdpdGggb3RoZXIgZGF0ZXMgKGxpa2UgZXF1YWxpdHkpLlxuICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudChjaHJvbm8ucGFyc2VEYXRlKGlucHV0KSkuc3RhcnRPZignZGF5Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdHJpbmdJbmNsdWRlc0Nhc2VJbnNlbnNpdGl2ZShcbiAgICAgICAgaGF5c3RhY2s6IHN0cmluZyxcbiAgICAgICAgbmVlZGxlOiBzdHJpbmcsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBoYXlzdGFja1xuICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyhuZWVkbGUudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBRdWVyeSwgU29ydGluZ1Byb3BlcnR5IH0gZnJvbSAnLi9RdWVyeSc7XG5cbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9TZXR0aW5ncyc7XG5cbnR5cGUgQ29tcGFyYXRvciA9IChhOiBUYXNrLCBiOiBUYXNrKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBjbGFzcyBTb3J0IHtcbiAgICBwdWJsaWMgc3RhdGljIGJ5KHF1ZXJ5OiBQaWNrPFF1ZXJ5LCAnc29ydGluZyc+LCB0YXNrczogVGFza1tdKTogVGFza1tdIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENvbXBhcmF0b3JzOiBDb21wYXJhdG9yW10gPSBbXG4gICAgICAgICAgICBTb3J0LmNvbXBhcmVCeVVyZ2VuY3ksXG4gICAgICAgICAgICBTb3J0LmNvbXBhcmVCeVN0YXR1cyxcbiAgICAgICAgICAgIFNvcnQuY29tcGFyZUJ5RHVlRGF0ZSxcbiAgICAgICAgICAgIFNvcnQuY29tcGFyZUJ5UHJpb3JpdHksXG4gICAgICAgICAgICBTb3J0LmNvbXBhcmVCeVBhdGgsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdXNlckNvbXBhcmF0b3JzOiBDb21wYXJhdG9yW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcHJvcGVydHksIHJldmVyc2UgfSBvZiBxdWVyeS5zb3J0aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wYXJhdG9yID0gU29ydC5jb21wYXJhdG9yc1twcm9wZXJ0eV07XG4gICAgICAgICAgICB1c2VyQ29tcGFyYXRvcnMucHVzaChcbiAgICAgICAgICAgICAgICByZXZlcnNlID8gU29ydC5tYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIDogY29tcGFyYXRvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFza3Muc29ydChcbiAgICAgICAgICAgIFNvcnQubWFrZUNvbXBvc2l0ZUNvbXBhcmF0b3IoW1xuICAgICAgICAgICAgICAgIC4uLnVzZXJDb21wYXJhdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5kZWZhdWx0Q29tcGFyYXRvcnMsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21wYXJhdG9yczogUmVjb3JkPFNvcnRpbmdQcm9wZXJ0eSwgQ29tcGFyYXRvcj4gPSB7XG4gICAgICAgIHVyZ2VuY3k6IFNvcnQuY29tcGFyZUJ5VXJnZW5jeSxcbiAgICAgICAgZGVzY3JpcHRpb246IFNvcnQuY29tcGFyZUJ5RGVzY3JpcHRpb24sXG4gICAgICAgIHByaW9yaXR5OiBTb3J0LmNvbXBhcmVCeVByaW9yaXR5LFxuICAgICAgICBzdGFydDogU29ydC5jb21wYXJlQnlTdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZDogU29ydC5jb21wYXJlQnlTY2hlZHVsZWREYXRlLFxuICAgICAgICBkdWU6IFNvcnQuY29tcGFyZUJ5RHVlRGF0ZSxcbiAgICAgICAgZG9uZTogU29ydC5jb21wYXJlQnlEb25lRGF0ZSxcbiAgICAgICAgcGF0aDogU29ydC5jb21wYXJlQnlQYXRoLFxuICAgICAgICBzdGF0dXM6IFNvcnQuY29tcGFyZUJ5U3RhdHVzLFxuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3I6IENvbXBhcmF0b3IpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhLCBiKSA9PiAoY29tcGFyYXRvcihhLCBiKSAqIC0xKSBhcyAtMSB8IDAgfCAxO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG1ha2VDb21wb3NpdGVDb21wYXJhdG9yKFxuICAgICAgICBjb21wYXJhdG9yczogQ29tcGFyYXRvcltdLFxuICAgICk6IENvbXBhcmF0b3Ige1xuICAgICAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcGFyYXRvciBvZiBjb21wYXJhdG9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IoYSwgYik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbXBhcmVCeVVyZ2VuY3koYTogVGFzaywgYjogVGFzayk6IG51bWJlciB7XG4gICAgICAgIC8vIEhpZ2hlciB1cmdlbmN5IHNob3VsZCBiZSBzb3J0ZWQgZWFybGllci5cbiAgICAgICAgcmV0dXJuIGIudXJnZW5jeSAtIGEudXJnZW5jeTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21wYXJlQnlTdGF0dXMoYTogVGFzaywgYjogVGFzayk6IC0xIHwgMCB8IDEge1xuICAgICAgICBpZiAoYS5zdGF0dXMgPCBiLnN0YXR1cykge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5zdGF0dXMgPiBiLnN0YXR1cykge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21wYXJlQnlQcmlvcml0eShhOiBUYXNrLCBiOiBUYXNrKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkubG9jYWxlQ29tcGFyZShiLnByaW9yaXR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21wYXJlQnlTdGFydERhdGUoYTogVGFzaywgYjogVGFzayk6IC0xIHwgMCB8IDEge1xuICAgICAgICByZXR1cm4gU29ydC5jb21wYXJlQnlEYXRlKGEuc3RhcnREYXRlLCBiLnN0YXJ0RGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29tcGFyZUJ5U2NoZWR1bGVkRGF0ZShhOiBUYXNrLCBiOiBUYXNrKTogLTEgfCAwIHwgMSB7XG4gICAgICAgIHJldHVybiBTb3J0LmNvbXBhcmVCeURhdGUoYS5zY2hlZHVsZWREYXRlLCBiLnNjaGVkdWxlZERhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbXBhcmVCeUR1ZURhdGUoYTogVGFzaywgYjogVGFzayk6IC0xIHwgMCB8IDEge1xuICAgICAgICByZXR1cm4gU29ydC5jb21wYXJlQnlEYXRlKGEuZHVlRGF0ZSwgYi5kdWVEYXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21wYXJlQnlEb25lRGF0ZShhOiBUYXNrLCBiOiBUYXNrKTogLTEgfCAwIHwgMSB7XG4gICAgICAgIHJldHVybiBTb3J0LmNvbXBhcmVCeURhdGUoYS5kb25lRGF0ZSwgYi5kb25lRGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29tcGFyZUJ5RGF0ZShcbiAgICAgICAgYTogbW9tZW50Lk1vbWVudCB8IG51bGwsXG4gICAgICAgIGI6IG1vbWVudC5Nb21lbnQgfCBudWxsLFxuICAgICk6IC0xIHwgMCB8IDEge1xuICAgICAgICBpZiAoYSAhPT0gbnVsbCAmJiBiID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSA9PT0gbnVsbCAmJiBiICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChhICE9PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhLmlzQWZ0ZXIoYikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5pc0JlZm9yZShiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbXBhcmVCeVBhdGgoYTogVGFzaywgYjogVGFzayk6IC0xIHwgMCB8IDEge1xuICAgICAgICBpZiAoYS5wYXRoIDwgYi5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5wYXRoID4gYi5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSB0aGUgZGVzY3JpcHRpb24gYnkgaG93IGl0IGlzIHJlbmRlcmVkIGluIG1hcmtkb3duLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgdXNlIHRoZSBNYXJrZG93blJlbmRlcmVyLCBidXQgdHJpZXMgdG8gbWF0Y2ggcmVnZXhlcyBpbnN0ZWFkXG4gICAgICogaW4gb3JkZXIgdG8gYmUgc2ltcGxlciwgZmFzdGVyLCBhbmQgbm90IGFzeW5jLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGNvbXBhcmVCeURlc2NyaXB0aW9uKGE6IFRhc2ssIGI6IFRhc2spIHtcbiAgICAgICAgcmV0dXJuIFNvcnQuY2xlYW5EZXNjcmlwdGlvbihhLmRlc2NyaXB0aW9uKS5sb2NhbGVDb21wYXJlKFxuICAgICAgICAgICAgU29ydC5jbGVhbkRlc2NyaXB0aW9uKGIuZGVzY3JpcHRpb24pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYCpgLCBgPWAsIGFuZCBgW2AgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZXNjcmlwdGlvbi5cbiAgICAgKlxuICAgICAqIFdpbGwgcmVtb3ZlIHRoZW0gb25seSBpZiB0aGV5IGFyZSBjbG9zaW5nLlxuICAgICAqIFByb3Blcmx5IHJlYWRzIGxpbmtzIFtbbGlrZSB0aGlzfG9uZV1dIChub3RlIHBpcGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGNsZWFuRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlciA9IGdldFNldHRpbmdzKCkuZ2xvYmFsRmlsdGVyO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoZ2xvYmFsRmlsdGVyLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0c1dpdGhMaW5rUmVnZXggPSAvXlxcW1xcWz8oW15cXF1dKilcXF0vO1xuICAgICAgICBjb25zdCBsaW5rUmVnZXhNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKHN0YXJ0c1dpdGhMaW5rUmVnZXgpO1xuICAgICAgICBpZiAobGlua1JlZ2V4TWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyTGlua1RleHQgPSBsaW5rUmVnZXhNYXRjaFsxXTtcbiAgICAgICAgICAgIC8vIEZvciBhIGxpbmssIHdlIGhhdmUgdG8gY2hlY2sgd2hldGhlciBpdCBoYXMgYW5vdGhlciB2aXNpYmxlIG5hbWUgc2V0LlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUgYFtbdGhpcyBpcyB0aGUgbGlua3xidXQgdGhpcyBpcyBhY3R1YWxseSBzaG93bl1dYC5cbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID1cbiAgICAgICAgICAgICAgICBpbm5lckxpbmtUZXh0LnN1YnN0cmluZyhpbm5lckxpbmtUZXh0LmluZGV4T2YoJ3wnKSArIDEpICtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXBsYWNlKHN0YXJ0c1dpdGhMaW5rUmVnZXgsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0c1dpdGhJdGFsaWNPckJvbGRSZWdleCA9IC9eXFwqXFwqPyhbXipdKilcXCovO1xuICAgICAgICBjb25zdCBpdGFsaWNCb2xkUmVnZXhNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFxuICAgICAgICAgICAgc3RhcnRzV2l0aEl0YWxpY09yQm9sZFJlZ2V4LFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRhbGljQm9sZFJlZ2V4TWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVySXRhbGljQm9sZFRleHQgPSBpdGFsaWNCb2xkUmVnZXhNYXRjaFsxXTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID1cbiAgICAgICAgICAgICAgICBpbm5lckl0YWxpY0JvbGRUZXh0ICtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXBsYWNlKHN0YXJ0c1dpdGhMaW5rUmVnZXgsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0c1dpdGhIaWdobGlnaHRSZWdleCA9IC9ePT0/KFtePV0qKT09LztcbiAgICAgICAgY29uc3QgaGlnaGxpZ2h0UmVnZXhNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKHN0YXJ0c1dpdGhIaWdobGlnaHRSZWdleCk7XG4gICAgICAgIGlmIChoaWdobGlnaHRSZWdleE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lckhpZ2hsaWdodHNUZXh0ID0gaGlnaGxpZ2h0UmVnZXhNYXRjaFsxXTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID1cbiAgICAgICAgICAgICAgICBpbm5lckhpZ2hsaWdodHNUZXh0ICtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXBsYWNlKHN0YXJ0c1dpdGhIaWdobGlnaHRSZWdleCwgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgQXBwLFxuICAgIEV2ZW50UmVmLFxuICAgIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gICAgTWFya2Rvd25SZW5kZXJDaGlsZCxcbiAgICBQbHVnaW4sXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL0NhY2hlJztcbmltcG9ydCB7IHJlcGxhY2VUYXNrV2l0aFRhc2tzIH0gZnJvbSAnLi9GaWxlJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9RdWVyeSc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnLi9Tb3J0JztcbmltcG9ydCB7IFRhc2tNb2RhbCB9IGZyb20gJy4vVGFza01vZGFsJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzIH0gZnJvbSAnLi9FdmVudHMnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVuZGVyZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IEV2ZW50cztcblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luLCBldmVudHMgfTogeyBwbHVnaW46IFBsdWdpbjsgZXZlbnRzOiBFdmVudHMgfSkge1xuICAgICAgICB0aGlzLmFwcCA9IHBsdWdpbi5hcHA7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgIHBsdWdpbi5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFxuICAgICAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgICAgIHRoaXMuX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQuYmluZCh0aGlzKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVlcnlSZW5kZXJDaGlsZCA9IHRoaXMuX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQuYmluZCh0aGlzKTtcblxuICAgIHByaXZhdGUgYXN5bmMgX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQoXG4gICAgICAgIHNvdXJjZTogc3RyaW5nLFxuICAgICAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCxcbiAgICApIHtcbiAgICAgICAgY29udGV4dC5hZGRDaGlsZChcbiAgICAgICAgICAgIG5ldyBRdWVyeVJlbmRlckNoaWxkKHtcbiAgICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICAgIGV2ZW50czogdGhpcy5ldmVudHMsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuY2xhc3MgUXVlcnlSZW5kZXJDaGlsZCBleHRlbmRzIE1hcmtkb3duUmVuZGVyQ2hpbGQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IEV2ZW50cztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcXVlcnk6IFF1ZXJ5O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJFdmVudFJlZjogRXZlbnRSZWYgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBxdWVyeVJlbG9hZFRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBhcHAsXG4gICAgICAgIGV2ZW50cyxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBzb3VyY2UsXG4gICAgfToge1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgZXZlbnRzOiBFdmVudHM7XG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIH0pIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyKTtcblxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXG4gICAgICAgIHRoaXMucXVlcnkgPSBuZXcgUXVlcnkoeyBzb3VyY2UgfSk7XG4gICAgfVxuXG4gICAgb25sb2FkKCkge1xuICAgICAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IGNhY2hlIHN0YXRlOlxuICAgICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyUmVxdWVzdENhY2hlVXBkYXRlKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuICAgICAgICAvLyBMaXN0ZW4gdG8gZnV0dXJlIGNhY2hlIGNoYW5nZXM6XG4gICAgICAgIHRoaXMucmVuZGVyRXZlbnRSZWYgPSB0aGlzLmV2ZW50cy5vbkNhY2hlVXBkYXRlKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMucmVsb2FkUXVlcnlBdE1pZG5pZ2h0KCk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlckV2ZW50UmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLm9mZih0aGlzLnJlbmRlckV2ZW50UmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UmVsb2FkVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5xdWVyeVJlbG9hZFRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgcXVlcnkgYWZ0ZXIgbWlkbmlnaHQgdG8gdXBkYXRlIHJlc3VsdHMgZnJvbSByZWxhdGl2ZSBkYXRlIHF1ZXJpZXMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIHF1ZXJ5IGBkdWUgdG9kYXlgIGNoYW5nZXMgZXZlcnkgZGF5LiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBhbGwgcXVlcnkgcmVzdWx0c1xuICAgICAqIGFyZSByZS1yZW5kZXJlZCBhZnRlciBtaWRuaWdodCBldmVyeSBkYXkgdG8gZW5zdXJlIHVwLXRvLWRhdGUgcmVzdWx0cyB3aXRob3V0IGhhdmluZyB0b1xuICAgICAqIHJlbG9hZCBvYnNpZGlhbi4gQ3JlYXRpbmcgYSBuZXcgcXVlcnkgb2JqZWN0IGZyb20gdGhlIHNvdXJjZSByZS1hcHBsaWVzIHRoZSByZWxhdGl2ZSBkYXRlc1xuICAgICAqIHRvIFwibm93XCIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWxvYWRRdWVyeUF0TWlkbmlnaHQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1pZG5pZ2h0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgbWlkbmlnaHQuc2V0SG91cnMoMjQsIDAsIDAsIDApO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc1RvTWlkbmlnaHQgPSBtaWRuaWdodC5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpO1xuXG4gICAgICAgIHRoaXMucXVlcnlSZWxvYWRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gbmV3IFF1ZXJ5KHsgc291cmNlOiB0aGlzLnNvdXJjZSB9KTtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGN1cnJlbnQgY2FjaGUgc3RhdGU6XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyUmVxdWVzdENhY2hlVXBkYXRlKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRRdWVyeUF0TWlkbmlnaHQoKTtcbiAgICAgICAgfSwgbWlsbGlzZWNvbmRzVG9NaWRuaWdodCArIDEwMDApOyAvLyBBZGQgYnVmZmVyIHRvIGJlIHN1cmUgdG8gcnVuIGFmdGVyIG1pZG5pZ2h0LlxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVuZGVyKHsgdGFza3MsIHN0YXRlIH06IHsgdGFza3M6IFRhc2tbXTsgc3RhdGU6IFN0YXRlIH0pIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicpO1xuICAgICAgICBpZiAoc3RhdGUgPT09IFN0YXRlLldhcm0gJiYgdGhpcy5xdWVyeS5lcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRhc2tMaXN0LCB0YXNrc0NvdW50IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhc2tzTGlzdCh7XG4gICAgICAgICAgICAgICAgdGFza3MsXG4gICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0YXNrTGlzdCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMucXVlcnkubGF5b3V0T3B0aW9ucy5oaWRlVGFza0NvdW50KSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0YXNrc0NvdW50fSB0YXNrJHt0YXNrc0NvdW50ICE9PSAxID8gJ3MnIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAndGFza3MtY291bnQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnkuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGVudC5zZXRUZXh0KGBUYXNrcyBxdWVyeTogJHt0aGlzLnF1ZXJ5LmVycm9yfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5zZXRUZXh0KCdMb2FkaW5nIFRhc2tzIC4uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5maXJzdENoaWxkPy5yZXBsYWNlV2l0aChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZVRhc2tzTGlzdCh7XG4gICAgICAgIHRhc2tzLFxuICAgICAgICBjb250ZW50LFxuICAgIH06IHtcbiAgICAgICAgdGFza3M6IFRhc2tbXTtcbiAgICAgICAgY29udGVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgfSk6IFByb21pc2U8eyB0YXNrTGlzdDogSFRNTFVMaXN0RWxlbWVudDsgdGFza3NDb3VudDogbnVtYmVyIH0+IHtcbiAgICAgICAgdGhpcy5xdWVyeS5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgICAgICAgdGFza3MgPSB0YXNrcy5maWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGFza3NTb3J0ZWRMaW1pdGVkID0gU29ydC5ieSh0aGlzLnF1ZXJ5LCB0YXNrcykuc2xpY2UoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgdGhpcy5xdWVyeS5saW1pdCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGFza3NDb3VudCA9IHRhc2tzU29ydGVkTGltaXRlZC5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgdGFza0xpc3QgPSBjb250ZW50LmNyZWF0ZUVsKCd1bCcpO1xuICAgICAgICB0YXNrTGlzdC5hZGRDbGFzc2VzKFtcbiAgICAgICAgICAgICdjb250YWlucy10YXNrLWxpc3QnLFxuICAgICAgICAgICAgJ3BsdWdpbi10YXNrcy1xdWVyeS1yZXN1bHQnLFxuICAgICAgICBdKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSB0YXNrc1NvcnRlZExpbWl0ZWRbaV07XG5cbiAgICAgICAgICAgIGxldCBmaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IHRhc2sucGF0aC5tYXRjaCgvKFteL10rKVxcLm1kJC8pO1xuICAgICAgICAgICAgaWYgKGZpbGVOYW1lTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2hbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gYXdhaXQgdGFzay50b0xpKHtcbiAgICAgICAgICAgICAgICBwYXJlbnRVbEVsZW1lbnQ6IHRhc2tMaXN0LFxuICAgICAgICAgICAgICAgIGxpc3RJbmRleDogaSxcbiAgICAgICAgICAgICAgICBsYXlvdXRPcHRpb25zOiB0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBmb290bm90ZXMuIFRoZXkgZG9uJ3QgcmUtYXBwZWFyIGluIGFub3RoZXIgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBmb290bm90ZXMgPSBsaXN0SXRlbS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mb290bm90ZS1pZF0nKTtcbiAgICAgICAgICAgIGZvb3Rub3Rlcy5mb3JFYWNoKChmb290bm90ZSkgPT4gZm9vdG5vdGUucmVtb3ZlKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBwb3N0SW5mbyA9IGxpc3RJdGVtLmNyZWF0ZVNwYW4oKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMuaGlkZUJhY2tsaW5rcyAmJlxuICAgICAgICAgICAgICAgIGZpbGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmFja2xpbmtzKHBvc3RJbmZvLCBmaWxlTmFtZSwgdGFzayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmhpZGVFZGl0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFZGl0QnV0dG9uKHBvc3RJbmZvLCB0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFza0xpc3QuYXBwZW5kQ2hpbGQobGlzdEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdGFza0xpc3QsIHRhc2tzQ291bnQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEVkaXRCdXR0b24ocG9zdEluZm86IEhUTUxTcGFuRWxlbWVudCwgdGFzazogVGFzaykge1xuICAgICAgICBjb25zdCBlZGl0VGFza1BlbmNpbCA9IHBvc3RJbmZvLmNyZWF0ZUVsKCdhJywge1xuICAgICAgICAgICAgY2xzOiAndGFza3MtZWRpdCcsXG4gICAgICAgIH0pO1xuICAgICAgICBlZGl0VGFza1BlbmNpbC5vbkNsaWNrRXZlbnQoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvblN1Ym1pdCA9ICh1cGRhdGVkVGFza3M6IFRhc2tbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VUYXNrV2l0aFRhc2tzKHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUYXNrOiB0YXNrLFxuICAgICAgICAgICAgICAgICAgICBuZXdUYXNrczogdXBkYXRlZFRhc2tzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSwgYXMgY3Vyc29yL3Rhc2sgY2FuIGNoYW5nZS5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tNb2RhbCA9IG5ldyBUYXNrTW9kYWwoe1xuICAgICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgICBvblN1Ym1pdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFza01vZGFsLm9wZW4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCYWNrbGlua3MoXG4gICAgICAgIHBvc3RJbmZvOiBIVE1MU3BhbkVsZW1lbnQsXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHRhc2s6IFRhc2ssXG4gICAgKSB7XG4gICAgICAgIHBvc3RJbmZvLmFkZENsYXNzKCd0YXNrcy1iYWNrbGluaycpO1xuICAgICAgICBwb3N0SW5mby5hcHBlbmQoJyAoJyk7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBwb3N0SW5mby5jcmVhdGVFbCgnYScpO1xuXG4gICAgICAgIGxpbmsuaHJlZiA9IGZpbGVOYW1lO1xuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgZmlsZU5hbWUpO1xuICAgICAgICBsaW5rLnJlbCA9ICdub29wZW5lcic7XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmsuYWRkQ2xhc3MoJ2ludGVybmFsLWxpbmsnKTtcblxuICAgICAgICBsZXQgbGlua1RleHQgPSBmaWxlTmFtZTtcbiAgICAgICAgaWYgKHRhc2sucHJlY2VkaW5nSGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaW5rLmhyZWYgPSBsaW5rLmhyZWYgKyAnIycgKyB0YXNrLnByZWNlZGluZ0hlYWRlcjtcbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICdkYXRhLWhyZWYnLFxuICAgICAgICAgICAgICAgIGxpbmsuZ2V0QXR0cmlidXRlKCdkYXRhLWhyZWYnKSArICcjJyArIHRhc2sucHJlY2VkaW5nSGVhZGVyLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIHdvdWxkbid0IHByb3ZpZGUgYWRkaXRpbm9hbCBpbmZvcm1hdGlvbiBhbmQgb25seSB0YWtlIHVwIHNwYWNlLlxuICAgICAgICAgICAgaWYgKHRhc2sucHJlY2VkaW5nSGVhZGVyICE9PSBmaWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIGxpbmtUZXh0ID0gbGlua1RleHQgKyAnID4gJyArIHRhc2sucHJlY2VkaW5nSGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGluay5zZXRUZXh0KGxpbmtUZXh0KTtcbiAgICAgICAgcG9zdEluZm8uYXBwZW5kKCcpJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHVwZGF0ZVNldHRpbmdzIH0gZnJvbSAnLi9TZXR0aW5ncyc7XG5pbXBvcnQgdHlwZSBUYXNrc1BsdWdpbiBmcm9tICcuL21haW4nO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogVGFza3NQbHVnaW47XG5cbiAgICBjb25zdHJ1Y3Rvcih7IHBsdWdpbiB9OiB7IHBsdWdpbjogVGFza3NQbHVnaW4gfSkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwLCBwbHVnaW4pO1xuXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1Rhc2tzIFNldHRpbmdzJyB9KTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1zZXR0aW5nLWltcG9ydGFudCcsXG4gICAgICAgICAgICB0ZXh0OiAnQ2hhbmdpbmcgYW55IHNldHRpbmdzIHJlcXVpcmVzIGEgcmVzdGFydCBvZiBvYnNpZGlhbi4nLFxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdHbG9iYWwgdGFzayBmaWx0ZXInKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgJ1RoZSBnbG9iYWwgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgY2hlY2tsaXN0IGl0ZW1zLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICAgICAgICAgIHRleHQuc2V0UGxhY2Vob2xkZXIoJyN0YXNrJylcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmdsb2JhbEZpbHRlcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBnbG9iYWxGaWx0ZXI6IHZhbHVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgICAgIGNsczogJ3NldHRpbmctaXRlbS1kZXNjcmlwdGlvbicsXG4gICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICAgICdUaGUgZ2xvYmFsIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNoZWNrbGlzdCBpdGVtcyB0byBmaWx0ZXIgb3V0IFwibm9uLXRhc2tcIiBjaGVja2xpc3QgaXRlbXMuXFxuJyArXG4gICAgICAgICAgICAgICAgJ0EgY2hlY2tsaXN0IGl0ZW0gbXVzdCBpbmNsdWRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIGl0cyBkZXNjcmlwdGlvbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIGEgdGFzay5cXG4nICtcbiAgICAgICAgICAgICAgICAnRm9yIGV4YW1wbGUsIGlmIHlvdSBzZXQgdGhlIGdsb2JhbCBmaWx0ZXIgdG8gYCN0YXNrYCwgdGhlIFRhc2tzIHBsdWdpbiB3aWxsIG9ubHkgaGFuZGxlIGNoZWNrbGlzdCBpdGVtcyB0YWdnZWQgd2l0aCBgI3Rhc2tgLlxcbicgK1xuICAgICAgICAgICAgICAgICdPdGhlciBjaGVja2xpc3QgaXRlbXMgd2lsbCByZW1haW4gbm9ybWFsIGNoZWNrbGlzdCBpdGVtcyBhbmQgbm90IGFwcGVhciBpbiBxdWVyaWVzIG9yIGdldCBhIGRvbmUgZGF0ZSBzZXQuXFxuJyArXG4gICAgICAgICAgICAgICAgJ0xlYXZlIGVtcHR5IGlmIHlvdSB3YW50IGFsbCBjaGVja2xpc3QgaXRlbXMgZnJvbSB5b3VyIHZhdWx0IHRvIGJlIHRhc2tzIG1hbmFnZWQgYnkgdGhpcyBwbHVnaW4uJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnUmVtb3ZlIGdsb2JhbCBmaWx0ZXIgZnJvbSBkZXNjcmlwdGlvbicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnRW5hYmxpbmcgdGhpcyByZW1vdmVzIHRoZSBzdHJpbmcgdGhhdCB5b3Ugc2V0IGFzIGdsb2JhbCBmaWx0ZXIgZnJvbSB0aGUgdGFzayBkZXNjcmlwdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSB0YXNrLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlbW92ZUdsb2JhbEZpbHRlcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyByZW1vdmVHbG9iYWxGaWx0ZXI6IHZhbHVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi9DYWNoZSc7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJy4vQ29tbWFuZHMnO1xuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi9FdmVudHMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUZpbGUgfSBmcm9tICcuL0ZpbGUnO1xuaW1wb3J0IHsgSW5saW5lUmVuZGVyZXIgfSBmcm9tICcuL0lubGluZVJlbmRlcmVyJztcbmltcG9ydCB7IFF1ZXJ5UmVuZGVyZXIgfSBmcm9tICcuL1F1ZXJ5UmVuZGVyZXInO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHVwZGF0ZVNldHRpbmdzIH0gZnJvbSAnLi9TZXR0aW5ncyc7XG5pbXBvcnQgeyBTZXR0aW5nc1RhYiB9IGZyb20gJy4vU2V0dGluZ3NUYWInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXNrc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGUgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIGlubGluZVJlbmRlcmVyOiBJbmxpbmVSZW5kZXJlciB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgcXVlcnlSZW5kZXJlcjogUXVlcnlSZW5kZXJlciB8IHVuZGVmaW5lZDtcblxuICAgIGFzeW5jIG9ubG9hZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvYWRpbmcgcGx1Z2luIFwidGFza3NcIicpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ3NUYWIoeyBwbHVnaW46IHRoaXMgfSkpO1xuXG4gICAgICAgIGluaXRpYWxpemVGaWxlKHtcbiAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGU6IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICB2YXVsdDogdGhpcy5hcHAudmF1bHQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IG5ldyBFdmVudHMoeyBvYnNpZGlhbkVlbnRzOiB0aGlzLmFwcC53b3Jrc3BhY2UgfSk7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgQ2FjaGUoe1xuICAgICAgICAgICAgbWV0YWRhdGFDYWNoZTogdGhpcy5hcHAubWV0YWRhdGFDYWNoZSxcbiAgICAgICAgICAgIHZhdWx0OiB0aGlzLmFwcC52YXVsdCxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5saW5lUmVuZGVyZXIgPSBuZXcgSW5saW5lUmVuZGVyZXIoeyBwbHVnaW46IHRoaXMgfSk7XG4gICAgICAgIHRoaXMucXVlcnlSZW5kZXJlciA9IG5ldyBRdWVyeVJlbmRlcmVyKHsgcGx1Z2luOiB0aGlzLCBldmVudHMgfSk7XG4gICAgICAgIG5ldyBDb21tYW5kcyh7IHBsdWdpbjogdGhpcyB9KTtcbiAgICB9XG5cbiAgICBvbnVubG9hZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3VubG9hZGluZyBwbHVnaW4gXCJ0YXNrc1wiJyk7XG4gICAgICAgIHRoaXMuY2FjaGU/LnVubG9hZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gICAgICAgIHVwZGF0ZVNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEoZ2V0U2V0dGluZ3MoKSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlRGaWxlIiwiaW5pdGlhbGl6ZU9wdGlvbnMiLCJkYXRldXRpbCIsIkRFRkFVTFRfT1BUSU9OUyIsIkRhdGVUaW1lIiwiQ2FjaGUiLCJNYXJrZG93blJlbmRlcmVyIiwidGhpcyIsInJlcXVpcmUkJDAiLCJwYXR0ZXJuXzEiLCJ5ZWFyc18xIiwicmVxdWlyZSQkMSIsImRheWpzXzIiLCJjb25zdGFudHNfMSIsIkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xIiwicmVzdWx0c18xIiwiaW5kZXhfMSIsInRpbWV1bml0c18xIiwiYWJzdHJhY3RSZWZpbmVyc18xIiwiQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMSIsIm1lcmdpbmdDYWxjdWxhdGlvbl8xIiwiRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXJfMSIsIkV4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXJfMSIsIk92ZXJsYXBSZW1vdmFsUmVmaW5lcl8xIiwicmVxdWlyZSQkMiIsIkZvcndhcmREYXRlUmVmaW5lcl8xIiwicmVxdWlyZSQkMyIsIlVubGlrZWx5Rm9ybWF0RmlsdGVyXzEiLCJyZXF1aXJlJCQ0IiwiSVNPRm9ybWF0UGFyc2VyXzEiLCJyZXF1aXJlJCQ1IiwiTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lcl8xIiwicmVxdWlyZSQkNiIsIndlZWtzXzEiLCJlbl8xIiwicmVzdWx0cyIsIkVOVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSIsIkVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEiLCJFTk1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlcl8xIiwiRU5Nb250aE5hbWVQYXJzZXJfMSIsIkVOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyXzEiLCJFTlNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMSIsIkVOVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIkVOVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXJfMSIsInJlcXVpcmUkJDciLCJFTlRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXJfMSIsInJlcXVpcmUkJDgiLCJFTk1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwicmVxdWlyZSQkOSIsIkVOTWVyZ2VEYXRlVGltZVJlZmluZXJfMSIsInJlcXVpcmUkJDEwIiwiRU5DYXN1YWxEYXRlUGFyc2VyXzEiLCJyZXF1aXJlJCQxMSIsIkVOQ2FzdWFsVGltZVBhcnNlcl8xIiwicmVxdWlyZSQkMTIiLCJFTldlZWtkYXlQYXJzZXJfMSIsInJlcXVpcmUkJDEzIiwiRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXJfMSIsInJlcXVpcmUkJDE0IiwiU2xhc2hEYXRlRm9ybWF0UGFyc2VyXzEiLCJyZXF1aXJlJCQxNSIsIkVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xIiwicmVxdWlyZSQkMTYiLCJjaHJvbm9fMSIsImNvbmZpZ3VyYXRpb25zXzEiLCJERUNhc3VhbFRpbWVQYXJzZXJfMSIsIkRFVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIkRFV2Vla2RheVBhcnNlcl8xIiwiREVNZXJnZURhdGVSYW5nZVJlZmluZXJfMSIsIkRFTWVyZ2VEYXRlVGltZVJlZmluZXJfMSIsIkRFQ2FzdWFsRGF0ZVBhcnNlcl8xIiwiREVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSIsIkZSQ2FzdWFsRGF0ZVBhcnNlcl8xIiwiRlJDYXN1YWxUaW1lUGFyc2VyXzEiLCJGUlRpbWVFeHByZXNzaW9uUGFyc2VyXzEiLCJGUk1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEiLCJGUk1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiRlJXZWVrZGF5UGFyc2VyXzEiLCJGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIkZSTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEiLCJGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEiLCJGUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyXzEiLCJKUFN0YW5kYXJkUGFyc2VyXzEiLCJKUE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiSlBDYXN1YWxEYXRlUGFyc2VyXzEiLCJkYXlqc18xIiwiUFRXZWVrZGF5UGFyc2VyXzEiLCJQVFRpbWVFeHByZXNzaW9uUGFyc2VyXzEiLCJQVE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEiLCJQVE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSIsIlBUQ2FzdWFsRGF0ZVBhcnNlcl8xIiwiUFRDYXN1YWxUaW1lUGFyc2VyXzEiLCJOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiTkxNZXJnZURhdGVUaW1lUmVmaW5lcl8xIiwiTkxDYXN1YWxEYXRlUGFyc2VyXzEiLCJOTENhc3VhbFRpbWVQYXJzZXJfMSIsIk5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSIsIk5MV2Vla2RheVBhcnNlcl8xIiwiTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSIsIk5MTW9udGhOYW1lUGFyc2VyXzEiLCJOTFNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMSIsIk5MVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIk5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyXzEiLCJOTENhc3VhbERhdGVUaW1lUGFyc2VyXzEiLCJlbiIsImRlIiwiZnIiLCJqYSIsInB0IiwibmwiLCJNb2RhbCIsIk1hcmtkb3duVmlldyIsIk1hcmtkb3duUmVuZGVyQ2hpbGQiLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FB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Q08sSUFBSSxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzFDLElBQUksT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDOztBQ2xIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSSxRQUFRLENBQUM7QUFDcEIsQ0FBQyxVQUFVLFFBQVEsRUFBRTtBQUNyQixJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQzFDLFFBQVEsSUFBSSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMs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QUFFO0FBQy9ELG9CQUFvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsaUJBQWlCLENBQUM7QUFDbEIsZ0JBQWdCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0Msb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0Msb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELG9CQUFvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0Msb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0Msb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLGFBQWEsQ0FBQztBQUNkLFlBQVksSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9DLGdCQUFnQixPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3QyxhQUFhLENBQUM7QUFDZCxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN2RCxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4RCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQy9DLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDL0MsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTTtBQUNoRCxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ2hELFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztBQUNsQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLEtBQUssRUFBRTtBQUNqRCxRQUFRLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztBQUM5QixRQUFRLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO0FBQ3ZELFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSztBQUM5RCxZQUFZLE9BQU8sS0FBSyxDQUFDO0FBQ3pCLFFBQVEsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO0FBQzNDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQztBQUMxRCxnQkFBZ0IsT0FBTyxJQUFJLENBQUM7QUFDNUIsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7QUFDdEUsZ0JBQWdCLE9BQU8sS0FBSyxDQUFDO0FBQzdCLFNBQVM7QUFDVCxRQUFRLE9BQU8sVUFBVSxDQUFDO0FBQzFCLEtBQUssQ0FBQztBQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxZQUFZO0FBQ3RELFFBQVEsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsWUFBWTtBQUM1QyxRQUFRLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDbkMsUUFBUSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ3hELFlBQVksT0FBTyxPQUFPLENBQUMseURBQXlELENBQUMsQ0FBQztBQUN0RixTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdkM7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3JELFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUNoQyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdkMsWUFBWSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUMzQyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwSSxTQUFTO0FBQ1QsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3JDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNuRCxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDM0YsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtBQUN0QyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUNqRCxRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZO0FBQzFDLFFBQVEsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNuQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQztBQUN2QyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUN2RCxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMxRixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDNUMsUUFBUSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ25ELGNBQWMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNoQyxjQUFjLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEtBQUssQ0FBQztBQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsWUFBWTtBQUN6QyxRQUFRLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDbkMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUM7QUFDdkMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDdkQsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUU7QUFDekQsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDdkQsa0JBQWtCLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDckMsa0JBQWtCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUYsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN0QyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEMsWUFBWSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDNUIsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQzdCLFlBQVksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNqQyxZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM5QixTQUFTO0FBQ1QsYUFBYSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQzFDLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzNCLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7QUFDMUMsUUFBUSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDekMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDcEksU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO0FBQ3pELFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDN0MsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUMzRCxzQkFBc0IsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN6QyxzQkFBc0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDakUsYUFBYTtBQUNiLFNBQVM7QUFDVCxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtBQUM5RCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1RixTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDO0FBQzNDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUMxQyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4QyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2hDLGFBQWE7QUFDYixZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNqQyxnQkFBZ0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ25DLGFBQWE7QUFDYixpQkFBaUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3JDLGdCQUFnQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDbEMsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7QUFDM0MsUUFBUSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN0QyxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQzdDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDdEQsb0JBQW9CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUMsYUFHYTtBQUNiLFlBQVksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzVCLFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUM7QUFDM0MsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUMzRCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN2RCxrQkFBa0IsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNuQyxrQkFBa0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDcEMsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQzdCLFlBQVksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtBQUM5RCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzdELFNBQVM7QUFDVCxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNqQyxZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM5QixTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZO0FBQzFDLFFBQVEsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNuQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7QUFDdEMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtBQUM3QyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzNELGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzNDLGFBR2E7QUFDYixZQUFZLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM1QixTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDO0FBQzNDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDM0QsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUYsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQzdCLFlBQVksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNqQyxZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM5QixTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO0FBQ3BDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakYsaUJBQWlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQ25DLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUM5RCxrQkFBa0IsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNsQyxrQkFBa0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRixTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZO0FBQy9DLFFBQVEsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNuQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtBQUN2RCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLGlCQUFpQixHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxTQUFTO0FBQ1Q7QUFDQSxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFlBQVk7QUFDOUMsUUFBUSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO0FBQ25FLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUM5RixTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO0FBQ3RDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7QUFDdkMsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuSCxTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQzNDLFFBQVEsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkcsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzVDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkYsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtBQUN4QyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxHQUFHLENBQUM7QUFDaEIsUUFBUSxJQUFJLElBQUksQ0FBQztBQUNqQixRQUFRLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEIsWUFBWSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuQyxRQUFRLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFFBQVEsUUFBUSxJQUFJO0FBQ3BCLFlBQVksS0FBSyxDQUFDLENBQUM7QUFDbkIsWUFBWSxLQUFLLEVBQUUsQ0FBQztBQUNwQixZQUFZLEtBQUssRUFBRTtBQUNuQixnQkFBZ0IsR0FBRyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLENBQUMsQ0FBQztBQUNuQixZQUFZLEtBQUssRUFBRTtBQUNuQixnQkFBZ0IsR0FBRyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLENBQUMsQ0FBQztBQUNuQixZQUFZLEtBQUssRUFBRTtBQUNuQixnQkFBZ0IsR0FBRyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWTtBQUNaLGdCQUFnQixHQUFHLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxTQUFTO0FBQ1QsUUFBUSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEtBQUssQ0FBQztBQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEVBQUU7QUFDOUMsUUFBUSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQ25ELFFBQVEsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzVFLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUMxRixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFFO0FBQzNDLFFBQVEsT0FBTyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM3QixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0FBQ3hDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUssQ0FBQztBQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7QUFDeEUsUUFBUSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRTtBQUM5QyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDM0IsWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixTQUFTO0FBQ1QsUUFBUSxJQUFJLFNBQVMsR0FBRyxVQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO0FBQ3BFLFlBQVksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkQsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM3QixvQkFBb0IsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDaEQsd0JBQXdCLElBQUksSUFBSSxHQUFHLEdBQUcsY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUMzRCxxQkFBcUI7QUFDckIseUJBQXlCO0FBQ3pCLHdCQUF3QixJQUFJLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUNoRCxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLGFBQWE7QUFDYixZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFNBQVMsQ0FBQztBQUNWLFFBQVEsUUFBUTtBQUNoQixZQUFZLFFBQVE7QUFDcEIsZ0JBQWdCLFVBQVUsQ0FBQyxFQUFFO0FBQzdCLG9CQUFvQixPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QyxpQkFBaUIsQ0FBQztBQUNsQixRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixRQUFRLElBQUksWUFBWSxHQUFHLFVBQVUsR0FBRyxFQUFFO0FBQzFDLFlBQVksT0FBTyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEQsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLFVBQVUsRUFBRTtBQUN4QixZQUFZLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZFLFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzRCxTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLEVBQUUsQ0FBQzs7QUM5WEo7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLGtCQUFrQixZQUFZO0FBQ3hDLElBQUksU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQzNCLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLElBQUksRUFBRTtBQUM3QyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7QUFDMUIsUUFBUSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqQyxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7QUFDMUMsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7QUFDakQsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxZQUFZO0FBQzlDLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDakIsUUFBUSxJQUFJLFVBQVUsQ0FBQztBQUN2QixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQixRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzNCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBUSxHQUFHO0FBQ1gsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJO0FBQ3pCLGdCQUFnQixPQUFPLEtBQUssQ0FBQztBQUM3QixZQUFZLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUMzQyxnQkFBZ0IsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUMsZ0JBQWdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLGdCQUFnQixJQUFJLEtBQUssRUFBRTtBQUMzQixvQkFBb0IsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMzRSx3QkFBd0IsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUNyQyx3QkFBd0IsVUFBVSxHQUFHLE1BQU0sQ0FBQztBQUM1QyxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixZQUFZLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUM5QixnQkFBZ0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0QsZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFO0FBQ3BDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQyxhQUFhO0FBQ2IsWUFBWSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDOUIsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLGdCQUFnQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUNuQyxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbEMsZ0JBQWdCLE9BQU87QUFDdkIsYUFBYTtBQUNiO0FBQ0EsU0FBUyxRQUFRLFVBQVUsS0FBSyxNQUFNLEVBQUU7QUFDeEM7QUFDQSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtBQUNsQyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUM1QixnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNuQyxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xDLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUN6QixhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUIsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTO0FBQ1QsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFlBQVk7QUFDaEQsUUFBUSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckMsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLElBQUksRUFBRTtBQUM5QyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDN0IsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFFLEtBQUssQ0FBQztBQUNOLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNVLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDbEQsSUFBSSxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRTtBQUNwRCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN4QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDUixJQUFJLE9BQU8sT0FBTyxDQUFDO0FBQ25CLElBQUksU0FBUyxDQUFDLEdBQUc7QUFDakI7QUFDQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUIsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUM7QUFDYixZQUFZLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRCxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtBQUN4QixZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM5QyxRQUFRLFFBQVEsR0FBRyxDQUFDLE1BQU07QUFDMUIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUMzQyxnQkFBZ0IsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7QUFDdEMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO0FBQ3pCLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztBQUN4QixpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU07QUFDdEI7QUFDQTtBQUNBLFlBQVksS0FBSyxZQUFZO0FBQzdCLGdCQUFnQixPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDNUMsZ0JBQWdCLE9BQU8sQ0FBQyxTQUFTLEdBQUc7QUFDcEMsb0JBQW9CLEtBQUssQ0FBQyxFQUFFO0FBQzVCLG9CQUFvQixLQUFLLENBQUMsRUFBRTtBQUM1QixvQkFBb0IsS0FBSyxDQUFDLEVBQUU7QUFDNUIsb0JBQW9CLEtBQUssQ0FBQyxFQUFFO0FBQzVCLG9CQUFvQixLQUFLLENBQUMsRUFBRTtBQUM1QixpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztBQUNwQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtBQUN0QyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7QUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtBQUN0QyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7QUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssV0FBVztBQUM1QixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQzlDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtBQUN0QyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7QUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssVUFBVTtBQUMzQixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQzdDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtBQUN0QyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7QUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtBQUN0QyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7QUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssUUFBUSxDQUFDO0FBQzFCLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBWSxLQUFLLFdBQVcsQ0FBQztBQUM3QixZQUFZLEtBQUssVUFBVSxDQUFDO0FBQzVCLFlBQVksS0FBSyxRQUFRLENBQUM7QUFDMUIsWUFBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixZQUFZLEtBQUssUUFBUTtBQUN6QixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVDLGdCQUFnQixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDaEUsZ0JBQWdCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDckMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQzVDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7QUFDcEMsd0JBQXdCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRCxvQkFBb0IsSUFBSSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7QUFDMUMsb0JBQW9CLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDOUIsd0JBQXdCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2xHLHFCQUFxQjtBQUNyQjtBQUNBLG9CQUFvQixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxvQkFBb0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3JDLGlCQUFpQjtBQUNqQixnQkFBZ0IsS0FBSyxFQUFFLENBQUM7QUFDeEIsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0FBQ3BCLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixZQUFZLEtBQUssT0FBTyxDQUFDO0FBQ3pCLFlBQVksS0FBSyxPQUFPLENBQUM7QUFDekIsWUFBWSxLQUFLLEtBQUssQ0FBQztBQUN2QixZQUFZLEtBQUssTUFBTSxDQUFDO0FBQ3hCLFlBQVksS0FBSyxNQUFNLENBQUM7QUFDeEIsWUFBWSxLQUFLLFFBQVEsQ0FBQztBQUMxQixZQUFZLEtBQUssV0FBVyxDQUFDO0FBQzdCLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixZQUFZLEtBQUssVUFBVTtBQUMzQixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVDLGdCQUFnQixPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDckMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQzVDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7QUFDcEMsd0JBQXdCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRCxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFDdEMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDNUIsd0JBQXdCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ2hHLHFCQUFxQjtBQUNyQixvQkFBb0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsb0JBQW9CLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNyQyxpQkFBaUI7QUFDakIsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO0FBQ3JCLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztBQUNwQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZO0FBQ1osZ0JBQWdCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNsRCxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksU0FBUyxFQUFFLEdBQUc7QUFDbEIsUUFBUSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxRQUFRLElBQUksRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ3hCLFlBQVksT0FBTztBQUNuQixRQUFRLEdBQUc7QUFDWCxZQUFZLElBQUksR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLFlBQVksSUFBSSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7QUFDbEMsWUFBWSxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUM5QjtBQUNBLFlBQVksSUFBSSxHQUFHLEVBQUU7QUFDckI7QUFDQSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7QUFDekIsb0JBQW9CLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNyQyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO0FBQzFDLHdCQUF3QixPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUMvQztBQUNBLG9CQUFvQixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsaUJBQWlCO0FBQ2pCLHFCQUFxQjtBQUNyQixvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0FBQzNDLHdCQUF3QixPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNoRDtBQUNBLG9CQUFvQixPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRCxvQkFBb0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2IsaUJBQWlCLElBQUksR0FBRyxFQUFFO0FBQzFCLGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztBQUN0QyxvQkFBb0IsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDM0M7QUFDQSxnQkFBZ0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkQsYUFBYTtBQUNiLGlCQUFpQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssWUFBWSxFQUFFO0FBQ2xELGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO0FBQ3hDLG9CQUFvQixPQUFPLENBQUMsU0FBUyxHQUFHO0FBQ3hDLHdCQUF3QixLQUFLLENBQUMsRUFBRTtBQUNoQyx3QkFBd0IsS0FBSyxDQUFDLEVBQUU7QUFDaEMsd0JBQXdCLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLHdCQUF3QixLQUFLLENBQUMsRUFBRTtBQUNoQyx3QkFBd0IsS0FBSyxDQUFDLEVBQUU7QUFDaEMscUJBQXFCLENBQUM7QUFDdEIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixpQkFBaUIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUMvQyxnQkFBZ0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDM0MsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsb0JBQW9CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ2xHLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RCxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQzVDLG9CQUFvQixDQUFDLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzNDLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQzVCLHdCQUF3QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQztBQUNuRyxxQkFBcUI7QUFDckIsb0JBQW9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5RCxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLGlCQUFpQixJQUFJLENBQUMsRUFBRTtBQUN4QixnQkFBZ0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87QUFDcEMsb0JBQW9CLE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3pDO0FBQ0EsZ0JBQWdCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU87QUFDdkIsYUFBYTtBQUNiLFNBQVMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMvRSxLQUFLO0FBQ0wsSUFBSSxTQUFTLEVBQUUsR0FBRztBQUNsQixRQUFRLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsRUFBRTtBQUNmLFlBQVksT0FBTztBQUNuQixRQUFRLEdBQUc7QUFDWCxZQUFZLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN2QyxZQUFZLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDcEIsZ0JBQWdCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3ZGLGFBQWE7QUFDYixZQUFZLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDeEMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDdkMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsb0JBQW9CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNGLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hELGFBQWE7QUFDYixTQUFTLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzFELEtBQUs7QUFDTCxJQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3ZCLFFBQVEsUUFBUSxHQUFHLENBQUMsTUFBTTtBQUMxQixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsT0FBTyxDQUFDLENBQUM7QUFDekIsWUFBWSxLQUFLLFVBQVU7QUFDM0IsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLFlBQVksS0FBSyxPQUFPO0FBQ3hCLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUN6QixZQUFZLEtBQUssT0FBTztBQUN4QixnQkFBZ0IsT0FBTyxDQUFDLENBQUM7QUFDekIsWUFBWSxLQUFLLEtBQUs7QUFDdEIsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUN6QixZQUFZLEtBQUssTUFBTTtBQUN2QixnQkFBZ0IsT0FBTyxDQUFDLENBQUM7QUFDekIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLFlBQVksS0FBSyxXQUFXO0FBQzVCLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUN6QixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsT0FBTyxFQUFFLENBQUM7QUFDMUIsWUFBWSxLQUFLLFVBQVU7QUFDM0IsZ0JBQWdCLE9BQU8sRUFBRSxDQUFDO0FBQzFCLFlBQVksS0FBSyxVQUFVO0FBQzNCLGdCQUFnQixPQUFPLEVBQUUsQ0FBQztBQUMxQixZQUFZO0FBQ1osZ0JBQWdCLE9BQU8sS0FBSyxDQUFDO0FBQzdCLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxTQUFTLFNBQVMsR0FBRztBQUN6QixRQUFRLFFBQVEsR0FBRyxDQUFDLE1BQU07QUFDMUIsWUFBWSxLQUFLLFFBQVEsQ0FBQztBQUMxQixZQUFZLEtBQUssU0FBUyxDQUFDO0FBQzNCLFlBQVksS0FBSyxXQUFXLENBQUM7QUFDN0IsWUFBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixZQUFZLEtBQUssUUFBUSxDQUFDO0FBQzFCLFlBQVksS0FBSyxVQUFVLENBQUM7QUFDNUIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzdELFlBQVk7QUFDWixnQkFBZ0IsT0FBTyxLQUFLLENBQUM7QUFDN0IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3pCLFFBQVEsUUFBUSxHQUFHLENBQUMsTUFBTTtBQUMxQixZQUFZLEtBQUssTUFBTTtBQUN2QixnQkFBZ0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLGdCQUFnQixPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFlBQVksS0FBSyxPQUFPO0FBQ3hCLGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLFlBQVksS0FBSyxRQUFRO0FBQ3pCLGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkQsWUFBWSxLQUFLLE9BQU87QUFDeEIsZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqQyxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRCxZQUFZLEtBQUssS0FBSztBQUN0QixnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbkQsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHO0FBQ3ZDLG9CQUFvQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlELGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkQsWUFBWTtBQUNaLGdCQUFnQixPQUFPLEtBQUssQ0FBQztBQUM3QixTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksU0FBUyxLQUFLLEdBQUc7QUFDckIsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQixRQUFRLElBQUksR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLEdBQUc7QUFDaEIsWUFBWSxPQUFPO0FBQ25CLFFBQVEsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3pCLFFBQVEsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ3BDLFlBQVksR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQzlCLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUN0QixnQkFBZ0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUM7QUFDM0YsYUFBYTtBQUNiLFlBQVksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekMsWUFBWSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDN0IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFNBQVMsQ0FBQyxHQUFHO0FBQ2pCLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtBQUNwQyxZQUFZLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDLFlBQVksSUFBSSxDQUFDLElBQUk7QUFDckIsZ0JBQWdCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZFLFlBQVksT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxTQUFTO0FBQ1QsYUFBYSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDcEMsWUFBWSxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELFlBQVksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FDcFpPLElBQUksU0FBUyxDQUFDO0FBQ3JCLENBQUMsVUFBVSxTQUFTLEVBQUU7QUFDdEIsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztBQUNsRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3BELElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDbEQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNoRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQ2xELElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDdEQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUN0RCxDQUFDLEVBQUUsU0FBUyxLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO0FBQzNDLElBQUksT0FBTyxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNuQzs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLEdBQUcsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3pDLElBQUksSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLEVBQUU7QUFDcEQsSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxNQUFNLEdBQUc7QUFDYixJQUFJLE9BQU87QUFDWCxJQUFJLE9BQU87QUFDWCxJQUFJLFVBQVU7QUFDZCxJQUFJLFdBQVc7QUFDZixJQUFJLFlBQVk7QUFDaEIsSUFBSSxTQUFTO0FBQ2IsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDOUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoRjtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTtBQUNoRSxJQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCOztBQ25IbEQsSUFBSSxJQUFJLGtCQUFrQixZQUFZO0FBQ3RDLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO0FBQ3JELFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzdCLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO0FBQzVDLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDMUMsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDekIsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzNCLEtBQUssQ0FBQztBQUNOLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsWUFBWTtBQUM1QyxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUMzQixLQUFLLENBQUM7QUFDTixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFlBQVk7QUFDakQsUUFBUSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDaEMsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQ3pDLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUk7QUFDN0UsWUFBWSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzlCLEtBQUssQ0FBQztBQUNOLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVMLElBQUksUUFBUSxrQkFBa0IsVUFBVSxNQUFNLEVBQUU7QUFDaEQsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLElBQUksU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO0FBQzNFLFFBQVEsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ2pGLFFBQVEsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBUSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUM1QixRQUFRLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxVQUFVLElBQUksRUFBRTtBQUN4QyxRQUFRLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqTCxLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFlBQVk7QUFDaEQsUUFBUSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7QUFDN0MsUUFBUSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3hJLEtBQUssQ0FBQztBQUNOLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTtBQUM1QyxRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUN4QixLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDOUMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDMUIsS0FBSyxDQUFDO0FBQ04sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQzdDLFFBQVEsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pCLEtBQUssQ0FBQztBQUNOLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxLQUFLLEVBQUU7QUFDbkQsUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUMzQixLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsTUFBTSxFQUFFO0FBQ3JELFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDN0IsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFO0FBQzdCLFlBQVksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELFlBQVksSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDakQsWUFBWSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUNsQyxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO0FBQ2pDLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUNsQyxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDaEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztBQUM1QixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUssQ0FBQztBQUNOLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ3pELFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO0FBQ3RDLFlBQVksSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN6RSxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQy9ELFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN0QixLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQ2xELFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDdEIsS0FBSyxDQUFDO0FBQ04sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO0FBQ3JFLFFBQVEsSUFBSSxRQUFRLEVBQUU7QUFDdEI7QUFDQSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN0RSxTQUFTO0FBQ1QsUUFBUSxPQUFPLElBQUksRUFBRTtBQUNyQixZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQy9CLFlBQVksSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDOUUsWUFBWSxJQUFJLE1BQU0sRUFBRTtBQUN4QixnQkFBZ0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7QUFDcEMsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsYUFBYTtBQUNiLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzVELGdCQUFnQixNQUFNO0FBQ3RCLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQ25GLFFBQVEsSUFBSSxRQUFRLEVBQUU7QUFDdEI7QUFDQSxZQUFZLElBQUksQ0FBQyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDeEYsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLEVBQUU7QUFDckIsWUFBWSxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQztBQUNuQyxZQUFZLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQ25GLFlBQVksSUFBSSxPQUFPLEVBQUU7QUFDekIsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ3hDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEQsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDN0QsaUJBQWlCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLGdCQUFnQixNQUFNO0FBQ3RCLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUFVLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDN0YsUUFBUSxJQUFJLFFBQVEsRUFBRTtBQUN0QjtBQUNBLFlBQVksSUFBSSxDQUFDLE1BQU07QUFDdkIsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM5RyxTQUFTO0FBQ1QsUUFBUSxPQUFPLElBQUksRUFBRTtBQUNyQixZQUFZLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDO0FBQ25DLFlBQVksSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDckYsWUFBWSxJQUFJLFNBQVMsRUFBRTtBQUMzQixnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDeEMsZ0JBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDcEUsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDN0QsaUJBQWlCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRSxpQkFBaUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDdEUsZ0JBQWdCLE1BQU07QUFDdEIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7QUFDNUMsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO0FBQzVCLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1QsUUFBUSxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUU7QUFDckMsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVCxRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLEVBQUU7QUFDdkMsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQztBQUNwQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN6QixZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7QUFDbkMsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDNUIsZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFO0FBQ2xELG9CQUFvQixPQUFPO0FBQzNCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsU0FBUztBQUNULEtBQUssQ0FBQztBQUNOLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxPQUFPLEVBQUUsUUFBUSxFQUFFO0FBQzFELFFBQVEsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNySyxRQUFRLFFBQVEsSUFBSTtBQUNwQixZQUFZLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEUsWUFBWSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLFlBQVksS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekUsWUFBWSxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pFLFlBQVksS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BGLFlBQVksS0FBSyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRyxZQUFZLEtBQUssU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzVHLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUN4S0QsU0FBU0MsbUJBQWlCLENBQUMsT0FBTyxFQUFFO0FBQzNDLElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLElBQUksSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQztBQUNBLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM5RCxRQUFRLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUN2QyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsUUFBUSxJQUFJQyxVQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUNBLFVBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hGLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDeEIsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsRSxLQUFLO0FBQ0wsSUFBSSxPQUFPLFFBQVEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUNNLFNBQVMsWUFBWSxDQUFDLE9BQU8sRUFBRTtBQUN0QyxJQUFJLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFQyxpQkFBZSxDQUFDLEVBQUVGLG1CQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbkYsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ2pDLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNqRSxRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hGLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztBQUNyQixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQy9CLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxLQUFLO0FBQ0wsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FFN0I7QUFDTCxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3RDLEtBQUs7QUFDTCxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNsQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDbkMsWUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZELFlBQVksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDckQsZ0JBQWdCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLEdBQUcseUJBQXlCLENBQUMsQ0FBQztBQUNuRyxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUNoQyxRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQy9CLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDaEMsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNoQyxRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQ2pDLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDakMsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDbkMsUUFBUSxRQUFRLElBQUksQ0FBQyxJQUFJO0FBQ3pCLFlBQVksS0FBSyxLQUFLLENBQUMsTUFBTTtBQUM3QixnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO0FBQ2pDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLGdCQUFnQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDNUQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLEtBQUssQ0FBQyxPQUFPO0FBQzlCLGdCQUFnQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDNUQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLEtBQUssQ0FBQyxNQUFNO0FBQzdCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUNDLFVBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckUsZ0JBQWdCLE1BQU07QUFDdEIsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUMzRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUNoQyxRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDbEMsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDckMsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQzlCLEtBQUs7QUFDTCxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUN2QyxRQUFRLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFRLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUM3QixRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6RCxZQUFZLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdkIsZ0JBQWdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsYUFBYTtBQUNiLGlCQUFpQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDdkMsS0FBSztBQUNMLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtBQUNsQyxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUM3QixLQUFLO0FBQ0wsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUM3RCxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUNwQyxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQy9CLEtBQUs7QUFDTCxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUN2QyxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUMvQixLQUFLO0FBQ0wsU0FBUyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDM0MsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkUsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUMvQixLQUFLO0FBQ0wsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLFlBQVksT0FBTyxFQUFFO0FBQ2hELFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUM1RCxZQUFZLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELFlBQVksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDbkMsU0FBUztBQUNULGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxZQUFZLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsU0FBUztBQUNULFFBQVEsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQzNCLFFBQVEsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hELFlBQVksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2hDLGdCQUFnQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JDLGdCQUFnQixTQUFTO0FBQ3pCLGFBQWE7QUFDYixpQkFBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDekMsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5RCxnQkFBZ0IsU0FBUztBQUN6QixhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDdEQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELGFBQWE7QUFDYixTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ2hFLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQztBQUNuRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU07QUFDbkIsWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzNFLEtBQUs7QUFDTCxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNwQyxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNuQyxRQUFRLElBQUksQ0FBQyxRQUFRO0FBQ3JCLFlBQVksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMvRSxLQUFLO0FBQ0wsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDdEMsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDbkMsUUFBUSxJQUFJLENBQUMsUUFBUTtBQUNyQixZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0UsS0FBSztBQUNMLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxLQUFLO0FBQ0wsSUFBSSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFDTSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDbkMsSUFBSSxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFELElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMxQyxRQUFRLE9BQU8sRUFBRSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO0FBQ3hDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFNLEVBQUU7QUFDaEQsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLE1BQU0sRUFBRTtBQUNwRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFDaEYsYUFBYSxDQUFDLENBQUM7QUFDZixTQUFTLENBQUMsQ0FBQztBQUNYLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxPQUFPLE9BQU8sQ0FBQztBQUNuQjs7QUNsTU8sU0FBUyxXQUFXLENBQUMsU0FBUyxFQUFFO0FBQ3ZDLElBQUksSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25HLElBQUksT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ00sU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLElBQUksSUFBSSxlQUFlLEdBQUcsOENBQThDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUMxQixRQUFRLE9BQU8sT0FBTyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxJQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFDLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRTtBQUN4RixJQUFJLElBQUksSUFBSSxFQUFFO0FBQ2QsUUFBUSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1QixLQUFLO0FBQ0wsSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHQSxVQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUQsSUFBSSxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBQ0QsU0FBUyxTQUFTLENBQUMsU0FBUyxFQUFFO0FBQzlCLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO0FBQ3pCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2pCLFFBQVEsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckMsS0FBSztBQUNMLElBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDdkMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDN0IsUUFBUSxLQUFLLE9BQU8sQ0FBQztBQUNyQixRQUFRLEtBQUssUUFBUTtBQUNyQixZQUFZLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsS0FBSyxTQUFTO0FBQ3RCLFlBQVksT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0MsUUFBUTtBQUNSLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQ2hGLEtBQUs7QUFDTCxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzFCLElBQUksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDN0MsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7QUFDbEMsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxRQUFRLFFBQVEsR0FBRyxDQUFDLFdBQVcsRUFBRTtBQUNqQyxZQUFZLEtBQUssTUFBTTtBQUN2QixnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLE1BQU07QUFDdkIsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxPQUFPLENBQUM7QUFDekIsWUFBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixZQUFZLEtBQUssVUFBVSxDQUFDO0FBQzVCLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBWSxLQUFLLFlBQVksQ0FBQztBQUM5QixZQUFZLEtBQUssV0FBVyxDQUFDO0FBQzdCLFlBQVksS0FBSyxVQUFVLENBQUM7QUFDNUIsWUFBWSxLQUFLLFFBQVEsQ0FBQztBQUMxQixZQUFZLEtBQUssVUFBVSxDQUFDO0FBQzVCLFlBQVksS0FBSyxVQUFVO0FBQzNCLGdCQUFnQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNsRDtBQUNBLGdCQUFnQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxXQUFXLENBQUM7QUFDN0IsWUFBWSxLQUFLLE9BQU87QUFDeEIsZ0JBQWdCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBWSxLQUFLLE1BQU07QUFDdkI7QUFDQSxnQkFBZ0IsSUFBSSxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELGdCQUFnQixPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDNUMsZ0JBQWdCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNsRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssT0FBTztBQUN4QixnQkFBZ0IsT0FBTyxDQUFDLEtBQUssR0FBR0EsVUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxVQUFVO0FBQzNCLGdCQUFnQixPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZO0FBQ1osZ0JBQWdCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3hFLFNBQVM7QUFDVCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUNELFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUM1QixJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNuQyxRQUFRLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEMsUUFBUSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0wsSUFBSSxPQUFPLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFDRCxTQUFTLHFCQUFxQixDQUFDLEtBQUssRUFBRTtBQUN0QyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNsQyxRQUFRLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdCLEtBQUs7QUFDTCxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFDRCxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUU7QUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFO0FBQ25DLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUM5QjtBQUNBLFlBQVksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUFDNUQsUUFBUSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQzFDLFFBQVEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsS0FBSyxDQUFDLENBQUM7QUFDUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0SEE7QUFDQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUMxQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLElBQUksSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztBQUMzRCxJQUFJLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ25DLElBQUksSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzFELElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM5RCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDNUQsRUFBRSxJQUFJLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZFLEVBQUUsSUFBSSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQy9ELEVBQUUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRTtBQUM5QyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0QsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDNUMsRUFBRSxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGVBQWUsQ0FBQyxDQUFDLEVBQUU7QUFDNUIsRUFBRSxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRTtBQUNoRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELEdBQUcsQ0FBQztBQUNKLEVBQUUsT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUUsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLHlCQUF5QixHQUFHO0FBQ3JDLEVBQUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3pFLEVBQUUsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQztBQUMzQyxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQy9DO0FBQ0EsRUFBRSxJQUFJO0FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5RSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNkLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSx5QkFBeUIsRUFBRSxFQUFFO0FBQ25DLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDbkMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDMUQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JCLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVCLE1BQU0sSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELE1BQU0sSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN2QyxNQUFNLElBQUksS0FBSyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVELE1BQU0sT0FBTyxRQUFRLENBQUM7QUFDdEIsS0FBSyxDQUFDO0FBQ04sR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsRUFBRSxFQUFFO0FBQy9CLEVBQUUsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNEO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7QUFDakMsRUFBRSxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsS0FBSyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7QUFDakU7QUFDQSxFQUFFLGdCQUFnQixHQUFHLFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO0FBQ3RELElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEU7QUFDQSxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO0FBQ3JDLE1BQU0sTUFBTSxJQUFJLFNBQVMsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0FBQ2hGLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7QUFDdkMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3ZCLE1BQU0sT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDN0UsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtBQUN2RCxNQUFNLFdBQVcsRUFBRTtBQUNuQixRQUFRLEtBQUssRUFBRSxPQUFPO0FBQ3RCLFFBQVEsVUFBVSxFQUFFLEtBQUs7QUFDekIsUUFBUSxRQUFRLEVBQUUsSUFBSTtBQUN0QixRQUFRLFlBQVksRUFBRSxJQUFJO0FBQzFCLE9BQU87QUFDUCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFDRDtBQUNBLFNBQVMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUN6RCxFQUFFLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNoQyxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDYjtBQUNBLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUztBQUM3QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLDJCQUEyQixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7QUFDaEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU87QUFDakIsRUFBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLGlCQUFpQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRSxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxJQUFJLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDOUQsRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsRUFBRSxJQUFJLENBQUMsS0FBSyxXQUFXLElBQUksMENBQTBDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8saUJBQWlCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ25ILENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN4RDtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RTtBQUNBLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLCtCQUErQixDQUFDLENBQUMsRUFBRTtBQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaO0FBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtBQUNuRSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLFlBQVk7QUFDckYsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU87QUFDaEMsUUFBUSxJQUFJLEVBQUUsSUFBSTtBQUNsQixPQUFPLENBQUM7QUFDUixNQUFNLE9BQU87QUFDYixRQUFRLElBQUksRUFBRSxLQUFLO0FBQ25CLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNyQixPQUFPLENBQUM7QUFDUixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsdUlBQXVJLENBQUMsQ0FBQztBQUNqSyxHQUFHO0FBQ0g7QUFDQSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDM0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsZ0JBQWdCLFVBQVUsTUFBTSxFQUFFO0FBQ2hELEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQztBQUNBLEVBQUUsU0FBUyxVQUFVLEdBQUc7QUFDeEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsZUFBZSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG9CQUFvQixnQkFBZ0IsVUFBVSxXQUFXLEVBQUU7QUFDL0QsRUFBRSxjQUFjLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDcEQ7QUFDQSxFQUFFLFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFO0FBQ3hDLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDckYsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvQkFBb0IsZ0JBQWdCLFVBQVUsWUFBWSxFQUFFO0FBQ2hFLEVBQUUsY0FBYyxDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsRUFBRSxTQUFTLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtBQUN4QyxJQUFJLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3RGLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksb0JBQW9CLGdCQUFnQixVQUFVLFlBQVksRUFBRTtBQUNoRSxFQUFFLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsU0FBUyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7QUFDeEMsSUFBSSxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUN0RixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDZCQUE2QixnQkFBZ0IsVUFBVSxZQUFZLEVBQUU7QUFDekUsRUFBRSxjQUFjLENBQUMsNkJBQTZCLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDOUQ7QUFDQSxFQUFFLFNBQVMsNkJBQTZCLEdBQUc7QUFDM0MsSUFBSSxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUN2RCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sNkJBQTZCLENBQUM7QUFDdkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFnQixnQkFBZ0IsVUFBVSxZQUFZLEVBQUU7QUFDNUQsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDakQ7QUFDQSxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO0FBQ2xDLElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ25FLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksb0JBQW9CLGdCQUFnQixVQUFVLFlBQVksRUFBRTtBQUNoRSxFQUFFLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsU0FBUyxvQkFBb0IsR0FBRztBQUNsQyxJQUFJLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3ZELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksbUJBQW1CLGdCQUFnQixVQUFVLFlBQVksRUFBRTtBQUMvRCxFQUFFLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNwRDtBQUNBLEVBQUUsU0FBUyxtQkFBbUIsR0FBRztBQUNqQyxJQUFJLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDeEUsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxDQUFDLEdBQUcsU0FBUztBQUNqQixJQUFJLENBQUMsR0FBRyxPQUFPO0FBQ2YsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2YsSUFBSSxVQUFVLEdBQUc7QUFDakIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxRQUFRLEdBQUc7QUFDZixFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDUixDQUFDLENBQUM7QUFDRixJQUFJLHFCQUFxQixHQUFHO0FBQzVCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNSLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFDRixJQUFJLFNBQVMsR0FBRztBQUNoQixFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDUixDQUFDLENBQUM7QUFDRixJQUFJLFNBQVMsR0FBRztBQUNoQixFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDUixFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBQ0YsSUFBSSxXQUFXLEdBQUc7QUFDbEIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxDQUFDLENBQUM7QUFDRixJQUFJLGlCQUFpQixHQUFHO0FBQ3hCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUNGLElBQUksc0JBQXNCLEdBQUc7QUFDN0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNqQixDQUFDLENBQUM7QUFDRixJQUFJLHFCQUFxQixHQUFHO0FBQzVCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxjQUFjLEdBQUc7QUFDckIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLE1BQU0sRUFBRSxLQUFLO0FBQ2YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG9CQUFvQixHQUFHO0FBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFDZixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUkseUJBQXlCLEdBQUc7QUFDaEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsS0FBSztBQUNmLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHdCQUF3QixHQUFHO0FBQy9CLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFDZixFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLEdBQUc7QUFDckIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMkJBQTJCLEdBQUc7QUFDbEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxZQUFZLEdBQUc7QUFDbkIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxDQUFDLENBQUM7QUFDRixJQUFJLHlCQUF5QixHQUFHO0FBQ2hDLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNSLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUNGLElBQUkseUJBQXlCLEdBQUc7QUFDaEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0YsSUFBSSxhQUFhLEdBQUc7QUFDcEIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNGLElBQUksMEJBQTBCLEdBQUc7QUFDakMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNqQixDQUFDLENBQUM7QUFDRixJQUFJLGFBQWEsR0FBRztBQUNwQixFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDUixFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNGLElBQUksMEJBQTBCLEdBQUc7QUFDakMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVixFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRTtBQUN4QixFQUFFLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxDQUFDO0FBQ2xDLENBQUM7QUFDRCxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDckIsRUFBRSxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztBQUMvQixDQUFDO0FBQ0QsU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQ3RCLEVBQUUsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUNELFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixFQUFFLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQy9CLENBQUM7QUFDRCxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDbkIsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxlQUFlLENBQUM7QUFDL0QsQ0FBQztBQUNEO0FBQ0EsU0FBUyxPQUFPLEdBQUc7QUFDbkIsRUFBRSxJQUFJO0FBQ04sSUFBSSxPQUFPLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO0FBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNkLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILENBQUM7QUFDRCxTQUFTLGdCQUFnQixHQUFHO0FBQzVCLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBQ0QsU0FBUyxXQUFXLEdBQUc7QUFDdkIsRUFBRSxJQUFJO0FBQ04sSUFBSSxPQUFPLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0FBQ3BFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNkLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRTtBQUMzQixFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBQ0QsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDbEMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3hCLElBQUksT0FBTyxTQUFTLENBQUM7QUFDckIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQzFDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEM7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDZixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RELE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixLQUFLO0FBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUNELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDekIsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDbkMsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDNUMsRUFBRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLENBQUM7QUFDN0QsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBQ0QsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ25DLEVBQUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDMUMsRUFBRSxJQUFJLE1BQU0sQ0FBQztBQUNiO0FBQ0EsRUFBRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3BDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsR0FBRyxNQUFNO0FBQ1QsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQy9CLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUM3QixDQUFDO0FBQ0QsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFO0FBQzlCLEVBQUUsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssRUFBRSxFQUFFO0FBQy9ELElBQUksT0FBTyxTQUFTLENBQUM7QUFDckIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEMsR0FBRztBQUNILENBQUM7QUFDRCxTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUU7QUFDL0I7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLEVBQUUsRUFBRTtBQUNyRSxJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLEdBQUcsTUFBTTtBQUNULElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0MsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRCxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRTtBQUM3QyxFQUFFLElBQUksVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQzdCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN2QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUNuQyxNQUFNLE9BQU8sR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMzQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUU7QUFDMUIsRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUMxQixFQUFFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEMsQ0FBQztBQUNELFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDbEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQy9DO0FBQ0EsRUFBRSxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDdEIsSUFBSSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pDLEdBQUcsTUFBTTtBQUNULElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVFLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUU7QUFDM0IsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEc7QUFDQSxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7QUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNoRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDO0FBQ0QsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztBQUM5RyxNQUFNLElBQUksR0FBRyxRQUFRLEdBQUcsQ0FBQztBQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0YsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFDRCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUU7QUFDOUIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUU7QUFDakIsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHLE1BQU0sT0FBTyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7QUFDM0QsRUFBRSxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUMzQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDekIsTUFBTSxRQUFRLEdBQUc7QUFDakIsSUFBSSxNQUFNLEVBQUUsS0FBSztBQUNqQixJQUFJLElBQUksRUFBRSxTQUFTO0FBQ25CLElBQUksS0FBSyxFQUFFLFNBQVM7QUFDcEIsSUFBSSxHQUFHLEVBQUUsU0FBUztBQUNsQixJQUFJLElBQUksRUFBRSxTQUFTO0FBQ25CLElBQUksTUFBTSxFQUFFLFNBQVM7QUFDckIsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLElBQUksUUFBUSxFQUFFO0FBQ2hCLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDakMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQy9CLElBQUksWUFBWSxFQUFFLFlBQVk7QUFDOUIsR0FBRyxFQUFFLFFBQVEsQ0FBQztBQUNkLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQ3ZCO0FBQ0EsRUFBRSxJQUFJLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxFQUFFO0FBQ2xDLElBQUksSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ2pHLE1BQU0sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLGNBQWMsQ0FBQztBQUNyRCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDeEMsR0FBRyxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ25CO0FBQ0EsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDeEUsUUFBUSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3pFLFFBQVEsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNuRCxRQUFRLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLE9BQU8sT0FBTyxDQUFDO0FBQ25CLEdBQUcsTUFBTTtBQUNULElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUU7QUFDaEQsRUFBRSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDO0FBQ0EsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDN0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQzlDLE1BQU0sWUFBWSxHQUFHLE9BQU8sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDOUUsRUFBRSxPQUFPLE9BQU8sR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3JDLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRTtBQUN6QixFQUFFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLElBQUksb0JBQW9CLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDOUksRUFBRSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBQ0QsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDdkQsRUFBRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEI7QUFDQSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO0FBQ3JCLElBQUksSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hDLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTO0FBQ2hELE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLE1BQU0sSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsU0FBUztBQUNsRCxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUNELFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDdEMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDakQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3JDO0FBQ0EsRUFBRSxRQUFRLE1BQU07QUFDaEIsSUFBSSxLQUFLLE9BQU87QUFDaEIsTUFBTSxPQUFPLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RTtBQUNBLElBQUksS0FBSyxRQUFRO0FBQ2pCLE1BQU0sT0FBTyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDcEU7QUFDQSxJQUFJLEtBQUssUUFBUTtBQUNqQixNQUFNLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkU7QUFDQSxJQUFJO0FBQ0osTUFBTSxNQUFNLElBQUksVUFBVSxDQUFDLGVBQWUsR0FBRyxNQUFNLEdBQUcsc0NBQXNDLENBQUMsQ0FBQztBQUM5RixHQUFHO0FBQ0gsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN6QixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELElBQUksU0FBUyxHQUFHLG9FQUFvRSxDQUFDO0FBQ3JGO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUksSUFBSSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZHLElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRixTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDeEIsRUFBRSxRQUFRLE1BQU07QUFDaEIsSUFBSSxLQUFLLFFBQVE7QUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDckM7QUFDQSxJQUFJLEtBQUssT0FBTztBQUNoQixNQUFNLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNwQztBQUNBLElBQUksS0FBSyxNQUFNO0FBQ2YsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkM7QUFDQSxJQUFJLEtBQUssU0FBUztBQUNsQixNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdFO0FBQ0EsSUFBSSxLQUFLLFNBQVM7QUFDbEIsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUk7QUFDSixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEdBQUc7QUFDSCxDQUFDO0FBQ0QsSUFBSSxZQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRyxJQUFJLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLElBQUksY0FBYyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDekQsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQzFCLEVBQUUsUUFBUSxNQUFNO0FBQ2hCLElBQUksS0FBSyxRQUFRO0FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsSUFBSSxLQUFLLE9BQU87QUFDaEIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdEM7QUFDQSxJQUFJLEtBQUssTUFBTTtBQUNmLE1BQU0sT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxLQUFLLFNBQVM7QUFDbEIsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakQ7QUFDQSxJQUFJO0FBQ0osTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixHQUFHO0FBQ0gsQ0FBQztBQUNELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLElBQUksUUFBUSxHQUFHLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ2hELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLElBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN0QixFQUFFLFFBQVEsTUFBTTtBQUNoQixJQUFJLEtBQUssUUFBUTtBQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuQztBQUNBLElBQUksS0FBSyxPQUFPO0FBQ2hCLE1BQU0sT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDO0FBQ0EsSUFBSSxLQUFLLE1BQU07QUFDZixNQUFNLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUk7QUFDSixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEdBQUc7QUFDSCxDQUFDO0FBQ0QsU0FBUyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUU7QUFDakMsRUFBRSxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUNELFNBQVMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRTtBQUN4QyxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUNELFNBQVMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRTtBQUN0QyxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUU7QUFDcEMsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUNELFNBQVMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQzFELEVBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDMUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3ZCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDekIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ25CLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUc7QUFDZCxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7QUFDMUIsSUFBSSxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0FBQ2pDLElBQUksTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztBQUM1QixJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7QUFDMUIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUNoQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7QUFDMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0FBQy9CLElBQUksT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztBQUMvQixHQUFHLENBQUM7QUFDSixFQUFFLElBQUksUUFBUSxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEU7QUFDQSxFQUFFLElBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxRQUFRLEVBQUU7QUFDdEMsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hDO0FBQ0EsSUFBSSxRQUFRLEtBQUs7QUFDakIsTUFBTSxLQUFLLENBQUM7QUFDWixRQUFRLE9BQU8sS0FBSyxHQUFHLFVBQVUsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdEO0FBQ0EsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUNiLFFBQVEsT0FBTyxLQUFLLEdBQUcsV0FBVyxHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQ7QUFDQSxNQUFNLEtBQUssQ0FBQztBQUNaLFFBQVEsT0FBTyxLQUFLLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsS0FBSyxDQUFDO0FBQy9CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoSCxFQUFFLE9BQU8sUUFBUSxHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsUUFBUSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFDekYsQ0FBQztBQUNELFNBQVMsWUFBWSxDQUFDLFdBQVcsRUFBRTtBQUNuQztBQUNBO0FBQ0EsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDcEksTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztBQUMvQixNQUFNLFlBQVksR0FBRyw0QkFBNEIsQ0FBQztBQUNsRDtBQUNBLEVBQUUsUUFBUSxHQUFHO0FBQ2IsSUFBSSxLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUM7QUFDOUIsTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUN4QjtBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQzVCLE1BQU0sT0FBTyxhQUFhLENBQUM7QUFDM0I7QUFDQSxJQUFJLEtBQUssU0FBUyxDQUFDLHFCQUFxQixDQUFDO0FBQ3pDLE1BQU0sT0FBTyxrQkFBa0IsQ0FBQztBQUNoQztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQzdCLE1BQU0sT0FBTyxjQUFjLENBQUM7QUFDNUI7QUFDQSxJQUFJLEtBQUssU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM3QixNQUFNLE9BQU8sb0JBQW9CLENBQUM7QUFDbEM7QUFDQSxJQUFJLEtBQUssU0FBUyxDQUFDLFdBQVcsQ0FBQztBQUMvQixNQUFNLE9BQU8sUUFBUSxDQUFDO0FBQ3RCO0FBQ0EsSUFBSSxLQUFLLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztBQUNyQyxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3pCO0FBQ0EsSUFBSSxLQUFLLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztBQUMxQyxNQUFNLE9BQU8sUUFBUSxDQUFDO0FBQ3RCO0FBQ0EsSUFBSSxLQUFLLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQztBQUN6QyxNQUFNLE9BQU8sUUFBUSxDQUFDO0FBQ3RCO0FBQ0EsSUFBSSxLQUFLLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDbEMsTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNyQjtBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsb0JBQW9CLENBQUM7QUFDeEMsTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUN4QjtBQUNBLElBQUksS0FBSyxTQUFTLENBQUMseUJBQXlCLENBQUM7QUFDN0MsTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNyQjtBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsd0JBQXdCLENBQUM7QUFDNUMsTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNyQjtBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxrQkFBa0IsQ0FBQztBQUNoQztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsWUFBWSxDQUFDO0FBQ2hDLE1BQU0sT0FBTyxxQkFBcUIsQ0FBQztBQUNuQztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsYUFBYSxDQUFDO0FBQ2pDLE1BQU0sT0FBTyxzQkFBc0IsQ0FBQztBQUNwQztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsYUFBYSxDQUFDO0FBQ2pDLE1BQU0sT0FBTyxZQUFZLENBQUM7QUFDMUI7QUFDQSxJQUFJLEtBQUssU0FBUyxDQUFDLDJCQUEyQixDQUFDO0FBQy9DLE1BQU0sT0FBTyxxQkFBcUIsQ0FBQztBQUNuQztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMseUJBQXlCLENBQUM7QUFDN0MsTUFBTSxPQUFPLHdCQUF3QixDQUFDO0FBQ3RDO0FBQ0EsSUFBSSxLQUFLLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQztBQUM3QyxNQUFNLE9BQU8seUJBQXlCLENBQUM7QUFDdkM7QUFDQSxJQUFJLEtBQUssU0FBUyxDQUFDLDBCQUEwQixDQUFDO0FBQzlDLE1BQU0sT0FBTyx5QkFBeUIsQ0FBQztBQUN2QztBQUNBLElBQUksS0FBSyxTQUFTLENBQUMsMEJBQTBCLENBQUM7QUFDOUMsTUFBTSxPQUFPLCtCQUErQixDQUFDO0FBQzdDO0FBQ0EsSUFBSTtBQUNKLE1BQU0sT0FBTyxZQUFZLENBQUM7QUFDMUIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUU7QUFDaEQsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsS0FBSyxJQUFJLFNBQVMsR0FBRywrQkFBK0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUFJLEdBQUc7QUFDckcsSUFBSSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzVCO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDdkIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUNyQixLQUFLLE1BQU07QUFDWCxNQUFNLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNEO0FBQ0EsSUFBSSx1QkFBdUIsR0FBRztBQUM5QixFQUFFLENBQUMsRUFBRSxVQUFVO0FBQ2YsRUFBRSxFQUFFLEVBQUUsUUFBUTtBQUNkLEVBQUUsR0FBRyxFQUFFLFNBQVM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsU0FBUztBQUNqQixFQUFFLENBQUMsRUFBRSxXQUFXO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLGlCQUFpQjtBQUN2QixFQUFFLEdBQUcsRUFBRSxzQkFBc0I7QUFDN0IsRUFBRSxJQUFJLEVBQUUscUJBQXFCO0FBQzdCLEVBQUUsQ0FBQyxFQUFFLGNBQWM7QUFDbkIsRUFBRSxFQUFFLEVBQUUsb0JBQW9CO0FBQzFCLEVBQUUsR0FBRyxFQUFFLHlCQUF5QjtBQUNoQyxFQUFFLElBQUksRUFBRSx3QkFBd0I7QUFDaEMsRUFBRSxDQUFDLEVBQUUsY0FBYztBQUNuQixFQUFFLEVBQUUsRUFBRSxZQUFZO0FBQ2xCLEVBQUUsR0FBRyxFQUFFLGFBQWE7QUFDcEIsRUFBRSxJQUFJLEVBQUUsYUFBYTtBQUNyQixFQUFFLENBQUMsRUFBRSwyQkFBMkI7QUFDaEMsRUFBRSxFQUFFLEVBQUUseUJBQXlCO0FBQy9CLEVBQUUsR0FBRyxFQUFFLDBCQUEwQjtBQUNqQyxFQUFFLElBQUksRUFBRSwwQkFBMEI7QUFDbEMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsZ0JBQWdCLFlBQVk7QUFDekMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbkQsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUU7QUFDcEQsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJO0FBQ3RCLFFBQVEsV0FBVyxHQUFHLEVBQUU7QUFDeEIsUUFBUSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQzFCLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxNQUFNLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUI7QUFDQSxNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNyQixRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDcEMsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3RCLFlBQVksT0FBTyxFQUFFLFNBQVM7QUFDOUIsWUFBWSxHQUFHLEVBQUUsV0FBVztBQUM1QixXQUFXLENBQUMsQ0FBQztBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFRLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDekIsUUFBUSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUM7QUFDL0IsT0FBTyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQzVCLFFBQVEsV0FBVyxJQUFJLENBQUMsQ0FBQztBQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFO0FBQ2hDLFFBQVEsV0FBVyxJQUFJLENBQUMsQ0FBQztBQUN6QixPQUFPLE1BQU07QUFDYixRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDcEMsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3RCLFlBQVksT0FBTyxFQUFFLEtBQUs7QUFDMUIsWUFBWSxHQUFHLEVBQUUsV0FBVztBQUM1QixXQUFXLENBQUMsQ0FBQztBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN4QixRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDcEIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNoQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDbEIsUUFBUSxPQUFPLEVBQUUsU0FBUztBQUMxQixRQUFRLEdBQUcsRUFBRSxXQUFXO0FBQ3hCLE9BQU8sQ0FBQyxDQUFDO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsU0FBUyxDQUFDLHNCQUFzQixHQUFHLFNBQVMsc0JBQXNCLENBQUMsS0FBSyxFQUFFO0FBQzVFLElBQUksT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRTtBQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQzNCLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztBQUMxQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7QUFDbkM7QUFDQSxFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDOUUsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO0FBQ2pDLE1BQU0sSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFDcEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLElBQUksT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDdkIsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUM1RCxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNoQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN2QixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUN0RSxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNoQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUM5QixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsTUFBTSxDQUFDLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQzlELElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxRSxJQUFJLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ2hDLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMvQixNQUFNLE9BQU8sUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QztBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2YsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsU0FBUyx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQy9FLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7QUFDdEQsUUFBUSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksZ0JBQWdCLEVBQUU7QUFDckgsUUFBUSxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUNoRCxNQUFNLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0wsUUFBUSxZQUFZLEdBQUcsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ25ELE1BQU0sSUFBSSxFQUFFLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDOUQsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixPQUFPO0FBQ1A7QUFDQSxNQUFNLE9BQU8sRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDeEUsS0FBSztBQUNMLFFBQVEsUUFBUSxHQUFHLFNBQVMsUUFBUSxHQUFHO0FBQ3ZDLE1BQU0sT0FBTyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzdELFFBQVEsSUFBSSxFQUFFLFNBQVM7QUFDdkIsUUFBUSxNQUFNLEVBQUUsSUFBSTtBQUNwQixPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMLFFBQVEsS0FBSyxHQUFHLFNBQVMsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7QUFDbkQsTUFBTSxPQUFPLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRztBQUMvRSxRQUFRLEtBQUssRUFBRSxNQUFNO0FBQ3JCLE9BQU8sR0FBRztBQUNWLFFBQVEsS0FBSyxFQUFFLE1BQU07QUFDckIsUUFBUSxHQUFHLEVBQUUsU0FBUztBQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEIsS0FBSztBQUNMLFFBQVEsT0FBTyxHQUFHLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7QUFDdkQsTUFBTSxPQUFPLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRztBQUNqRixRQUFRLE9BQU8sRUFBRSxNQUFNO0FBQ3ZCLE9BQU8sR0FBRztBQUNWLFFBQVEsT0FBTyxFQUFFLE1BQU07QUFDdkIsUUFBUSxLQUFLLEVBQUUsTUFBTTtBQUNyQixRQUFRLEdBQUcsRUFBRSxTQUFTO0FBQ3RCLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwQixLQUFLO0FBQ0wsUUFBUSxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0FBQ2hELE1BQU0sSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9EO0FBQ0EsTUFBTSxJQUFJLFVBQVUsRUFBRTtBQUN0QixRQUFRLE9BQU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3RCxPQUFPLE1BQU07QUFDYixRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLE9BQU87QUFDUCxLQUFLO0FBQ0wsUUFBUSxHQUFHLEdBQUcsU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFO0FBQ25DLE1BQU0sT0FBTyxZQUFZLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDaEUsUUFBUSxHQUFHLEVBQUUsTUFBTTtBQUNuQixPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEIsS0FBSztBQUNMLFFBQVEsYUFBYSxHQUFHLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRTtBQUN0RDtBQUNBLE1BQU0sUUFBUSxLQUFLO0FBQ25CO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNDO0FBQ0EsUUFBUSxLQUFLLEdBQUcsQ0FBQztBQUNqQjtBQUNBLFFBQVEsS0FBSyxLQUFLO0FBQ2xCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUM7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekM7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekM7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNuRTtBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEU7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEM7QUFDQSxRQUFRLEtBQUssSUFBSTtBQUNqQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQjtBQUNBLFVBQVUsT0FBTyxZQUFZLENBQUM7QUFDOUIsWUFBWSxNQUFNLEVBQUUsUUFBUTtBQUM1QixZQUFZLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU07QUFDckMsV0FBVyxDQUFDLENBQUM7QUFDYjtBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCO0FBQ0EsVUFBVSxPQUFPLFlBQVksQ0FBQztBQUM5QixZQUFZLE1BQU0sRUFBRSxPQUFPO0FBQzNCLFlBQVksTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUNyQyxXQUFXLENBQUMsQ0FBQztBQUNiO0FBQ0EsUUFBUSxLQUFLLEtBQUs7QUFDbEI7QUFDQSxVQUFVLE9BQU8sWUFBWSxDQUFDO0FBQzlCLFlBQVksTUFBTSxFQUFFLFFBQVE7QUFDNUIsWUFBWSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ3JDLFdBQVcsQ0FBQyxDQUFDO0FBQ2I7QUFDQSxRQUFRLEtBQUssTUFBTTtBQUNuQjtBQUNBLFVBQVUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFlBQVksTUFBTSxFQUFFLE9BQU87QUFDM0IsWUFBWSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNO0FBQ3BDLFdBQVcsQ0FBQyxDQUFDO0FBQ2I7QUFDQSxRQUFRLEtBQUssT0FBTztBQUNwQjtBQUNBLFVBQVUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFlBQVksTUFBTSxFQUFFLE1BQU07QUFDMUIsWUFBWSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNO0FBQ3BDLFdBQVcsQ0FBQyxDQUFDO0FBQ2I7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCO0FBQ0EsVUFBVSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFDN0I7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxRQUFRLEVBQUUsQ0FBQztBQUM1QjtBQUNBO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUMvQyxZQUFZLEdBQUcsRUFBRSxTQUFTO0FBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QztBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCLFVBQVUsT0FBTyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsWUFBWSxHQUFHLEVBQUUsU0FBUztBQUMxQixXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNDO0FBQ0E7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQjtBQUNBLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QztBQUNBLFFBQVEsS0FBSyxLQUFLO0FBQ2xCO0FBQ0EsVUFBVSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEM7QUFDQSxRQUFRLEtBQUssTUFBTTtBQUNuQjtBQUNBLFVBQVUsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsUUFBUSxLQUFLLE9BQU87QUFDcEI7QUFDQSxVQUFVLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6QztBQUNBO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEI7QUFDQSxVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkM7QUFDQSxRQUFRLEtBQUssS0FBSztBQUNsQjtBQUNBLFVBQVUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDO0FBQ0EsUUFBUSxLQUFLLE1BQU07QUFDbkI7QUFDQSxVQUFVLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QztBQUNBLFFBQVEsS0FBSyxPQUFPO0FBQ3BCO0FBQ0EsVUFBVSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUM7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCO0FBQ0EsVUFBVSxPQUFPLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUMvQyxZQUFZLEtBQUssRUFBRSxTQUFTO0FBQzVCLFlBQVksR0FBRyxFQUFFLFNBQVM7QUFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsUUFBUSxLQUFLLElBQUk7QUFDakI7QUFDQSxVQUFVLE9BQU8sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQy9DLFlBQVksS0FBSyxFQUFFLFNBQVM7QUFDNUIsWUFBWSxHQUFHLEVBQUUsU0FBUztBQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsUUFBUSxLQUFLLEtBQUs7QUFDbEI7QUFDQSxVQUFVLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsS0FBSyxNQUFNO0FBQ25CO0FBQ0EsVUFBVSxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFRLEtBQUssT0FBTztBQUNwQjtBQUNBLFVBQVUsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQjtBQUNBLFVBQVUsT0FBTyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsWUFBWSxLQUFLLEVBQUUsU0FBUztBQUM1QixXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUM7QUFDQSxRQUFRLEtBQUssSUFBSTtBQUNqQjtBQUNBLFVBQVUsT0FBTyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsWUFBWSxLQUFLLEVBQUUsU0FBUztBQUM1QixXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsUUFBUSxLQUFLLEtBQUs7QUFDbEI7QUFDQSxVQUFVLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2QztBQUNBLFFBQVEsS0FBSyxNQUFNO0FBQ25CO0FBQ0EsVUFBVSxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdEM7QUFDQSxRQUFRLEtBQUssT0FBTztBQUNwQjtBQUNBLFVBQVUsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDO0FBQ0E7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQjtBQUNBLFVBQVUsT0FBTyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsWUFBWSxJQUFJLEVBQUUsU0FBUztBQUMzQixXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLEtBQUssSUFBSTtBQUNqQjtBQUNBLFVBQVUsT0FBTyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsWUFBWSxJQUFJLEVBQUUsU0FBUztBQUMzQixXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xFO0FBQ0EsUUFBUSxLQUFLLE1BQU07QUFDbkI7QUFDQSxVQUFVLE9BQU8sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQy9DLFlBQVksSUFBSSxFQUFFLFNBQVM7QUFDM0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QztBQUNBLFFBQVEsS0FBSyxRQUFRO0FBQ3JCO0FBQ0EsVUFBVSxPQUFPLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUMvQyxZQUFZLElBQUksRUFBRSxTQUFTO0FBQzNCLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0M7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCO0FBQ0EsVUFBVSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5QjtBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCO0FBQ0EsVUFBVSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QjtBQUNBLFFBQVEsS0FBSyxPQUFPO0FBQ3BCLFVBQVUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0I7QUFDQSxRQUFRLEtBQUssSUFBSTtBQUNqQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hFO0FBQ0EsUUFBUSxLQUFLLE1BQU07QUFDbkIsVUFBVSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQztBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxQztBQUNBLFFBQVEsS0FBSyxJQUFJO0FBQ2pCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0M7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkM7QUFDQSxRQUFRLEtBQUssS0FBSztBQUNsQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEI7QUFDQSxVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkM7QUFDQSxRQUFRLEtBQUssSUFBSTtBQUNqQjtBQUNBLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQixVQUFVLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyRDtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQztBQUNBLFFBQVE7QUFDUixVQUFVLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLE9BQU87QUFDUCxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksT0FBTyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN0RSxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNoRixJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztBQUN0QjtBQUNBLElBQUksSUFBSSxZQUFZLEdBQUcsU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFO0FBQ3BELE1BQU0sUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxhQUFhLENBQUM7QUFDL0I7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQixVQUFVLE9BQU8sUUFBUSxDQUFDO0FBQzFCO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLFFBQVEsQ0FBQztBQUMxQjtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxNQUFNLENBQUM7QUFDeEI7QUFDQSxRQUFRLEtBQUssR0FBRztBQUNoQixVQUFVLE9BQU8sS0FBSyxDQUFDO0FBQ3ZCO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLE9BQU8sQ0FBQztBQUN6QjtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxNQUFNLENBQUM7QUFDeEI7QUFDQSxRQUFRO0FBQ1IsVUFBVSxPQUFPLElBQUksQ0FBQztBQUN0QixPQUFPO0FBQ1AsS0FBSztBQUNMLFFBQVEsYUFBYSxHQUFHLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRTtBQUN2RCxNQUFNLE9BQU8sVUFBVSxLQUFLLEVBQUU7QUFDOUIsUUFBUSxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekM7QUFDQSxRQUFRLElBQUksTUFBTSxFQUFFO0FBQ3BCLFVBQVUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlELFNBQVMsTUFBTTtBQUNmLFVBQVUsT0FBTyxLQUFLLENBQUM7QUFDdkIsU0FBUztBQUNULE9BQU8sQ0FBQztBQUNSLEtBQUs7QUFDTCxRQUFRLE1BQU0sR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztBQUMzQyxRQUFRLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUMxRCxNQUFNLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPO0FBQ2hDLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsTUFBTSxPQUFPLE9BQU8sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRCxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQ1YsUUFBUSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQzVGLE1BQU0sT0FBTyxDQUFDLENBQUM7QUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ1I7QUFDQSxJQUFJLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM3RCxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxFQUFFLENBQUM7QUFDSjtBQUNBLElBQUksT0FBTyxnQkFBZ0IsWUFBWTtBQUN2QyxFQUFFLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUU7QUFDeEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ25DLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNqQztBQUNBLEVBQUUsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVMsR0FBRztBQUMxQyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN6QixLQUFLO0FBQ0wsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsRUFBRSxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxnQkFBZ0IsWUFBWTtBQUNwQyxFQUFFLFNBQVMsSUFBSSxHQUFHLEVBQUU7QUFDcEI7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNwRCxJQUFJLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQ3BDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUU7QUFDMUQsSUFBSSxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUNwQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxJQUFJLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQ3BDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFO0FBQzdDLElBQUksTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7QUFDcEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN0QixJQUFJLEdBQUcsRUFBRSxNQUFNO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUN0QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7QUFDdEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUN0QyxLQUFLO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUztBQUNsQixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQ3RDLEtBQUs7QUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxFQUFFLENBQUM7QUFDSjtBQUNBLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLGdCQUFnQixVQUFVLEtBQUssRUFBRTtBQUM5QyxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkM7QUFDQSxFQUFFLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDaEQsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQ25DO0FBQ0E7QUFDQSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNwRCxJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO0FBQzVCLFFBQVEsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDN0IsSUFBSSxPQUFPLGFBQWEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQzVELElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFO0FBQ3RDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFDN0MsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUM3QyxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDdEMsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDM0IsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmO0FBQ0E7QUFDQSxJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sT0FBTyxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUNyQixRQUFRLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO0FBQ3BFLE9BQU8sTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUNuQixLQUFLO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUztBQUNsQixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ1AsSUFBSSxHQUFHLEVBQUUsVUFBVTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7QUFDOUIsUUFBUSxTQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUNwQyxPQUFPO0FBQ1A7QUFDQSxNQUFNLE9BQU8sU0FBUyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNSO0FBQ0EsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNsQjtBQUNBLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRTtBQUN2QixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdkIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtBQUN0RCxNQUFNLE1BQU0sRUFBRSxLQUFLO0FBQ25CLE1BQU0sUUFBUSxFQUFFLElBQUk7QUFDcEIsTUFBTSxJQUFJLEVBQUUsU0FBUztBQUNyQixNQUFNLEtBQUssRUFBRSxTQUFTO0FBQ3RCLE1BQU0sR0FBRyxFQUFFLFNBQVM7QUFDcEIsTUFBTSxJQUFJLEVBQUUsU0FBUztBQUNyQixNQUFNLE1BQU0sRUFBRSxTQUFTO0FBQ3ZCLE1BQU0sTUFBTSxFQUFFLFNBQVM7QUFDdkIsS0FBSyxDQUFDLENBQUM7QUFDUCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBLElBQUksU0FBUyxHQUFHO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNSLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ1gsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUNGO0FBQ0EsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtBQUNoQyxFQUFFLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7QUFDekQsTUFBTSxNQUFNLEdBQUcseUNBQXlDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDekIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtBQUNoQyxFQUFFLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQjtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJO0FBQ2hDLFFBQVEsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLO0FBQ2xDLFFBQVEsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QjtBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLGdCQUFnQixVQUFVLEtBQUssRUFBRTtBQUM3QyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUU7QUFDMUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzlCLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsVUFBVSxHQUFHLFNBQVMsVUFBVSxHQUFHO0FBQzlDLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDbEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLGdCQUFnQixDQUFDLENBQUMsRUFBRTtBQUMzRCxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDM0MsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFO0FBQ3BELElBQUksSUFBSTtBQUNSLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtBQUN2QyxRQUFRLFFBQVEsRUFBRSxJQUFJO0FBQ3RCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2xCLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ2hCLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFDbkIsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsY0FBYyxHQUFHLFNBQVMsY0FBYyxDQUFDLFNBQVMsRUFBRTtBQUMvRCxJQUFJLElBQUksU0FBUyxFQUFFO0FBQ25CLE1BQU0sSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBQ2hFO0FBQ0EsTUFBTSxJQUFJLEtBQUssRUFBRTtBQUNqQixRQUFRLE9BQU8sQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDMUIsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUNkO0FBQ0EsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDckM7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDMUI7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNsQztBQUNBO0FBQ0EsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsVUFBVSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDcEQsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtBQUM1QixRQUFRLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzdCLElBQUksT0FBTyxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQzVELElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFO0FBQ3RDLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNoQztBQUNBLElBQUksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDaEMsUUFBUSxLQUFLLEdBQUcsR0FBRyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQ25GLFFBQVEsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBUSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFRLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBUSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixRQUFRLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsWUFBWSxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM5QztBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsWUFBWSxDQUFDO0FBQzdCLE1BQU0sSUFBSSxFQUFFLElBQUk7QUFDaEIsTUFBTSxLQUFLLEVBQUUsS0FBSztBQUNsQixNQUFNLEdBQUcsRUFBRSxHQUFHO0FBQ2QsTUFBTSxJQUFJLEVBQUUsWUFBWTtBQUN4QixNQUFNLE1BQU0sRUFBRSxNQUFNO0FBQ3BCLE1BQU0sTUFBTSxFQUFFLE1BQU07QUFDcEIsTUFBTSxXQUFXLEVBQUUsQ0FBQztBQUNwQixLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDckIsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzNCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDM0MsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDeEMsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUM3QyxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JFLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzFCLElBQUksR0FBRyxFQUFFLE1BQU07QUFDZixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsV0FBVztBQUNwQixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxTQUFTO0FBQ2xCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3hCLEtBQUs7QUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNSO0FBQ0EsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGVBQWUsZ0JBQWdCLFVBQVUsS0FBSyxFQUFFO0FBQ3BELEVBQUUsY0FBYyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQ3ZELElBQUksT0FBTyxNQUFNLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFO0FBQzlELElBQUksSUFBSSxDQUFDLEVBQUU7QUFDWCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztBQUMvRDtBQUNBLE1BQU0sSUFBSSxDQUFDLEVBQUU7QUFDYixRQUFRLE9BQU8sSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdELE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3ZDLElBQUksR0FBRyxFQUFFLGFBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO0FBQ2hDLFFBQVEsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxXQUFXLENBQUM7QUFDekIsS0FBSztBQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDTjtBQUNBLEVBQUUsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ25DLElBQUksSUFBSSxLQUFLLENBQUM7QUFDZDtBQUNBLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3JDO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3pCLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQztBQUN6QztBQUNBO0FBQ0EsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsVUFBVSxHQUFHO0FBQzVDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JCLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQzVELElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM1QyxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sR0FBRztBQUNwQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN0QixHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFO0FBQzdDLElBQUksT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDeEUsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDakMsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxPQUFPLENBQUM7QUFDckIsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxNQUFNO0FBQ2YsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbkYsS0FBSztBQUNMLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixLQUFLO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUztBQUNsQixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxnQkFBZ0IsVUFBVSxLQUFLLEVBQUU7QUFDaEQsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsRUFBRSxTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUU7QUFDakMsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUNkO0FBQ0EsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDckM7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDOUIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO0FBQ3JDO0FBQ0E7QUFDQSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxVQUFVLEdBQUc7QUFDNUMsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEdBQUc7QUFDaEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sR0FBRztBQUNwQyxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxHQUFHO0FBQ3BDLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDN0IsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxTQUFTLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxNQUFNO0FBQ2YsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDM0IsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxXQUFXO0FBQ3BCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFDbkIsS0FBSztBQUNMLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLFNBQVM7QUFDbEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUNuQixLQUFLO0FBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNOO0FBQ0EsRUFBRSxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUU7QUFDM0MsRUFBRSxJQUFJLE1BQU0sQ0FBQztBQUNiO0FBQ0EsRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQzVDLElBQUksT0FBTyxXQUFXLENBQUM7QUFDdkIsR0FBRyxNQUFNLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtBQUNwQyxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM5QixJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN0QyxJQUFJLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDaE07QUFDQSxNQUFNLE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxLQUFLLE1BQU0sSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssT0FBTyxlQUFlLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9KLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM5QixJQUFJLE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQzVGO0FBQ0E7QUFDQSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEdBQUcsTUFBTTtBQUNULElBQUksT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUc7QUFDekIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSTtBQUN0QjtBQUNBLGFBQWEsR0FBRyxJQUFJO0FBQ3BCLElBQUksc0JBQXNCLEdBQUcsSUFBSTtBQUNqQyxJQUFJLHFCQUFxQixHQUFHLElBQUk7QUFDaEMsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsZ0JBQWdCLFlBQVk7QUFDeEMsRUFBRSxTQUFTLFFBQVEsR0FBRyxFQUFFO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXLEdBQUc7QUFDaEQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEIsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDMUIsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDaEMsSUFBSSxHQUFHLEVBQUUsS0FBSztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sR0FBRyxDQUFDO0FBQ2pCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNkLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsaUJBQWlCO0FBQzFCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztBQUN2QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUN6QixNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDZCxRQUFRLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDM0IsT0FBTyxNQUFNO0FBQ2IsUUFBUSxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLGFBQWE7QUFDdEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLFdBQVcsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsZUFBZTtBQUN4QixJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sYUFBYSxDQUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFO0FBQzlCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMLElBQUksR0FBRyxFQUFFLHdCQUF3QjtBQUNqQyxJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN4QixNQUFNLE9BQU8sc0JBQXNCLENBQUM7QUFDcEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxlQUFlLEVBQUU7QUFDdkMsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUM7QUFDL0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSx1QkFBdUI7QUFDaEMsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLHFCQUFxQixDQUFDO0FBQ25DLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsY0FBYyxFQUFFO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDO0FBQzdDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsZ0JBQWdCO0FBQ3pCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxjQUFjLENBQUM7QUFDNUIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDekIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEtBQUs7QUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsRUFBRSxDQUFDO0FBQ0o7QUFDQSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDckI7QUFDQSxTQUFTLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFO0FBQ3ZDLEVBQUUsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDdkIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0I7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0EsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3RCO0FBQ0EsU0FBUyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRTtBQUN2QyxFQUFFLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlDLEVBQUUsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN0QjtBQUNBLFNBQVMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUU7QUFDdkMsRUFBRSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN2QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxNQUFNLEtBQUssR0FBRyxJQUFJO0FBQ2xCLE1BQWEsS0FBSyxDQUFDLElBQUk7QUFDdkIsVUFBTSxZQUFZLEdBQUcsNkJBQTZCLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDcEU7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM1QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0EsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzFCO0FBQ0EsU0FBUyxZQUFZLEdBQUc7QUFDeEIsRUFBRSxJQUFJLGNBQWMsRUFBRTtBQUN0QixJQUFJLE9BQU8sY0FBYyxDQUFDO0FBQzFCLEdBQUcsTUFBTSxJQUFJLE9BQU8sRUFBRSxFQUFFO0FBQ3hCLElBQUksSUFBSSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQ3pFO0FBQ0EsSUFBSSxjQUFjLEdBQUcsQ0FBQyxXQUFXLElBQUksV0FBVyxLQUFLLEtBQUssR0FBRyxPQUFPLEdBQUcsV0FBVyxDQUFDO0FBQ25GLElBQUksT0FBTyxjQUFjLENBQUM7QUFDMUIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQzdCLElBQUksT0FBTyxjQUFjLENBQUM7QUFDMUIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsU0FBUyxFQUFFO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QztBQUNBLEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDckIsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxJQUFJLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsSUFBSSxJQUFJO0FBQ1IsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQzFELEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNoQixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFFBQVEsR0FBRyxPQUFPO0FBQzFCLFFBQVEsZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlO0FBQ2xELFFBQVEsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFDckM7QUFDQSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFO0FBQ3RFLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUNqQixJQUFJLElBQUksY0FBYyxJQUFJLGVBQWUsRUFBRTtBQUMzQyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUM7QUFDeEI7QUFDQSxNQUFNLElBQUksY0FBYyxFQUFFO0FBQzFCLFFBQVEsU0FBUyxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFDN0MsT0FBTztBQUNQO0FBQ0EsTUFBTSxJQUFJLGVBQWUsRUFBRTtBQUMzQixRQUFRLFNBQVMsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDO0FBQzlDLE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxTQUFTLENBQUM7QUFDdkIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxPQUFPLFNBQVMsQ0FBQztBQUN2QixLQUFLO0FBQ0wsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDdEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDZDtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoQyxJQUFJLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFDRDtBQUNBLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRTtBQUN4QixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNkO0FBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9CLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7QUFDOUQsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDeEIsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHLE1BQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQzVCLElBQUksT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7QUFDbEMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLGVBQWUsS0FBSyxNQUFNLEVBQUU7QUFDN0QsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHLE1BQU07QUFDVCxJQUFJLE9BQU8sR0FBRyxDQUFDLGVBQWUsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsZUFBZSxLQUFLLE1BQU0sQ0FBQztBQUN2TCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1CQUFtQixnQkFBZ0IsWUFBWTtBQUNuRCxFQUFFLFNBQVMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7QUFDeEQsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztBQUNyQztBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUNuQyxNQUFNLElBQUksUUFBUSxHQUFHO0FBQ3JCLFFBQVEsV0FBVyxFQUFFLEtBQUs7QUFDMUIsT0FBTyxDQUFDO0FBQ1IsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JFLE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzlDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztBQUM3QztBQUNBLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDckMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDbEIsTUFBTSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxLQUFLLE1BQU07QUFDWDtBQUNBLE1BQU0sSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUQ7QUFDQSxNQUFNLE9BQU8sUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUMsRUFBRSxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksaUJBQWlCLGdCQUFnQixZQUFZO0FBQ2pELEVBQUUsU0FBUyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUM3QyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUM3QixJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ1Y7QUFDQSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDNUMsTUFBTSxJQUFJLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxHQUFHLFVBQVUsR0FBRyxTQUFTLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUNwRixNQUFNLElBQUkscUJBQXFCLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRTtBQUNBLE1BQU0sSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxxQkFBcUIsRUFBRTtBQUNwRCxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDcEIsUUFBUSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyQixPQUFPLE1BQU07QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQjtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQy9CLFVBQVUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsU0FBUyxNQUFNO0FBQ2YsVUFBVSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUYsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDekMsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixLQUFLLE1BQU07QUFDWCxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3RCLE1BQU0sSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsTUFBTSxJQUFJLENBQUMsRUFBRTtBQUNiLFFBQVEsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDOUIsT0FBTztBQUNQO0FBQ0EsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDOUMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDO0FBQzVDO0FBQ0EsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxHQUFHO0FBQ3JDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3RCLE1BQU0sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDakQsS0FBSyxNQUFNO0FBQ1gsTUFBTSxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMvQyxVQUFVLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbEYsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxHQUFHO0FBQ25ELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLGdCQUFnQixFQUFFLEVBQUU7QUFDNUMsTUFBTSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUN4RCxLQUFLLE1BQU07QUFDWDtBQUNBO0FBQ0EsTUFBTSxPQUFPLEVBQUUsQ0FBQztBQUNoQixLQUFLO0FBQ0wsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsU0FBUyxlQUFlLEdBQUc7QUFDdkQsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdEIsTUFBTSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDeEMsS0FBSyxNQUFNO0FBQ1gsTUFBTSxPQUFPO0FBQ2IsUUFBUSxNQUFNLEVBQUUsT0FBTztBQUN2QixRQUFRLGVBQWUsRUFBRSxNQUFNO0FBQy9CLFFBQVEsY0FBYyxFQUFFLFNBQVM7QUFDakMsT0FBTyxDQUFDO0FBQ1IsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLGlCQUFpQixDQUFDO0FBQzNCLENBQUMsRUFBRSxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0JBQWdCLGdCQUFnQixZQUFZO0FBQ2hELEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtBQUNuRCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUM5QixNQUFNLEtBQUssRUFBRSxNQUFNO0FBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNiO0FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFdBQVcsRUFBRSxFQUFFO0FBQ3JDLE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztBQUMzQztBQUNBLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ2hELElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ2xCLE1BQU0sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUMsS0FBSyxNQUFNO0FBQ1gsTUFBTSxPQUFPLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDNUYsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDOUQsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDbEIsTUFBTSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRCxLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTCxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLEVBQUUsQ0FBQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sZ0JBQWdCLFlBQVk7QUFDdEMsRUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUM1QyxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkcsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO0FBQ3hGLElBQUksSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDaEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzFCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxlQUFlLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxhQUFhO0FBQzFEO0FBQ0EsSUFBSSxPQUFPLEdBQUcsZUFBZSxLQUFLLFdBQVcsR0FBRyxPQUFPLEdBQUcsWUFBWSxFQUFFLENBQUM7QUFDekUsUUFBUSxnQkFBZ0IsR0FBRyxlQUFlLElBQUksUUFBUSxDQUFDLHNCQUFzQjtBQUM3RSxRQUFRLGVBQWUsR0FBRyxjQUFjLElBQUksUUFBUSxDQUFDLHFCQUFxQixDQUFDO0FBQzNFLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ25GLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsVUFBVSxHQUFHO0FBQzVDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztBQUMxQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDckIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN0QixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUU7QUFDakQsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEtBQUssS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7QUFDNUMsUUFBUSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07QUFDNUIsUUFBUSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWU7QUFDOUMsUUFBUSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztBQUM3QztBQUNBLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbEUsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRTtBQUN0RSxJQUFJLElBQUksa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0FBQ3RELFFBQVEsWUFBWSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztBQUM1QyxRQUFRLHFCQUFxQixHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztBQUNyRCxRQUFRLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztBQUMvQixJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxJQUFJLHFCQUFxQixJQUFJLElBQUksQ0FBQztBQUN0RSxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxJQUFJLG9CQUFvQixJQUFJLElBQUksQ0FBQztBQUN6RSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN6RixJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUc7QUFDekIsTUFBTSxNQUFNLEVBQUUsRUFBRTtBQUNoQixNQUFNLFVBQVUsRUFBRSxFQUFFO0FBQ3BCLEtBQUssQ0FBQztBQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRztBQUN2QixNQUFNLE1BQU0sRUFBRSxFQUFFO0FBQ2hCLE1BQU0sVUFBVSxFQUFFLEVBQUU7QUFDcEIsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLElBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDM0MsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUNqQztBQUNBLEVBQUUsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxTQUFTLEVBQUU7QUFDeEQsSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUU7QUFDeEIsUUFBUSxNQUFNLEdBQUcsSUFBSSxJQUFJLGdCQUFnQixFQUFFO0FBQzNDLFFBQVEsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDdkMsUUFBUSxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBQ25LO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsWUFBWSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3BFLE1BQU0sT0FBTyxPQUFPLENBQUM7QUFDckIsS0FBSyxNQUFNLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxJQUFJLGNBQWMsRUFBRTtBQUMxRCxNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFDcEIsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRTtBQUN2QyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDaEUsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ3JMLEtBQUs7QUFDTCxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUU7QUFDdkQsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQzlDLE1BQU0sV0FBVyxFQUFFLElBQUk7QUFDdkIsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNSLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7QUFDL0QsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQzlDLE1BQU0sV0FBVyxFQUFFLEtBQUs7QUFDeEIsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNSLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0FBQ2hFLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRTtBQUMzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWTtBQUNsRSxNQUFNLElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRztBQUMxQixRQUFRLEtBQUssRUFBRSxNQUFNO0FBQ3JCLFFBQVEsR0FBRyxFQUFFLFNBQVM7QUFDdEIsT0FBTyxHQUFHO0FBQ1YsUUFBUSxLQUFLLEVBQUUsTUFBTTtBQUNyQixPQUFPO0FBQ1AsVUFBVSxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxZQUFZLENBQUM7QUFDdkQ7QUFDQSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ2pELFFBQVEsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUU7QUFDdkUsVUFBVSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRCxTQUFTLENBQUMsQ0FBQztBQUNYLE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7QUFDcEUsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdEI7QUFDQSxJQUFJLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQzNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztBQUN2QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZO0FBQ3BFLE1BQU0sSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHO0FBQzFCLFFBQVEsT0FBTyxFQUFFLE1BQU07QUFDdkIsUUFBUSxJQUFJLEVBQUUsU0FBUztBQUN2QixRQUFRLEtBQUssRUFBRSxNQUFNO0FBQ3JCLFFBQVEsR0FBRyxFQUFFLFNBQVM7QUFDdEIsT0FBTyxHQUFHO0FBQ1YsUUFBUSxPQUFPLEVBQUUsTUFBTTtBQUN2QixPQUFPO0FBQ1AsVUFBVSxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxZQUFZLENBQUM7QUFDdkQ7QUFDQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3BELFFBQVEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUU7QUFDNUUsVUFBVSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxTQUFTLENBQUMsQ0FBQztBQUNYLE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxXQUFXLENBQUMsU0FBUyxFQUFFO0FBQ3RELElBQUksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3RCO0FBQ0EsSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZO0FBQzdELE1BQU0sT0FBTyxTQUFTLENBQUM7QUFDdkIsS0FBSyxFQUFFLFlBQVk7QUFDbkI7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7QUFDakMsUUFBUSxJQUFJLElBQUksR0FBRztBQUNuQixVQUFVLElBQUksRUFBRSxTQUFTO0FBQ3pCLFVBQVUsTUFBTSxFQUFFLElBQUk7QUFDdEIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFO0FBQ2pILFVBQVUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDdkQsU0FBUyxDQUFDLENBQUM7QUFDWCxPQUFPO0FBQ1A7QUFDQSxNQUFNLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQztBQUNsQyxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUU7QUFDcEQsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdEI7QUFDQSxJQUFJLElBQUksU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztBQUN2QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZO0FBQ2hFLE1BQU0sSUFBSSxJQUFJLEdBQUc7QUFDakIsUUFBUSxHQUFHLEVBQUUsTUFBTTtBQUNuQixPQUFPLENBQUM7QUFDUjtBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNwQyxRQUFRLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7QUFDeEcsVUFBVSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNqRCxTQUFTLENBQUMsQ0FBQztBQUNYLE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7QUFDMUQsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUM7QUFDM0MsUUFBUSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRTtBQUNwQyxRQUFRLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQzdDLE1BQU0sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQztBQUM1QyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDNUMsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFO0FBQzNELElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFO0FBQzNELElBQUksSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDN0IsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFELEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRTtBQUNyRCxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNoQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRSxHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVMsR0FBRztBQUMzQyxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLEdBQUcsQ0FBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUMxQyxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUM7QUFDMUksR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN4QixJQUFJLEdBQUcsRUFBRSxhQUFhO0FBQ3RCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxFQUFFO0FBQzFDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNELE9BQU87QUFDUDtBQUNBLE1BQU0sT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDcEMsS0FBSztBQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDTjtBQUNBLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxFQUFFLENBQUM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxjQUFjLEdBQUc7QUFDMUIsRUFBRSxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUM5RixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsRUFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLEdBQUc7QUFDN0IsRUFBRSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUN2RyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFO0FBQ3RCLElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNqRCxNQUFNLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUIsVUFBVSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QixVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0I7QUFDQSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQzdCLFVBQVUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEIsVUFBVSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QixVQUFVLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEI7QUFDQSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRDtBQUNBLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNsQixFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtBQUNqQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDekgsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxRQUFRLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDdEUsSUFBSSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBUSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQjtBQUNBLElBQUksSUFBSSxDQUFDLEVBQUU7QUFDWCxNQUFNLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxXQUFXLEdBQUc7QUFDdkIsRUFBRSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUNqRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLFVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUNsQyxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNqQixJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ1Y7QUFDQSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25DLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRDtBQUNBO0FBQ0EsSUFBSSxXQUFXLEdBQUcsaUNBQWlDO0FBQ25ELElBQUksZ0JBQWdCLEdBQUcscURBQXFEO0FBQzVFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ2xGLElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN2RSxJQUFJLFdBQVcsR0FBRyw2Q0FBNkM7QUFDL0QsSUFBSSxZQUFZLEdBQUcsNkJBQTZCO0FBQ2hELElBQUksZUFBZSxHQUFHLGtCQUFrQjtBQUN4QyxJQUFJLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQztBQUN6RSxJQUFJLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO0FBQzFELElBQUksV0FBVyxHQUFHLHVCQUF1QjtBQUN6QztBQUNBLFlBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUMvRyxJQUFJLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN4RTtBQUNBLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO0FBQ25DLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsSUFBSSxJQUFJLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUM1QixJQUFJLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsR0FBRyxDQUFDO0FBQ0osRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUN2QyxFQUFFLElBQUksSUFBSSxHQUFHO0FBQ2IsSUFBSSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLElBQUksT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEMsSUFBSSxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxJQUFJLFlBQVksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRCxHQUFHLENBQUM7QUFDSixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDekMsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsTUFBTSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRDtBQUNBLFNBQVMsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDeEMsRUFBRSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNoRTtBQUNBLElBQUksV0FBVyxHQUFHLDZKQUE2SixDQUFDO0FBQ2hMO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7QUFDbkMsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDMUIsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxlQUFlLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7QUFDMUQ7QUFDQSxFQUFFLElBQUksV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDckQsSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRTtBQUMxQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUcsS0FBSyxTQUFTLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqRixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsT0FBTyxDQUFDO0FBQ1YsSUFBSSxLQUFLLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxJQUFJLE1BQU0sRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLElBQUksS0FBSyxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0MsSUFBSSxJQUFJLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzQyxJQUFJLEtBQUssRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLElBQUksT0FBTyxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakQsSUFBSSxPQUFPLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEtBQUssSUFBSSxDQUFDO0FBQ3JFLElBQUksWUFBWSxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsZUFBZSxDQUFDO0FBQzVFLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxVQUFVLEdBQUc7QUFDakIsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNSLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDZCxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ2QsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUNkLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDZCxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ2QsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUNkLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDZCxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ2QsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxTQUFTLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0YsRUFBRSxJQUFJLE1BQU0sR0FBRztBQUNmLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO0FBQzlGLElBQUksS0FBSyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUM1QyxJQUFJLEdBQUcsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQzdCLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUM7QUFDL0IsSUFBSSxNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQztBQUNuQyxHQUFHLENBQUM7QUFDSixFQUFFLElBQUksU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pEO0FBQ0EsRUFBRSxJQUFJLFVBQVUsRUFBRTtBQUNsQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUgsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLElBQUksT0FBTyxHQUFHLGlNQUFpTSxDQUFDO0FBQ2hOO0FBQ0EsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDMUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDMUIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM1QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQzlCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRyxFQUFFLElBQUksTUFBTSxDQUFDO0FBQ2I7QUFDQSxFQUFFLElBQUksU0FBUyxFQUFFO0FBQ2pCLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxHQUFHLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFDeEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRyxNQUFNO0FBQ1QsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNwRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGlCQUFpQixDQUFDLENBQUMsRUFBRTtBQUM5QjtBQUNBLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDN0UsQ0FBQztBQUNEO0FBQ0E7QUFDQSxJQUFJLE9BQU8sR0FBRyw0SEFBNEg7QUFDMUksSUFBSSxNQUFNLEdBQUcsc0pBQXNKO0FBQ25LLElBQUksS0FBSyxHQUFHLDJIQUEySCxDQUFDO0FBQ3hJO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7QUFDcEMsRUFBRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRTtBQUM3QixFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDM0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pHLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUNEO0FBQ0EsSUFBSSw0QkFBNEIsR0FBRyxjQUFjLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDdEYsSUFBSSw2QkFBNkIsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDeEYsSUFBSSxnQ0FBZ0MsR0FBRyxjQUFjLENBQUMsZUFBZSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDOUYsSUFBSSxvQkFBb0IsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDeEQsSUFBSSwwQkFBMEIsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDcEcsSUFBSSwyQkFBMkIsR0FBRyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRyxJQUFJLDRCQUE0QixHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzlHLElBQUksdUJBQXVCLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsMkJBQTJCLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7QUFDL1AsQ0FBQztBQUNELFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsT0FBTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3hHLENBQUM7QUFDRCxTQUFTLGdCQUFnQixDQUFDLENBQUMsRUFBRTtBQUM3QixFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUNELElBQUksa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0QsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7QUFDN0IsRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFDRCxJQUFJLDRCQUE0QixHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUN0RixJQUFJLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4RCxJQUFJLGtDQUFrQyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDN0gsSUFBSSwrQkFBK0IsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDM0csU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JCLEVBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsa0NBQWtDLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLCtCQUErQixDQUFDLENBQUMsQ0FBQztBQUMvSSxDQUFDO0FBQ0Q7QUFDQSxJQUFJLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztBQUNqQztBQUNBLElBQUksY0FBYyxHQUFHO0FBQ3JCLEVBQUUsS0FBSyxFQUFFO0FBQ1QsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNYLElBQUksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFO0FBQ2pCLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QixJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzdCLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ3pDLEdBQUc7QUFDSCxFQUFFLElBQUksRUFBRTtBQUNSLElBQUksS0FBSyxFQUFFLEVBQUU7QUFDYixJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRTtBQUNwQixJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekIsSUFBSSxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUNyQyxHQUFHO0FBQ0gsRUFBRSxLQUFLLEVBQUU7QUFDVCxJQUFJLE9BQU8sRUFBRSxFQUFFO0FBQ2YsSUFBSSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUU7QUFDcEIsSUFBSSxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ2hDLEdBQUc7QUFDSCxFQUFFLE9BQU8sRUFBRTtBQUNYLElBQUksT0FBTyxFQUFFLEVBQUU7QUFDZixJQUFJLFlBQVksRUFBRSxFQUFFLEdBQUcsSUFBSTtBQUMzQixHQUFHO0FBQ0gsRUFBRSxPQUFPLEVBQUU7QUFDWCxJQUFJLFlBQVksRUFBRSxJQUFJO0FBQ3RCLEdBQUc7QUFDSCxDQUFDO0FBQ0QsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNqQyxFQUFFLEtBQUssRUFBRTtBQUNULElBQUksUUFBUSxFQUFFLENBQUM7QUFDZixJQUFJLE1BQU0sRUFBRSxFQUFFO0FBQ2QsSUFBSSxLQUFLLEVBQUUsRUFBRTtBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEtBQUssRUFBRSxHQUFHLEdBQUcsRUFBRTtBQUNuQixJQUFJLE9BQU8sRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDMUIsSUFBSSxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMvQixJQUFJLFlBQVksRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUMzQyxHQUFHO0FBQ0gsRUFBRSxRQUFRLEVBQUU7QUFDWixJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ2IsSUFBSSxLQUFLLEVBQUUsRUFBRTtBQUNiLElBQUksSUFBSSxFQUFFLEVBQUU7QUFDWixJQUFJLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRTtBQUNsQixJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekIsSUFBSSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM5QixJQUFJLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUMxQyxHQUFHO0FBQ0gsRUFBRSxNQUFNLEVBQUU7QUFDVixJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ1osSUFBSSxJQUFJLEVBQUUsRUFBRTtBQUNaLElBQUksS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQ2xCLElBQUksT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN6QixJQUFJLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzlCLElBQUksWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQzFDLEdBQUc7QUFDSCxDQUFDLEVBQUUsY0FBYyxDQUFDO0FBQ2xCLElBQUksa0JBQWtCLEdBQUcsUUFBUSxHQUFHLEdBQUc7QUFDdkMsSUFBSSxtQkFBbUIsR0FBRyxRQUFRLEdBQUcsSUFBSTtBQUN6QyxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ25DLEVBQUUsS0FBSyxFQUFFO0FBQ1QsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLElBQUksTUFBTSxFQUFFLEVBQUU7QUFDZCxJQUFJLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxDQUFDO0FBQ2pDLElBQUksSUFBSSxFQUFFLGtCQUFrQjtBQUM1QixJQUFJLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxFQUFFO0FBQ2xDLElBQUksT0FBTyxFQUFFLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3pDLElBQUksT0FBTyxFQUFFLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM5QyxJQUFJLFlBQVksRUFBRSxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQzFELEdBQUc7QUFDSCxFQUFFLFFBQVEsRUFBRTtBQUNaLElBQUksTUFBTSxFQUFFLENBQUM7QUFDYixJQUFJLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxFQUFFO0FBQ2xDLElBQUksSUFBSSxFQUFFLGtCQUFrQixHQUFHLENBQUM7QUFDaEMsSUFBSSxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDdEMsSUFBSSxPQUFPLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQzdDLElBQUksT0FBTyxFQUFFLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDbEQsSUFBSSxZQUFZLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDOUQsR0FBRztBQUNILEVBQUUsTUFBTSxFQUFFO0FBQ1YsSUFBSSxLQUFLLEVBQUUsbUJBQW1CLEdBQUcsQ0FBQztBQUNsQyxJQUFJLElBQUksRUFBRSxtQkFBbUI7QUFDN0IsSUFBSSxLQUFLLEVBQUUsbUJBQW1CLEdBQUcsRUFBRTtBQUNuQyxJQUFJLE9BQU8sRUFBRSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMxQyxJQUFJLE9BQU8sRUFBRSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDL0MsSUFBSSxZQUFZLEVBQUUsbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUMzRCxHQUFHO0FBQ0gsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ25CO0FBQ0EsSUFBSSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ25ILElBQUksWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDbkQ7QUFDQSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNqQyxFQUFFLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3hCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUc7QUFDYixJQUFJLE1BQU0sRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2xGLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDaEMsSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDLGtCQUFrQjtBQUN6RSxHQUFHLENBQUM7QUFDSixFQUFFLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDM0QsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJO0FBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUQ7QUFDQSxFQUFFLEtBQUssR0FBRyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUN6QixFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUN2QyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQ25ELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtBQUNyQyxNQUFNLElBQUksUUFBUSxFQUFFO0FBQ3BCLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxPQUFPO0FBQ1A7QUFDQSxNQUFNLE9BQU8sT0FBTyxDQUFDO0FBQ3JCLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxRQUFRLENBQUM7QUFDdEIsS0FBSztBQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsZ0JBQWdCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDNUIsSUFBSSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxRQUFRLENBQUMsVUFBVSxHQUFHLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDekQsSUFBSSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUM3QyxNQUFNLFlBQVksRUFBRSxLQUFLO0FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsUUFBUSxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUU7QUFDakQsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ2hELE1BQU0sTUFBTSxJQUFJLG9CQUFvQixDQUFDLDhEQUE4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1SSxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxRQUFRLENBQUM7QUFDeEIsTUFBTSxNQUFNLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU07QUFDckgsT0FBTyxDQUFDO0FBQ1IsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFDakMsTUFBTSxrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO0FBQ2hELEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDbEQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztBQUNsRCxRQUFRLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QztBQUNBLElBQUksSUFBSSxNQUFNLEVBQUU7QUFDaEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxNQUFNLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3RHLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDMUQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztBQUNsRCxRQUFRLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QztBQUNBLElBQUksSUFBSSxNQUFNLEVBQUU7QUFDaEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxNQUFNLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3RHLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUU7QUFDM0QsSUFBSSxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2pCLE1BQU0sTUFBTSxJQUFJLG9CQUFvQixDQUFDLGtEQUFrRCxDQUFDLENBQUM7QUFDekYsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE9BQU8sR0FBRyxNQUFNLFlBQVksT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDeEY7QUFDQSxJQUFJLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRTtBQUNqQyxNQUFNLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5QyxLQUFLLE1BQU07QUFDWCxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUM7QUFDMUIsUUFBUSxPQUFPLEVBQUUsT0FBTztBQUN4QixPQUFPLENBQUMsQ0FBQztBQUNULEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRTtBQUN4RCxJQUFJLElBQUksVUFBVSxHQUFHO0FBQ3JCLE1BQU0sSUFBSSxFQUFFLE9BQU87QUFDbkIsTUFBTSxLQUFLLEVBQUUsT0FBTztBQUNwQixNQUFNLE9BQU8sRUFBRSxVQUFVO0FBQ3pCLE1BQU0sUUFBUSxFQUFFLFVBQVU7QUFDMUIsTUFBTSxLQUFLLEVBQUUsUUFBUTtBQUNyQixNQUFNLE1BQU0sRUFBRSxRQUFRO0FBQ3RCLE1BQU0sSUFBSSxFQUFFLE9BQU87QUFDbkIsTUFBTSxLQUFLLEVBQUUsT0FBTztBQUNwQixNQUFNLEdBQUcsRUFBRSxNQUFNO0FBQ2pCLE1BQU0sSUFBSSxFQUFFLE1BQU07QUFDbEIsTUFBTSxJQUFJLEVBQUUsT0FBTztBQUNuQixNQUFNLEtBQUssRUFBRSxPQUFPO0FBQ3BCLE1BQU0sTUFBTSxFQUFFLFNBQVM7QUFDdkIsTUFBTSxPQUFPLEVBQUUsU0FBUztBQUN4QixNQUFNLE1BQU0sRUFBRSxTQUFTO0FBQ3ZCLE1BQU0sT0FBTyxFQUFFLFNBQVM7QUFDeEIsTUFBTSxXQUFXLEVBQUUsY0FBYztBQUNqQyxNQUFNLFlBQVksRUFBRSxjQUFjO0FBQ2xDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQsSUFBSSxPQUFPLFVBQVUsQ0FBQztBQUN0QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsUUFBUSxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUsQ0FBQyxDQUFDLEVBQUU7QUFDL0MsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQztBQUMzQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDakQsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUMxQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUs7QUFDekQsS0FBSyxDQUFDLENBQUM7QUFDUCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM1RyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQzVDLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDakMsSUFBSSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUM7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUM1QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFDeEQsTUFBTSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQ3RELE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUssR0FBRztBQUNsQztBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDbkMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUNoRCxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdGLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEQsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUM5QyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUMxRyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ2hELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDcEQsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQztBQUNyRDtBQUNBLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNyRSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzlDLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDbkMsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxPQUFPLElBQUksQ0FBQztBQUN0RCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3pCLE1BQU0sb0JBQW9CLEVBQUUsS0FBSztBQUNqQyxNQUFNLGVBQWUsRUFBRSxLQUFLO0FBQzVCLE1BQU0sYUFBYSxFQUFFLEtBQUs7QUFDMUIsTUFBTSxNQUFNLEVBQUUsVUFBVTtBQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDNUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3pEO0FBQ0EsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtBQUNsRixNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3BEO0FBQ0EsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFO0FBQ2xFLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQztBQUN0QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxHQUFHO0FBQ3BDLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsUUFBUSxHQUFHO0FBQ3hDLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsUUFBUSxHQUFHO0FBQ3hDLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ25DLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sR0FBRztBQUN0QyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzNCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ25DLElBQUksSUFBSSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0FBQ3hDLFFBQVEsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNwQjtBQUNBLElBQUksS0FBSyxJQUFJLFNBQVMsR0FBRywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUFJLEdBQUc7QUFDN0csTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzFCO0FBQ0EsTUFBTSxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzNFLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUU7QUFDdkIsTUFBTSxNQUFNLEVBQUUsTUFBTTtBQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQyxRQUFRLEVBQUU7QUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNuQyxJQUFJLElBQUksR0FBRyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNuQyxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNwQjtBQUNBLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzlGLE1BQU0sSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQ3ZCLE1BQU0sTUFBTSxFQUFFLE1BQU07QUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFO0FBQ2xDLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUU7QUFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNuQyxJQUFJLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRTtBQUN2QixNQUFNLE1BQU0sRUFBRSxLQUFLO0FBQ25CLEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQ25ELElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLO0FBQzVDLFFBQVEsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO0FBQzVCLFFBQVEsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlO0FBQzlDLFFBQVEsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0FBQ3JEO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUM3QixNQUFNLE1BQU0sRUFBRSxNQUFNO0FBQ3BCLE1BQU0sZUFBZSxFQUFFLGVBQWU7QUFDdEMsS0FBSyxDQUFDO0FBQ04sUUFBUSxJQUFJLEdBQUc7QUFDZixNQUFNLEdBQUcsRUFBRSxHQUFHO0FBQ2QsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLElBQUksa0JBQWtCLEVBQUU7QUFDNUIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7QUFDbkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFO0FBQ2hDLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3RCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsU0FBUyxHQUFHO0FBQzFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDbkMsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0IsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRTtBQUN2QixNQUFNLE1BQU0sRUFBRSxJQUFJO0FBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNiLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxHQUFHO0FBQ3RDLElBQUksS0FBSyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7QUFDOUYsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDbkM7QUFDQSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDNUIsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ25DLE1BQU0sT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ2xCLFFBQVEsV0FBVyxHQUFHLEVBQUU7QUFDeEIsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQy9CLElBQUksSUFBSSxRQUFRLENBQUM7QUFDakI7QUFDQSxJQUFJLEtBQUssSUFBSSxVQUFVLEdBQUcsK0JBQStCLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLEVBQUUsSUFBSSxHQUFHO0FBQ2pILE1BQU0sSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUMzQjtBQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNqQyxRQUFRLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDckIsUUFBUSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDcEI7QUFDQSxRQUFRLEtBQUssSUFBSSxFQUFFLElBQUksV0FBVyxFQUFFO0FBQ3BDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELFVBQVUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckIsUUFBUSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNqQztBQUNBO0FBQ0EsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUMvQixVQUFVLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3BFLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkQsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBLE9BQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNwQyxRQUFRLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFO0FBQ2pDLE1BQU0sSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2xDLFFBQVEsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9HLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRTtBQUN2QixNQUFNLE1BQU0sRUFBRSxLQUFLO0FBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN6QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU0sR0FBRztBQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7QUFDbkcsTUFBTSxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsTUFBTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQ3ZCLE1BQU0sTUFBTSxFQUFFLE9BQU87QUFDckIsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUN6QyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNyQyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN4QjtBQUNBLE1BQU0sSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUUsTUFBTSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLElBQUksVUFBVSxHQUFHLCtCQUErQixDQUFDLFlBQVksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLFVBQVUsRUFBRSxFQUFFLElBQUksR0FBRztBQUNqSCxNQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDM0I7QUFDQSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDaEQsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzFCLElBQUksR0FBRyxFQUFFLFFBQVE7QUFDakIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ25ELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxpQkFBaUI7QUFDMUIsSUFBSSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQzVELEtBQUs7QUFDTCxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxPQUFPO0FBQ2hCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDekQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxVQUFVO0FBQ25CLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ2pCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxPQUFPO0FBQ2hCLElB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Q0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDM0IsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxTQUFTLFFBQVEsR0FBRztBQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQ3hDLElBQUksT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEUsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUU7QUFDdEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUN4QyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxTQUFTLEdBQUc7QUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUN4QyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN6RCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzlDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDeEMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRTtBQUMxRCxJQUFJLElBQUksS0FBSyxHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTTtBQUMvQyxRQUFRLGVBQWUsR0FBRyxLQUFLLENBQUMsU0FBUztBQUN6QyxRQUFRLFNBQVMsR0FBRyxlQUFlLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLGVBQWUsQ0FBQztBQUN6RTtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDeEMsSUFBSSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUs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QUUsU0FBUyxHQUFHLEdBQUc7QUFDeEIsTUFBTSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQzlDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxTQUFTO0FBQ2xCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTCxJQUFJLEdBQUcsRUFBRSxPQUFPO0FBQ2hCLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUMvQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsS0FBSztBQUNkLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0wsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztB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QyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbk8sSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuTyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1SCxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1SCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDN0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxZQUFZO0FBQzVCLElBQUksSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDL0IsUUFBUSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsR0FBRzs7QUN2QkcsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUMzQyxJQUFJLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFB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S0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JELElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSSxD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R0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzlOLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkQsU0FBUyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM5RSxTQUFTLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELFNBQVMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUN2RCxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFELFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM3RCxTQUFTLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDNUIsYUFBYSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsT0FBTztBQUNyQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDcEQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0FBQzlELGlCQUFpQixV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QUksRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLEVBQUU7QUFDbkMsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3RFLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUMxRCxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsS0FBSztBQUNMLENBQUM7QUFDRCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBQ3BDLElBQUksSUFBSSxFQUFFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTtBQUNqQyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHVCQUF1QixDQUFDLENBQUM7QUFDcEUsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3pELFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixRQUFRQSxVQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTCxDQUFDO0FBQ0QsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDN0MsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQ3RELElBQUksSUFBSSxNQUFNLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3JFLElBQUksSUFBSSxVQUFV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Q0FBQyxDQUFDLENBQUMsQ0FBc0QsY0FBYyxDQUFDLENBQUMsR0FBa0gsQ0FBQyxDQUFDTyxjQUFJLEVBQUUsVUFBVSxDQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyw0RkFBNEYsQ0FBQyxDQUFDLENBQUMscUZBQXFGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMERBQTBELENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1RkFBdUYsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUNGLGNBQUksRUFBRSxVQUFVLENBQWMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxD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R0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDZCxJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNaLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRTtBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEVBQUU7QUFDWCxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEVBQUU7QUFDWCxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2QsSUFBSSxLQUFLLEVBQUUsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksS0FBSyxFQUFFLENBQUMsR0FBRztBQUNmLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksSUFBSSxFQUFFLENBQUM7QUFDWCxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNWLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxDQUFDLEdBQUc7QUFDZCxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxDQUFDLEdBQUc7QUFDZCxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxLQUFLLEVBQUUsR0FBRztBQUNkLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxDQUFDLEdBQUc7QUFDZCxJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEVBQUU7QUFDWCxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDZCxJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHO0FBQ2IsSUFBSSxLQUFLLEVBQUUsR0FBRztBQUNkLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxDQUFDLEdBQUc7QUFDZCxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLElBQUksRUFBRSxDQUFDLEdBQUc7QUFDZCxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNWLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRztBQUNkLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUc7QUFDYixJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2QsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsRUFBRTtBQUNYLElBQUksSUFBSSxFQUFFLEVBQUU7QUFDWixJQUFJLElBQUksRUFBRSxFQUFFO0FBQ1osSUFBSSxHQUFHLEVBQUUs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QUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqRSxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssV0FBVztBQUM1QixnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUVBLElBQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakUsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFFBQVEsQ0FBQztBQUMxQixZQUFZLEtBQUssU0FBUztBQUMxQixnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUMsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUVBLElBQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakUsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFlBQVk7QUFDN0IsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFQSxJQUFP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QUFZLEtBQUssWUFBWSxDQUFDO0FBQzlCLFlBQVksS0FBSyxPQUFPO0FBQ3hCLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFRSxJQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFQSxJQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxPQUFPO0FBQ3hCLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFQSxJQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxRQUFRO0FBQ3pCLGdCQUFnQixTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFF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YUFBQSxFQUFBLEVBQUE7RUFDQSxPQUFBLEVBQUEsRUFBQTtFQUNBLFFBQUEsRUFBQSxFQUFBOzs7S0FHQSxlQUFBLEdBQUEsRUFBQTtLQUNBLG1CQUFBLEdBQUEsRUFBQTtLQUNBLGFBQUEsR0FBQSxFQUFBO0tBQ0EsZ0JBQUEsR0FBQSxFQUFBO0tBQ0EsVUFBQSxHQUFBLEVBQUE7O0NBcUZBLE9BQUE7VUFDQSxZQUFBLEtBQUEsV0FBQTtRQUNBLFdBQUEsR0FBQSxJQUFBLENBQUEsV0FBQSxDQUNBLE9BQUEsQ0FBQSxZQUFBLEVBQUEsRUFBQSxFQUNBLE9BQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUNBLElBQUE7TUFFQSxRQUFBLEdBQUEsTUFBQTs7TUFDQSxJQUFBLENBQUEsUUFBQSxLQUFBLFFBQUEsQ0FBQSxHQUFBO0dBQ0EsUUFBQSxHQUFBLEtBQUE7YUFDQSxJQUFBLENBQUEsUUFBQSxLQUFBLFFBQUEsQ0FBQSxNQUFBO0dBQ0EsUUFBQSxHQUFBLFFBQUE7YUFDQSxJQUFBLENBQUEsUUFBQSxLQUFBLFFBQUEsQ0FBQSxJQUFBO0dBQ0EsUUFBQSxHQUFBLE1BQUE7OztrQkFHQSxZQUFBO0dBQ0EsV0FBQTtHQUNBLE1BQUEsRUFBQSxJQUFBLENBQUEsTUFBQTtHQUNBLFFBQUE7R0FDQSxjQUFBLEVBQUEsSUFBQSxDQUFBLFVBQUEsR0FBQSxJQUFBLENBQUEsVUFBQSxDQUFBLE1BQUEsS0FBQSxFQUFBO0dBQ0EsU0FBQSxFQUFBLElBQUEsQ0FBQSxTQUFBO0tBQ0EsSUFBQSxDQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsWUFBQTtLQUNBLEVBQUE7R0FDQSxhQUFBLEVBQUEsSUFBQSxDQUFBLGFBQUE7S0FDQSxJQUFBLENBQUEsYUFBQSxDQUFBLE1BQUEsQ0FBQSxZQUFBO0tBQ0EsRUFBQTtHQUNBLE9BQUEsRUFBQSxJQUFBLENBQUEsT0FBQSxHQUFBLElBQUEsQ0FBQSxPQUFBLENBQUEsTUFBQSxDQUFBLFlBQUEsSUFBQSxFQUFBO0dBQ0EsUUFBQSxFQUFBLElBQUEsQ0FBQSxRQUFBLEdBQUEsSUFBQSxDQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsWUFBQSxJQUFBLEVBQUE7OztFQUVBLFVBQUE7O0lBQ0EsZ0JBQUEsQ0FBQSxLQUFBOztHQUNBLEVBQUE7Ozs7T0FHQSxTQUFBO1VBQ0EsWUFBQSxLQUFBLFdBQUE7TUFDQSxXQUFBLEdBQUEsWUFBQSxDQUFBLFdBQUEsQ0FBQSxJQUFBOztPQUNBLFdBQUEsQ0FBQSxRQUFBLENBQUEsWUFBQTtHQUNBLFdBQUEsR0FBQSxZQUFBLEdBQUEsR0FBQSxHQUFBLFdBQUE7OztNQUdBLFNBQUEsR0FBQSxJQUFBO1FBQ0EsZUFBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsTUFBQSxJQUFBLE1BQUEsV0FBQSxFQUFBLElBQUE7O01BS0EsZUFBQSxLQUFBLElBQUE7R0FDQSxTQUFBLEdBQUEsTUFBQSxDQUFBLE1BQUEsQ0FBQSxlQUFBOzs7TUFHQSxhQUFBLEdBQUEsSUFBQTtRQUNBLG1CQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxZQUFBLENBQUEsYUFBQSxNQUFBLElBQUEsTUFBQSxXQUFBLEVBQUEsSUFBQTs7TUFLQSxtQkFBQSxLQUFBLElBQUE7R0FDQSxhQUFBLEdBQUEsTUFBQSxDQUFBLE1BQUEsQ0FBQSxtQkFBQTs7O01BR0EsT0FBQSxHQUFBLElBQUE7UUFDQSxhQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxZQUFBLENBQUEsT0FBQSxNQUFBLElBQUEsTUFBQSxXQUFBLEVBQUEsSUFBQTs7TUFLQSxhQUFBLEtBQUEsSUFBQTtHQUNBLE9BQUEsR0FBQSxNQUFBLENBQUEsTUFBQSxDQUFBLGFBQUE7OztNQUdBLFVBQUEsR0FBQSxJQUFBOztNQUNBLFlBQUEsQ0FBQSxjQUFBO0dBQ0EsVUFBQSxHQUFBLFVBQUEsQ0FBQSxRQUFBO0lBQ0Esa0JBQUEsRUFBQSxZQUFBLENBQUEsY0FBQTtJQUNBLFNBQUE7SUFDQSxhQUFBO0lBQ0EsT0FBQTs7OztNQUlBLGNBQUE7O1VBQ0EsWUFBQSxDQUFBLFFBQUE7UUFDQSxL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 +// src/Query.ts +var import_chrono_node2 = __toModule(require_dist()); +var Query = class { + constructor({ source }) { + this._limit = void 0; + this._layoutOptions = new LayoutOptions(); + this._filters = []; + this._error = void 0; + this._sorting = []; + this.priorityRegexp = /^priority (is )?(above|below)? ?(low|none|medium|high)/; + this.happensRegexp = /^happens (before|after|on)? ?(.*)/; + this.noStartString = "no start date"; + this.startRegexp = /^starts (before|after|on)? ?(.*)/; + this.noScheduledString = "no scheduled date"; + this.scheduledRegexp = /^scheduled (before|after|on)? ?(.*)/; + this.noDueString = "no due date"; + this.dueRegexp = /^due (before|after|on)? ?(.*)/; + this.doneString = "done"; + this.notDoneString = "not done"; + this.doneRegexp = /^done (before|after|on)? ?(.*)/; + this.pathRegexp = /^path (includes|does not include) (.*)/; + this.descriptionRegexp = /^description (includes|does not include) (.*)/; + this.sortByRegexp = /^sort by (urgency|status|priority|start|scheduled|due|done|path|description)( reverse)?/; + this.headingRegexp = /^heading (includes|does not include) (.*)/; + this.hideOptionsRegexp = /^hide (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button)/; + this.shortModeRegexp = /^short/; + this.recurringString = "is recurring"; + this.notRecurringString = "is not recurring"; + this.limitRegexp = /^limit (to )?(\d+)( tasks?)?/; + this.excludeSubItemsString = "exclude sub-items"; + this.commentRegexp = /^#.*/; + source.split("\n").map((line) => line.trim()).forEach((line) => { + switch (true) { + case line === "": + break; + case line === this.doneString: + this._filters.push((task) => task.status === Status.Done); + break; + case line === this.notDoneString: + this._filters.push((task) => task.status !== Status.Done); + break; + case line === this.recurringString: + this._filters.push((task) => task.recurrence !== null); + break; + case line === this.notRecurringString: + this._filters.push((task) => task.recurrence === null); + break; + case line === this.excludeSubItemsString: + this._filters.push((task) => task.indentation === ""); + break; + case line === this.noStartString: + this._filters.push((task) => task.startDate === null); + break; + case line === this.noScheduledString: + this._filters.push((task) => task.scheduledDate === null); + break; + case line === this.noDueString: + this._filters.push((task) => task.dueDate === null); + break; + case this.shortModeRegexp.test(line): + this._layoutOptions.shortMode = true; + break; + case this.priorityRegexp.test(line): + this.parsePriorityFilter({ line }); + break; + case this.happensRegexp.test(line): + this.parseHappensFilter({ line }); + break; + case this.startRegexp.test(line): + this.parseStartFilter({ line }); + break; + case this.scheduledRegexp.test(line): + this.parseScheduledFilter({ line }); + break; + case this.dueRegexp.test(line): + this.parseDueFilter({ line }); + break; + case this.doneRegexp.test(line): + this.parseDoneFilter({ line }); + break; + case this.pathRegexp.test(line): + this.parsePathFilter({ line }); + break; + case this.descriptionRegexp.test(line): + this.parseDescriptionFilter({ line }); + break; + case this.headingRegexp.test(line): + this.parseHeadingFilter({ line }); + break; + case this.limitRegexp.test(line): + this.parseLimit({ line }); + break; + case this.sortByRegexp.test(line): + this.parseSortBy({ line }); + break; + case this.hideOptionsRegexp.test(line): + this.parseHideOptions({ line }); + break; + case this.commentRegexp.test(line): + break; + default: + this._error = "do not understand query"; + } + }); + } + get limit() { + return this._limit; + } + get layoutOptions() { + return this._layoutOptions; + } + get filters() { + return this._filters; + } + get sorting() { + return this._sorting; + } + get error() { + return this._error; + } + parseHideOptions({ line }) { + const hideOptionsMatch = line.match(this.hideOptionsRegexp); + if (hideOptionsMatch !== null) { + const option = hideOptionsMatch[1].trim().toLowerCase(); + switch (option) { + case "task count": + this._layoutOptions.hideTaskCount = true; + break; + case "backlink": + this._layoutOptions.hideBacklinks = true; + break; + case "priority": + this._layoutOptions.hidePriority = true; + break; + case "start date": + this._layoutOptions.hideStartDate = true; + break; + case "scheduled date": + this._layoutOptions.hideScheduledDate = true; + break; + case "due date": + this._layoutOptions.hideDueDate = true; + break; + case "done date": + this._layoutOptions.hideDoneDate = true; + break; + case "recurrence rule": + this._layoutOptions.hideRecurrenceRule = true; + break; + case "edit button": + this._layoutOptions.hideEditButton = true; + break; + default: + this._error = "do not understand hide option"; + } + } + } + parsePriorityFilter({ line }) { + const priorityMatch = line.match(this.priorityRegexp); + if (priorityMatch !== null) { + const filterPriorityString = priorityMatch[3]; + let filterPriority = null; + switch (filterPriorityString) { + case "low": + filterPriority = Priority.Low; + break; + case "none": + filterPriority = Priority.None; + break; + case "medium": + filterPriority = Priority.Medium; + break; + case "high": + filterPriority = Priority.High; + break; + } + if (filterPriority === null) { + this._error = "do not understand priority"; + return; + } + let filter; + if (priorityMatch[2] === "above") { + filter = (task) => task.priority ? task.priority.localeCompare(filterPriority) < 0 : false; + } else if (priorityMatch[2] === "below") { + filter = (task) => task.priority ? task.priority.localeCompare(filterPriority) > 0 : false; + } else { + filter = (task) => task.priority ? task.priority === filterPriority : false; + } + this._filters.push(filter); + } else { + this._error = "do not understand query filter (priority date)"; + } + } + parseHappensFilter({ line }) { + const happensMatch = line.match(this.happensRegexp); + if (happensMatch !== null) { + const filterDate = this.parseDate(happensMatch[2]); + if (!filterDate.isValid()) { + this._error = "do not understand happens date"; + return; + } + let filter; + if (happensMatch[1] === "before") { + filter = (task) => { + return Array.of(task.startDate, task.scheduledDate, task.dueDate).some((date) => date && date.isBefore(filterDate)); + }; + } else if (happensMatch[1] === "after") { + filter = (task) => { + return Array.of(task.startDate, task.scheduledDate, task.dueDate).some((date) => date && date.isAfter(filterDate)); + }; + } else { + filter = (task) => { + return Array.of(task.startDate, task.scheduledDate, task.dueDate).some((date) => date && date.isSame(filterDate)); + }; + } + this._filters.push(filter); + } else { + this._error = "do not understand query filter (happens date)"; + } + } + parseStartFilter({ line }) { + const startMatch = line.match(this.startRegexp); + if (startMatch !== null) { + const filterDate = this.parseDate(startMatch[2]); + if (!filterDate.isValid()) { + this._error = "do not understand start date"; + return; + } + let filter; + if (startMatch[1] === "before") { + filter = (task) => task.startDate ? task.startDate.isBefore(filterDate) : true; + } else if (startMatch[1] === "after") { + filter = (task) => task.startDate ? task.startDate.isAfter(filterDate) : true; + } else { + filter = (task) => task.startDate ? task.startDate.isSame(filterDate) : true; + } + this._filters.push(filter); + } else { + this._error = "do not understand query filter (start date)"; + } + } + parseScheduledFilter({ line }) { + const scheduledMatch = line.match(this.scheduledRegexp); + if (scheduledMatch !== null) { + const filterDate = this.parseDate(scheduledMatch[2]); + if (!filterDate.isValid()) { + this._error = "do not understand scheduled date"; + } + let filter; + if (scheduledMatch[1] === "before") { + filter = (task) => task.scheduledDate ? task.scheduledDate.isBefore(filterDate) : false; + } else if (scheduledMatch[1] === "after") { + filter = (task) => task.scheduledDate ? task.scheduledDate.isAfter(filterDate) : false; + } else { + filter = (task) => task.scheduledDate ? task.scheduledDate.isSame(filterDate) : false; + } + this._filters.push(filter); + } else { + this._error = "do not understand query filter (scheduled date)"; + } + } + parseDueFilter({ line }) { + const dueMatch = line.match(this.dueRegexp); + if (dueMatch !== null) { + const filterDate = this.parseDate(dueMatch[2]); + if (!filterDate.isValid()) { + this._error = "do not understand due date"; + return; + } + let filter; + if (dueMatch[1] === "before") { + filter = (task) => task.dueDate ? task.dueDate.isBefore(filterDate) : false; + } else if (dueMatch[1] === "after") { + filter = (task) => task.dueDate ? task.dueDate.isAfter(filterDate) : false; + } else { + filter = (task) => task.dueDate ? task.dueDate.isSame(filterDate) : false; + } + this._filters.push(filter); + } else { + this._error = "do not understand query filter (due date)"; + } + } + parseDoneFilter({ line }) { + const doneMatch = line.match(this.doneRegexp); + if (doneMatch !== null) { + const filterDate = this.parseDate(doneMatch[2]); + if (!filterDate.isValid()) { + this._error = "do not understand done date"; + return; + } + let filter; + if (doneMatch[1] === "before") { + filter = (task) => task.doneDate ? task.doneDate.isBefore(filterDate) : false; + } else if (doneMatch[1] === "after") { + filter = (task) => task.doneDate ? task.doneDate.isAfter(filterDate) : false; + } else { + filter = (task) => task.doneDate ? task.doneDate.isSame(filterDate) : false; + } + this._filters.push(filter); + } + } + parsePathFilter({ line }) { + const pathMatch = line.match(this.pathRegexp); + if (pathMatch !== null) { + const filterMethod = pathMatch[1]; + if (filterMethod === "includes") { + this._filters.push((task) => this.stringIncludesCaseInsensitive(task.path, pathMatch[2])); + } else if (pathMatch[1] === "does not include") { + this._filters.push((task) => !this.stringIncludesCaseInsensitive(task.path, pathMatch[2])); + } else { + this._error = "do not understand query filter (path)"; + } + } else { + this._error = "do not understand query filter (path)"; + } + } + parseDescriptionFilter({ line }) { + const descriptionMatch = line.match(this.descriptionRegexp); + if (descriptionMatch !== null) { + const filterMethod = descriptionMatch[1]; + const globalFilter = getSettings().globalFilter; + if (filterMethod === "includes") { + this._filters.push((task) => this.stringIncludesCaseInsensitive(task.description.replace(globalFilter, "").trim(), descriptionMatch[2])); + } else if (descriptionMatch[1] === "does not include") { + this._filters.push((task) => !this.stringIncludesCaseInsensitive(task.description.replace(globalFilter, "").trim(), descriptionMatch[2])); + } else { + this._error = "do not understand query filter (description)"; + } + } else { + this._error = "do not understand query filter (description)"; + } + } + parseHeadingFilter({ line }) { + const headingMatch = line.match(this.headingRegexp); + if (headingMatch !== null) { + const filterMethod = headingMatch[1].toLowerCase(); + if (filterMethod === "includes") { + this._filters.push((task) => task.precedingHeader !== null && this.stringIncludesCaseInsensitive(task.precedingHeader, headingMatch[2])); + } else if (headingMatch[1] === "does not include") { + this._filters.push((task) => task.precedingHeader === null || !this.stringIncludesCaseInsensitive(task.precedingHeader, headingMatch[2])); + } else { + this._error = "do not understand query filter (heading)"; + } + } else { + this._error = "do not understand query filter (heading)"; + } + } + parseLimit({ line }) { + const limitMatch = line.match(this.limitRegexp); + if (limitMatch !== null) { + const limit = Number.parseInt(limitMatch[2], 10); + this._limit = limit; + } else { + this._error = "do not understand query limit"; + } + } + parseSortBy({ line }) { + const fieldMatch = line.match(this.sortByRegexp); + if (fieldMatch !== null) { + this._sorting.push({ + property: fieldMatch[1], + reverse: !!fieldMatch[2] + }); + } else { + this._error = "do not understand query sorting"; + } + } + parseDate(input) { + return window.moment(import_chrono_node2.default.parseDate(input)).startOf("day"); + } + stringIncludesCaseInsensitive(haystack, needle) { + return haystack.toLocaleLowerCase().includes(needle.toLocaleLowerCase()); + } +}; + +// src/Sort.ts +var _Sort = class { + static by(query, tasks2) { + const defaultComparators = [ + _Sort.compareByUrgency, + _Sort.compareByStatus, + _Sort.compareByDueDate, + _Sort.compareByPriority, + _Sort.compareByPath + ]; + const userComparators = []; + for (const { property, reverse } of query.sorting) { + const comparator = _Sort.comparators[property]; + userComparators.push(reverse ? _Sort.makeReversedComparator(comparator) : comparator); + } + return tasks2.sort(_Sort.makeCompositeComparator([ + ...userComparators, + ...defaultComparators + ])); + } + static makeReversedComparator(comparator) { + return (a, b) => comparator(a, b) * -1; + } + static makeCompositeComparator(comparators) { + return (a, b) => { + for (const comparator of comparators) { + const result = comparator(a, b); + if (result !== 0) { + return result; + } + } + return 0; + }; + } + static compareByUrgency(a, b) { + return b.urgency - a.urgency; + } + static compareByStatus(a, b) { + if (a.status < b.status) { + return 1; + } else if (a.status > b.status) { + return -1; + } else { + return 0; + } + } + static compareByPriority(a, b) { + return a.priority.localeCompare(b.priority); + } + static compareByStartDate(a, b) { + return _Sort.compareByDate(a.startDate, b.startDate); + } + static compareByScheduledDate(a, b) { + return _Sort.compareByDate(a.scheduledDate, b.scheduledDate); + } + static compareByDueDate(a, b) { + return _Sort.compareByDate(a.dueDate, b.dueDate); + } + static compareByDoneDate(a, b) { + return _Sort.compareByDate(a.doneDate, b.doneDate); + } + static compareByDate(a, b) { + if (a !== null && b === null) { + return -1; + } else if (a === null && b !== null) { + return 1; + } else if (a !== null && b !== null) { + if (a.isAfter(b)) { + return 1; + } else if (a.isBefore(b)) { + return -1; + } else { + return 0; + } + } else { + return 0; + } + } + static compareByPath(a, b) { + if (a.path < b.path) { + return -1; + } else if (a.path > b.path) { + return 1; + } else { + return 0; + } + } + static compareByDescription(a, b) { + return _Sort.cleanDescription(a.description).localeCompare(_Sort.cleanDescription(b.description)); + } + static cleanDescription(description) { + const globalFilter = getSettings().globalFilter; + description = description.replace(globalFilter, "").trim(); + const startsWithLinkRegex = /^\[\[?([^\]]*)\]/; + const linkRegexMatch = description.match(startsWithLinkRegex); + if (linkRegexMatch !== null) { + const innerLinkText = linkRegexMatch[1]; + description = innerLinkText.substring(innerLinkText.indexOf("|") + 1) + description.replace(startsWithLinkRegex, ""); + } + const startsWithItalicOrBoldRegex = /^\*\*?([^*]*)\*/; + const italicBoldRegexMatch = description.match(startsWithItalicOrBoldRegex); + if (italicBoldRegexMatch !== null) { + const innerItalicBoldText = italicBoldRegexMatch[1]; + description = innerItalicBoldText + description.replace(startsWithLinkRegex, ""); + } + const startsWithHighlightRegex = /^==?([^=]*)==/; + const highlightRegexMatch = description.match(startsWithHighlightRegex); + if (highlightRegexMatch !== null) { + const innerHighlightsText = highlightRegexMatch[1]; + description = innerHighlightsText + description.replace(startsWithHighlightRegex, ""); + } + return description; + } +}; +var Sort = _Sort; +Sort.comparators = { + urgency: _Sort.compareByUrgency, + description: _Sort.compareByDescription, + priority: _Sort.compareByPriority, + start: _Sort.compareByStartDate, + scheduled: _Sort.compareByScheduledDate, + due: _Sort.compareByDueDate, + done: _Sort.compareByDoneDate, + path: _Sort.compareByPath, + status: _Sort.compareByStatus +}; + +// src/QueryRenderer.ts +var QueryRenderer = class { + constructor({ plugin, events }) { + this.addQueryRenderChild = this._addQueryRenderChild.bind(this); + this.app = plugin.app; + this.events = events; + plugin.registerMarkdownCodeBlockProcessor("tasks", this._addQueryRenderChild.bind(this)); + } + _addQueryRenderChild(source, element2, context) { + return __async(this, null, function* () { + context.addChild(new QueryRenderChild({ + app: this.app, + events: this.events, + container: element2, + source + })); + }); + } +}; +var QueryRenderChild = class extends import_obsidian7.MarkdownRenderChild { + constructor({ + app, + events, + container, + source + }) { + super(container); + this.app = app; + this.events = events; + this.source = source; + this.query = new Query({ source }); + } + onload() { + this.events.triggerRequestCacheUpdate(this.render.bind(this)); + this.renderEventRef = this.events.onCacheUpdate(this.render.bind(this)); + this.reloadQueryAtMidnight(); + } + onunload() { + if (this.renderEventRef !== void 0) { + this.events.off(this.renderEventRef); + } + if (this.queryReloadTimeout !== void 0) { + clearTimeout(this.queryReloadTimeout); + } + } + reloadQueryAtMidnight() { + const midnight = new Date(); + midnight.setHours(24, 0, 0, 0); + const now = new Date(); + const millisecondsToMidnight = midnight.getTime() - now.getTime(); + this.queryReloadTimeout = setTimeout(() => { + this.query = new Query({ source: this.source }); + this.events.triggerRequestCacheUpdate(this.render.bind(this)); + this.reloadQueryAtMidnight(); + }, millisecondsToMidnight + 1e3); + } + render(_0) { + return __async(this, arguments, function* ({ tasks: tasks2, state }) { + var _a; + const content = this.containerEl.createEl("div"); + if (state === State.Warm && this.query.error === void 0) { + const tasksSortedLimited = this.applyQueryToTasks(tasks2); + const { taskList, tasksCount } = yield this.createTasksList({ + tasks: tasksSortedLimited, + content + }); + content.appendChild(taskList); + this.addTaskCount(content, tasksCount); + } else if (this.query.error !== void 0) { + content.setText(`Tasks query: ${this.query.error}`); + } else { + content.setText("Loading Tasks ..."); + } + (_a = this.containerEl.firstChild) == null ? void 0 : _a.replaceWith(content); + }); + } + createTasksList(_0) { + return __async(this, arguments, function* ({ + tasks: tasks2, + content + }) { + const tasksCount = tasks2.length; + const taskList = content.createEl("ul"); + taskList.addClasses([ + "contains-task-list", + "plugin-tasks-query-result" + ]); + for (let i = 0; i < tasksCount; i++) { + const task = tasks2[i]; + const isFilenameUnique = this.isFilenameUnique({ task }); + const listItem = yield task.toLi({ + parentUlElement: taskList, + listIndex: i, + layoutOptions: this.query.layoutOptions, + isFilenameUnique + }); + const footnotes = listItem.querySelectorAll("[data-footnote-id]"); + footnotes.forEach((footnote) => footnote.remove()); + const postInfo = listItem.createSpan(); + const shortMode = this.query.layoutOptions.shortMode; + if (!this.query.layoutOptions.hideBacklinks) { + this.addBacklinks(postInfo, task, shortMode, isFilenameUnique); + } + if (!this.query.layoutOptions.hideEditButton) { + this.addEditButton(postInfo, task); + } + taskList.appendChild(listItem); + } + return { taskList, tasksCount }; + }); + } + applyQueryToTasks(tasks2) { + this.query.filters.forEach((filter) => { + tasks2 = tasks2.filter(filter); + }); + return Sort.by(this.query, tasks2).slice(0, this.query.limit); + } + addEditButton(postInfo, task) { + const editTaskPencil = postInfo.createEl("a", { + cls: "tasks-edit" + }); + editTaskPencil.onClickEvent((event) => { + event.preventDefault(); + const onSubmit = (updatedTasks) => { + replaceTaskWithTasks({ + originalTask: task, + newTasks: updatedTasks + }); + }; + const taskModal = new TaskModal({ + app: this.app, + task, + onSubmit + }); + taskModal.open(); + }); + } + addBacklinks(postInfo, task, shortMode, isFilenameUnique) { + var _a; + postInfo.addClass("tasks-backlink"); + if (!shortMode) { + postInfo.append(" ("); + } + const link = postInfo.createEl("a"); + link.href = task.path; + link.setAttribute("data-href", task.path); + link.rel = "noopener"; + link.target = "_blank"; + link.addClass("internal-link"); + if (shortMode) { + link.addClass("internal-link-short-mode"); + } + if (task.precedingHeader !== null) { + link.href = link.href + "#" + task.precedingHeader; + link.setAttribute("data-href", link.getAttribute("data-href") + "#" + task.precedingHeader); + } + let linkText; + if (shortMode) { + linkText = " \u{1F517}"; + } else { + linkText = (_a = task.getLinkText({ isFilenameUnique })) != null ? _a : ""; + } + link.setText(linkText); + if (!shortMode) { + postInfo.append(")"); + } + } + addTaskCount(content, tasksCount) { + if (!this.query.layoutOptions.hideTaskCount) { + content.createDiv({ + text: `${tasksCount} task${tasksCount !== 1 ? "s" : ""}`, + cls: "tasks-count" + }); + } + } + isFilenameUnique({ task }) { + const filenameMatch = task.path.match(/([^/]*)\..+$/i); + if (filenameMatch === null) { + return void 0; + } + const filename = filenameMatch[1]; + const allFilesWithSameName = this.app.vault.getMarkdownFiles().filter((file) => { + if (file.basename === filename) { + return true; + } + }); + return allFilesWithSameName.length < 2; + } +}; + +// src/SettingsTab.ts +var import_obsidian8 = __toModule(require("obsidian")); +var SettingsTab = class extends import_obsidian8.PluginSettingTab { + constructor({ plugin }) { + super(plugin.app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Tasks Settings" }); + containerEl.createEl("p", { + cls: "tasks-setting-important", + text: "Changing any settings requires a restart of obsidian." + }); + new import_obsidian8.Setting(containerEl).setName("Global task filter").setDesc("The global filter will be applied to all checklist items.").addText((text2) => { + const settings2 = getSettings(); + text2.setPlaceholder("#task").setValue(settings2.globalFilter).onChange((value) => __async(this, null, function* () { + updateSettings({ globalFilter: value }); + yield this.plugin.saveSettings(); + })); + }); + containerEl.createEl("div", { + cls: "setting-item-description", + text: 'The global filter will be applied to all checklist items to filter out "non-task" checklist items.\nA checklist item must include the specified string in its description in order to be considered a task.\nFor example, if you set the global filter to `#task`, the Tasks plugin will only handle checklist items tagged with `#task`.\nOther checklist items will remain normal checklist items and not appear in queries or get a done date set.\nLeave empty if you want all checklist items from your vault to be tasks managed by this plugin.' + }); + new import_obsidian8.Setting(containerEl).setName("Remove global filter from description").setDesc("Enabling this removes the string that you set as global filter from the task description when displaying a task.").addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.removeGlobalFilter).onChange((value) => __async(this, null, function* () { + updateSettings({ removeGlobalFilter: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian8.Setting(containerEl).setName("Set done date on every completed task").setDesc("Enabling this will add a timestamp \u2705 YYYY-MM-DD at the end when a task is toggled to done").addToggle((toogle) => { + const settings2 = getSettings(); + toogle.setValue(settings2.setDoneDate).onChange((value) => __async(this, null, function* () { + updateSettings({ setDoneDate: value }); + yield this.plugin.saveSettings(); + })); + }); + } +}; + +// src/main.ts +var TasksPlugin = class extends import_obsidian9.Plugin { + onload() { + return __async(this, null, function* () { + console.log('loading plugin "tasks"'); + yield this.loadSettings(); + this.addSettingTab(new SettingsTab({ plugin: this })); + initializeFile({ + metadataCache: this.app.metadataCache, + vault: this.app.vault + }); + const events = new Events({ obsidianEents: this.app.workspace }); + this.cache = new Cache2({ + metadataCache: this.app.metadataCache, + vault: this.app.vault, + events + }); + this.inlineRenderer = new InlineRenderer({ plugin: this }); + this.queryRenderer = new QueryRenderer({ plugin: this, events }); + this.registerEditorExtension(newLivePreviewExtension()); + new Commands({ plugin: this }); + }); + } + onunload() { + var _a; + console.log('unloading plugin "tasks"'); + (_a = this.cache) == null ? void 0 : _a.unload(); + } + loadSettings() { + return __async(this, null, function* () { + const newSettings = yield this.loadData(); + updateSettings(newSettings); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(getSettings()); + }); + } +}; +/*! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jakubroztocil/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + * Based on: + * python-dateutil - Extensions to the standard Python datetime module. + * Copyright (c) 2003-2011 - Gustavo Niemeyer + * Copyright (c) 2012 - Tomi Pieviläinen + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + */ +/*! +* rrule.js - Library for working with recurrence rules for calendar dates. +* https://github.com/jakubroztocil/rrule +* +* Copyright 2010, Jakub Roztocil and Lars Schoning +* Licenced under the BSD licence. +* https://github.com/jakubroztocil/rrule/blob/master/LICENCE +* +*/ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ diff --git a/.obsidian/plugins/obsidian-tasks-plugin/manifest.json b/.obsidian/plugins/obsidian-tasks-plugin/manifest.json index 59e01b4..1405981 100644 --- a/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +++ b/.obsidian/plugins/obsidian-tasks-plugin/manifest.json @@ -1,8 +1,8 @@ { "id": "obsidian-tasks-plugin", "name": "Tasks", - "version": "1.4.1", - "minAppVersion": "0.12.17", + "version": "1.5.0", + "minAppVersion": "0.13.21", "description": "Task management for Obsidian", "author": "Martin Schenck", "authorUrl": "https://github.com/schemar", diff --git a/.obsidian/plugins/obsidian-tasks-plugin/styles.css b/.obsidian/plugins/obsidian-tasks-plugin/styles.css index 4bbcbff..8de91f3 100644 --- a/.obsidian/plugins/obsidian-tasks-plugin/styles.css +++ b/.obsidian/plugins/obsidian-tasks-plugin/styles.css @@ -16,6 +16,10 @@ cursor: pointer; } +.internal-link.internal-link-short-mode { + text-decoration: none; +} + .tasks-list-text { position: relative; } diff --git a/.obsidian/plugins/templater-obsidian/main.js b/.obsidian/plugins/templater-obsidian/main.js index de1968c..545e445 100644 --- a/.obsidian/plugins/templater-obsidian/main.js +++ b/.obsidian/plugins/templater-obsidian/main.js @@ -78,7 +78,7 @@ var import_obsidian = __toModule(require("obsidian")); function log_error(e) { const notice = new import_obsidian.Notice("", 8e3); if (e instanceof TemplaterError && e.console_msg) { - notice.noticeEl.innerHTML = `Templater Error:
${e.message}
Check console for more informations`; + notice.noticeEl.innerHTML = `Templater Error:
${e.message}
Check console for more information`; console.error(`Templater Error:`, e.message, "\n", e.console_msg); } else { notice.noticeEl.innerHTML = `Templater Error:
${e.message}`; @@ -371,6 +371,9 @@ function getContainingBlock(element) { } } var currentNode = getParentNode(element); + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { var css = getComputedStyle(currentNode); if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { @@ -553,13 +556,13 @@ function mapToStyles(_ref2) { offsetParent = offsetParent; if (placement === top || (placement === left || placement === right) && variation === end) { sideY = bottom; - var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; y -= offsetY - popperRect.height; y *= gpuAcceleration ? 1 : -1; } if (placement === left || (placement === top || placement === bottom) && variation === end) { sideX = right; - var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; x -= offsetX - popperRect.width; x *= gpuAcceleration ? 1 : -1; } @@ -2195,7 +2198,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab { desc.append("All JavaScript files in this folder will be loaded as CommonJS modules, to import custom user functions.", desc.createEl("br"), "The folder needs to be accessible from the vault.", desc.createEl("br"), "Check the ", desc.createEl("a", { href: "https://silentvoid13.github.io/Templater/", text: "documentation" - }), " for more informations."); + }), " for more information."); new import_obsidian6.Setting(this.containerEl).setName("Script files folder location").setDesc(desc).addSearch((cb) => { new FolderSuggest(this.app, cb.inputEl); cb.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.user_scripts_folder).onChange((new_folder) => { @@ -2786,12 +2789,13 @@ var PromptModal = class extends import_obsidian9.Modal { // src/core/functions/internal_functions/system/SuggesterModal.ts var import_obsidian10 = __toModule(require("obsidian")); var SuggesterModal = class extends import_obsidian10.FuzzySuggestModal { - constructor(app, text_items, items, placeholder) { + constructor(app, text_items, items, placeholder, limit) { super(app); this.text_items = text_items; this.items = items; this.submitted = false; this.setPlaceholder(placeholder); + this.limit = limit; } getItems() { return this.items; @@ -2864,8 +2868,8 @@ var InternalModuleSystem = class extends InternalModule { }); } generate_suggester() { - return (text_items, items, throw_on_cancel = false, placeholder = "") => __async(this, null, function* () { - const suggester = new SuggesterModal(this.app, text_items, items, placeholder); + return (text_items, items, throw_on_cancel = false, placeholder = "", limit) => __async(this, null, function* () { + const suggester = new SuggesterModal(this.app, text_items, items, placeholder, limit); const promise = new Promise((resolve2, reject) => suggester.openAndGetValue(resolve2, reject)); try { return yield promise; @@ -3788,6 +3792,10 @@ var Templater = class { return; } yield this.app.vault.modify(file, output_content); + this.app.workspace.trigger("templater:new-note-from-template", { + file, + content: output_content + }); yield this.plugin.editor_handler.jump_to_next_cursor_location(file, true); }); } @@ -3809,6 +3817,10 @@ var Templater = class { return; } yield this.app.vault.modify(file, output_content); + this.app.workspace.trigger("templater:overwrite-file", { + file, + content: output_content + }); yield this.plugin.editor_handler.jump_to_next_cursor_location(file, true); }); } @@ -4143,7 +4155,7 @@ var CursorJumper = class { var import_obsidian17 = __toModule(require("obsidian")); // toml:/home/runner/work/Templater/Templater/docs/documentation.toml -var tp = { config: { name: "config", description: "This module exposes Templater's running configuration.\n\nThis is mostly useful when writing scripts requiring some context informations.\n", functions: { template_file: { name: "template_file", description: "The `TFile` object representing the template file.", definition: "tp.file.template_file" }, target_file: { name: "target_file", description: "The `TFile` object representing the target file where the template will be inserted.", definition: "tp.config.target_file" }, run_mode: { name: "run_mode", description: "The `RunMode`, representing the way Templater was launched (Create new from template, Append to active file, ...)", definition: "tp.config.run_mode" }, active_file: { name: "active_file", description: "The active file (if existing) when launching Templater.", definition: "tp.config.active_file?" } } }, date: { name: "date", description: "This module contains every internal function related to dates.", functions: { now: { name: "now", description: "Retrieves the date.", definition: 'tp.date.now(format: string = "YYYY-MM-DD", offset?: number\u23AEstring, reference?: string, reference_format?: string)', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" }, offset: { name: "offset", description: "Offset for the day, e.g. set this to `-7` to get last week's date. You can also specify the offset as a string using the ISO 8601 format" }, reference: { name: "reference", description: "The date referential, e.g. set this to the note's title" }, reference_format: { name: "reference_format", description: "The date reference format." } } }, tomorrow: { name: "tomorrow", description: "Retrieves tomorrow's date.", definition: 'tp.date.tomorrow(format: string = "YYYY-MM-DD")', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } } }, yesterday: { name: "yesterday", description: "Retrieves yesterday's date.", definition: 'tp.date.yesterday(format: string = "YYYY-MM-DD")', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } } }, weekday: { name: "weekday", description: "", definition: 'tp.date.weekday(format: string = "YYYY-MM-DD", weekday: number, reference?: string, reference_format?: string)', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" }, weekday: { name: "weekday", description: "Week day number. If the locale assigns Monday as the first day of the week, `0` will be Monday, `-7` will be last week's day." }, reference: { name: "reference", description: "The date referential, e.g. set this to the note's title" }, reference_format: { name: "reference_format", description: "The date reference format." } } } } }, file: { name: "file", description: "This module contains every internal function related to files.", functions: { content: { name: "content", description: "Retrieves the file's content", definition: "tp.file.content" }, create_new: { name: "create_new", description: "Creates a new file using a specified template or with a specified content.", definition: "tp.file.create_new(template: TFile \u23AE string, filename?: string, open_new: boolean = false, folder?: TFolder)", args: { template: { name: "template", description: "Either the template used for the new file content, or the file content as a string." }, filename: { name: "filename", description: 'The filename of the new file, defaults to "Untitled".' }, open_new: { name: "open_new", description: "Whether to open or not the newly created file. Warning: if you use this option, since commands are executed asynchronously, the file can be opened first and then other commands are appended to that new file and not the previous file." }, folder: { name: "folder", description: "The folder to put the new file in, defaults to obsidian's default location." } } }, creation_date: { name: "creation_date", description: "Retrieves the file's creation date.", definition: 'tp.file.creation_date(format: string = "YYYY-MM-DD HH:mm")', args: { format: { name: "format", description: "Format for the date, refer to format reference" } } }, cursor: { name: "cursor", description: "Sets the cursor to this location after the template has been inserted. \n\nYou can navigate between the different tp.file.cursor using the configured hotkey in obsidian settings.\n", definition: "tp.file.cursor(order?: number)", args: { order: { name: "order", description: "The order of the different cursors jump, e.g. it will jump from 1 to 2 to 3, and so on.\nIf you specify multiple tp.file.cursor with the same order, the editor will switch to multi-cursor.\n" } } }, cursor_append: { name: "cursor_append", description: "Appends some content after the active cursor in the file.", definition: "tp.file.cursor_append(content: string)", args: { content: { name: "content", description: "The content to append after the active cursor" } } }, exists: { name: "exists", description: "Checks if a file exists or not. Returns a true / false boolean.", definition: "tp.file.exists(filename: string)", args: { filename: { name: "filename", description: "The filename of the file we want to check existence, e.g. MyFile." } } }, find_tfile: { name: "find_tfile", description: "Retrieves the file's folder name.", definition: "tp.file.folder(relative: boolean = false)", args: { relative: { name: "relative", description: "If set to true, appends the vault relative path to the folder name." } } }, include: { name: "include", description: "Includes the file's link content. Templates in the included content will be resolved.", definition: "tp.file.include(include_link: string \u23AE TFile)", args: { include_link: { name: "include_link", description: "The link to the file to include, e.g. [[MyFile]], or a TFile object. Also supports sections or blocks inclusions, e.g. [[MyFile#Section1]]" } } }, last_modified_date: { name: "last_modified_date", description: "Retrieves the file's last modification date.", definition: 'tp.file.last_modified_date(format: string = "YYYY-MM-DD HH:mm")', args: { format: { name: "format", description: "Format for the date, refer to format reference." } } }, move: { name: "functions.move", description: "Moves the file to the desired vault location.", definition: "tp.file.move(new_path: string)", args: { new_path: { name: "new_path", description: "The new vault relative path of the file, without the file extension. Note: the new path needs to include the folder and the filename, e.g. /Notes/MyNote" } } }, path: { name: "path", description: "Retrieves the file's absolute path on the system.", definition: "tp.file.path(relative: boolean = false)", args: { relative: { name: "relative", description: "If set to true, only retrieves the vault's relative path." } } }, rename: { name: "rename", description: "Renames the file (keeps the same file extension).", definition: "tp.file.rename(new_title: string)", args: { new_title: { name: "new_title", description: "The new file title." } } }, selection: { name: "selection", description: "Retrieves the active file's text selection.", definition: "tp.file.selection()" }, tags: { name: "tags", description: "Retrieves the file's tags (array of string)", definition: "tp.file.tags" }, title: { name: "title", definition: "tp.file.title", description: "Retrieves the file's title." } } }, frontmatter: { name: "frontmatter", description: "This modules exposes all the frontmatter variables of a file as variables." }, obsidian: { name: "obsidian", description: "This module exposes all the functions and classes from the obsidian API." }, system: { name: "system", description: "This module contains system related functions.", functions: { clipboard: { name: "clipboard", description: "Retrieves the clipboard's content", definition: "tp.system.clipboard()" }, prompt: { name: "prompt", description: "Spawns a prompt modal and returns the user's input.", definition: "tp.system.prompt(prompt_text?: string, default_value?: string, throw_on_cancel: boolean = false)", args: { prompt_text: { name: "prompt_text", description: "Text placed above the input field" }, default_value: { name: "default_value", description: "A default value for the input field" }, throw_on_cancel: { name: "throw_on_cancel", description: "Throws an error if the prompt is canceled, instead of returning a `null` value" } } }, suggester: { name: "suggester", description: "Spawns a suggester prompt and returns the user's chosen item.", definition: 'tp.system.suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = "")', args: { text_items: { name: "text_items", description: "Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation." }, items: { name: "items", description: "Array containing the values of each item in the correct order." }, throw_on_cancel: { name: "throw_on_cancel", description: "Throws an error if the prompt is canceled, instead of returning a `null` value" }, placeholder: { name: "placeholder", description: "Placeholder string of the prompt" } } } } }, web: { name: "web", description: "This modules contains every internal function related to the web (making web requests).", functions: { daily_quote: { name: "daily_quote", description: "Retrieves and parses the daily quote from the API https://api.quotable.io", definition: "tp.web.daily_quote()" }, random_picture: { name: "random_picture", description: "Gets a random image from https://unsplash.com/", definition: "tp.web.random_picture(size?: string, query?: string)", args: { size: { name: "size", description: "Image size in the format `x`" }, query: { name: "query", description: "Limits selection to photos matching a search term. Multiple search terms can be passed separated by a comma `,`" } } } } } }; +var tp = { config: { name: "config", description: "This module exposes Templater's running configuration.\n\nThis is mostly useful when writing scripts requiring some context information.\n", functions: { template_file: { name: "template_file", description: "The `TFile` object representing the template file.", definition: "tp.file.template_file" }, target_file: { name: "target_file", description: "The `TFile` object representing the target file where the template will be inserted.", definition: "tp.config.target_file" }, run_mode: { name: "run_mode", description: "The `RunMode`, representing the way Templater was launched (Create new from template, Append to active file, ...)", definition: "tp.config.run_mode" }, active_file: { name: "active_file", description: "The active file (if existing) when launching Templater.", definition: "tp.config.active_file?" } } }, date: { name: "date", description: "This module contains every internal function related to dates.", functions: { now: { name: "now", description: "Retrieves the date.", definition: 'tp.date.now(format: string = "YYYY-MM-DD", offset?: number\u23AEstring, reference?: string, reference_format?: string)', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" }, offset: { name: "offset", description: "Offset for the day, e.g. set this to `-7` to get last week's date. You can also specify the offset as a string using the ISO 8601 format" }, reference: { name: "reference", description: "The date referential, e.g. set this to the note's title" }, reference_format: { name: "reference_format", description: "The date reference format." } } }, tomorrow: { name: "tomorrow", description: "Retrieves tomorrow's date.", definition: 'tp.date.tomorrow(format: string = "YYYY-MM-DD")', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } } }, yesterday: { name: "yesterday", description: "Retrieves yesterday's date.", definition: 'tp.date.yesterday(format: string = "YYYY-MM-DD")', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } } }, weekday: { name: "weekday", description: "", definition: 'tp.date.weekday(format: string = "YYYY-MM-DD", weekday: number, reference?: string, reference_format?: string)', args: { format: { name: "format", description: "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" }, weekday: { name: "weekday", description: "Week day number. If the locale assigns Monday as the first day of the week, `0` will be Monday, `-7` will be last week's day." }, reference: { name: "reference", description: "The date referential, e.g. set this to the note's title" }, reference_format: { name: "reference_format", description: "The date reference format." } } } } }, file: { name: "file", description: "This module contains every internal function related to files.", functions: { content: { name: "content", description: "Retrieves the file's content", definition: "tp.file.content" }, create_new: { name: "create_new", description: "Creates a new file using a specified template or with a specified content.", definition: "tp.file.create_new(template: TFile \u23AE string, filename?: string, open_new: boolean = false, folder?: TFolder)", args: { template: { name: "template", description: "Either the template used for the new file content, or the file content as a string." }, filename: { name: "filename", description: 'The filename of the new file, defaults to "Untitled".' }, open_new: { name: "open_new", description: "Whether to open or not the newly created file. Warning: if you use this option, since commands are executed asynchronously, the file can be opened first and then other commands are appended to that new file and not the previous file." }, folder: { name: "folder", description: "The folder to put the new file in, defaults to obsidian's default location." } } }, creation_date: { name: "creation_date", description: "Retrieves the file's creation date.", definition: 'tp.file.creation_date(format: string = "YYYY-MM-DD HH:mm")', args: { format: { name: "format", description: "Format for the date, refer to format reference" } } }, cursor: { name: "cursor", description: "Sets the cursor to this location after the template has been inserted. \n\nYou can navigate between the different tp.file.cursor using the configured hotkey in obsidian settings.\n", definition: "tp.file.cursor(order?: number)", args: { order: { name: "order", description: "The order of the different cursors jump, e.g. it will jump from 1 to 2 to 3, and so on.\nIf you specify multiple tp.file.cursor with the same order, the editor will switch to multi-cursor.\n" } } }, cursor_append: { name: "cursor_append", description: "Appends some content after the active cursor in the file.", definition: "tp.file.cursor_append(content: string)", args: { content: { name: "content", description: "The content to append after the active cursor" } } }, exists: { name: "exists", description: "Checks if a file exists or not. Returns a true / false boolean.", definition: "tp.file.exists(filename: string)", args: { filename: { name: "filename", description: "The filename of the file we want to check existence, e.g. MyFile." } } }, find_tfile: { name: "find_tfile", description: "Retrieves the file's folder name.", definition: "tp.file.folder(relative: boolean = false)", args: { relative: { name: "relative", description: "If set to true, appends the vault relative path to the folder name." } } }, include: { name: "include", description: "Includes the file's link content. Templates in the included content will be resolved.", definition: "tp.file.include(include_link: string \u23AE TFile)", args: { include_link: { name: "include_link", description: "The link to the file to include, e.g. [[MyFile]], or a TFile object. Also supports sections or blocks inclusions, e.g. [[MyFile#Section1]]" } } }, last_modified_date: { name: "last_modified_date", description: "Retrieves the file's last modification date.", definition: 'tp.file.last_modified_date(format: string = "YYYY-MM-DD HH:mm")', args: { format: { name: "format", description: "Format for the date, refer to format reference." } } }, move: { name: "functions.move", description: "Moves the file to the desired vault location.", definition: "tp.file.move(new_path: string)", args: { new_path: { name: "new_path", description: "The new vault relative path of the file, without the file extension. Note: the new path needs to include the folder and the filename, e.g. /Notes/MyNote" } } }, path: { name: "path", description: "Retrieves the file's absolute path on the system.", definition: "tp.file.path(relative: boolean = false)", args: { relative: { name: "relative", description: "If set to true, only retrieves the vault's relative path." } } }, rename: { name: "rename", description: "Renames the file (keeps the same file extension).", definition: "tp.file.rename(new_title: string)", args: { new_title: { name: "new_title", description: "The new file title." } } }, selection: { name: "selection", description: "Retrieves the active file's text selection.", definition: "tp.file.selection()" }, tags: { name: "tags", description: "Retrieves the file's tags (array of string)", definition: "tp.file.tags" }, title: { name: "title", definition: "tp.file.title", description: "Retrieves the file's title." } } }, frontmatter: { name: "frontmatter", description: "This modules exposes all the frontmatter variables of a file as variables." }, obsidian: { name: "obsidian", description: "This module exposes all the functions and classes from the obsidian API." }, system: { name: "system", description: "This module contains system related functions.", functions: { clipboard: { name: "clipboard", description: "Retrieves the clipboard's content", definition: "tp.system.clipboard()" }, prompt: { name: "prompt", description: "Spawns a prompt modal and returns the user's input.", definition: "tp.system.prompt(prompt_text?: string, default_value?: string, throw_on_cancel: boolean = false)", args: { prompt_text: { name: "prompt_text", description: "Text placed above the input field" }, default_value: { name: "default_value", description: "A default value for the input field" }, throw_on_cancel: { name: "throw_on_cancel", description: "Throws an error if the prompt is canceled, instead of returning a `null` value" } } }, suggester: { name: "suggester", description: "Spawns a suggester prompt and returns the user's chosen item.", definition: 'tp.system.suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = "", limit?: number = undefined)', args: { text_items: { name: "text_items", description: "Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation." }, items: { name: "items", description: "Array containing the values of each item in the correct order." }, throw_on_cancel: { name: "throw_on_cancel", description: "Throws an error if the prompt is canceled, instead of returning a `null` value" }, placeholder: { name: "placeholder", description: "Placeholder string of the prompt" }, limit: { name: "limit", description: "Limit the number of items rendered at once (useful to improve performance when displaying large lists)" } } } } }, web: { name: "web", description: "This modules contains every internal function related to the web (making web requests).", functions: { daily_quote: { name: "daily_quote", description: "Retrieves and parses the daily quote from the API https://api.quotable.io", definition: "tp.web.daily_quote()" }, random_picture: { name: "random_picture", description: "Gets a random image from https://unsplash.com/", definition: "tp.web.random_picture(size?: string, query?: string)", args: { size: { name: "size", description: "Image size in the format `x`" }, query: { name: "query", description: "Limits selection to photos matching a search term. Multiple search terms can be passed separated by a comma `,`" } } } } } }; var documentation_default = { tp }; // src/editor/TpDocumentation.ts diff --git a/.obsidian/plugins/templater-obsidian/manifest.json b/.obsidian/plugins/templater-obsidian/manifest.json index 59e9d45..f9634f6 100644 --- a/.obsidian/plugins/templater-obsidian/manifest.json +++ b/.obsidian/plugins/templater-obsidian/manifest.json @@ -1,7 +1,7 @@ { "id": "templater-obsidian", "name": "Templater", - "version": "1.11.3", + "version": "1.12.0", "description": "Create and use templates", "minAppVersion": "0.11.13", "author": "SilentVoid",