!function(){
/**
 * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
 * Released under MIT license, http://github.com/requirejs/almond/LICENSE
 */
var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function g(t,e){return d.call(t,e)}function m(t,e){var n,i,r,o,s,a,c,l,h,d,f,g=e&&e.split("/"),m=u.map,v=m&&m["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&g&&(t=g.slice(0,g.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((g||v)&&m){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),g)for(d=g.length;d>0;d-=1)if((r=m[g.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(g(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!g(c,t)&&!g(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=m(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return m(t,i)})):m(t,s):(o=(r=b(t=m(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,m,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),m=!0;else if("module"===o)r=b[f]=a.module(t);else if(g(c,o)||g(l,o)||g(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&m||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),g(c,t)||g(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),g=t("./util"),m=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new m({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},A,x(r,E),i.pick(r,k)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(g.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};g.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(g.intersectRect(o,n)),r.points.push(g.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],A={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},k=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,g=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:g,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:g,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,g=0;g<4;++p,++g){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var m=o(t,a);m<l&&(g=0,c=i.cloneDeep(a),l=m)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var g=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(g,f);var m=s(g,c);if(h&&(m.vs=i.flatten([h,m.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(m,"barycenter")||(m.barycenter=0,m.weight=0),m.barycenter=(m.barycenter*m.weight+v.order+_.order)/(m.weight+2),m.weight+=2}return m}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-g(t,n)/2}));return i.max(e,(function(e,n){return e+g(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function g(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=g(n);)v(n,t,e,m(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function g(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function m(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=g,u.enterEdge=m,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),g=/($^)/,m=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",A="[object Date]",k="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[A]=C["[object Number]"]=C[k]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},P={configurable:!1,enumerable:!1,value:null,writable:!1},L={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=L[typeof window]&&window||this,O=L[typeof n]&&n&&!n.nodeType&&n,R=L[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=L[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Q=function t(e){var n=(e=e?Q.defaults(S.Object(),e,Q.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Y=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,gt=e.isNaN,mt=Dt(mt=I.keys)&&mt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new At(t)}function At(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[A]=r,wt["[object Function]"]=N,wt[k]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,At.prototype=Et.prototype;var kt=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case A:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?ge:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Pt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(kt.funcNames&&(i=!t.name),!(i=i||!kt.funcDecomp))){var r=rt.call(t);kt.funcNames||(i=!d.test(r)),i||(i=m.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Lt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Lt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function Nt(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&L[typeof t]||e&&L[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=k),c==b&&(c=k),a!=c)return!1;switch(a){case E:case A:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=k)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var g=r.length;g--;)if(r[g]==t)return o[g]==e;var m=0;if(s=!0,r.push(t),o.push(e),l){if(g=t.length,m=e.length,(s=m==g)||i)for(;m--;){var v=g,_=e[m];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[m],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return m++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--m>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?ge:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Y;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Lt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Pe?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}kt.funcDecomp=!Dt(e.WinRTError)&&m.test(t),kt.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){P.value=e,ht(t,"__bindData__",P)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=k||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Qt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=mt?function(t){return oe(t)?mt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!L[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qt=ie(Wt),Yt=j("("+Gt(Qt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Pt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&L[typeof r])for(var u=-1,h=L[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&L[typeof r])for(var l=-1,u=L[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;for(i in e=e&&void 0===n?e:Pt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;e=e&&void 0===n?e:Pt(e,n,3);for(var s=-1,a=L[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Pt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!L[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=k)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function ge(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function me(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function Ae(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),me(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function ke(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return ge(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,_t(vt(0,i),r))}function Pe(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Le(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return W(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Y;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},g=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var m=h-(s-u),v=m<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(g,m))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=At,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);ge(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Y;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new At(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Y;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Pt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Y;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Y;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=ge,Et.forEachRight=me,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Pt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return ge(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Y;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Pt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Y;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Le,Et.shuffle=ke,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),ge(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Y;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Pt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?ge:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Le,Et.each=ge,Et.eachRight=me,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Le,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Pt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Pt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),me(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Pe,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==A||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==k&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Pt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!gt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=Ae,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||g,m="__p += '",_=j((n.escape||g).source+"|"+p.source+"|"+(p===f?u:g).source+"|"+(n.evaluate||g).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),m+=t.slice(d,a).replace(v,F),n&&(m+="' +\n__e("+n+") +\n'"),s&&(r=!0,m+="';\n"+s+";\n__p += '"),i&&(m+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),m+="';\n";var b=n.variable,w=b;w||(m="with ("+(b="obj")+") {\n"+m+"\n}\n"),m=(r?m.replace(a,""):m).replace(c,"$1").replace(l,"$1;"),m="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+m+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var A=N(s,"return "+m+E).apply(void 0,h)}catch(t){throw t.source=m,t}return e?A(e):(A.source=m,A)},Et.unescape=function(t){return null==t?"":q(t).replace(Yt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=Ae,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=ke(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new At(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,ge(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new At(n,t):n}})),ge(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),ge(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new At(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Q)._=Q:O._=Q:S._=Q}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let g=((o+f)/2+f)/2;const m=this._c("g");m.setAttribute("class","label"),n._labelsElement.appendChild(m),m.arcRef=c;const v=n;m.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=m.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",g+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,A=m.insertBefore(n._c("rect"),_),k=w+2*n.xPadding;A.setAttribute("x",d+u-k/2),A.setAttribute("ry",5),A.setAttribute("y",b.y-n.yPadding),A.setAttribute("width",k),A.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
/**
 * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
 * Available via the MIT or new BSD license.
 * see: http://github.com/requirejs/domReady for details
 */
n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},g={},m=!1,v=13,_=27,y=32,b=[];return g={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,g="",m=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(g=d.value),"function"==typeof t&&(void 0!==d?t(!0,g):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){m.hide(),m.unbind(r.body,"keyup",l),m.unbind(o,"focus",u),h&&m.unbind(i,"click",e),f&&m.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||m.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=g.message.replace("{{message}}",i),"prompt"===n&&(e+=g.input),e+=g.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",g.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),m||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(m=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(m=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;m=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function m(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!g[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,A[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(A[E.sL]=t.top),m(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=m(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?m(t.cN,"",!0):"";t.rB?(k+=i,x=""):t.eB?(k+=e(n)+i,x=""):(k+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return k+=v(),0;var i=s(n,E);if(i)return k+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),k+=v();do{E.cN&&(k+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(k+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,A={},k="";for(w=E;w!=b;w=w.parent)w.cN&&(k=m(w.cN,"",!0)+k);var x="",C=0;try{for(var T,P,L=0;E.t.lastIndex=L,T=E.t.exec(n);)P=y(n.substr(L,T.index-L),T[0]),L=T.index+P;for(y(n.substr(L)),w=E;w.parent;w=w.parent)w.cN&&(k+="</span>");return{r:C,value:k,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(g);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?m[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return g[t]||g[m[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},g={},m={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=g[e]=n(t);i.aliases&&i.aliases.forEach((function(t){m[t]=e}))},t.listLanguages=function(){return Object.keys(g)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(m.call(this,document.querySelector(".introjs-helperLayer")),m.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),m.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var g=a.width/2-s.width/2;r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",g=a.width/2-s.width/2,r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&g(i,"bottom"),a.top-o<0&&g(i,"top"),a.right+s>r.width&&g(i,"right"),a.left-s<0&&g(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&g(s,"-left-aligned");(t<r||o-t<r)&&g(s,"-middle-aligned");t<e&&g(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function g(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function m(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;L(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),m.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),g=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var A=this._introItems[t.step-2>=0?t.step-2:0];(null!==A&&"forward"===this._direction&&"floating"===A.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,s),m.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,g,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Q.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Q.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var k=document.createElement("div"),x=document.createElement("div"),L=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");k.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,k),m.call(o,x),this._targetElement.appendChild(k),this._targetElement.appendChild(x),L.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Q.call(this)),M.style.cssText="width:"+Q.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(O),N.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(L),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,L,q),b.call(this,t.scrollTo,t,N)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=P(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=P(e,"z-index"),r=parseFloat(P(e,"opacity")),o=P(e,"transform")||P(e,"-webkit-transform")||P(e,"-moz-transform")||P(e,"-ms-transform")||P(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var A,k=(A={},function(t,e){return A[e=e||"introjs-stamp"]=A[e]||0,void 0===t[e]&&(t[e]=A[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+k(n)+(i?"_"+k(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function P(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function L(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===P(t,"position")||L(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),L(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),m.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Q(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Y=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Y.instances[k(n,"introjs-instance")]=n,n};return Y.version="2.9.3",Y.instances={},Y.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Y})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const g=document;KorAP.URL=g.body.getAttribute("data-korap-url")||"";const m=g.getElementById("koralQuery");let v;null!==m&&(KorAP.koralQuery=JSON.parse(m.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(v=document.getElementById("link-guided-tour"))&&(v.setAttribute("href","#"),v.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},m=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},g.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=g.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=g.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=g.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=g.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=g.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==g.getElementById("ql-field")&&(KorAP.QLmenu=c.create(g.getElementById("ql-field").parentNode).limit(5));var A=g.getElementById("resultinfo"),k=l.create(m);if(null!=A){A.appendChild(k.actions.element());var x=g.getElementById("search");x.insertBefore(k.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==A&&k.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&k.addAlignAction(),KorAP.Panel.result=k,r){_.onMinimize=function(){r.classList.remove("active"),delete m.vc},_.onOpen=function(){r.classList.add("active");var t=g.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),m.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,m.vc&&C.apply()}g.getElementById("view-tutorial")?(window.tutorial=i.create(g.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(g),a.tutorial.initDocLinks(g));var T=g.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=g.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",m),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),g.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var P=u.create(),L=g.getElementById("searchform"),N=g.getElementById("vc-view");let S;if(L&&N&&(L.insertBefore(P.element(),N),KorAP.Panel.query=P),S=g.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),g.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),g.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();