From f37f5b6ab4ec1a1b1e61236e9fa3d7f7daaeb2e8 Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Wed, 12 Aug 2015 11:53:50 -0400 Subject: [PATCH] cleaned up reader --- .gitignore | 1 + reader/js/epub.js.map | 1 - reader/js/epub.min.js | 8273 ----------------------- reader/js/hooks.js.map | 17 - reader/js/hooks.min.js | 2 - reader/js/hooks/extensions/highlight.js | 14 - reader/js/libs/fileStorage.min.js | 3 - reader/js/libs/jquery-2.1.0.min.js | 4 - reader/js/libs/jquery.highlight.js | 108 - reader/js/libs/loader_filesystem.min.js | 3 - reader/js/libs/screenfull.min.js | 7 - reader/js/libs/zip.min.js | 15 - reader/js/plugins/hypothesis.js | 109 - reader/js/plugins/search.js | 125 - reader/js/reader.min.js | 2 - 15 files changed, 1 insertion(+), 8683 deletions(-) delete mode 100644 reader/js/epub.js.map delete mode 100644 reader/js/epub.min.js delete mode 100644 reader/js/hooks.js.map delete mode 100644 reader/js/hooks.min.js delete mode 100644 reader/js/hooks/extensions/highlight.js delete mode 100644 reader/js/libs/fileStorage.min.js delete mode 100644 reader/js/libs/jquery-2.1.0.min.js delete mode 100644 reader/js/libs/jquery.highlight.js delete mode 100644 reader/js/libs/loader_filesystem.min.js delete mode 100644 reader/js/libs/screenfull.min.js delete mode 100644 reader/js/libs/zip.min.js delete mode 100644 reader/js/plugins/hypothesis.js delete mode 100644 reader/js/plugins/search.js delete mode 100644 reader/js/reader.min.js diff --git a/.gitignore b/.gitignore index 0a9e1b2..364d623 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ */**/.DS_Store node_modules/ components +bower_components/ reader/js/ build/ \ No newline at end of file diff --git a/reader/js/epub.js.map b/reader/js/epub.js.map deleted file mode 100644 index f4b2ea2..0000000 --- a/reader/js/epub.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"epub.min.js","sources":["epub.js"],"names":["n","this","t","_","r","e","Array","prototype","u","Object","i","Function","a","push","o","slice","c","concat","l","toString","f","hasOwnProperty","s","forEach","p","map","h","reduce","v","reduceRight","d","filter","g","every","m","some","y","indexOf","b","lastIndexOf","x","isArray","keys","j","bind","w","_wrapped","exports","module","VERSION","A","each","length","call","has","collect","O","foldl","inject","arguments","TypeError","foldr","find","detect","E","select","reject","all","identity","any","contains","include","invoke","isFunction","apply","pluck","where","isEmpty","findWhere","max","Math","computed","value","min","shuffle","random","k","sortBy","index","criteria","sort","F","groupBy","countBy","sortedIndex","toArray","values","size","first","head","take","initial","last","rest","tail","drop","compact","R","flatten","without","difference","uniq","unique","union","intersection","zip","object","range","ceil","partial","bindAll","functions","memoize","delay","setTimeout","defer","throttle","Date","clearTimeout","debounce","once","wrap","compose","after","pairs","invert","methods","extend","pick","omit","defaults","clone","isObject","tap","I","source","global","multiline","ignoreCase","constructor","pop","isEqual","isString","isElement","nodeType","isArguments","isFinite","isNaN","parseFloat","isNumber","isBoolean","isNull","isUndefined","noConflict","times","floor","M","escape","&","<",">","\"","'","/","unescape","S","RegExp","join","replace","result","mixin","D","N","uniqueId","templateSettings","evaluate","interpolate","T","q","\\","\r","\n","\t","
","
","B","template","variable","chain","_chain","define","requireModule","require","requirejs","registry","seen","name","deps","callback","resolve","child","charAt","parts","split","parentBase","part","_eak_seen","Error","mod","reified","__dependency1__","__exports__","Promise","array","label","__dependency2__","fulfilled","state","rejected","reason","isNonThenable","entries","fulfilledResolver","resolveAll","rejectedResolver","results","remaining","entry","cast","then","useNextTick","process","nextTick","flush","useMutationObserver","iterations","observer","BrowserMutationObserver","node","document","createTextNode","observe","characterData","data","useSetTimeout","queue","tuple","arg","scheduleFlush","browserGlobal","window","MutationObserver","WebKitMutationObserver","configure","config","on","EventTarget","instrument","deferred","promise","callbacks","callbacksFor","_promiseCallbacks","off","trigger","undefined","eventName","allCallbacks","splice","options","__dependency3__","promises","filterFn","filterResults","valuesLen","filtered","keysOf","fulfilledTo","property","onRejection","now","guid","_guidKey","_id","detail","_detail","childGuid","_label","timeStamp","stack","error","mapFn","resultLen","mappedResults","makeNodeCallbackFor","nodeFunc","binding","nodeArgs","thisArg","__dependency4__","__dependency5__","__dependency6__","__dependency7__","__dependency8__","__dependency9__","noop","resolver","counter","_subscribers","invokeResolver","resolvePromise","rejectPromise","subscribe","parent","onFulfillment","subscribers","FULFILLED","REJECTED","publish","settled","invokeCallback","succeeded","failed","hasCallback","handleThenable","resolved","objectOrFunction","val","fulfill","_state","PENDING","SEALED","async","publishFulfillment","publishRejection","_onerror","race","Resolve","Reject","guidKey","thenPromise","catch","finally","Constructor","fulfillmentAt","pending","getTime","prop","__dependency10__","__dependency11__","__dependency12__","__dependency13__","__dependency14__","__dependency15__","denodeify","allSettled","hash","rethrow","asap","__PROMISE_INSTRUMENTATION__","RSVP","EPUBJS","plugins","filePath","Render","root","previousEpub","ePub","bookPath","Book","amd","settings","bookKey","packageUrl","storage","fromStorage","saved","online","contained","width","height","layoutOveride","orientation","minSpreadWidth","gap","version","restore","reload","goto","styles","headTags","withCredentials","render_method","EPUBJSVERSION","spinePos","stored","navigator","onLine","networkListeners","ready","manifest","spine","metadata","cover","toc","pageList","readyPromises","pagination","Pagination","pageListReady","_ready","isRendered","_q","core","_rendering","_displayQ","_moving","_gotoQ","renderer","Renderer","setMinSpreadWidth","setGap","listenToRenderer","defer_opened","opened","store","open","addEventListener","unload","forceReload","epubpackage","book","bookUrl","urlFrom","isContained","unarchive","loadPackage","localStorage","packageXml","identifier","packageIdentifier","restored","unpack","_registerReplacements","_containerPath","parse","Parser","containerPath","loadXml","containerXml","container","paths","contentsPath","basePath","packagePath","encoding","console","contents","packageContents","spineIndexByURL","generateBookKey","globalLayoutProperties","parseLayoutProperties","coverPath","spineNodeIndex","locations","Locations","navPath","navUrl","navHtml","nav","epubcfi","EpubCFI","wait","pg","cfi","generateCfiFromHref","href","tocPath","tocUrl","tocXml","createHiddenRender","_width","_height","hiddenContainer","hiddenEl","box","element","getBoundingClientRect","forceSingle","createElement","style","visibility","overflow","appendChild","initialize","generatePageList","pager","spineLength","currentPage","nextChapter","chapter","next","done","Chapter","displayChapter","pageMap","item","start","page","spreads","end","remove","removeChild","generatePagination","defered","loadPagination","pagelistJSON","JSON","getPageList","getMetadata","getToc","Events","startPage","endPage","percent","pageRange","pageFromCfi","percentageFromPage","anchorPage","percentage","loadChange","url","uri","currentChapter","absolute","path","warn","filename","unlistenToRenderer","getXml","request","base","protocol","fromRoot","location","origin","host","baseTag","getElementsByTagName","resolveUrl","pathname","Unarchiver","extension","isSaved","storedSettings","getItem","saveContents","setItem","stringify","removeSavedContents","removeItem","renderTo","elem","rendered","getEl","direction","setDirection","_rendered","startDisplay","display","previousLocationCfi","gotoCfi","fetch","fromStore","len","clearSaved","chap","render","pos","enqueue","_needsAssetReplacement","registerHook","resources","svg","lastPage","preloadNextChapter","dequeue","message","nextPage","prevPage","prev","prevChapter","linear","getCurrentLocationCfi","currentLocationCfi","target","gotoPercentage","parseInt","substring","gotoPage","gotoHref","cfiString","spineItem","section","relativeURL","firstPage","cfiFromPage","pageFromPercentage","storeOffline","assets","put","availableOffline","toStorage","key","isStored","token","Storage","credentials","offline","setStyle","prefixed","noreflow","reformat","removeStyle","addHeadTag","tag","attrs","useSpreads","use","_use","force","load","destroy","removeEventListener","applyStyles","applyHeadTags","hrefs","layout","spread","spineObject","id","cfiBase","properties","manifestProperties","pages","loaded","Hooks","getHooks","caches","_store","xml","setDocument","doc","querySelector","setAttribute","insertBefore","firstChild","triggerHooks","serializer","XMLSerializer","serializeToString","tempUrl","getUrl","setPages","num","getPages","getID","ID","revokeUrl","_document","namespaceURI","doctype","implementation","createDocument","importNode","documentElement","cfiFromRange","_range","startXpath","endXpath","startContainer","endContainer","cleanEndTextContent","getElementXPath","nsResolver","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","collapsed","createRange","setStart","startOffset","setEnd","endOffset","log","cleanStartTextContent","cleanStringForXpath","textContent","generateCfiFromRange","_query","matches","query","toLowerCase","excerpt","text","limit","textSprint","func","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","test","FILTER_ACCEPT","FILTER_REJECT","nextNode","finished","progress","items","querySelectorAll","count","called","full","replaceWithStored","attr","_oldUrls","_newUrls","_cache","_uri","_chapterBase","_attr","_wait","link","src","getAttribute","replaceUrl","timeout","onload","onerror","getElementById","getEls","classes","getElementsByClassName","type","handler","readyState","DONE","status","responseXML","response","supportsURL","Blob","URL","BLOB_RESPONSE","xhr","XMLHttpRequest","xhrPrototype","defineProperty","onreadystatechange","responseType","setRequestHeader","overrideMimeType","send","obj","arr","member","newitm","ident","withoutProtocol","dot","firstSlash","directory","fragment","blob","doubleSlash","search","folder","lastSlash","dataURLToBlob","dataURL","contentType","raw","rawLength","uInt8Array","BASE64_MARKER","atob","Uint8Array","charCodeAt","addScript","body","addScripts","srcArr","total","curr","cb","addCss","rel","unprefixed","vendors","upper","toUpperCase","segments","folders","uuid","insert","compareFunction","locationOf","_start","_end","compared","pivot","indexOfSorted","_scope","scope","funcName","args","context","inwait","shift","clear","getElementTreeXPath","nodeName","tagName","pathIndex","isXhtml","ownerDocument","Node","TEXT_NODE","indexOfTextNode","parentNode","sibling","previousSibling","DOCUMENT_TYPE_NODE","prefix","ns","xhtml","epub","str","match","textNode","sib","children","childNodes","cfiStr","generateChapterComponent","_spineNodeIndex","_pos","generatePathComponent","steps","segment","generateCfiFromElement","pathTo","unshift","getChapterComponent","splitStr","getPathComponent","pathComponent","getCharecterOffsetComponent","chapSegment","chapterComponent","charecterOffsetComponent","assertion","chapId","endInt","parseStep","has_brackets","spineId","step","characterOffset","textLocationAssertion","addMarker","_doc","_marker","lastStep","marker","createMarker","findParent","splitText","classList","add","removeMarker","nextSib","nextSibling","prevSib","sections","compare","cfiOne","cfiTwo","generateCfiFromTextNode","anchor","offset","generateCfiFromRangeAnchor","anchorNode","anchorOffset","startElement","startSteps","startPath","startIndex","endElement","endSteps","endPath","endIndex","generateXpathFromSteps","xpath","position","generateRangeFromCfi","textLength","debug","selectNode","isCfiString","el","events","createEvent","tell","listen","deafen","listenUntil","evt","CustomEvent","msg","dispatchEvent","bindto","OnEvt","OffEvt","unlisten","hooks","plugs","plugType","hook","toAdd","toFront","removeHook","toRemove","passed","countdown","register","Layout","Reflowable","spreadWidth","format","_gap","columnAxis","columnGap","columnWidth","columnFill","colWidth","pageWidth","pageHeight","calculatePages","totalWidth","displayedPages","scrollWidth","pageCount","ReflowableSpreads","divisor","fullWidth","Fixed","content","viewport","hasAttribute","_locations","break","_current","generate","_currentCfi","currentLocation","sprint","dist","locationFromCfi","percentageFromCfi","loc","percentageFromLocation","cfiFromLocation","cfiFromPercentage","save","getCurrent","setCurrent","get","set","totalPages","round","baseUrl","rootfile","fullpath","xmlEncoding","metadataNode","getElementText","manifestNode","spineNode","findNavPath","findTocPath","findCoverPath","tocId","bookTitle","creator","description","pubdate","publisher","language","rights","modified_date","querySelectorText","found","getElementsByTagNameNS","nodeValue","manifestXml","selected","spineXml","Id","props","propArray","manifestProps","manifestPropArray","vert","bookSpine","findListItems","findAnchorOrSpan","getTOC","list","nodes","subitems","idCounter","navEl","snapshot","ORDERED_NODE_SNAPSHOT_TYPE","snapshotLength","snapshotItem","navLabel","navMap","isCfi","Iframe","iframe","docEl","bodyEl","leftPos","isMobile","userAgent","create","scrolling","seamless","border","contentDocument","headEl","contentWindow","resized","setLeft","margin","dir","right","write","close","resize","totalHeight","scrollHeight","setPageDimensions","defaultView","scrollTo","tagEl","getPageNumberByElement","left","getPageNumberByRect","boundingClientRect","getBaseElement","getDocumentElement","isElementVisible","rect","scroll","bool","renderMethod","hidden","listenedEvents","upEvent","downEvent","isForcedSingle","onResized","layoutSettings","initWidth","initHeight","clientWidth","clientHeight","globalLayout","removeEventListeners","removeSelectionListeners","chapterPos","currentChapterCfiBase","reconcileLayoutSettings","layoutMethod","determineLayout","visible","formated","addEventListeners","addSelectionListeners","beforeDisplay","queued","updatePages","visibleRangeCfi","getVisibleRangeCfi","rendition","determineSpreads","mapPage","headTag","pageByElement","firstElementisTextNode","leng","trim","isGoodNode","embeddedElements","walk","prevNode","startNode","STOP","ITER","containsPoint","childElementCount","SHOW_ELEMENT","prevRange","elLimit","check","elPos","elRange","ELEMENT_NODE","selectNodeContents","checkText","ranges","splitTextNodeIntoWordsRanges","collapse","indexOfBreakableChar","startPosition","whiteCharacters","rangePosition","getClientRects","getPageCfi","startRange","getRange","forceElement","caretPositionFromPoint","caretRangeFromPoint","visibileEl","findElementAfter","offsetNode","pagesInCurrentChapter","pgs","currentRenderedPage","getRenderedPagesLeft","pagesLeft","endRange","findFirstVisible","startEl","setSize","triggerEvent","onSelectionChange","selectionEndTimeout","selectedRange","getSelection","cutoff","replacments","relative","isRelative","onclick","links","srcs","stylesheets","getText","cssUrls","newText","_URL","webkitURL","mozURL","createObjectURL","replaced","checkRequirements","urlCache","current","encodedUrl","encodeURIComponent","localforage","buffer","mimeType","getMimeType","reader","FileReader","readAsText","parser","DOMParser","parseFromString","fromCache","revokeObjectURL","zipUrl","JSZip","decodededUrl","decodeURIComponent","unarchiver","file","asUint8Array","asText","afterSaved","that","saveEntryFileToStorage"],"mappings":"CAAA,WAAY,GAAIA,GAAEC,KAAKC,EAAEF,EAAEG,EAAEC,KAAKC,EAAEC,MAAMC,UAAUC,EAAEC,OAAOF,UAAUG,EAAEC,SAASJ,UAAUK,EAAEP,EAAEQ,KAAKC,EAAET,EAAEU,MAAMC,EAAEX,EAAEY,OAAOC,EAAEV,EAAEW,SAASC,EAAEZ,EAAEa,eAAeC,EAAEjB,EAAEkB,QAAQC,EAAEnB,EAAEoB,IAAIC,EAAErB,EAAEsB,OAAOC,EAAEvB,EAAEwB,YAAYC,EAAEzB,EAAE0B,OAAOC,EAAE3B,EAAE4B,MAAMC,EAAE7B,EAAE8B,KAAKC,EAAE/B,EAAEgC,QAAQC,EAAEjC,EAAEkC,YAAYC,EAAElC,MAAMmC,QAAQtC,EAAEM,OAAOiC,KAAKC,EAAEjC,EAAEkC,KAAKC,EAAE,SAAS7C,GAAG,MAAOA,aAAa6C,GAAE7C,EAAEC,eAAgB4C,QAAG5C,KAAK6C,SAAS9C,GAAU,GAAI6C,GAAE7C,GAAI,oBAAoB+C,UAAS,mBAAoBC,SAAQA,OAAOD,UAAUA,QAAQC,OAAOD,QAAQF,GAAGE,QAAQ5C,EAAE0C,GAAG7C,EAAEG,EAAE0C,EAAEA,EAAEI,QAAQ,OAAQ,IAAIC,GAAEL,EAAEM,KAAKN,EAAEtB,QAAQ,SAASvB,EAAEE,EAAEG,GAAG,GAAG,MAAML,EAAE,GAAGsB,GAAGtB,EAAEuB,UAAUD,EAAEtB,EAAEuB,QAAQrB,EAAEG,OAAQ,IAAGL,EAAEoD,UAAUpD,EAAEoD,QAAQ,IAAI,GAAI5C,GAAE,EAAEE,EAAEV,EAAEoD,OAAO1C,EAAEF,EAAEA,IAAI,GAAGN,EAAEmD,KAAKhD,EAAEL,EAAEQ,GAAGA,EAAER,KAAKI,EAAE,WAAY,KAAI,GAAIQ,KAAKZ,GAAE,GAAG6C,EAAES,IAAItD,EAAEY,IAAIV,EAAEmD,KAAKhD,EAAEL,EAAEY,GAAGA,EAAEZ,KAAKI,EAAE,OAAQyC,GAAEpB,IAAIoB,EAAEU,QAAQ,SAASvD,EAAEE,EAAEE,GAAG,GAAIC,KAAK,OAAO,OAAML,EAAEK,EAAEmB,GAAGxB,EAAEyB,MAAMD,EAAExB,EAAEyB,IAAIvB,EAAEE,IAAI8C,EAAElD,EAAE,SAASA,EAAEQ,EAAEE,GAAGL,EAAEA,EAAE+C,QAAQlD,EAAEmD,KAAKjD,EAAEJ,EAAEQ,EAAEE,KAAKL,GAAI,IAAImD,GAAE,6CAA8CX,GAAElB,OAAOkB,EAAEY,MAAMZ,EAAEa,OAAO,SAAS1D,EAAEE,EAAEE,EAAEC,GAAG,GAAIG,GAAEmD,UAAUP,OAAO,CAAE,IAAG,MAAMpD,IAAIA,MAAM0B,GAAG1B,EAAE2B,SAASD,EAAE,MAAOrB,KAAIH,EAAE2C,EAAED,KAAK1C,EAAEG,IAAIG,EAAER,EAAE2B,OAAOzB,EAAEE,GAAGJ,EAAE2B,OAAOzB,EAAG,IAAGgD,EAAElD,EAAE,SAASA,EAAEU,EAAEE,GAAGJ,EAAEJ,EAAEF,EAAEmD,KAAKhD,EAAED,EAAEJ,EAAEU,EAAEE,IAAIR,EAAEJ,EAAEQ,GAAE,MAAOA,EAAE,KAAM,IAAIoD,WAAUJ,EAAG,OAAOpD,IAAGyC,EAAEhB,YAAYgB,EAAEgB,MAAM,SAAS7D,EAAEE,EAAEE,EAAEC,GAAG,GAAIG,GAAEmD,UAAUP,OAAO,CAAE,IAAG,MAAMpD,IAAIA,MAAM4B,GAAG5B,EAAE6B,cAAcD,EAAE,MAAOvB,KAAIH,EAAE2C,EAAED,KAAK1C,EAAEG,IAAIG,EAAER,EAAE6B,YAAY3B,EAAEE,GAAGJ,EAAE6B,YAAY3B,EAAG,IAAIQ,GAAEV,EAAEoD,MAAO,IAAG1C,KAAKA,EAAE,CAAC,GAAIE,GAAEiC,EAAEH,KAAK1C,EAAGU,GAAEE,EAAEwC,OAAO,GAAGF,EAAElD,EAAE,SAASc,EAAEE,EAAEE,GAAGF,EAAEJ,EAAEA,IAAIF,KAAKA,EAAEF,EAAEJ,EAAEF,EAAEmD,KAAKhD,EAAED,EAAEJ,EAAEgB,GAAGA,EAAEE,IAAId,EAAEJ,EAAEgB,GAAGR,GAAE,MAAOA,EAAE,KAAM,IAAIoD,WAAUJ,EAAG,OAAOpD,IAAGyC,EAAEiB,KAAKjB,EAAEkB,OAAO,SAAS/D,EAAEE,EAAEE,GAAG,GAAIC,EAAE,OAAO2D,GAAEhE,EAAE,SAASA,EAAEQ,EAAEE,GAAG,MAAOR,GAAEmD,KAAKjD,EAAEJ,EAAEQ,EAAEE,IAAIL,EAAEL,GAAE,GAAI,SAASK,GAAGwC,EAAEd,OAAOc,EAAEoB,OAAO,SAASjE,EAAEE,EAAEE,GAAG,GAAIC,KAAK,OAAO,OAAML,EAAEK,EAAEyB,GAAG9B,EAAE+B,SAASD,EAAE9B,EAAE+B,OAAO7B,EAAEE,IAAI8C,EAAElD,EAAE,SAASA,EAAEQ,EAAEE,GAAGR,EAAEmD,KAAKjD,EAAEJ,EAAEQ,EAAEE,KAAKL,EAAEA,EAAE+C,QAAQpD,KAAKK,IAAIwC,EAAEqB,OAAO,SAASlE,EAAEE,EAAEE,GAAG,MAAOyC,GAAEd,OAAO/B,EAAE,SAASA,EAAEK,EAAEG,GAAG,OAAON,EAAEmD,KAAKjD,EAAEJ,EAAEK,EAAEG,IAAIJ,IAAIyC,EAAEZ,MAAMY,EAAEsB,IAAI,SAASnE,EAAEE,EAAEG,GAAGH,IAAIA,EAAE2C,EAAEuB,SAAU,IAAI5D,IAAE,CAAG,OAAO,OAAMR,EAAEQ,EAAEwB,GAAGhC,EAAEiC,QAAQD,EAAEhC,EAAEiC,MAAM/B,EAAEG,IAAI6C,EAAElD,EAAE,SAASA,EAAEU,EAAEE,GAAG,OAAOJ,EAAEA,GAAGN,EAAEmD,KAAKhD,EAAEL,EAAEU,EAAEE,IAAI,OAAOR,MAAMI,GAAI,IAAIwD,GAAEnB,EAAEV,KAAKU,EAAEwB,IAAI,SAASrE,EAAEE,EAAEG,GAAGH,IAAIA,EAAE2C,EAAEuB,SAAU,IAAI5D,IAAE,CAAG,OAAO,OAAMR,EAAEQ,EAAE0B,GAAGlC,EAAEmC,OAAOD,EAAElC,EAAEmC,KAAKjC,EAAEG,IAAI6C,EAAElD,EAAE,SAASA,EAAEU,EAAEE,GAAG,MAAOJ,KAAIA,EAAEN,EAAEmD,KAAKhD,EAAEL,EAAEU,EAAEE,IAAIR,EAAE,WAAWI,GAAIqC,GAAEyB,SAASzB,EAAE0B,QAAQ,SAASvE,EAAEE,GAAG,MAAO,OAAMF,GAAE,EAAGoC,GAAGpC,EAAEqC,UAAUD,EAAgB,IAAdpC,EAAEqC,QAAQnC,GAAO8D,EAAEhE,EAAE,SAASA,GAAG,MAAOA,KAAIE,KAAK2C,EAAE2B,OAAO,SAASxE,EAAEE,GAAG,GAAIE,GAAEU,EAAEuC,KAAKM,UAAU,GAAGtD,EAAEwC,EAAE4B,WAAWvE,EAAG,OAAO2C,GAAEpB,IAAIzB,EAAE,SAASA,GAAG,OAAOK,EAAEH,EAAEF,EAAEE,IAAIwE,MAAM1E,EAAEI,MAAMyC,EAAE8B,MAAM,SAAS3E,EAAEE,GAAG,MAAO2C,GAAEpB,IAAIzB,EAAE,SAASA,GAAG,MAAOA,GAAEE,MAAM2C,EAAE+B,MAAM,SAAS5E,EAAEE,EAAEE,GAAG,MAAOyC,GAAEgC,QAAQ3E,GAAGE,EAAE,QAAQyC,EAAEzC,EAAE,OAAO,UAAUJ,EAAE,SAASA,GAAG,IAAI,GAAII,KAAKF,GAAE,GAAGA,EAAEE,KAAKJ,EAAEI,GAAG,OAAM,CAAG,QAAM,KAAMyC,EAAEiC,UAAU,SAAS9E,EAAEE,GAAG,MAAO2C,GAAE+B,MAAM5E,EAAEE,GAAE,IAAK2C,EAAEkC,IAAI,SAAS/E,EAAEE,EAAEE,GAAG,IAAIF,GAAG2C,EAAEJ,QAAQzC,IAAIA,EAAE,MAAMA,EAAE,IAAI,MAAMA,EAAEoD,OAAO,MAAO4B,MAAKD,IAAIL,MAAMM,KAAKhF,EAAG,KAAIE,GAAG2C,EAAEgC,QAAQ7E,GAAG,MAAM,GAAG,CAAE,IAAIK,IAAG4E,SAAS,GAAG,EAAEC,MAAM,GAAG,EAAG,OAAOhC,GAAElD,EAAE,SAASA,EAAEQ,EAAEE,GAAG,GAAIE,GAAEV,EAAEA,EAAEmD,KAAKjD,EAAEJ,EAAEQ,EAAEE,GAAGV,CAAEY,IAAGP,EAAE4E,WAAW5E,GAAG6E,MAAMlF,EAAEiF,SAASrE,MAAMP,EAAE6E,OAAOrC,EAAEsC,IAAI,SAASnF,EAAEE,EAAEE,GAAG,IAAIF,GAAG2C,EAAEJ,QAAQzC,IAAIA,EAAE,MAAMA,EAAE,IAAI,MAAMA,EAAEoD,OAAO,MAAO4B,MAAKG,IAAIT,MAAMM,KAAKhF,EAAG,KAAIE,GAAG2C,EAAEgC,QAAQ7E,GAAG,MAAO,GAAE,CAAE,IAAIK,IAAG4E,SAAS,EAAE,EAAEC,MAAM,EAAE,EAAG,OAAOhC,GAAElD,EAAE,SAASA,EAAEQ,EAAEE,GAAG,GAAIE,GAAEV,EAAEA,EAAEmD,KAAKjD,EAAEJ,EAAEQ,EAAEE,GAAGV,CAAEK,GAAE4E,SAASrE,IAAIP,GAAG6E,MAAMlF,EAAEiF,SAASrE,MAAMP,EAAE6E,OAAOrC,EAAEuC,QAAQ,SAASpF,GAAG,GAAIE,GAAEE,EAAE,EAAEC,IAAK,OAAO6C,GAAElD,EAAE,SAASA,GAAGE,EAAE2C,EAAEwC,OAAOjF,KAAKC,EAAED,EAAE,GAAGC,EAAEH,GAAGG,EAAEH,GAAGF,IAAIK,EAAG,IAAIiF,GAAE,SAAStF,GAAG,MAAO6C,GAAE4B,WAAWzE,GAAGA,EAAE,SAASE,GAAG,MAAOA,GAAEF,IAAK6C,GAAE0C,OAAO,SAASvF,EAAEE,EAAEE,GAAG,GAAIC,GAAEiF,EAAEpF,EAAG,OAAO2C,GAAE8B,MAAM9B,EAAEpB,IAAIzB,EAAE,SAASA,EAAEE,EAAEM,GAAG,OAAO0E,MAAMlF,EAAEwF,MAAMtF,EAAEuF,SAASpF,EAAEgD,KAAKjD,EAAEJ,EAAEE,EAAEM,MAAMkF,KAAK,SAAS1F,EAAEE,GAAG,GAAIE,GAAEJ,EAAEyF,SAASpF,EAAEH,EAAEuF,QAAS,IAAGrF,IAAIC,EAAE,CAAC,GAAGD,EAAEC,GAAO,SAAJD,EAAW,MAAO,EAAE,IAAGC,EAAED,GAAO,SAAJC,EAAW,MAAM,GAAG,MAAOL,GAAEwF,MAAMtF,EAAEsF,MAAM,GAAG,IAAI,SAAU,IAAIG,GAAE,SAAS3F,EAAEE,EAAEE,EAAEC,GAAG,GAAIG,MAAKE,EAAE4E,EAAEpF,GAAG2C,EAAEuB,SAAU,OAAOlB,GAAElD,EAAE,SAASE,EAAEU,GAAG,GAAIE,GAAEJ,EAAE2C,KAAKjD,EAAEF,EAAEU,EAAEZ,EAAGK,GAAEG,EAAEM,EAAEZ,KAAKM,EAAGqC,GAAE+C,QAAQ,SAAS5F,EAAEE,EAAEE,GAAG,MAAOuF,GAAE3F,EAAEE,EAAEE,EAAE,SAASJ,EAAEE,EAAEE,IAAIyC,EAAES,IAAItD,EAAEE,GAAGF,EAAEE,GAAGF,EAAEE,OAAOW,KAAKT,MAAMyC,EAAEgD,QAAQ,SAAS7F,EAAEE,EAAEE,GAAG,MAAOuF,GAAE3F,EAAEE,EAAEE,EAAE,SAASJ,EAAEE,GAAG2C,EAAES,IAAItD,EAAEE,KAAKF,EAAEE,GAAG,GAAGF,EAAEE,QAAQ2C,EAAEiD,YAAY,SAAS9F,EAAEE,EAAEE,EAAEC,GAAGD,EAAE,MAAMA,EAAEyC,EAAEuB,SAASkB,EAAElF,EAAG,KAAI,GAAII,GAAEJ,EAAEiD,KAAKhD,EAAEH,GAAGQ,EAAE,EAAEE,EAAEZ,EAAEoD,OAAOxC,EAAEF,GAAG,CAAC,GAAII,GAAEJ,EAAEE,IAAI,CAAEJ,GAAEJ,EAAEiD,KAAKhD,EAAEL,EAAEc,IAAIJ,EAAEI,EAAE,EAAEF,EAAEE,EAAE,MAAOJ,IAAGmC,EAAEkD,QAAQ,SAAS/F,GAAG,MAAOA,GAAE6C,EAAEJ,QAAQzC,GAAGc,EAAEuC,KAAKrD,GAAGA,EAAEoD,UAAUpD,EAAEoD,OAAOP,EAAEpB,IAAIzB,EAAE6C,EAAEuB,UAAUvB,EAAEmD,OAAOhG,OAAO6C,EAAEoD,KAAK,SAASjG,GAAG,MAAO,OAAMA,EAAE,EAAEA,EAAEoD,UAAUpD,EAAEoD,OAAOpD,EAAEoD,OAAOP,EAAEH,KAAK1C,GAAGoD,QAAQP,EAAEqD,MAAMrD,EAAEsD,KAAKtD,EAAEuD,KAAK,SAASpG,EAAEE,EAAEE,GAAG,MAAO,OAAMJ,EAAE,OAAO,MAAME,GAAGE,EAAEJ,EAAE,GAAGc,EAAEuC,KAAKrD,EAAE,EAAEE,IAAI2C,EAAEwD,QAAQ,SAASrG,EAAEE,EAAEE,GAAG,MAAOU,GAAEuC,KAAKrD,EAAE,EAAEA,EAAEoD,QAAQ,MAAMlD,GAAGE,EAAE,EAAEF,KAAK2C,EAAEyD,KAAK,SAAStG,EAAEE,EAAEE,GAAG,MAAO,OAAMJ,EAAE,OAAO,MAAME,GAAGE,EAAEJ,EAAEA,EAAEoD,OAAO,GAAGtC,EAAEuC,KAAKrD,EAAEgF,KAAKD,IAAI/E,EAAEoD,OAAOlD,EAAE,KAAK2C,EAAE0D,KAAK1D,EAAE2D,KAAK3D,EAAE4D,KAAK,SAASzG,EAAEE,EAAEE,GAAG,MAAOU,GAAEuC,KAAKrD,EAAE,MAAME,GAAGE,EAAE,EAAEF,IAAI2C,EAAE6D,QAAQ,SAAS1G,GAAG,MAAO6C,GAAEd,OAAO/B,EAAE6C,EAAEuB,UAAW,IAAIuC,GAAE,SAAS3G,EAAEE,EAAEE,GAAG,MAAO8C,GAAElD,EAAE,SAASA,GAAG6C,EAAEJ,QAAQzC,GAAGE,EAAEU,EAAE8D,MAAMtE,EAAEJ,GAAG2G,EAAE3G,EAAEE,EAAEE,GAAGA,EAAES,KAAKb,KAAKI,EAAGyC,GAAE+D,QAAQ,SAAS5G,EAAEE,GAAG,MAAOyG,GAAE3G,EAAEE,OAAO2C,EAAEgE,QAAQ,SAAS7G,GAAG,MAAO6C,GAAEiE,WAAW9G,EAAEc,EAAEuC,KAAKM,UAAU,KAAKd,EAAEkE,KAAKlE,EAAEmE,OAAO,SAAShH,EAAEE,EAAEE,EAAEC,GAAGwC,EAAE4B,WAAWvE,KAAKG,EAAED,EAAEA,EAAEF,EAAEA,GAAE,EAAI,IAAIM,GAAEJ,EAAEyC,EAAEpB,IAAIzB,EAAEI,EAAEC,GAAGL,EAAEU,KAAKE,IAAK,OAAOsC,GAAE1C,EAAE,SAASJ,EAAEC,IAAIH,EAAEG,GAAGO,EAAEA,EAAEwC,OAAO,KAAKhD,EAAEyC,EAAEyB,SAAS1D,EAAER,MAAMQ,EAAEC,KAAKT,GAAGM,EAAEG,KAAKb,EAAEK,OAAOK,GAAGmC,EAAEoE,MAAM,WAAW,MAAOpE,GAAEkE,KAAK/F,EAAE0D,MAAMrE,EAAEsD,aAAad,EAAEqE,aAAa,SAASlH,GAAG,GAAIE,GAAEY,EAAEuC,KAAKM,UAAU,EAAG,OAAOd,GAAEd,OAAOc,EAAEkE,KAAK/G,GAAG,SAASA,GAAG,MAAO6C,GAAEZ,MAAM/B,EAAE,SAASA,GAAG,MAAO2C,GAAER,QAAQnC,EAAEF,IAAI,OAAO6C,EAAEiE,WAAW,SAAS9G,GAAG,GAAIE,GAAEc,EAAE0D,MAAMrE,EAAES,EAAEuC,KAAKM,UAAU,GAAI,OAAOd,GAAEd,OAAO/B,EAAE,SAASA,GAAG,OAAO6C,EAAEyB,SAASpE,EAAEF,MAAM6C,EAAEsE,IAAI,WAAW,IAAI,GAAInH,GAAEc,EAAEuC,KAAKM,WAAWzD,EAAE2C,EAAEkC,IAAIlC,EAAE8B,MAAM3E,EAAE,WAAWI,EAAEE,MAAMJ,GAAGG,EAAE,EAAEH,EAAEG,EAAEA,IAAID,EAAEC,GAAGwC,EAAE8B,MAAM3E,EAAE,GAAGK,EAAG,OAAOD,IAAGyC,EAAEuE,OAAO,SAASpH,EAAEE,GAAG,GAAG,MAAMF,EAAE,QAAS,KAAI,GAAII,MAAKC,EAAE,EAAEG,EAAER,EAAEoD,OAAO5C,EAAEH,EAAEA,IAAIH,EAAEE,EAAEJ,EAAEK,IAAIH,EAAEG,GAAGD,EAAEJ,EAAEK,GAAG,IAAIL,EAAEK,GAAG,EAAG,OAAOD,IAAGyC,EAAER,QAAQ,SAASrC,EAAEE,EAAEE,GAAG,GAAG,MAAMJ,EAAE,MAAM,EAAG,IAAIK,GAAE,EAAEG,EAAER,EAAEoD,MAAO,IAAGhD,EAAE,CAAC,GAAG,gBAAiBA,GAAE,MAAOC,GAAEwC,EAAEiD,YAAY9F,EAAEE,GAAGF,EAAEK,KAAKH,EAAEG,EAAE,EAAGA,GAAE,EAAED,EAAE4E,KAAKD,IAAI,EAAEvE,EAAEJ,GAAGA,EAAE,GAAGgC,GAAGpC,EAAEqC,UAAUD,EAAE,MAAOpC,GAAEqC,QAAQnC,EAAEE,EAAG,MAAKI,EAAEH,EAAEA,IAAI,GAAGL,EAAEK,KAAKH,EAAE,MAAOG,EAAE,OAAM,IAAIwC,EAAEN,YAAY,SAASvC,EAAEE,EAAEE,GAAG,GAAG,MAAMJ,EAAE,MAAM,EAAG,IAAIK,GAAE,MAAMD,CAAE,IAAGkC,GAAGtC,EAAEuC,cAAcD,EAAE,MAAOjC,GAAEL,EAAEuC,YAAYrC,EAAEE,GAAGJ,EAAEuC,YAAYrC,EAAG,KAAI,GAAIM,GAAEH,EAAED,EAAEJ,EAAEoD,OAAO5C,KAAK,GAAGR,EAAEQ,KAAKN,EAAE,MAAOM,EAAE,OAAM,IAAIqC,EAAEwE,MAAM,SAASrH,EAAEE,EAAEE,GAAG,GAAGuD,UAAUP,SAASlD,EAAEF,GAAG,EAAEA,EAAE,GAAGI,EAAEuD,UAAU,IAAI,CAAE,KAAI,GAAItD,GAAE2E,KAAKD,IAAIC,KAAKsC,MAAMpH,EAAEF,GAAGI,GAAG,GAAGI,EAAE,EAAEE,EAAEJ,MAAMD,GAAGA,EAAEG,GAAGE,EAAEF,KAAKR,EAAEA,GAAGI,CAAE,OAAOM,IAAGmC,EAAED,KAAK,SAAS5C,EAAEE,GAAG,GAAGF,EAAE4C,OAAOD,GAAGA,EAAE,MAAOA,GAAE+B,MAAM1E,EAAEc,EAAEuC,KAAKM,UAAU,GAAI,IAAIvD,GAAEU,EAAEuC,KAAKM,UAAU,EAAG,OAAO,YAAW,MAAO3D,GAAE0E,MAAMxE,EAAEE,EAAEa,OAAOH,EAAEuC,KAAKM,eAAed,EAAE0E,QAAQ,SAASvH,GAAG,GAAIE,GAAEY,EAAEuC,KAAKM,UAAU,EAAG,OAAO,YAAW,MAAO3D,GAAE0E,MAAMzE,KAAKC,EAAEe,OAAOH,EAAEuC,KAAKM,eAAed,EAAE2E,QAAQ,SAASxH,GAAG,GAAIE,GAAEY,EAAEuC,KAAKM,UAAU,EAAG,OAAO,KAAIzD,EAAEkD,SAASlD,EAAE2C,EAAE4E,UAAUzH,IAAIkD,EAAEhD,EAAE,SAASA,GAAGF,EAAEE,GAAG2C,EAAED,KAAK5C,EAAEE,GAAGF,KAAKA,GAAG6C,EAAE6E,QAAQ,SAAS1H,EAAEE,GAAG,GAAIE,KAAK,OAAOF,KAAIA,EAAE2C,EAAEuB,UAAU,WAAW,GAAI/D,GAAEH,EAAEwE,MAAMzE,KAAK0D,UAAW,OAAOd,GAAES,IAAIlD,EAAEC,GAAGD,EAAEC,GAAGD,EAAEC,GAAGL,EAAE0E,MAAMzE,KAAK0D,aAAad,EAAE8E,MAAM,SAAS3H,EAAEE,GAAG,GAAIE,GAAEU,EAAEuC,KAAKM,UAAU,EAAG,OAAOiE,YAAW,WAAW,MAAO5H,GAAE0E,MAAM,KAAKtE,IAAIF,IAAI2C,EAAEgF,MAAM,SAAS7H,GAAG,MAAO6C,GAAE8E,MAAMjD,MAAM7B,GAAG7C,EAAE,GAAGiB,OAAOH,EAAEuC,KAAKM,UAAU,MAAMd,EAAEiF,SAAS,SAAS9H,EAAEE,GAAG,GAAIE,GAAEC,EAAEG,EAAEE,EAAEE,EAAE,EAAEE,EAAE,WAAWF,EAAE,GAAImH,MAAKvH,EAAE,KAAKE,EAAEV,EAAE0E,MAAMtE,EAAEC,GAAI,OAAO,YAAW,GAAIW,GAAE,GAAI+G,MAAK7G,EAAEhB,GAAGc,EAAEJ,EAAG,OAAOR,GAAEH,KAAKI,EAAEsD,UAAU,GAAGzC,GAAG8G,aAAaxH,GAAGA,EAAE,KAAKI,EAAEI,EAAEN,EAAEV,EAAE0E,MAAMtE,EAAEC,IAAIG,IAAIA,EAAEoH,WAAW9G,EAAEI,IAAIR,IAAImC,EAAEoF,SAAS,SAASjI,EAAEE,EAAEE,GAAG,GAAIC,GAAEG,CAAE,OAAO,YAAW,GAAIE,GAAET,KAAKW,EAAE+C,UAAU7C,EAAE,WAAWT,EAAE,KAAKD,IAAII,EAAER,EAAE0E,MAAMhE,EAAEE,KAAKI,EAAEZ,IAAIC,CAAE,OAAO2H,cAAa3H,GAAGA,EAAEuH,WAAW9G,EAAEZ,GAAGc,IAAIR,EAAER,EAAE0E,MAAMhE,EAAEE,IAAIJ,IAAIqC,EAAEqF,KAAK,SAASlI,GAAG,GAAIE,GAAEE,GAAE,CAAG,OAAO,YAAW,MAAOA,GAAEF,GAAGE,GAAE,EAAGF,EAAEF,EAAE0E,MAAMzE,KAAK0D,WAAW3D,EAAE,KAAKE,KAAK2C,EAAEsF,KAAK,SAASnI,EAAEE,GAAG,MAAO,YAAW,GAAIE,IAAGJ,EAAG,OAAOY,GAAE8D,MAAMtE,EAAEuD,WAAWzD,EAAEwE,MAAMzE,KAAKG,KAAKyC,EAAEuF,QAAQ,WAAW,GAAIpI,GAAE2D,SAAU,OAAO,YAAW,IAAI,GAAIzD,GAAEyD,UAAUvD,EAAEJ,EAAEoD,OAAO,EAAEhD,GAAG,EAAEA,IAAIF,GAAGF,EAAEI,GAAGsE,MAAMzE,KAAKC,GAAI,OAAOA,GAAE,KAAK2C,EAAEwF,MAAM,SAASrI,EAAEE,GAAG,MAAO,IAAGF,EAAEE,IAAI,WAAW,MAAO,KAAIF,EAAEE,EAAEwE,MAAMzE,KAAK0D,WAAW,SAASd,EAAEH,KAAKvC,GAAG,SAASH,GAAG,GAAGA,IAAIS,OAAOT,GAAG,KAAM,IAAI4D,WAAU,iBAAkB,IAAI1D,KAAK,KAAI,GAAIE,KAAKJ,GAAE6C,EAAES,IAAItD,EAAEI,KAAKF,EAAEA,EAAEkD,QAAQhD,EAAG,OAAOF,IAAG2C,EAAEmD,OAAO,SAAShG,GAAG,GAAIE,KAAK,KAAI,GAAIE,KAAKJ,GAAE6C,EAAES,IAAItD,EAAEI,IAAIF,EAAEW,KAAKb,EAAEI,GAAI,OAAOF,IAAG2C,EAAEyF,MAAM,SAAStI,GAAG,GAAIE,KAAK,KAAI,GAAIE,KAAKJ,GAAE6C,EAAES,IAAItD,EAAEI,IAAIF,EAAEW,MAAMT,EAAEJ,EAAEI,IAAK,OAAOF,IAAG2C,EAAE0F,OAAO,SAASvI,GAAG,GAAIE,KAAK,KAAI,GAAIE,KAAKJ,GAAE6C,EAAES,IAAItD,EAAEI,KAAKF,EAAEF,EAAEI,IAAIA,EAAG,OAAOF,IAAG2C,EAAE4E,UAAU5E,EAAE2F,QAAQ,SAASxI,GAAG,GAAIE,KAAK,KAAI,GAAIE,KAAKJ,GAAE6C,EAAE4B,WAAWzE,EAAEI,KAAKF,EAAEW,KAAKT,EAAG,OAAOF,GAAEwF,QAAQ7C,EAAE4F,OAAO,SAASzI,GAAG,MAAOkD,GAAEpC,EAAEuC,KAAKM,UAAU,GAAG,SAASzD,GAAG,GAAGA,EAAE,IAAI,GAAIE,KAAKF,GAAEF,EAAEI,GAAGF,EAAEE,KAAKJ,GAAG6C,EAAE6F,KAAK,SAAS1I,GAAG,GAAIE,MAAKE,EAAEY,EAAE0D,MAAMrE,EAAES,EAAEuC,KAAKM,UAAU,GAAI,OAAOT,GAAE9C,EAAE,SAASA,GAAGA,IAAKJ,KAAIE,EAAEE,GAAGJ,EAAEI,MAAMF,GAAG2C,EAAE8F,KAAK,SAAS3I,GAAG,GAAIE,MAAKE,EAAEY,EAAE0D,MAAMrE,EAAES,EAAEuC,KAAKM,UAAU,GAAI,KAAI,GAAInD,KAAKR,GAAE6C,EAAEyB,SAASlE,EAAEI,KAAKN,EAAEM,GAAGR,EAAEQ,GAAI,OAAON,IAAG2C,EAAE+F,SAAS,SAAS5I,GAAG,MAAOkD,GAAEpC,EAAEuC,KAAKM,UAAU,GAAG,SAASzD,GAAG,GAAGA,EAAE,IAAI,GAAIE,KAAKF,GAAE,MAAMF,EAAEI,KAAKJ,EAAEI,GAAGF,EAAEE,MAAMJ,GAAG6C,EAAEgG,MAAM,SAAS7I,GAAG,MAAO6C,GAAEiG,SAAS9I,GAAG6C,EAAEJ,QAAQzC,GAAGA,EAAEe,QAAQ8B,EAAE4F,UAAUzI,GAAGA,GAAG6C,EAAEkG,IAAI,SAAS/I,EAAEE,GAAG,MAAOA,GAAEF,GAAGA,EAAG,IAAIgJ,GAAE,SAAShJ,EAAEE,EAAEE,EAAEC,GAAG,GAAGL,IAAIE,EAAE,MAAO,KAAIF,GAAG,EAAEA,GAAG,EAAEE,CAAE,IAAG,MAAMF,GAAG,MAAME,EAAE,MAAOF,KAAIE,CAAEF,aAAa6C,KAAI7C,EAAEA,EAAE8C,UAAU5C,YAAa2C,KAAI3C,EAAEA,EAAE4C,SAAU,IAAItC,GAAEU,EAAEmC,KAAKrD,EAAG,IAAGQ,GAAGU,EAAEmC,KAAKnD,GAAG,OAAM,CAAG,QAAOM,GAAG,IAAI,kBAAkB,MAAOR,IAAGE,EAAE,EAAG,KAAI,kBAAkB,MAAOF,KAAIA,EAAEE,IAAIA,EAAE,GAAGF,EAAE,EAAEA,GAAG,EAAEE,EAAEF,IAAIE,CAAE,KAAI,gBAAgB,IAAI,mBAAmB,OAAOF,IAAIE,CAAE,KAAI,kBAAkB,MAAOF,GAAEiJ,QAAQ/I,EAAE+I,QAAQjJ,EAAEkJ,QAAQhJ,EAAEgJ,QAAQlJ,EAAEmJ,WAAWjJ,EAAEiJ,WAAWnJ,EAAEoJ,YAAYlJ,EAAEkJ,WAAW,GAAG,gBAAiBpJ,IAAG,gBAAiBE,GAAE,OAAM,CAAG,KAAI,GAAIQ,GAAEN,EAAEgD,OAAO1C,KAAK,GAAGN,EAAEM,IAAIV,EAAE,MAAOK,GAAEK,IAAIR,CAAEE,GAAES,KAAKb,GAAGK,EAAEQ,KAAKX,EAAG,IAAIU,GAAE,EAAEE,GAAE,CAAG,IAAG,kBAAkBN,GAAG,GAAGI,EAAEZ,EAAEoD,OAAOtC,EAAEF,GAAGV,EAAEkD,OAAO,KAAKxC,MAAME,EAAEkI,EAAEhJ,EAAEY,GAAGV,EAAEU,GAAGR,EAAEC,WAAW,CAAC,GAAIW,GAAEhB,EAAEqJ,YAAYjI,EAAElB,EAAEmJ,WAAY,IAAGrI,IAAII,KAAKyB,EAAE4B,WAAWzD,IAAIA,YAAaA,IAAG6B,EAAE4B,WAAWrD,IAAIA,YAAaA,IAAG,OAAM,CAAG,KAAI,GAAIE,KAAKtB,GAAE,GAAG6C,EAAES,IAAItD,EAAEsB,KAAKV,MAAME,EAAE+B,EAAES,IAAIpD,EAAEoB,IAAI0H,EAAEhJ,EAAEsB,GAAGpB,EAAEoB,GAAGlB,EAAEC,KAAK,KAAM,IAAGS,EAAE,CAAC,IAAIQ,IAAKpB,GAAE,GAAG2C,EAAES,IAAIpD,EAAEoB,KAAKV,IAAI,KAAME,IAAGF,GAAG,MAAOR,GAAEkJ,MAAMjJ,EAAEiJ,MAAMxI,EAAG+B,GAAE0G,QAAQ,SAASvJ,EAAEE,GAAG,MAAO8I,GAAEhJ,EAAEE,UAAU2C,EAAEgC,QAAQ,SAAS7E,GAAG,GAAG,MAAMA,EAAE,OAAM,CAAG,IAAG6C,EAAEJ,QAAQzC,IAAI6C,EAAE2G,SAASxJ,GAAG,MAAO,KAAIA,EAAEoD,MAAO,KAAI,GAAIlD,KAAKF,GAAE,GAAG6C,EAAES,IAAItD,EAAEE,GAAG,OAAM,CAAG,QAAM,GAAI2C,EAAE4G,UAAU,SAASzJ,GAAG,SAASA,GAAG,IAAIA,EAAE0J,WAAW7G,EAAEJ,QAAQD,GAAG,SAASxC,GAAG,MAAM,kBAAkBkB,EAAEmC,KAAKrD,IAAI6C,EAAEiG,SAAS,SAAS9I,GAAG,MAAOA,KAAIS,OAAOT,IAAIkD,GAAG,YAAY,WAAW,SAAS,SAAS,OAAO,UAAU,SAASlD,GAAG6C,EAAE,KAAK7C,GAAG,SAASE,GAAG,MAAOgB,GAAEmC,KAAKnD,IAAI,WAAWF,EAAE,OAAO6C,EAAE8G,YAAYhG,aAAad,EAAE8G,YAAY,SAAS3J,GAAG,SAASA,IAAI6C,EAAES,IAAItD,EAAE,aAAa,kBAAkB,MAAM6C,EAAE4B,WAAW,SAASzE,GAAG,MAAM,kBAAmBA,KAAI6C,EAAE+G,SAAS,SAAS5J,GAAG,MAAO4J,UAAS5J,KAAK6J,MAAMC,WAAW9J,KAAK6C,EAAEgH,MAAM,SAAS7J,GAAG,MAAO6C,GAAEkH,SAAS/J,IAAIA,IAAIA,GAAG6C,EAAEmH,UAAU,SAAShK,GAAG,MAAOA,MAAI,GAAIA,KAAI,GAAI,oBAAoBkB,EAAEmC,KAAKrD,IAAI6C,EAAEoH,OAAO,SAASjK,GAAG,MAAO,QAAOA,GAAG6C,EAAEqH,YAAY,SAASlK,GAAG,MAAW,UAAJA,GAAY6C,EAAES,IAAI,SAAStD,EAAEE,GAAG,MAAOkB,GAAEiC,KAAKrD,EAAEE,IAAI2C,EAAEsH,WAAW,WAAW,MAAOnK,GAAEG,EAAED,EAAED,MAAM4C,EAAEuB,SAAS,SAASpE,GAAG,MAAOA,IAAG6C,EAAEuH,MAAM,SAASpK,EAAEE,EAAEE,GAAG,IAAI,GAAIC,GAAEC,MAAMN,GAAGQ,EAAE,EAAER,EAAEQ,EAAEA,IAAIH,EAAEG,GAAGN,EAAEmD,KAAKjD,EAAEI,EAAG,OAAOH,IAAGwC,EAAEwC,OAAO,SAASrF,EAAEE,GAAG,MAAO,OAAMA,IAAIA,EAAEF,EAAEA,EAAE,GAAGA,EAAEgF,KAAKqF,MAAMrF,KAAKK,UAAUnF,EAAEF,EAAE,IAAK,IAAIsK,IAAGC,QAAQC,IAAI,QAAQC,IAAI,OAAOC,IAAI,OAAOC,IAAI,SAASC,IAAI,SAASC,IAAI,UAAWP,GAAEQ,SAASjI,EAAE0F,OAAO+B,EAAEC,OAAQ,IAAIQ,IAAGR,OAAOS,OAAO,IAAInI,EAAEH,KAAK4H,EAAEC,QAAQU,KAAK,IAAI,IAAI,KAAKH,SAASE,OAAO,IAAInI,EAAEH,KAAK4H,EAAEQ,UAAUG,KAAK,KAAK,IAAI,KAAMpI,GAAEM,MAAM,SAAS,YAAY,SAASnD,GAAG6C,EAAE7C,GAAG,SAASE,GAAG,MAAO,OAAMA,EAAE,IAAI,GAAGA,GAAGgL,QAAQH,EAAE/K,GAAG,SAASE,GAAG,MAAOoK,GAAEtK,GAAGE,QAAQ2C,EAAEsI,OAAO,SAASnL,EAAEE,GAAG,GAAG,MAAMF,EAAE,MAAO,KAAK,IAAII,GAAEJ,EAAEE,EAAG,OAAO2C,GAAE4B,WAAWrE,GAAGA,EAAEiD,KAAKrD,GAAGI,GAAGyC,EAAEuI,MAAM,SAASpL,GAAGkD,EAAEL,EAAE4E,UAAUzH,GAAG,SAASE,GAAG,GAAIE,GAAEyC,EAAE3C,GAAGF,EAAEE,EAAG2C,GAAEtC,UAAUL,GAAG,WAAW,GAAIF,IAAGC,KAAK6C,SAAU,OAAOlC,GAAE8D,MAAM1E,EAAE2D,WAAW0H,EAAEhI,KAAKpD,KAAKG,EAAEsE,MAAM7B,EAAE7C,OAAQ,IAAIsL,GAAE,CAAEzI,GAAE0I,SAAS,SAASvL,GAAG,GAAIE,KAAIoL,EAAE,EAAG,OAAOtL,GAAEA,EAAEE,EAAEA,GAAG2C,EAAE2I,kBAAkBC,SAAS,kBAAkBC,YAAY,mBAAmBnB,OAAO,mBAAoB,IAAIoB,GAAE,OAAOC,GAAGhB,IAAI,IAAIiB,KAAK,KAAKC,KAAK,IAAIC,KAAK,IAAIC,IAAI,IAAIC,SAAS,QAAQC,SAAS,SAASC,EAAE,8BAA+BtJ,GAAEuJ,SAAS,SAASpM,EAAEE,EAAEE,GAAG,GAAIC,EAAED,GAAEyC,EAAE+F,YAAYxI,EAAEyC,EAAE2I,iBAAkB,IAAIhL,GAAEwK,SAAS5K,EAAEmK,QAAQoB,GAAG1C,QAAQ7I,EAAEsL,aAAaC,GAAG1C,QAAQ7I,EAAEqL,UAAUE,GAAG1C,QAAQgC,KAAK,KAAK,KAAK,KAAKvK,EAAE,EAAEE,EAAE,QAASZ,GAAEkL,QAAQ1K,EAAE,SAASN,EAAEE,EAAEC,EAAEG,EAAEM,GAAG,MAAOF,IAAGZ,EAAEe,MAAML,EAAEI,GAAGoK,QAAQiB,EAAE,SAASnM,GAAG,MAAM,KAAK4L,EAAE5L,KAAKI,IAAIQ,GAAG,cAAcR,EAAE,kCAAkCC,IAAIO,GAAG,cAAcP,EAAE,wBAAwBG,IAAII,GAAG,OAAOJ,EAAE,YAAYE,EAAEI,EAAEZ,EAAEkD,OAAOlD,IAAIU,GAAG,OAAOR,EAAEiM,WAAWzL,EAAE,mBAAmBA,EAAE,OAAOA,EAAE,4FAA+FA,EAAE,eAAgB,KAAIP,EAAEM,SAASP,EAAEiM,UAAU,MAAM,IAAIzL,GAAG,MAAME,GAAG,KAAMA,GAAEmI,OAAOrI,EAAEE,EAAE,GAAGZ,EAAE,MAAOG,GAAEH,EAAE2C,EAAG,IAAI7B,GAAE,SAAShB,GAAG,MAAOK,GAAEgD,KAAKpD,KAAKD,EAAE6C,GAAI,OAAO7B,GAAEiI,OAAO,aAAa7I,EAAEiM,UAAU,OAAO,OAAOzL,EAAE,IAAII,GAAG6B,EAAEyJ,MAAM,SAAStM,GAAG,MAAO6C,GAAE7C,GAAGsM,QAAS,IAAIjB,GAAE,SAASrL,GAAG,MAAOC,MAAKsM,OAAO1J,EAAE7C,GAAGsM,QAAQtM,EAAG6C,GAAEuI,MAAMvI,GAAGK,GAAG,MAAM,OAAO,UAAU,QAAQ,OAAO,SAAS,WAAW,SAASlD,GAAG,GAAIE,GAAEG,EAAEL,EAAG6C,GAAEtC,UAAUP,GAAG,WAAW,GAAII,GAAEH,KAAK6C,QAAS,OAAO5C,GAAEwE,MAAMtE,EAAEuD,WAAW,SAAS3D,GAAG,UAAUA,GAAG,IAAII,EAAEgD,cAAehD,GAAE,GAAGiL,EAAEhI,KAAKpD,KAAKG,MAAM8C,GAAG,SAAS,OAAO,SAAS,SAASlD,GAAG,GAAIE,GAAEG,EAAEL,EAAG6C,GAAEtC,UAAUP,GAAG,WAAW,MAAOqL,GAAEhI,KAAKpD,KAAKC,EAAEwE,MAAMzE,KAAK6C,SAASa,eAAed,EAAE4F,OAAO5F,EAAEtC,WAAW+L,MAAM,WAAW,MAAOrM,MAAKsM,QAAO,EAAGtM,MAAMiF,MAAM,WAAW,MAAOjF,MAAK6C,cAAcO,KAAKpD,MACnoa,SAASiJ,GACV,GAAIsD,GAAQC,EAAeC,EAASC,GAEpC,WACE,GAAIC,MAAeC,IAEnBL,GAAS,SAASM,EAAMC,EAAMC,GAC5BJ,EAASE,IAAUC,KAAMA,EAAMC,SAAUA,IAG3CL,EAAYD,EAAUD,EAAgB,SAASK,GA2B7C,QAASG,GAAQC,GACf,GAAwB,MAApBA,EAAMC,OAAO,GAAc,MAAOD,EAItC,KAAK,GAHDE,GAAQF,EAAMG,MAAM,KACpBC,EAAaR,EAAKO,MAAM,KAAKtM,MAAM,EAAG,IAEjCL,EAAE,EAAGQ,EAAEkM,EAAMhK,OAAUlC,EAAFR,EAAKA,IAAK,CACtC,GAAI6M,GAAOH,EAAM1M,EAEjB,IAAa,OAAT6M,EAAiBD,EAAWhE,UAC3B,CAAA,GAAa,MAATiE,EAAgB,QAClBD,GAAWzM,KAAK0M,IAGzB,MAAOD,GAAWrC,KAAK,KArCzB,GAFF0B,EAAUa,UAAYZ,EAEhBC,EAAKC,GAAS,MAAOD,GAAKC,EAG9B,IAFAD,EAAKC,OAEAF,EAASE,GACZ,KAAM,IAAIW,OAAM,yBAA2BX,EAS7C,KAAK,GAFD/J,GAJA2K,EAAMd,EAASE,GACfC,EAAOW,EAAIX,KACXC,EAAWU,EAAIV,SACfW,KAGKjN,EAAE,EAAGQ,EAAE6L,EAAK3J,OAAUlC,EAAFR,EAAKA,IAE9BiN,EAAQ9M,KADM,YAAZkM,EAAKrM,GACMqC,KAEA0J,EAAcQ,EAAQF,EAAKrM,KAI5C,IAAIwE,GAAQ8H,EAAStI,MAAMzE,KAAM0N,EACjC,OAAOd,GAAKC,GAAQ/J,GAAWmC,MAoBnCsH,EAAO,YACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YACA,IAAIC,GAAUF,EAAgB,UAE9BC,GAAY,WAAa,SAAaE,EAAOC,GAC3C,MAAOF,GAAQ3J,IAAI4J,EAAOC,MAGhCxB,EAAO,oBACJ,YAAY,UAAU,WACvB,SAASoB,EAAiBK,EAAiBJ,GACzC,YAuGA,SAASK,GAAUhJ,GACjB,OAASiJ,MAAO,YAAajJ,MAAOA,GAGtC,QAASkJ,GAASC,GAChB,OAASF,MAAO,WAAYE,OAAQA,GA3GtC,GAAIP,GAAUF,EAAgB,WAC1BnL,EAAUwL,EAAgBxL,QAC1B6L,EAAgBL,EAAgBK,aAqDpCT,GAAY,WAAa,SAAoBU,EAASP,GACpD,MAAO,IAAIF,GAAQ,SAASb,GAe1B,QAASuB,GAAkBhJ,GACzB,MAAO,UAASN,GACduJ,EAAWjJ,EAAO0I,EAAUhJ,KAIhC,QAASwJ,GAAiBlJ,GACxB,MAAO,UAAS6I,GACdI,EAAWjJ,EAAO4I,EAASC,KAI/B,QAASI,GAAWjJ,EAAON,GACzByJ,EAAQnJ,GAASN,EACG,MAAd0J,GACJ3B,EAAQ0B,GA7BZ,IAAKlM,EAAQ8L,GACX,KAAM,IAAI3K,WAAU,wCAGtB,IACIiL,GADAD,EAAYL,EAAQnL,MAGxB,IAAkB,IAAdwL,EAEF,WADA3B,MAyBF,KAAK,GArBD0B,GAAU,GAAIrO,OAAMsO,GAqBfpJ,EAAQ,EAAGA,EAAQ+I,EAAQnL,OAAQoC,IAC1CqJ,EAAQN,EAAQ/I,GAEZ8I,EAAcO,GAChBJ,EAAWjJ,EAAO0I,EAAUW,IAE5Bf,EAAQgB,KAAKD,GAAOE,KAAKP,EAAkBhJ,GAAQkJ,EAAiBlJ,KAGvEwI,MAWTxB,EAAO,aACJ,WACD,SAASqB,GACP,YAeA,SAASmB,KACP,MAAO,YACLC,QAAQC,SAASC,IAIrB,QAASC,KACP,GAAIC,GAAa,EACbC,EAAW,GAAIC,GAAwBJ,GACvCK,EAAOC,SAASC,eAAe,GAGnC,OAFAJ,GAASK,QAAQH,GAAQI,eAAe,IAEjC,WACLJ,EAAKK,KAAQR,IAAeA,EAAa,GAI7C,QAASS,KACP,MAAO,YACLlI,WAAWuH,EAAO,IAKtB,QAASA,KACP,IAAK,GAAIzO,GAAI,EAAGA,EAAIqP,EAAM3M,OAAQ1C,IAAK,CACrC,GAAIsP,GAAQD,EAAMrP,GACdsM,EAAWgD,EAAM,GAAIC,EAAMD,EAAM,EACrChD,GAASiD,GAEXF,KA5CFlC,EAAY,WAAa,SAAcb,EAAUiD,GAC/C,GAAI7M,GAAS2M,EAAMlP,MAAMmM,EAAUiD,GACpB,KAAX7M,GAIF8M,IAIJ,IAqCIA,GArCAC,EAAmC,mBAAXC,QAA0BA,UAClDb,EAA0BY,EAAcE,kBAAoBF,EAAcG,uBA0B1EP,IAcFG,GADqB,mBAAZjB,UAAyD,wBAA3B9N,SAASkC,KAAK4L,SACrCD,IACPO,EACOH,IAEAU,MAGtBtD,EAAO,eACJ,WAAW,WACZ,SAASoB,EAAiBC,GACxB,YASA,SAAS0C,GAAUzD,EAAM5H,GACvB,MAAa,YAAT4H,MAIF0D,GAAOC,GAAG,QAASvL,GAII,IAArBvB,UAAUP,OAGLoN,EAAO1D,QAFd0D,EAAO1D,GAAQ5H,GAlBnB,GAAIwL,GAAc9C,EAAgB,WAE9B4C,GACFG,YAAY,EAGdD,GAAYtF,MAAMoF,GAkBlB3C,EAAY2C,OAASA,EACrB3C,EAAY0C,UAAYA,IAE5B/D,EAAO,cACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YACA,IAAIC,GAAUF,EAAgB,UAkC9BC,GAAY,WAAa,SAAeG,GACtC,GAAI4C,KAOJ,OALAA,GAASC,QAAU,GAAI/C,GAAQ,SAASb,EAAS/I,GAC/C0M,EAAS3D,QAAUA,EACnB2D,EAAS1M,OAASA,GACjB8J,GAEI4C,KAGbpE,EAAO,eACJ,WACD,SAASqB,GACP,YACA,IAAIxL,GAAU,SAASyO,EAAW9D,GAChC,IAAK,GAAItM,GAAE,EAAGQ,EAAE4P,EAAU1N,OAAUlC,EAAFR,EAAKA,IACrC,GAAIoQ,EAAUpQ,KAAOsM,EAAY,MAAOtM,EAG1C,OAAO,IAGLqQ,EAAe,SAAS3J,GAC1B,GAAI0J,GAAY1J,EAAO4J,iBAMvB,OAJKF,KACHA,EAAY1J,EAAO4J,sBAGdF,EAOTjD,GAAY,YA2CVzC,MAAO,SAAShE,GAKd,MAJAA,GAAOqJ,GAAKxQ,KAAKwQ,GACjBrJ,EAAO6J,IAAMhR,KAAKgR,IAClB7J,EAAO8J,QAAUjR,KAAKiR,QACtB9J,EAAO4J,kBAAoBG,OACpB/J,GAmBTqJ,GAAI,SAASW,EAAWpE,GACtB,GAAuC8D,GAAnCO,EAAeN,EAAa9Q,KAEhC6Q,GAAYO,EAAaD,GAEpBN,IACHA,EAAYO,EAAaD,OAGU,KAAjC/O,EAAQyO,EAAW9D,IACrB8D,EAAUjQ,KAAKmM,IA2CnBiE,IAAK,SAASG,EAAWpE,GACvB,GAAuC8D,GAAWtL,EAA9C6L,EAAeN,EAAa9Q,KAEhC,OAAK+M,IAKL8D,EAAYO,EAAaD,GAEzB5L,EAAQnD,EAAQyO,EAAW9D,QAEb,KAAVxH,GAAgBsL,EAAUQ,OAAO9L,EAAO,UAR1C6L,EAAaD,QAwCjBF,QAAS,SAASE,EAAWG,GAC3B,GACIT,GAA0B9D,EAD1BqE,EAAeN,EAAa9Q,KAGhC,IAAI6Q,EAAYO,EAAaD,GAE3B,IAAK,GAAI1Q,GAAE,EAAGA,EAAEoQ,EAAU1N,OAAQ1C,KAChCsM,EAAW8D,EAAUpQ,IAEZ6Q,OAMrB/E,EAAO,eACJ,QAAQ,QAAQ,UAAU,WAC3B,SAASoB,EAAiBK,EAAiBuD,EAAiB3D,GAC1D,YAwFA,SAAS9L,GAAO0P,EAAUC,EAAU1D,GAClC,IAAKvL,EAAQgP,GACX,KAAM,IAAI7N,WAAU,oCAGtB,KAAKa,EAAWiN,GACd,KAAM,IAAI9N,WAAU,wDAGtB,OAAOO,GAAIsN,EAAUzD,GAAOe,KAAK,SAAS/I,GACxC,MAAOvE,GAAIgQ,EAAUC,EAAU1D,GAAOe,KAAK,SAAS4C,GACjD,GAAIjR,GACAkR,EAAY5L,EAAO5C,OACnByO,IAEJ,KAAKnR,EAAI,EAAOkR,EAAJlR,EAAeA,IACtBiR,EAAcjR,IAAImR,EAAShR,KAAKmF,EAAOtF,GAE5C,OAAOmR,OAzGd,GAAI1N,GAAMyJ,EAAgB,WACtBnM,EAAMwM,EAAgB,WACtBxJ,EAAa+M,EAAgB/M,WAC7BhC,EAAU+O,EAAgB/O,OA2G9BoL,GAAY,WAAa9L,IAE7ByK,EAAO,aACJ,YAAY,UAAU,WACvB,SAASoB,EAAiBK,EAAiBJ,GACzC,YACA,IAAIC,GAAUF,EAAgB,WAC1BU,EAAgBL,EAAgBK,cAChCwD,EAAS7D,EAAgB6D,MAwF7BjE,GAAY,WAAa,SAAczG,GACrC,MAAO,IAAI0G,GAAQ,SAASb,EAAS/I,GAWpC,QAAS6N,GAAYC,GAClB,MAAO,UAAS9M,GACdyJ,EAAQqD,GAAY9M,EACA,MAAd0J,GACJ3B,EAAQ0B,IAKd,QAASsD,GAAY5D,GACnBO,EAAY,EACZ1K,EAAOmK,GArBT,GAGIQ,GAAOmD,EAHPrD,KACAjM,EAAOoP,EAAO1K,GACdwH,EAAYlM,EAAKU,MAGrB,IAAkB,IAAdwL,EAEF,WADA3B,GAAQ0B,EAkBV,KAAK,GAAIjO,GAAI,EAAGA,EAAIgC,EAAKU,OAAQ1C,IAC/BsR,EAAWtP,EAAKhC,GAChBmO,EAAQzH,EAAO4K,GAEX1D,EAAcO,IAChBF,EAAQqD,GAAYnD,EACA,MAAdD,GACJ3B,EAAQ0B,IAGVb,EAAQgB,KAAKD,GAAOE,KAAKgD,EAAYC,GAAWC,QAM5DzF,EAAO,mBACJ,WAAW,UAAU,WACtB,SAASoB,EAAiBK,EAAiBJ,GACzC,YACA,IAAI2C,GAAS5C,EAAgB4C,OACzB0B,EAAMjE,EAAgBiE,GAE1BrE,GAAY,WAAa,SAAoBuD,EAAWP,EAAS3D,GAE/D,IACEsD,EAAOU,QAAQE,GACbe,KAAMtB,EAAQuB,SAAWvB,EAAQwB,IACjCjB,UAAWA,EACXkB,OAAQzB,EAAQ0B,QAChBC,UAAWtF,GAAS2D,EAAQuB,SAAWlF,EAAMmF,IAC7CrE,MAAO6C,EAAQ4B,OACfC,UAAWR,IACXS,MAAO,GAAIlF,OAAMoD,EAAQ4B,QAAQE,QAEnC,MAAMC,GACNhL,WAAW,WACT,KAAMgL,IACL,OAIXpG,EAAO,YACJ,YAAY,QAAQ,UAAU,WAC/B,SAASoB,EAAiBK,EAAiBuD,EAAiB3D,GAC1D,YACA,IACI1J,IADUyJ,EAAgB,WACpBK,EAAgB,YACtBxL,EAAU+O,EAAgB/O,QAC1BgC,EAAa+M,EAAgB/M,UA+EjCoJ,GAAY,WAAa,SAAa4D,EAAUoB,EAAO7E,GAErD,IAAKvL,EAAQgP,GACX,KAAM,IAAI7N,WAAU,iCAGtB,KAAKa,EAAWoO,GACd,KAAM,IAAIjP,WAAU,qDAGtB,OAAOO,GAAIsN,EAAUzD,GAAOe,KAAK,SAASJ,GACxC,GAEIjO,GAFAoS,EAAYnE,EAAQvL,OACpB2P,IAGJ,KAAKrS,EAAI,EAAOoS,EAAJpS,EAAeA,IACzBqS,EAAclS,KAAKgS,EAAMlE,EAAQjO,IAGnC,OAAOyD,GAAI4O,EAAe/E,QAIlCxB,EAAO,aACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YAKA,SAASmF,GAAoB/F,EAAS/I,GACpC,MAAO,UAAU0O,EAAO1N,GAClB0N,EACF1O,EAAO0O,GAEP3F,EADStJ,UAAUP,OAAS,EACpBrC,EAAMsC,KAAKM,UAAW,GAEtBuB,IAXd,GAAI4I,GAAUF,EAAgB,WAE1B7M,EAAQT,MAAMC,UAAUQ,KAwF5B8M,GAAY,WAAa,SAAmBoF,EAAUC,GACpD,MAAO,YACL,GAAIC,GAAWpS,EAAMsC,KAAKM,WACtByP,EAAUnT,MAAQiT,CAEtB,OAAO,IAAIpF,GAAQ,SAASb,EAAS/I,GACnC4J,EAAQ3J,IAAIgP,GAAUpE,KAAK,SAASoE,GAClC,IACEA,EAAStS,KAAKmS,EAAoB/F,EAAS/I,IAC3C+O,EAASvO,MAAM0O,EAASD,GACxB,MAAM9S,GACN6D,EAAO7D,YAOrBmM,EAAO,gBACJ,WAAW,WAAW,eAAe,UAAU,iBAAiB,gBAAgB,iBAAiB,oBAAoB,mBAAmB,WACzI,SAASoB,EAAiBK,EAAiBuD,EAAiB6B,EAAiBC,EAAiBC,EAAiBC,EAAiBC,EAAiBC,EAAiB7F,GAChK,YAgBA,SAAS8F,MAoGT,QAAS7F,GAAQ8F,EAAU5F,GACzB,IAAKvJ,EAAWmP,GACd,KAAM,IAAIhQ,WAAU,qFAGtB,MAAM3D,eAAgB6N,IACpB,KAAM,IAAIlK,WAAU,wHAGtB3D,MAAKoS,IAAMwB,IACX5T,KAAKwS,OAASzE,EACd/N,KAAK6T,gBAEDtD,EAAOG,YACTA,EAAW,UAAW1Q,MAGpB0T,IAASC,GACXG,EAAeH,EAAU3T,MAI7B,QAAS8T,GAAeH,EAAU/C,GAChC,QAASmD,GAAe9O,GACtB+H,EAAQ4D,EAAS3L,GAGnB,QAAS+O,GAAc5F,GACrBnK,EAAO2M,EAASxC,GAGlB,IACEuF,EAASI,EAAgBC,GACzB,MAAM5T,GACN4T,EAAc5T,IAelB,QAAS6T,GAAUC,EAAQjH,EAAOkH,EAAenC,GAC/C,GAAIoC,GAAcF,EAAOL,aACrB1Q,EAASiR,EAAYjR,MAEzBiR,GAAYjR,GAAU8J,EACtBmH,EAAYjR,EAASkR,GAAaF,EAClCC,EAAYjR,EAASmR,GAAatC,EAGpC,QAASuC,GAAQ3D,EAAS4D,GACxB,GAAIvH,GAAOF,EAAUqH,EAAcxD,EAAQiD,aAAcxB,EAASzB,EAAQ0B,OAEtE/B,GAAOG,YACTA,EAAW8D,IAAYH,EAAY,YAAc,WAAYzD,EAG/D,KAAK,GAAInQ,GAAI,EAAGA,EAAI2T,EAAYjR,OAAQ1C,GAAK,EAC3CwM,EAAQmH,EAAY3T,GACpBsM,EAAWqH,EAAY3T,EAAI+T,GAE3BC,EAAeD,EAASvH,EAAOF,EAAUsF,EAG3CzB,GAAQiD,aAAe,KA8TzB,QAASY,GAAeD,EAAS5D,EAAS7D,EAAUsF,GAClD,GACIpN,GAAO0N,EAAO+B,EAAWC,EADzBC,EAAcpQ,EAAWuI,EAG7B,IAAI6H,EACF,IACE3P,EAAQ8H,EAASsF,GACjBqC,GAAY,EACZ,MAAMtU,GACNuU,GAAS,EACThC,EAAQvS,MAGV6E,GAAQoN,EACRqC,GAAY,CAGVG,GAAejE,EAAS3L,KAEjB2P,GAAeF,EACxB1H,EAAQ4D,EAAS3L,GACR0P,EACT1Q,EAAO2M,EAAS+B,GACP6B,IAAYH,EACrBrH,EAAQ4D,EAAS3L,GACRuP,IAAYF,GACrBrQ,EAAO2M,EAAS3L,IAIpB,QAAS4P,GAAejE,EAAS3L,GAC/B,GACA6P,GADIhG,EAAO,IAGX,KACE,GAAI8B,IAAY3L,EACd,KAAM,IAAItB,WAAU,uDAGtB,IAAIoR,EAAiB9P,KACnB6J,EAAO7J,EAAM6J,KAETtK,EAAWsK,IAiBb,MAhBAA,GAAK1L,KAAK6B,EAAO,SAAS+P,GACxB,MAAIF,IAAmB,GACvBA,GAAW,OAEP7P,IAAU+P,EACZhI,EAAQ4D,EAASoE,GAEjBC,EAAQrE,EAASoE,MAElB,SAASA,GACV,MAAIF,IAAmB,GACvBA,GAAW,MAEX7Q,GAAO2M,EAASoE,KACf,kBAAoBpE,EAAQ4B,QAAU,sBAElC,EAGX,MAAOG,GACP,MAAImC,IAAmB,GACvB7Q,EAAO2M,EAAS+B,IACT,GAGT,OAAO,EAGT,QAAS3F,GAAQ4D,EAAS3L,GACpB2L,IAAY3L,EACdgQ,EAAQrE,EAAS3L,GACP4P,EAAejE,EAAS3L,IAClCgQ,EAAQrE,EAAS3L,GAIrB,QAASgQ,GAAQrE,EAAS3L,GACpB2L,EAAQsE,SAAWC,IACvBvE,EAAQsE,OAASE,EACjBxE,EAAQ0B,QAAUrN,EAElBsL,EAAO8E,MAAMC,EAAoB1E,IAGnC,QAAS3M,GAAO2M,EAASxC,GACnBwC,EAAQsE,SAAWC,IACvBvE,EAAQsE,OAASE,EACjBxE,EAAQ0B,QAAUlE,EAElBmC,EAAO8E,MAAME,EAAkB3E,IAGjC,QAAS0E,GAAmB1E,GAC1B2D,EAAQ3D,EAASA,EAAQsE,OAASb,GAGpC,QAASkB,GAAiB3E,GACpBA,EAAQ4E,UACV5E,EAAQ4E,SAAS5E,EAAQ0B,SAG3BiC,EAAQ3D,EAASA,EAAQsE,OAASZ,GAjmBpC,GAAI/D,GAAS5C,EAAgB4C,OAEzBG,GADc1C,EAAgB,WACjBuD,EAAgB,YAC7BwD,EAAmB3B,EAAgB2B,iBACnCvQ,EAAa4O,EAAgB5O,WAC7ByN,EAAMmB,EAAgBnB,IACtBpD,EAAOwE,EAAgB,WACvBnP,EAAMoP,EAAgB,WACtBmC,EAAOlC,EAAgB,WACvBmC,EAAUlC,EAAgB,WAC1BmC,EAASlC,EAAgB,WAEzBmC,EAAU,QAAU3D,IAAQ,IAC5B2B,EAAU,CAIdhG,GAAY,WAAaC,EAwIzBA,EAAQgB,KAAOA,EACfhB,EAAQ3J,IAAMA,EACd2J,EAAQ4H,KAAOA,EACf5H,EAAQb,QAAU0I,EAClB7H,EAAQ5J,OAAS0R,CAEjB,IAAIR,GAAY,OACZC,EAAY,EACZf,EAAY,EACZC,EAAY,CA4BhBzG,GAAQvN,WAIN8I,YAAayE,EAEbuE,IAAKlB,OACLiB,SAAUyD,EACVpD,OAAQtB,OAERgE,OAAQhE,OACRoB,QAASpB,OACT2C,aAAc3C,OAEdsE,SAAU,SAAUpH,GAClBmC,EAAOU,QAAQ,QAAS7C,IAuM1BU,KAAM,SAASqF,EAAenC,EAAajE,GACzC,GAAI6C,GAAU5Q,IACdA,MAAKwV,SAAW,IAEhB,IAAIK,GAAc,GAAI7V,MAAKoJ,YAAYsK,EAAM3F,EAE7C,IAAI/N,KAAKkV,OAAQ,CACf,GAAIrE,GAAYnN,SAChB6M,GAAO8E,MAAM,WACXZ,EAAe7D,EAAQsE,OAAQW,EAAahF,EAAUD,EAAQsE,OAAS,GAAItE,EAAQ0B,eAGrF2B,GAAUjU,KAAM6V,EAAa1B,EAAenC,EAO9C,OAJIzB,GAAOG,YACTA,EAAW,UAAWE,EAASiF,GAG1BA,GA+BTC,QAAS,SAAS9D,EAAajE,GAC7B,MAAO/N,MAAK8O,KAAK,KAAMkD,EAAajE,IAmCtCgI,UAAW,SAAShJ,EAAUgB,GAC5B,GAAI3E,GAAcpJ,KAAKoJ,WAEvB,OAAOpJ,MAAK8O,KAAK,SAAS7J,GACxB,MAAOmE,GAAYyF,KAAK9B,KAAY+B,KAAK,WACvC,MAAO7J,MAER,SAASmJ,GACV,MAAOhF,GAAYyF,KAAK9B,KAAY+B,KAAK,WACvC,KAAMV,MAEPL,OA+GXxB,EAAO,oBACJ,WAAW,WACZ,SAASoB,EAAiBC,GACxB,YACA,IAAIpL,GAAUmL,EAAgBnL,QAC1B6L,EAAgBV,EAAgBU,aAiDpCT,GAAY,WAAa,SAAaU,EAASP,GAG7C,GAAIiI,GAAchW,IAElB,OAAO,IAAIgW,GAAY,SAAShJ,EAAS/I,GAcvC,QAASgS,GAAc1Q,GACrB,MAAO,UAASN,GACdyJ,EAAQnJ,GAASN,EACG,MAAd0J,GACJ3B,EAAQ0B,IAKd,QAASsD,GAAY5D,GACnBO,EAAY,EACZ1K,EAAOmK,GAxBT,IAAK5L,EAAQ8L,GACX,KAAM,IAAI3K,WAAU,iCAGtB,IAEIiL,GAFAD,EAAYL,EAAQnL,OACpBuL,EAAU,GAAIrO,OAAMsO,EAGxB,IAAkB,IAAdA,EAEF,WADA3B,GAAQ0B,EAkBV,KAAK,GAAInJ,GAAQ,EAAGA,EAAQ+I,EAAQnL,OAAQoC,IAC1CqJ,EAAQN,EAAQ/I,GACZ8I,EAAcO,IAChBF,EAAQnJ,GAASqJ,EACG,MAAdD,GACJ3B,EAAQ0B,IAGVsH,EAAYnH,KAAKD,GAAOE,KAAKmH,EAAc1Q,GAAQyM,IAGtDjE,MAGTxB,EAAO,qBACJ,WACD,SAASqB,GACP,YAuDAA,GAAY,WAAa,SAAczG,EAAQ4G,GAE7C,GAAIiI,GAAchW,IAElB,OAAImH,IAA4B,gBAAXA,IAAuBA,EAAOiC,cAAgB4M,EAC1D7O,EAGF,GAAI6O,GAAY,SAAShJ,GAC9BA,EAAQ7F,IACP4G,MAGTxB,EAAO,qBACJ,WAAW,WACZ,SAASoB,EAAiBC,GACxB,YAGA,IAAIpL,GAAUmL,EAAgBnL,QAE1B6L,GADaV,EAAgBnJ,WACbmJ,EAAgBU,cA8DpCT,GAAY,WAAa,SAAcU,EAASP,GAE9C,GAAwBa,GAApBoH,EAAchW,IAElB,OAAO,IAAIgW,GAAY,SAAShJ,EAAS/I,GAOvC,QAASkQ,GAAclP,GAAaiR,IAAWA,GAAU,EAAOlJ,EAAQ/H,IACxE,QAAS+M,GAAY5D,GAAe8H,IAAWA,GAAU,EAAOjS,EAAOmK,IAPvE,IAAK5L,EAAQ8L,GACX,KAAM,IAAI3K,WAAU,kCAQtB,KAAK,GALDuS,IAAU,EAKLzV,EAAI,EAAGA,EAAI6N,EAAQnL,OAAQ1C,IAAK,CAEvC,GADAmO,EAAQN,EAAQ7N,GACZ4N,EAAcO,GAGhB,MAFAsH,IAAU,MACVlJ,GAAQ4B,EAGRoH,GAAYnH,KAAKD,GAAOE,KAAKqF,EAAenC,KAG/CjE,MAGTxB,EAAO,uBACJ,WACD,SAASqB,GACP,YAoCAA,GAAY,WAAa,SAAgBQ,EAAQL,GAE/C,GAAIiI,GAAchW,IAElB,OAAO,IAAIgW,GAAY,SAAUhJ,EAAS/I,GACxCA,EAAOmK,IACNL,MAGTxB,EAAO,wBACJ,WACD,SAASqB,GACP,YAiCAA,GAAY,WAAa,SAAiB3I,EAAO8I,GAE/C,GAAIiI,GAAchW,IAElB,OAAO,IAAIgW,GAAY,SAAShJ,GAC9BA,EAAQ/H,IACP8I,MAGTxB,EAAO,aACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YACA,IAAIC,GAAUF,EAAgB,UAE9BC,GAAY,WAAa,SAAcE,EAAOC,GAC5C,MAAOF,GAAQ4H,KAAK3H,EAAOC,MAGjCxB,EAAO,eACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YACA,IAAIC,GAAUF,EAAgB,UAE9BC,GAAY,WAAa,SAAgBQ,EAAQL,GAC/C,MAAOF,GAAQ5J,OAAOmK,EAAQL,MAGpCxB,EAAO,gBACJ,YAAY,WACb,SAASoB,EAAiBC,GACxB,YACA,IAAIC,GAAUF,EAAgB,UAE9BC,GAAY,WAAa,SAAiB3I,EAAO8I,GAC/C,MAAOF,GAAQb,QAAQ/H,EAAO8I,MAGpCxB,EAAO,gBACJ,WACD,SAASqB,GACP,YAuCAA,GAAY,WAAa,SAAiBQ,GAIxC,KAHAzG,YAAW,WACT,KAAMyG,KAEFA,KAGZ7B,EAAO,cACJ,WACD,SAASqB,GACP,YACA,SAASmH,GAAiBxS,GACxB,MAAoB,kBAANA,IAAkC,gBAANA,IAAwB,OAANA,EAGd,QAASiC,GAAWjC,GAClE,MAAoB,kBAANA,GAGoB,QAAS8L,GAAc9L,GACzD,OAAQwS,EAAiBxS,GAGe,QAASC,GAAQD,GACzD,MAA6C,mBAAtC/B,OAAOF,UAAUY,SAASkC,KAAKb,GATxCqL,EAAYmH,iBAAmBA,EAI/BnH,EAAYpJ,WAAaA,EAIzBoJ,EAAYS,cAAgBA,EAI5BT,EAAYpL,QAAUA,CAEtB,IAAIyP,GAAMnK,KAAKmK,KAAO,WAAa,OAAO,GAAInK,OAAOqO,UACrDvI,GAAYqE,IAAMA,CAClB,IAAIJ,GAASrR,OAAOiC,MAAQ,SAAS0E,GACnC,GAAI+D,KAEJ,KAAK,GAAIkL,KAAQjP,GACf+D,EAAOtK,KAAKwV,EAGd,OAAOlL,GAET0C,GAAYiE,OAASA,IAEzBtF,EAAO,QACJ,iBAAiB,gBAAgB,cAAc,aAAa,qBAAqB,cAAc,cAAc,iBAAiB,eAAe,gBAAgB,aAAa,iBAAiB,gBAAgB,cAAc,gBAAgB,WAC1O,SAASoB,EAAiBK,EAAiBuD,EAAiB6B,EAAiBC,EAAiBC,EAAiBC,EAAiBC,EAAiBC,EAAiB4C,EAAkBC,EAAkBC,EAAkBC,EAAkBC,EAAkBC,EAAkB9I,GAC5Q,YAoBA,SAASyH,GAAMtI,EAAUiD,GACvBO,EAAO8E,MAAMtI,EAAUiD,GAGzB,QAASQ,KACPD,EAAOC,GAAG/L,MAAM8L,EAAQ7M,WAG1B,QAASsN,KACPT,EAAOS,IAAIvM,MAAM8L,EAAQ7M,WA5B3B,GAAImK,GAAUF,EAAgB,WAC1B8C,EAAczC,EAAgB,WAC9B2I,EAAYpF,EAAgB,WAC5BrN,EAAMkP,EAAgB,WACtBwD,EAAavD,EAAgB,WAC7BoC,EAAOnC,EAAgB,WACvBuD,EAAOtD,EAAgB,WACvBuD,EAAUtD,EAAgB,WAC1B5L,EAAQ6L,EAAgB,WACxBlD,EAAS8F,EAAiB9F,OAC1BD,EAAY+F,EAAiB/F,UAC7B9O,EAAM8U,EAAiB,WACvBtJ,EAAUuJ,EAAiB,WAC3BtS,EAASuS,EAAiB,WAC1BO,EAAON,EAAiB,WACxB3U,EAAS4U,EAAiB,UAiB9B,IAfAnG,EAAO8E,MAAQ0B,EAeO,mBAAX5G,SAAwE,gBAAvCA,QAAO6G,4BAA0C,CAC3F,GAAInG,GAAYV,OAAO6G,2BACvB1G,GAAU,cAAc,EACxB,KAAK,GAAIa,KAAaN,GAChBA,EAAUzP,eAAe+P,IAC3BX,EAAGW,EAAWN,EAAUM,IAK9BvD,EAAYC,QAAUA,EACtBD,EAAY6C,YAAcA,EAC1B7C,EAAY1J,IAAMA,EAClB0J,EAAYgJ,WAAaA,EACzBhJ,EAAY6H,KAAOA,EACnB7H,EAAYiJ,KAAOA,EACnBjJ,EAAYkJ,QAAUA,EACtBlJ,EAAYhG,MAAQA,EACpBgG,EAAY+I,UAAYA,EACxB/I,EAAY0C,UAAYA,EACxB1C,EAAY4C,GAAKA,EACjB5C,EAAYoD,IAAMA,EAClBpD,EAAYZ,QAAUA,EACtBY,EAAY3J,OAASA,EACrB2J,EAAYyH,MAAQA,EACpBzH,EAAYpM,IAAMA,EAClBoM,EAAY9L,OAASA,IAEzBmH,EAAOgO,KAAOzK,EAAc,SAC1B2D,OAGF,IAAI+G,QAASA,UACbA,QAAOlU,QAAU,QAEjBkU,OAAOC,QAAUD,OAAOC,YAExBD,OAAOE,SAAWF,OAAOE,UAAY,WAErCF,OAAOG,UAEP,SAAUC,GAET,GAAIC,GAAeD,EAAKE,SAEpBA,EAAOF,EAAKE,KAAO,WACtB,GAAIC,GAAUnG,CA+Bd,OA5B2B,mBAAjB5N,WAAU,IACK,gBAAjBA,WAAU,KAEjB+T,EAAW/T,UAAU,GAEjBA,UAAU,IAA8B,gBAAjBA,WAAU,IACpC4N,EAAU5N,UAAU,GACpB4N,EAAQmG,SAAWA,GAEnBnG,GAAYmG,SAAaA,IAcvB/T,UAAU,IAA8B,gBAAjBA,WAAU,KACpC4N,EAAU5N,UAAU,IAId,GAAIwT,QAAOQ,KAAKpG,GAGxBpR,GAAEsI,OAAOgP,GACRtN,WAAa,WAEZ,MADAoN,GAAKE,KAAOD,EACLvX,QAKa,kBAAXuM,SAAyBA,OAAOoL,IAE3CpL,OAAO,WAAY,MAAOiL,KACA,mBAAVzU,SAAyBA,OAAOD,UAEhDC,OAAOD,QAAU0U,IAEfrH,QAEH+G,OAAOQ,KAAO,SAASpG,GAItBtR,KAAK4X,SAAW1X,EAAEyI,SAAS2I,OAC1BmG,SAAW,KACXI,QAAU,KACVC,WAAa,KACbC,SAAS,EACTC,aAAc,EACdC,OAAQ,EACRC,QAAS,EACTC,WAAY,EACZC,MAAQ,KACRC,OAAQ,KACRC,cAAgB,KAChBC,YAAc,KACdC,eAAgB,IAChBC,IAAK,OACLC,QAAS,EACTC,SAAS,EACTC,QAAS,EACTC,QAAO,EACPC,UACAC,YACAC,iBAAiB,EACjBC,cAAe,WAGhBjZ,KAAK4X,SAASsB,cAAgBhC,OAAOlU,QAErChD,KAAKmZ,SAAW,EAChBnZ,KAAKoZ,QAAS,EAmBdpZ,KAAKkY,OAASlY,KAAK4X,SAASM,QAAUmB,UAAUC,OAChDtZ,KAAKuZ,mBAELvZ,KAAKwZ,OACJC,SAAU,GAAIxC,MAAKrP,MACnB8R,MAAO,GAAIzC,MAAKrP,MAChB+R,SAAU,GAAI1C,MAAKrP,MACnBgS,MAAO,GAAI3C,MAAKrP,MAChBiS,IAAK,GAAI5C,MAAKrP,MACdkS,SAAU,GAAI7C,MAAKrP,OAGpB5H,KAAK+Z,eACJ/Z,KAAKwZ,MAAMC,SAAS7I,QACpB5Q,KAAKwZ,MAAME,MAAM9I,QACjB5Q,KAAKwZ,MAAMG,SAAS/I,QACpB5Q,KAAKwZ,MAAMI,MAAMhJ,QACjB5Q,KAAKwZ,MAAMK,IAAIjJ,SAGhB5Q,KAAK8Z,YACL9Z,KAAKga,WAAa,GAAI9C,QAAO+C,WAC7Bja,KAAKka,cAAgBla,KAAKwZ,MAAMM,SAASlJ,QAEzC5Q,KAAKwZ,MAAMtV,IAAM+S,KAAK/S,IAAIlE,KAAK+Z,eAE/B/Z,KAAKwZ,MAAMtV,IAAI4K,KAAK9O,KAAKma,OAAOxX,KAAK3C,OAGrCA,KAAKoa,YAAa,EAClBpa,KAAKqa,GAAKnD,OAAOoD,KAAKxK,MAAM9P,MAE5BA,KAAKua,YAAa,EAClBva,KAAKwa,UAAYtD,OAAOoD,KAAKxK,MAAM9P,MAEnCA,KAAKya,SAAU,EACfza,KAAK0a,OAASxD,OAAOoD,KAAKxK,MAAM9P,MAMhCA,KAAK2a,SAAW,GAAIzD,QAAO0D,SAAS5a,KAAK4X,SAASqB,eAElDjZ,KAAK2a,SAASE,kBAAkB7a,KAAK4X,SAASY,gBAC9CxY,KAAK2a,SAASG,OAAO9a,KAAK4X,SAASa,KAEnCzY,KAAK+a,iBAAiB/a,KAAK2a,UAE3B3a,KAAKgb,aAAe,GAAI/D,MAAKrP,MAC7B5H,KAAKib,OAASjb,KAAKgb,aAAapK,QAEhC5Q,KAAKkb,OAAQ,EAIVlb,KAAK4X,SAASG,WAAY,GAE5B/X,KAAKgY,aAAY,GAImB,gBAA3BhY,MAAK4X,SAASH,UACvBzX,KAAKmb,KAAKnb,KAAK4X,SAASH,SAAUzX,KAAK4X,SAASgB,QAGjDzI,OAAOiL,iBAAiB,eAAgBpb,KAAKqb,OAAO1Y,KAAK3C,OAAO,IAQjEkX,OAAOQ,KAAKpX,UAAU6a,KAAO,SAAS1D,EAAU6D,GAC/C,GACEC,GADEC,EAAOxb,KAETib,EAAS,GAAIhE,MAAKrP,KA+CpB,OA7CA5H,MAAK4X,SAASH,SAAWA,EAGzBzX,KAAKyb,QAAUzb,KAAK0b,QAAQjE,GAEzBzX,KAAK4X,SAASO,WAAanY,KAAK2b,YAAYlE,IAE9CzX,KAAK4X,SAASO,UAAYnY,KAAKmY,WAAY,EAE3CnY,KAAKyb,QAAU,GAEfF,EAAcvb,KAAK4b,UAAUnE,GAC5B3I,KAAK,WACJ,MAAO0M,GAAKK,iBAIdN,EAAcvb,KAAK6b,cAKnBN,EAAYzM,KAFV9O,KAAK4X,SAASe,UAAY2C,GAAeQ,aAE1B,SAASC,GACzB,GAAIC,GAAaR,EAAKS,kBAAkBF,GACpCG,EAAWV,EAAK7C,QAAQqD,EAExBE,IACHV,EAAKW,OAAOJ,GAEbd,EAAOjO,UACPwO,EAAKR,aAAahO,WAMF,SAAS+O,GACzBP,EAAKW,OAAOJ,GACZd,EAAOjO,UACPwO,EAAKR,aAAahO,YAIpBhN,KAAKoc,sBAAsBpc,KAAK2a,UAEzBM,EAAOrK,SAIfsG,OAAOQ,KAAKpX,UAAUub,YAAc,SAASQ,GAC5C,GAIEN,GAJEP,EAAOxb,KACTsc,EAAQ,GAAIpF,QAAOqF,OACnBC,EAAgBH,GAAkB,wBAwBpC,OARCN,GAZG/b,KAAK4X,SAASE,WAYJ0D,EAAKiB,QAAQjB,EAAK5D,SAASE,YAX3B0D,EAAKiB,QAAQjB,EAAKC,QAAUe,GACxC1N,KAAK,SAAS4N,GACb,MAAOJ,GAAMK,UAAUD,KAExB5N,KAAK,SAAS8N,GAIb,MAHApB,GAAK5D,SAASiF,aAAerB,EAAKC,QAAUmB,EAAME,SAClDtB,EAAK5D,SAASE,WAAa0D,EAAKC,QAAUmB,EAAMG,YAChDvB,EAAK5D,SAASoF,SAAWJ,EAAMI,SACxBxB,EAAKiB,QAAQjB,EAAK5D,SAASE,cAMrCiE,EAAWjG,MAAM,WAEhBmH,QAAQtK,MAAM,2BAA4B6J,GAC1ChB,EAAKvK,QAAQ,kBAAmBuL,KAE1BT,GAGR7E,OAAOQ,KAAKpX,UAAU2b,kBAAoB,SAASF,GAClD,GACEO,GAAQ,GAAIpF,QAAOqF,MAErB,OAAOD,GAAMN,WAAWD,IAGzB7E,OAAOQ,KAAKpX,UAAU6b,OAAS,SAASJ,GACvC,GAAIP,GAAOxb,KACTsc,EAAQ,GAAIpF,QAAOqF,MAErBf,GAAK0B,SAAWZ,EAAMa,gBAAgBpB,EAAYP,EAAK5D,SAASiF,cAEhErB,EAAK/B,SAAW+B,EAAK0B,SAASzD,SAC9B+B,EAAK9B,MAAQ8B,EAAK0B,SAASxD,MAC3B8B,EAAK4B,gBAAkB5B,EAAK0B,SAASE,gBACrC5B,EAAK7B,SAAW6B,EAAK0B,SAASvD,SAC1B6B,EAAK5D,SAASC,UACjB2D,EAAK5D,SAASC,QAAU2D,EAAK6B,gBAAgB7B,EAAK7B,SAASqC,aAI5DR,EAAK8B,uBAAyB9B,EAAK+B,sBAAsB/B,EAAK7B,UAE3D6B,EAAK0B,SAASM,YAChBhC,EAAK5B,MAAQ4B,EAAK0B,SAAStD,MAAQ4B,EAAK5D,SAASiF,aAAerB,EAAK0B,SAASM,WAG/EhC,EAAKiC,eAAiBjC,EAAK0B,SAASO,eAEpCjC,EAAKhC,MAAMC,SAASzM,QAAQwO,EAAK0B,SAASzD,UAC1C+B,EAAKhC,MAAME,MAAM1M,QAAQwO,EAAK0B,SAASxD,OACvC8B,EAAKhC,MAAMG,SAAS3M,QAAQwO,EAAK0B,SAASvD,UAC1C6B,EAAKhC,MAAMI,MAAM5M,QAAQwO,EAAK0B,SAAStD,OAEvC4B,EAAKkC,UAAY,GAAIxG,QAAOyG,UAAUnC,EAAK9B,OAGxC8B,EAAK0B,SAASU,SAChBpC,EAAK5D,SAASiG,OAASrC,EAAK5D,SAASiF,aAAerB,EAAK0B,SAASU,QAElEpC,EAAKiB,QAAQjB,EAAK5D,SAASiG,QAC1B/O,KAAK,SAASgP,GACb,MAAOxB,GAAMyB,IAAID,EAAStC,EAAK4B,gBAAiB5B,EAAK9B,SACnD5K,KAAK,SAAS+K,GAChB2B,EAAK3B,IAAM2B,EAAK0B,SAASrD,IAAMA,EAC/B2B,EAAKhC,MAAMK,IAAI7M,QAAQwO,EAAK0B,SAASrD,MACnC,WACF2B,EAAKhC,MAAMK,IAAI7M,SAAQ,KAIzBwO,EAAKiB,QAAQjB,EAAK5D,SAASiG,QAC1B/O,KAAK,SAASgP,GACb,MAAOxB,GAAMxC,SAASgE,EAAStC,EAAK4B,gBAAiB5B,EAAK9B,SACxD5K,KAAK,SAASgL,GAChB,GAAIkE,GAAU,GAAI9G,QAAO+G,QACrBC,EAAO,CAGY,KAApBpE,EAAS3W,SAIZqY,EAAK1B,SAAW0B,EAAK0B,SAASpD,SAAWA,EAGzC0B,EAAK1B,SAASxY,QAAQ,SAAS6c,GAC1BA,EAAGC,MACNF,GAAQ,EACRF,EAAQK,oBAAoBF,EAAGG,KAAM9C,GAAM1M,KAAK,SAASsP,GACxDD,EAAGC,IAAMA,EACTD,EAAGrG,WAAa0D,EAAK5D,SAASE,WAE9BoG,GAAQ,EACI,IAATA,IACF1C,EAAKxB,WAAWhL,QAAQwM,EAAK1B,UAC7B0B,EAAKhC,MAAMM,SAAS9M,QAAQwO,EAAK1B,gBAMjCoE,IACH1C,EAAKxB,WAAWhL,QAAQwM,EAAK1B,UAC7B0B,EAAKhC,MAAMM,SAAS9M,QAAQwO,EAAK1B,aAGhC,WACF0B,EAAKhC,MAAMM,SAAS9M,eAEbwO,EAAK0B,SAASqB,SACvB/C,EAAK5D,SAAS4G,OAAShD,EAAK5D,SAASiF,aAAerB,EAAK0B,SAASqB,QAElE/C,EAAKiB,QAAQjB,EAAK5D,SAAS4G,QAC1B1P,KAAK,SAAS2P,GACZ,MAAOnC,GAAMzC,IAAI4E,EAAQjD,EAAK4B,gBAAiB5B,EAAK9B,SACnD5K,KAAK,SAAS+K,GAChB2B,EAAK3B,IAAM2B,EAAK0B,SAASrD,IAAMA,EAC/B2B,EAAKhC,MAAMK,IAAI7M,QAAQwO,EAAK0B,SAASrD,MACnC,WACF2B,EAAKhC,MAAMK,IAAI7M,SAAQ,MAIzBwO,EAAKhC,MAAMK,IAAI7M,SAAQ,IAKzBkK,OAAOQ,KAAKpX,UAAUoe,mBAAqB,SAAS/D,EAAUgE,EAAQC,GACrE,GAGIC,GACAC,EAJAC,EAAM/e,KAAKgf,QAAQC,wBACnB7G,EAAQuG,GAAU3e,KAAK4X,SAASQ,OAAS2G,EAAI3G,MAC7CC,EAASuG,GAAW5e,KAAK4X,SAASS,QAAU0G,EAAI1G,MA0BpD,OAvBAsC,GAASE,kBAAkB7a,KAAK4X,SAASY,gBACzCmC,EAASG,OAAO9a,KAAK4X,SAASa,KAE7BzY,KAAKoc,sBAAsBzB,GACzB3a,KAAK4X,SAASsH,aAChBvE,EAASuE,aAAY,GAGtBL,EAAkBrP,SAAS2P,cAAc,OACzCN,EAAgBO,MAAMC,WAAa,SACnCR,EAAgBO,MAAME,SAAW,SACjCT,EAAgBO,MAAMhH,MAAQ,IAC9ByG,EAAgBO,MAAM/G,OAAS,IAC/BrY,KAAKgf,QAAQO,YAAYV,GAEzBC,EAAWtP,SAAS2P,cAAc,OAClCL,EAASM,MAAMC,WAAa,SAC5BP,EAASM,MAAME,SAAW,SAC1BR,EAASM,MAAMhH,MAAQA,EAAQ,KAC/B0G,EAASM,MAAM/G,OAASA,EAAQ,KAChCwG,EAAgBU,YAAYT,GAE5BnE,EAAS6E,WAAWV,GACbD,GAIR3H,OAAOQ,KAAKpX,UAAUmf,iBAAmB,SAASrH,EAAOC,GACxD,CAAA,GAAIyB,MACA4F,EAAQ,GAAIxI,QAAO0D,SAAS5a,KAAK4X,SAASqB,eAAe,GACzD4F,EAAkB7e,KAAK0e,mBAAmBgB,EAAOtH,EAAOC,GACxD1H,EAAW,GAAIsG,MAAKrP,MACpBuR,EAAW,GACXwG,EAAc3f,KAAK0Z,MAAMvW,OAEzByc,EAAc,EACdC,EAAc,SAASlP,GAC1B,GAAImP,GACAC,EAAO5G,EAAW,EAClB6G,EAAOrP,GAAY,GAAIsG,MAAKrP,KAgChC,OA9BGmY,IAAQJ,EACVK,EAAKhT,WAELmM,EAAW4G,EACXD,EAAU,GAAI5I,QAAO+I,QAAQjgB,KAAK0Z,MAAMP,GAAWnZ,KAAKkb,OACxDwE,EAAMQ,eAAeJ,EAAS9f,KAAKsd,wBAAwBxO,KAAK,WAC/D4Q,EAAMS,QAAQ7e,QAAQ,SAAS8e,GAC9BR,GAAe,EACf9F,EAASlZ,MACRwd,IAAQgC,EAAKC,MACbC,KAASV,MAKRF,EAAMS,QAAQhd,OAAS,EAAI,GAC5Buc,EAAMa,UACPX,GAAe,EACf9F,EAASlZ,MACRwd,IAAQsB,EAAMS,QAAQT,EAAMS,QAAQhd,OAAS,GAAGqd,IAChDF,KAASV,KAKXjY,WAAW,WACVkY,EAAYG,IACV,MAGEA,EAAKpP,SACXjO,KAAK3C,KAEQ6f,KAAc/Q,KAAK,WACjC4Q,EAAMe,SACNzgB,KAAKgf,QAAQ0B,YAAY7B,GACzBlO,EAAS3D,QAAQ8M,IAChBnX,KAAK3C,OAEP,MAAO2Q,GAASC,SAKjBsG,OAAOQ,KAAKpX,UAAUqgB,mBAAqB,SAASvI,EAAOC,GAC1D,GAAImD,GAAOxb,KACP4gB,EAAU,GAAI3J,MAAKrP,KAWvB,OATA5H,MAAKwZ,MAAME,MAAM9I,QAAQ9B,KAAK,WAC7B0M,EAAKiE,iBAAiBrH,EAAOC,GAAQvJ,KAAK,SAASgL,GAClD0B,EAAK1B,SAAW0B,EAAK0B,SAASpD,SAAWA,EACzC0B,EAAKxB,WAAWhL,QAAQ8K,GACxB0B,EAAKhC,MAAMM,SAAS9M,QAAQwO,EAAK1B,UACjC8G,EAAQ5T,QAAQwO,EAAK1B,cAIhB8G,EAAQhQ,SAIhBsG,OAAOQ,KAAKpX,UAAUugB,eAAiB,SAASC,GAC/C,GAAIhH,GAAWiH,KAAKzE,MAAMwE,EAO1B,OALGhH,IAAYA,EAAS3W,SACvBnD,KAAK8Z,SAAWA,EAChB9Z,KAAKga,WAAWhL,QAAQhP,KAAK8Z,UAC7B9Z,KAAKwZ,MAAMM,SAAS9M,QAAQhN,KAAK8Z,WAE3B9Z,KAAK8Z,UAGb5C,OAAOQ,KAAKpX,UAAU0gB,YAAc,WACnC,MAAOhhB,MAAKwZ,MAAMM,SAASlJ,SAG5BsG,OAAOQ,KAAKpX,UAAU2gB,YAAc,WACnC,MAAOjhB,MAAKwZ,MAAMG,SAAS/I,SAG5BsG,OAAOQ,KAAKpX,UAAU4gB,OAAS,WAC9B,MAAOlhB,MAAKwZ,MAAMK,IAAIjJ,SAMvBsG,OAAOQ,KAAKpX,UAAUiZ,iBAAmB,WACxC,GAAIiC,GAAOxb,IACXmQ;OAAOiL,iBAAiB,UAAW,WAClCI,EAAKtD,QAAS,EACVsD,EAAK5D,SAASG,SACjByD,EAAKxD,aAAY,GAElBwD,EAAKvK,QAAQ,kBACX,GAEHd,OAAOiL,iBAAiB,SAAU,WACjCI,EAAKtD,QAAS,EACVsD,EAAK5D,SAASG,SACjByD,EAAKxD,aAAY,GAElBwD,EAAKvK,QAAQ,iBACX,IAKJiG,OAAOQ,KAAKpX,UAAUya,iBAAmB,SAASJ,GACjD,GAAIa,GAAOxb,IACX2a,GAASwG,OAAO7f,QAAQ,SAAS6P,GAChCwJ,EAASnK,GAAGW,EAAW,SAAS/Q,GAC/Bob,EAAKvK,QAAQE,EAAW/Q,OAI1Bua,EAASnK,GAAG,+BAAgC,SAASpJ,GACpD,GAAIga,GAAWC,EAASC,EACpBC,IAEDvhB,MAAK8Z,SAAS3W,OAAS,IACzBie,EAAYphB,KAAKga,WAAWwH,YAAYpa,EAAMiZ,OAC9CiB,EAAUthB,KAAKga,WAAWyH,mBAAmBL,GAC7CG,EAAU3gB,KAAKwgB,GAEZha,EAAMoZ,MACRa,EAAUrhB,KAAKga,WAAWwH,YAAYpa,EAAMoZ,KAE3Ce,EAAU3gB,KAAKygB,IAGjBrhB,KAAKiR,QAAQ,oBACZyQ,WAAcN,EACdO,WAAcL,EACdC,UAAcA,MAMf5e,KAAK3C,OAEP2a,EAASnK,GAAG,gBAAiBxQ,KAAK4hB,WAAWjf,KAAK3C,QAKnDkX,OAAOQ,KAAKpX,UAAUshB,WAAa,SAASC,GAC3C,GACI/B,GADAgC,EAAM5K,OAAOoD,KAAKwH,IAAID,EAGvB7hB,MAAK+hB,iBACPjC,EAAU5I,OAAOoD,KAAKwH,IAAI9hB,KAAK+hB,eAAeC,YAG3ChiB,KAAKua,YAAcva,KAAK+hB,gBAAkBD,EAAIG,MAAQnC,EAAQmC,OACjEhF,QAAQiF,KAAK,aAAcJ,EAAIG,KAAMjiB,KAAK+hB,eAAeC,UACzDhiB,KAAK6Y,KAAKiJ,EAAIK,YAIhBjL,OAAOQ,KAAKpX,UAAU8hB,mBAAqB,SAASzH,GACnDA,EAASwG,OAAO7f,QAAQ,SAAS6P,GAChCwJ,EAAS3J,IAAIG,MAKf+F,OAAOQ,KAAKpX,UAAUmc,QAAU,SAASoF,GACxC,MAAG7hB,MAAK4X,SAASI,YACThY,KAAKkb,MAAMmH,OAAOR,EAAK7hB,KAAK4X,SAASoF,UACnChd,KAAK4X,SAASO,UAChBnY,KAAKkH,IAAImb,OAAOR,EAAK7hB,KAAK4X,SAASoF,UAEnC9F,OAAOoD,KAAKgI,QAAQT,EAAK,MAAO7hB,KAAK4X,SAASoB,kBAKvD9B,OAAOQ,KAAKpX,UAAUob,QAAU,SAASjE,GACxC,GAOC8K,GAPGT,EAAM5K,OAAOoD,KAAKwH,IAAIrK,GACzBuK,EAAWF,EAAIU,SACfC,EAA0B,KAAfX,EAAIG,KAAK,GACpBS,EAAWvS,OAAOuS,SAElBC,EAASD,EAASC,QAAUD,EAASF,SAAW,KAAOE,EAASE,KAChEC,EAAUrT,SAASsT,qBAAqB,OAWzC,OALGD,GAAQ1f,SACVof,EAAOM,EAAQ,GAAGvE,MAIhBwD,EAAIU,SACCV,EAAIa,OAASb,EAAIG,MAIrBD,GAAYS,GACPF,GAAQI,GAAUb,EAAIG,KAI3BD,GAAaS,EAAjB,OACQvL,OAAOoD,KAAKyI,WAAWR,GAAQG,EAASM,SAAUlB,EAAIG,OAM/D/K,OAAOQ,KAAKpX,UAAUsb,UAAY,SAASnE,GAY1C,MAFAzX,MAAKkH,IAAM,GAAIgQ,QAAO+L,WACtBjjB,KAAKkb,MAAQlb,KAAKkH,IACXlH,KAAKkH,IAAIiU,KAAK1D,IAItBP,OAAOQ,KAAKpX,UAAUqb,YAAc,SAASF,GAC5C,GAAIqG,GAAM5K,OAAOoD,KAAKwH,IAAIrG,EAE1B,QAAGqG,EAAIoB,WAA+B,QAAjBpB,EAAIoB,WAAwC,OAAjBpB,EAAIoB,WAI7C,GAHC,GAOThM,OAAOQ,KAAKpX,UAAU6iB,QAAU,SAAStL,GACxC,GAAIuL,EAEJ,OAAItH,eAIJsH,EAAiBtH,aAAauH,QAAQxL,GAEjCiE,cACe,OAAnBsH,GAGO,GAFA,IAPA,GAcTlM,OAAOQ,KAAKpX,UAAU+c,gBAAkB,SAASrB,GAChD,MAAO,UAAY9E,OAAOlU,QAAU,IAAMmN,OAAOuS,SAASE,KAAO,IAAM5G,GAGxE9E,OAAOQ,KAAKpX,UAAUgjB,aAAe,WACpC,MAAIxH,kBAGJA,cAAayH,QAAQvjB,KAAK4X,SAASC,QAASkJ,KAAKyC,UAAUxjB,KAAKkd,YAFxD,GAKThG,OAAOQ,KAAKpX,UAAUmjB,oBAAsB,WAC3C,MAAI3H,kBAGJA,cAAa4H,WAAW1jB,KAAK4X,SAASC,UAF9B,GAQTX,OAAOQ,KAAKpX,UAAUqjB,SAAW,SAASC,GACzC,GACCC,GADGrI,EAAOxb,IAGX,IAAGE,EAAEsJ,UAAUoa,GACd5jB,KAAKgf,QAAU4E,MACT,CAAA,GAAmB,gBAARA,GAIjB,WADA3G,SAAQtK,MAAM,iBAFd3S,MAAKgf,QAAU9H,OAAOoD,KAAKwJ,MAAMF,GAqBlC,MAfAC,GAAW7jB,KAAKib,OACbnM,KAAK,WASJ,MAPA0M,GAAKb,SAAS6E,WAAWhE,EAAKwD,QAASxD,EAAK5D,SAASQ,MAAOoD,EAAK5D,SAASS,QAEvEmD,EAAK7B,SAASoK,WAChBvI,EAAKb,SAASqJ,aAAaxI,EAAK7B,SAASoK,WAG1CvI,EAAKyI,YACEzI,EAAK0I,kBAQjBhN,OAAOQ,KAAKpX,UAAU4jB,aAAe,WACpC,GAAIC,EAUJ,OAPCA,GADEnkB,KAAK4X,SAASiB,KACN7Y,KAAK6Y,KAAK7Y,KAAK4X,SAASiB,MAC1B7Y,KAAK4X,SAASwM,oBACZpkB,KAAKqkB,QAAQrkB,KAAK4X,SAASwM,qBAE3BpkB,KAAKkgB,eAAelgB,KAAKmZ,WAMrCjC,OAAOQ,KAAKpX,UAAUqY,QAAU,SAASqD,GAExC,GAMEvb,GANE+a,EAAOxb,KACTskB,GAAS,WAAY,QAAS,WAAY,QAAS,MAAO,iBAAkB,kBAAmB,0BAC/FrgB,GAAS,EACT4T,EAAU7X,KAAKqd,gBAAgBrB,GAC/BuI,EAAYzI,aAAauH,QAAQxL,GACjC2M,EAAMF,EAAMnhB,MAKd,IAFGnD,KAAK4X,SAAS6M,aAAYxgB,GAAS,IAElCA,GAAuB,aAAbsgB,GAA0C,OAAdA,EAGzC,IAFA/I,EAAK0B,SAAW6D,KAAKzE,MAAMiI,GAEvB9jB,EAAI,EAAO+jB,EAAJ/jB,EAASA,IAAK,CACxB,GAAI2f,GAAOkE,EAAM7jB,EAEjB,KAAI+a,EAAK0B,SAASkD,GAAO,CACxBnc,GAAS,CACT,OAEDuX,EAAK4E,GAAQ5E,EAAK0B,SAASkD,GAI7B,OAAGnc,GAAWsgB,GAAcvkB,KAAKkd,UAAald,KAAK4X,SAASiF,cAG3D7c,KAAK4X,SAASC,QAAUA,EACxB7X,KAAKwZ,MAAMC,SAASzM,QAAQhN,KAAKyZ,UACjCzZ,KAAKwZ,MAAME,MAAM1M,QAAQhN,KAAK0Z,OAC9B1Z,KAAKwZ,MAAMG,SAAS3M,QAAQhN,KAAK2Z,UACjC3Z,KAAKwZ,MAAMI,MAAM5M,QAAQhN,KAAK4Z,OAC9B5Z,KAAKwZ,MAAMK,IAAI7M,QAAQhN,KAAK6Z,MACrB,IARA,GAaT3C,OAAOQ,KAAKpX,UAAU4f,eAAiB,SAASwE,EAAMlE,EAAK7P,GAC1D,GACCgU,GACAvG,EACAwG,EAIG9E,EAPAtE,EAAOxb,KAKV4H,EAAQ+I,GAAY,GAAIsG,MAAKrP,KAI9B,OAAI5H,MAAKoa,WAWNpa,KAAKua,YAAcva,KAAKua,YAE1Bva,KAAKwa,UAAUqK,QAAQ,kBAAmBH,EAAMlE,EAAK5Y,IAC9CA,EAAMgJ,UAGX1Q,EAAE4J,SAAS4a,GACbE,EAAMF,GAENtG,EAAM,GAAIlH,QAAO+G,QAAQyG,GACzBE,EAAMxG,EAAIjF,WAGF,EAANyL,GAAWA,GAAO5kB,KAAK0Z,MAAMvW,UAC/B8Z,QAAQiF,KAAK,wBACb0C,EAAM,EACNpE,GAAM,EACNpC,GAAM,GAIP0B,EAAU,GAAI5I,QAAO+I,QAAQjgB,KAAK0Z,MAAMkL,GAAM5kB,KAAKkb,OAEnDlb,KAAKua,YAAa,EAEfva,KAAK8kB,0BAEPhF,EAAQiF,aAAa,uBACpB7N,OAAOjM,QAAQ/E,KACfgR,OAAOjM,QAAQ+Z,UACf9N,OAAOjM,QAAQga,MACb,GAIJN,EAASnJ,EAAKb,SAASuF,eAAeJ,EAAS9f,KAAKsd,wBACjDc,EACF5C,EAAKb,SAAS0J,QAAQjG,GACboC,GACThF,EAAKb,SAASuK,WAGfP,EAAO7V,KAAK,WAGX0M,EAAKrC,SAAWyL,EAEhBhd,EAAMoF,QAAQwO,EAAKb,UAEhBa,EAAK5D,SAASI,eAAgB,GAChCwD,EAAK5D,SAASO,aAAc,GAC5BqD,EAAK2J,qBAGN3J,EAAKuG,eAAiBjC,EACtBtE,EAAKjB,YAAa,EAClBiB,EAAKhB,UAAU4K,UACgB,IAA5B5J,EAAKhB,UAAUrX,UACjBqY,EAAKd,OAAO0K,WAGX,SAASzS,GAEXsK,QAAQtK,MAAM,2BAA4BmN,EAAQkC,SAAUrP,GAC5D6I,EAAKvK,QAAQ,yBAA0B6O,EAAQkC,UAC/CxG,EAAKjB,YAAa,EAClB3S,EAAM3D,OAAO0O,KAGP/K,EAAMgJ,UA/EZ5Q,KAAKqa,GAAGwK,QAAQ,iBAAkBnhB,WAElCkE,EAAM3D,QACJohB,QAAU,YACV3S,OAAQ,GAAIlF,QAAQkF,QAEf9K,EAAMgJ,UA4EfsG,OAAOQ,KAAKpX,UAAUglB,SAAW,WAChC,GAAIvF,EAEJ,OAAI/f,MAAKoa,YAET2F,EAAO/f,KAAK2a,SAAS2K,WAEjBvF,EAAJ,OACQ/f,KAAK6f,eALe7f,KAAKqa,GAAGwK,QAAQ,WAAYnhB,YASzDwT,OAAOQ,KAAKpX,UAAUilB,SAAW,WAChC,GAAIC,EAEJ,OAAIxlB,MAAKoa,YAEToL,EAAOxlB,KAAK2a,SAAS4K,WAEjBC,EAAJ,OACQxlB,KAAKylB,eALezlB,KAAKqa,GAAGwK,QAAQ,WAAYnhB,YASzDwT,OAAOQ,KAAKpX,UAAUuf,YAAc,WACnC,GAAIE,EACJ,IAAI/f,KAAKmZ,SAAWnZ,KAAK0Z,MAAMvW,OAAS,EAAG,CAG1C,IAFA4c,EAAO/f,KAAKmZ,SAAW,EAEhBnZ,KAAK0Z,MAAMqG,IAAS/f,KAAK0Z,MAAMqG,GAAM2F,QAAqC,MAA3B1lB,KAAK0Z,MAAMqG,GAAM2F,QACtE3F,GAED,IAAIA,EAAO/f,KAAK0Z,MAAMvW,OACrB,MAAOnD,MAAKkgB,eAAeH,EAE3B/f,MAAKiR,QAAQ,kBAIdjR,MAAKiR,QAAQ,eAIfiG,OAAOQ,KAAKpX,UAAUmlB,YAAc,WACnC,GAAID,EACJ,IAAIxlB,KAAKmZ,SAAW,EAAG,CAEtB,IADAqM,EAAOxlB,KAAKmZ,SAAW,EAChBnZ,KAAK0Z,MAAM8L,IAASxlB,KAAK0Z,MAAM8L,GAAME,QAAqC,MAA3B1lB,KAAK0Z,MAAM8L,GAAME,QACtEF,GAED,IAAIA,GAAQ,EACX,MAAOxlB,MAAKkgB,eAAesF,GAAM,EAEjCxlB,MAAKiR,QAAQ,oBAIdjR,MAAKiR,QAAQ,iBAIfiG,OAAOQ,KAAKpX,UAAUqlB,sBAAwB,WAC7C,MAAI3lB,MAAKoa,WACFpa,KAAK2a,SAASiL,oBADO,GAI7B1O,OAAOQ,KAAKpX,UAAUuY,KAAO,SAASgN,GAErC,MAAkC,KAA/BA,EAAOzjB,QAAQ,YACVpC,KAAKqkB,QAAQwB,GACXA,EAAOzjB,QAAQ,OAASyjB,EAAO1iB,OAAO,EACxCnD,KAAK8lB,eAAeC,SAASF,EAAOG,UAAU,EAAGH,EAAO1iB,OAAO,IAAI,KAC/C,gBAAX0iB,IAAuBjc,MAAMic,MAAY,EAClD7lB,KAAKimB,SAASJ,GAEd7lB,KAAKkmB,SAASL,IAKvB3O,OAAOQ,KAAKpX,UAAU+jB,QAAU,SAAS8B,EAAWve,GACnD,GAAIwW,GACFjF,EACAiN,EAEAzV,EAAW/I,GAAS,GAAIqP,MAAKrP,KAE/B,OAAI5H,MAAKoa,WAONpa,KAAKya,SAAWza,KAAKua,YACvB0C,QAAQiF,KAAK,sBACbliB,KAAK0a,OAAOmK,QAAQ,WAAYsB,EAAWxV,KACpC,IAGRyN,EAAM,GAAIlH,QAAO+G,QAAQkI,GACzBhN,EAAWiF,EAAIjF,SAEA,IAAZA,GACK,GAGRiN,EAAYpmB,KAAK0Z,MAAMP,GACvBvI,QAAUD,EAASC,QACnB5Q,KAAKya,SAAU,EAEZza,KAAK+hB,gBAAkB/hB,KAAKmZ,WAAaA,GAC3CnZ,KAAK2a,SAAS0J,QAAQjG,GACtBpe,KAAKya,SAAU,EACf9J,EAAS3D,QAAQhN,KAAK2a,SAASiL,sBAG3BQ,GAAyB,IAAZjN,IAChBA,EAAW,EACXiN,EAAYpmB,KAAK0Z,MAAMP,IAGxBnZ,KAAK+hB,eAAiB,GAAI7K,QAAO+I,QAAQmG,EAAWpmB,KAAKkb,OAEtDlb,KAAK+hB,iBACP/hB,KAAKmZ,SAAWA,EAChBwL,OAAS3kB,KAAK2a,SAASuF,eAAelgB,KAAK+hB,eAAgB/hB,KAAKsd,wBAEhEtd,KAAK2a,SAAS0J,QAAQjG,GACtBuG,OAAO7V,KAAK,SAAS+U,GACnB7jB,KAAKya,SAAU,EACf9J,EAAS3D,QAAQ6W,EAAS+B,qBAC1BjjB,KAAK3C,SAIT4Q,QAAQ9B,KAAK,WACZ9O,KAAK0a,OAAO0K,WACXziB,KAAK3C,OAEA4Q,WApDNqM,QAAQiF,KAAK,oBACbliB,KAAK4X,SAASwM,oBAAsB+B,GAC7B,IAqDTjP,OAAOQ,KAAKpX,UAAU4lB,SAAW,SAASrE,EAAKja,GAC9C,GAAIwF,GAAO0S,EAASuG,EAASC,EAAanN,EACtCxI,EAAW/I,GAAS,GAAIqP,MAAKrP,KAEjC,OAAI5H,MAAKoa,WAMNpa,KAAKya,SAAWza,KAAKua,YACvBva,KAAK0a,OAAOmK,QAAQ,YAAahD,EAAKlR,KAC/B,IAGRvD,EAAQyU,EAAIzU,MAAM,KAClB0S,EAAU1S,EAAM,GAChBiZ,EAAUjZ,EAAM,KAAM,EAEtBkZ,EAAcxG,EAAQ7U,QAAQjL,KAAK4X,SAASiF,aAAc,IAC1D1D,EAAWnZ,KAAKod,gBAAgBkJ,GAG5BxG,IACH3G,EAAWnZ,KAAK+hB,eAAiB/hB,KAAK+hB,eAAe5I,SAAW,GAI1C,gBAAd,IAA+B,EAEpCnZ,KAAK+hB,gBAAkB5I,GAAYnZ,KAAK+hB,eAAe5I,UAUvDkN,EACFrmB,KAAK2a,SAAS0L,QAAQA,GAGtBrmB,KAAK2a,SAAS4L,YAEf5V,EAAS3D,QAAQhN,KAAK2a,SAASiL,oBAGhCjV,EAASC,QAAQ9B,KAAK,WACrB9O,KAAK0a,OAAO0K,WACXziB,KAAK3C,OAEA2Q,EAASC,SArBR5Q,KAAKkgB,eAAe/G,GAAUrK,KAAK,WACrCuX,GACFrmB,KAAK2a,SAAS0L,QAAQA,GAEvB1V,EAAS3D,QAAQhN,KAAK2a,SAASiL,qBAC9BjjB,KAAK3C,SAhCRA,KAAK4X,SAASiB,KAAOgJ,GACd,IAkDT3K,OAAOQ,KAAKpX,UAAU2lB,SAAW,SAAS9H,GACzC,GAAIC,GAAMpe,KAAKga,WAAWwM,YAAYrI,EACtC,OAAOne,MAAKqkB,QAAQjG,IAGrBlH,OAAOQ,KAAKpX,UAAUwlB,eAAiB,SAASxE,GAC/C,GAAInD,GAAKne,KAAKga,WAAWyM,mBAAmBnF,EAC5C,OAAOthB,MAAKimB,SAAS9H,IAGtBjH,OAAOQ,KAAKpX,UAAU6kB,mBAAqB,WAC1C,GAAIpF,GACA2E,EAAO1kB,KAAKmZ,SAAW,CAE3B,OAAGuL,IAAQ1kB,KAAK0Z,MAAMvW,QACd,GAGR4c,EAAO,GAAI7I,QAAO+I,QAAQjgB,KAAK0Z,MAAMgL,SAClC3E,GACF7I,OAAOoD,KAAKgI,QAAQvC,EAAKiC,aAI3B9K,OAAOQ,KAAKpX,UAAUomB,aAAe,WACpC,GAAIlL,GAAOxb,KACV2mB,EAASzmB,EAAE6F,OAAO/F,KAAKyZ,SAGxB,OAAOzZ,MAAKkb,MAAM0L,IAAID,GACpB7X,KAAK,WACJ0M,EAAK5D,SAASwB,QAAS,EACvBoC,EAAKvK,QAAQ,kBAIjBiG,OAAOQ,KAAKpX,UAAUumB,iBAAmB,WACxC,MAAO7mB,MAAK4X,SAASwB,OAAS,GAAI,GAAO,GAG1ClC,OAAOQ,KAAKpX,UAAUwmB,UAAY,WACjC,GAAIC,GAAM/mB,KAAK4X,SAASC,OACxB7X,MAAKkb,MAAM8L,SAASD,GAAKjY,KAAK,SAASsK,GAEtC,MAAIA,MAAW,GACdpZ,KAAK4X,SAASwB,QAAS,GAChB,GAGDpZ,KAAK0mB,eACV5X,KAAK,WACL9O,KAAKkb,MAAM+L,MAAMF,GAAK,IACrBpkB,KAAK3C,QAEP2C,KAAK3C,QAGRkX,OAAOQ,KAAKpX,UAAU0X,YAAc,SAASoB,IAE3ClC,OAAOjM,QAAQ/E,KACfgR,OAAOjM,QAAQ+Z,UACf9N,OAAOjM,QAAQga,IAGbjlB,MAAKmY,WAAanY,KAAK4X,SAASO,YAGhCnY,KAAKkY,QACPlY,KAAKib,OAAOnM,KAAK9O,KAAK8mB,UAAUnkB,KAAK3C,OAGnCA,KAAKkb,OAASlb,KAAK4X,SAASI,aAAeoB,KAAW,GACxDpZ,KAAK4X,SAASI,aAAc,EAC5BhY,KAAKkb,MAAMlK,IAAI,WAEfhR,KAAKkb,OAAQ,GACJlb,KAAK4X,SAASI,cAEvBhY,KAAKkb,MAAQ,GAAIhE,QAAOgQ,QAAQlnB,KAAK4X,SAASuP,aAC9CnnB,KAAKkb,MAAM1K,GAAG,UAAW,SAAU4W,GAC7BA,GAQJpnB,KAAKonB,SAAU,EACfpnB,KAAK4X,SAASI,aAAc,EAE5BhY,KAAKiR,QAAQ,kBATbjR,KAAKonB,SAAU,EACfpnB,KAAK4X,SAASI,aAAc,EAE5BhY,KAAKiR,QAAQ,iBAQbtO,KAAK3C,UAMTkX,OAAOQ,KAAKpX,UAAU+mB,SAAW,SAASjI,EAAOpK,EAAKsS,GACrD,GAAIC,IAAY,QAAS,aAAc,mBAEvC,OAAIvnB,MAAKoa,YAETpa,KAAK4X,SAASkB,OAAOsG,GAASpK,EAE9BhV,KAAK2a,SAAS0M,SAASjI,EAAOpK,EAAKsS,QAEJ,KAA5BC,EAASnlB,QAAQgd,IAGnBpf,KAAK2a,SAAS6M,aATaxnB,KAAKqa,GAAGwK,QAAQ,WAAYnhB,YAczDwT,OAAOQ,KAAKpX,UAAUmnB,YAAc,SAASrI,GAC5C,MAAIpf,MAAKoa,YACTpa,KAAK2a,SAAS8M,YAAYrI,GAC1Bpf,KAAK2a,SAAS6M,sBACPxnB,MAAK4X,SAASkB,OAAOsG,IAHApf,KAAKqa,GAAGwK,QAAQ,cAAenhB,YAM5DwT,OAAOQ,KAAKpX,UAAUonB,WAAa,SAASC,EAAKC,GAChD,MAAI5nB,MAAKoa,gBACNpa,KAAK4X,SAASmB,SAAS4O,GAAOC,GADL5nB,KAAKqa,GAAGwK,QAAQ,aAAcnhB,YAI3DwT,OAAOQ,KAAKpX,UAAUunB,WAAa,SAASC,GAC3C7K,QAAQiF,KAAK,4EAEZliB,KAAKkf,YADH4I,KAAQ,GACO,GAEA,IAInB5Q,OAAOQ,KAAKpX,UAAU4e,YAAc,SAAS6I,GAC5C,GAAIC,GAAwB,mBAATD,IAAuB,EAAOA,CAEjD/nB,MAAK2a,SAASuE,YAAY8I,GAC1BhoB,KAAK4X,SAASsH,YAAc8I,EACzBhoB,KAAKoa,YACPpa,KAAK2a,SAAS6M,YAIhBtQ,OAAOQ,KAAKpX,UAAUua,kBAAoB,SAASzC,GAClDpY,KAAK4X,SAASY,eAAiBJ,EAC5BpY,KAAKoa,aACPpa,KAAK2a,SAASE,kBAAkB7a,KAAK4X,SAASY,gBAC9CxY,KAAK2a,SAAS6M,aAIhBtQ,OAAOQ,KAAKpX,UAAUwa,OAAS,SAASrC,GACvCzY,KAAK4X,SAASa,IAAMA,EACjBzY,KAAKoa,aACPpa,KAAK2a,SAASG,OAAO9a,KAAK4X,SAASa,KACnCzY,KAAK2a,SAAS6M,aAIhBtQ,OAAOQ,KAAKpX,UAAUwf,QAAU,SAASmC,GACxC,GACImE,GACAtG,EAFA3G,EAAWnZ,KAAKod,gBAAgB6E,EASpC,OALG9I,KACFiN,EAAYpmB,KAAK0Z,MAAMP,GACvB2G,EAAU,GAAI5I,QAAO+I,QAAQmG,EAAWpmB,KAAKkb,OAC7C4E,EAAQmI,QAEFnI,GAGR5I,OAAOQ,KAAKpX,UAAU+a,OAAS,WAE3Brb,KAAK4X,SAASe,SAAWmD,cAC3B9b,KAAKsjB,eAGNtjB,KAAKoiB,mBAAmBpiB,KAAK2a,UAE7B3a,KAAKiR,QAAQ,gBAGdiG,OAAOQ,KAAKpX,UAAU4nB,QAAU,WAE/B/X,OAAOgY,oBAAoB,eAAgBnoB,KAAKqb,QAE7Crb,KAAK+hB,gBAAgB/hB,KAAK+hB,eAAe1G,SAE5Crb,KAAKqb,SAEFrb,KAAK2a,UAAU3a,KAAK2a,SAAS8F,UAIjCvJ,OAAOQ,KAAKpX,UAAU6Z,OAAS,WAE9Bna,KAAKiR,QAAQ,eAIdiG,OAAOQ,KAAKpX,UAAU2jB,UAAY,WAGjCjkB,KAAKoa,YAAa,EAClBpa,KAAKiR,QAAQ,iBAEbjR,KAAKqa,GAAGnL,SAITgI,OAAOQ,KAAKpX,UAAU8nB,YAAc,SAASzN,EAAU5N,GAEtD4N,EAASyN,YAAYpoB,KAAK4X,SAASkB,QACnC/L,KAGDmK,OAAOQ,KAAKpX,UAAU+nB,cAAgB,SAAS1N,EAAU5N,GAExD4N,EAAS0N,cAAcroB,KAAK4X,SAASmB,UACrChM,KAGDmK,OAAOQ,KAAKpX,UAAU8b,sBAAwB,SAASzB,GACtDA,EAASoK,aAAa,uBAAwB/kB,KAAKooB,YAAYzlB,KAAK3C,KAAM2a,IAAW,GACrFA,EAASoK,aAAa,uBAAwB/kB,KAAKqoB,cAAc1lB,KAAK3C,KAAM2a,IAAW,GACvFA,EAASoK,aAAa,uBAAwB7N,OAAOjM,QAAQqd,MAAM3lB,KAAK3C,OAAO,IAGhFkX,OAAOQ,KAAKpX,UAAUwkB,uBAAyB,WAC9C,MAAG9kB,MAAK4X,SAASI,aAOT,EAEEhY,KAAK4X,SAASO,WAEhB,GAIA,GAOTjB,OAAOQ,KAAKpX,UAAUid,sBAAwB,SAAS5D,GACtD,GAAI4O,GAAUvoB,KAAKsY,eAAiBtY,KAAKsY,cAAciQ,QAAW5O,EAAS4O,QAAU,aACjFC,EAAUxoB,KAAKsY,eAAiBtY,KAAKsY,cAAckQ,QAAW7O,EAAS6O,QAAU,OACjFjQ,EAAevY,KAAKsY,eAAiBtY,KAAKsY,cAAcC,aAAgBoB,EAASpB,aAAe,MACpG,QACCgQ,OAASA,EACTC,OAASA,EACTjQ,YAAcA,IAKhBtB,KAAKxG,YAAYtF,MAAM+L,OAAOQ,KAAKpX,WAGnC2W,KAAKzG,GAAG,QAAS,cAIjByG,KAAK3G,UAAU,cAAc,GAQ7B4G,OAAO+I,QAAU,SAASwI,EAAavN,GACtClb,KAAKse,KAAOmK,EAAYnK,KACxBte,KAAKgiB,SAAWyG,EAAY5G,IAC5B7hB,KAAK0oB,GAAKD,EAAYC,GACtB1oB,KAAKmZ,SAAWsP,EAAYljB,MAC5BvF,KAAK2oB,QAAUF,EAAYE,QAC3B3oB,KAAK4oB,WAAaH,EAAYG,WAC9B5oB,KAAK6oB,mBAAqBJ,EAAYI,mBACtC7oB,KAAK0lB,OAAS+C,EAAY/C,OAC1B1lB,KAAK8oB,MAAQ,EACb9oB,KAAKkb,MAAQA,EACblb,KAAKge,QAAU,GAAI9G,QAAO+G,QAC1Bje,KAAK2Q,SAAW,GAAIsG,MAAKrP,MACzB5H,KAAK+oB,OAAS/oB,KAAK2Q,SAASC,QAE5BsG,OAAO8R,MAAM7d,MAAMnL,MAEnBA,KAAKipB,SAAS,uBAGdjpB,KAAKkpB,WAINhS,OAAO+I,QAAQ3f,UAAU2nB,KAAO,SAASkB,GACxC,GACIvY,GADAsK,EAAQiO,GAAUnpB,KAAKkb,KAc3B,OAVCtK,GADEsK,EACQA,EAAMmH,OAAOriB,KAAKgiB,UAElB9K,OAAOoD,KAAKgI,QAAQtiB,KAAKgiB,SAAU,OAG9CpR,EAAQ9B,KAAK,SAASsa,GACrBppB,KAAKqpB,YAAYD,GACjBppB,KAAK2Q,SAAS3D,QAAQhN,OACrB2C,KAAK3C,OAEA4Q,GAGRsG,OAAO+I,QAAQ3f,UAAUqkB,OAAS,WAEjC,MAAO3kB,MAAKioB,OAAOnZ,KAAK,SAASwa,GAEhC,GAAIpjB,GAAOojB,EAAIC,cAAc,QACzBhH,EAAO+G,EAAInK,cAAc,OAO7B,OALAoD,GAAKiH,aAAa,OAAQxpB,KAAKgiB,UAC/B9b,EAAKujB,aAAalH,EAAMrc,EAAKwjB,YAE7B1pB,KAAKkd,SAAWoM,EAET,GAAIrS,MAAKpJ,QAAQ,SAAUb,GACjChN,KAAK2pB,aAAa,sBAAuB,WACxC3c,EAAQsc,IACP3mB,KAAK3C,MAAOA,OACb2C,KAAK3C,QAEN2C,KAAK3C,OACN8O,KAAK,SAASwa,GACd,GAAIM,GAAa,GAAIC,eACjB3M,EAAW0M,EAAWE,kBAAkBR,EAC5C,OAAOpM,IACNva,KAAK3C,QAGRkX,OAAO+I,QAAQ3f,UAAUuhB,IAAM,SAASsH,GACvC,GAIItH,GAJAlR,EAAW,GAAIsG,MAAKrP,MACpBsT,EAAQiO,GAAUnpB,KAAKkb,MAEvB4E,EAAU9f,IA2Bd,OAxBGkb,GACElb,KAAK+pB,SAMRlI,EAAM7hB,KAAK+pB,QACXpZ,EAAS3D,QAAQ6U,IANjB3G,EAAM8O,OAAOhqB,KAAKgiB,UAAUlT,KAAK,SAAS+S,GACzC/B,EAAQiK,QAAUlI,EAClBlR,EAAS3D,QAAQ6U,MAOnBA,EAAM7hB,KAAKgiB,SACXrR,EAAS3D,QAAQ6U,IAYXlR,EAASC,SAGjBsG,OAAO+I,QAAQ3f,UAAU2pB,SAAW,SAASC,GAC5ClqB,KAAK8oB,MAAQoB,GAGdhT,OAAO+I,QAAQ3f,UAAU6pB,SAAW,WACnC,MAAOnqB,MAAK8oB,OAGb5R,OAAO+I,QAAQ3f,UAAU8pB,MAAQ,WAChC,MAAOpqB,MAAKqqB,IAGbnT,OAAO+I,QAAQ3f,UAAU+a,OAAS,SAASH,GAC1Clb,KAAKwP,SAAW,KACbxP,KAAK+pB,SAAW7O,IAClBA,EAAMoP,UAAUtqB,KAAK+pB,SACrB/pB,KAAK+pB,SAAU,IAIjB7S,OAAO+I,QAAQ3f,UAAU+oB,YAAc,SAASkB,GAC/C,CAAA,GAAIzI,GAAMyI,EAAUC,YACND,GAAUE,QAGxBzqB,KAAKwP,SAAW+a,EAAUG,eAAeC,eACvC7I,EACA,KACA,MAEF9hB,KAAKkd,SAAWld,KAAKwP,SAASob,WAC5BL,EAAUM,iBACV,GAGF7qB,KAAKwP,SAAS+P,YAAYvf,KAAKkd,WAG3Bld,KAAKwP,SAAShE,UAAYgE,SAAShE,WACtCxL,KAAKwP,SAAShE,SAAWgE,SAAShE,WAMpC0L,OAAO+I,QAAQ3f,UAAUwqB,aAAe,SAASC,GAChD,GAAI3jB,GACA4jB,EAAYC,EACZC,EAAgBC,EACEC,CAGtB,IAAIprB,KAAKwP,SAAT,CAEA,GAA+B,mBAArBA,UAAShE,SAAyB,CAc3C,GAZAwf,EAAa9T,OAAOoD,KAAK+Q,gBAAgBN,EAAOG,gBAEhDD,EAAW/T,OAAOoD,KAAK+Q,gBAAgBN,EAAOI,cAE9CD,EAAiBlrB,KAAKwP,SAAShE,SAASwf,EAAYhrB,KAAKwP,SAAU0H,OAAOoD,KAAKgR,WAAYC,YAAYC,wBAAyB,MAAMC,gBAElIV,EAAOW,YACVP,EAAenrB,KAAKwP,SAAShE,SAASyf,EAAUjrB,KAAKwP,SAAU0H,OAAOoD,KAAKgR,WAAYC,YAAYC,wBAAyB,MAAMC,iBAGnIrkB,EAAQpH,KAAKwP,SAASmc,cAEnBT,EACF,IACC9jB,EAAMwkB,SAASV,EAAgBH,EAAOc,cAClCd,EAAOW,WAAaP,GACvB/jB,EAAM0kB,OAAOX,EAAcJ,EAAOgB,WAElC,MAAO3rB,GACR6c,QAAQ+O,IAAI,UACZd,GAAiB,EAMfA,IACHjO,QAAQ+O,IAAI,8BACZC,sBAAwB/U,OAAOoD,KAAK4R,oBAAoBnB,EAAOG,eAAeiB,aAC9EnB,EAAa,uBAAyBiB,sBAAwB,KAE9Df,EAAiBlrB,KAAKwP,SAAShE,SAASwf,EAAYhrB,KAAKwP,SAAU0H,OAAOoD,KAAKgR,WAAYC,YAAYC,wBAAyB,MAAMC,gBAEnIP,IAEF9jB,EAAMwkB,SAASV,EAAgBH,EAAOc,aAElCd,EAAOW,YACVN,EAAsBlU,OAAOoD,KAAK4R,oBAAoBnB,EAAOI,aAAagB,aAC1ElB,EAAW,uBAAyBG,EAAsB,KAC1DD,EAAenrB,KAAKwP,SAAShE,SAASyf,EAAUjrB,KAAKwP,SAAU0H,OAAOoD,KAAKgR,WAAYC,YAAYC,wBAAyB,MAAMC,gBAC/HN,GACF/jB,EAAM0kB,OAAOX,EAAcJ,EAAOgB,kBAOtC3kB,GAAQ2jB,CAIT,OAAO/qB,MAAKge,QAAQoO,qBAAqBhlB,EAAOpH,KAAK2oB,WAGtDzR,OAAO+I,QAAQ3f,UAAUuD,KAAO,SAASwoB,GACxC,GAAIvM,GAAU9f,KACVssB,KACAC,EAAQF,EAAOG,cAEf3oB,EAAO,SAAS0L,GAUnB,IARA,GAEI6O,GACAwG,EAEA6H,EALAC,EAAOnd,EAAK4c,YAAYK,cACxBplB,EAAQ0Y,EAAQtQ,SAASmc,cAGzBtlB,EAAO,GAEPsmB,EAAQ,IAEE,IAAP/H,GACNA,EAAM8H,EAAKtqB,QAAQmqB,EAAOlmB,EAAO,GAEvB,IAAPue,IAEFxd,EAAQ0Y,EAAQtQ,SAASmc,cACzBvkB,EAAMwkB,SAASrc,EAAMqV,GACrBxd,EAAM0kB,OAAOvc,EAAMqV,EAAM2H,EAAMppB,QAG/Bib,EAAM0B,EAAQgL,aAAa1jB,GAGxBmI,EAAK4c,YAAYhpB,OAASwpB,EAC5BF,EAAUld,EAAK4c,aAEfM,EAAUld,EAAK4c,YAAYnG,UAAUpB,EAAI+H,EAAM,EAAE/H,EAAI+H,EAAM,GAC3DF,EAAU,MAAQA,EAAU,OAI7BH,EAAQ1rB,MACPwd,IAAKA,EACLqO,QAASA,KAIXpmB,EAAOue,EAmBT,OANA5kB,MAAK4sB,WAAW5sB,KAAKwP,SAAU,SAASD,GACvC1L,EAAK0L,KAKC+c,GAIRpV,OAAO+I,QAAQ3f,UAAUssB,WAAa,SAAStV,EAAMuV,GAWpD,IAVA,GASItd,GATAud,EAAatd,SAASud,iBAAiBzV,EAAM0V,WAAWC,WAC1DC,WAAY,SAAU3d,GACpB,MAAIA,GAAKK,OAAU,QAAQud,KAAK5d,EAAKK,MAC7Bod,WAAWI,cAEXJ,WAAWK,iBAGpB,GAEK9d,EAAOud,EAAWQ,YACzBT,EAAKtd,IAKP2H,OAAO+I,QAAQ3f,UAAU2K,QAAU,SAASshB,EAAOM,EAAMU,EAAUC,GAClE,GAAIC,GAAQztB,KAAKkd,SAASwQ,iBAAiBnB,GAC1CvH,EAAY3kB,MAAMC,UAAUQ,MAAMsC,KAAKqqB,GACvCE,EAAQ3I,EAAU7hB,MAGnB,OAAa,KAAVwqB,MACFJ,IAAS,OAGVvI,GAAU1jB,QAAQ,SAAS8e,GAC1B,GAAIwN,IAAS,EACTxlB,EAAQ,SAAS8C,EAAQ2iB,GACzBD,KAAW,IACbD,IACGH,GAAUA,EAAStiB,EAAQ2iB,EAAMF,GACxB,GAATA,GAAcJ,GAAUA,GAAS,GACpCK,GAAS,GAIXf,GAAKzM,EAAMhY,IAEVzF,KAAK3C,QAIRkX,OAAO+I,QAAQ3f,UAAUwtB,kBAAoB,SAASvB,EAAOwB,EAAMlB,EAAM9f,GACxE,GAAIihB,GACFC,KACA9E,EAASnpB,KAAKkb,MACdgT,EAASluB,KAAKkpB,OAAOqD,GACrB4B,EAAOjX,OAAOoD,KAAKwH,IAAI9hB,KAAKgiB,UAC5BoM,EAAeD,EAAK5L,KACpB8L,EAAQN,EACRO,EAAQ,EACRd,EAAW,SAAS3L,EAAKgM,GACxBI,EAASJ,GAAQhM,GAElB0L,EAAW,WACPxgB,GAAUA,IAEb7M,EAAEgD,KAAK8qB,EAAU,SAASnM,GACzBsH,EAAOmB,UAAUzI,KAGlBqM,EAASD,EAGR9E,KAEA+E,IAAQA,MACZF,EAAW9tB,EAAE0I,MAAMslB,GAEnBluB,KAAKiL,QAAQshB,EAAO,SAASgC,EAAMvO,GAClC,GAAIwO,GAAMD,EAAKE,aAAaJ,GAC1BR,EAAO3W,OAAOoD,KAAKyI,WAAWqL,EAAcI,GAE1CE,EAAa,SAAS7M,GACxB,GAAI8M,EACJJ,GAAKK,OAAS,WACb7mB,aAAa4mB,GACb3O,EAAK6B,EAAKgM,IAGXU,EAAKM,QAAU,SAASzuB,GACvB2H,aAAa4mB,GACb3O,EAAK6B,EAAKgM,GACV5Q,QAAQtK,MAAMvS,IAGH,SAATmsB,GAEFgC,EAAK/E,aAAa,4BAA6B,QAGpC,cAAT+C,GAAsD,eAA7BgC,EAAKE,aAAa,OAE7CzO,EAAK6B,EAAKgM,GAEVc,EAAUhnB,WAAW,WACpBqY,EAAK6B,EAAKgM,IACRS,GAGJC,EAAK/E,aAAa6E,EAAOxM,GAMxBgM,KAAQG,IACVU,EAAWV,EAASH,IACpBI,EAASJ,GAAQG,EAASH,SACnBG,GAASH,IAEhBhB,EAAK1D,EAAQ0E,EAAMa,EAAYH,IAG9BhB,EAAUC,IAGd,IAAItW,QAASA,UACbA,QAAOoD,QAGPpD,OAAOoD,KAAKwJ,MAAQ,SAASF,GAC5B,MAAOpU,UAASsf,eAAelL,IAIhC1M,OAAOoD,KAAKyU,OAAS,SAASC,GAC7B,MAAOxf,UAASyf,uBAAuBD,IAGxC9X,OAAOoD,KAAKgI,QAAU,SAAST,EAAKqN,EAAMlW,GA0CzC,QAASmW,KACR,GAAInvB,KAAKovB,aAAepvB,KAAKqvB,KAC5B,GAAoB,MAAhBrvB,KAAKsvB,OAAgB,CACxB,GAAInvB,EAGHA,GADU,OAAR+uB,EACElvB,KAAKuvB,YAEC,QAARL,EACEnO,KAAKzE,MAAMtc,KAAKwvB,UAEV,QAARN,EAECO,EACEzvB,KAAKwvB,SAGL,GAAIE,OAAM1vB,KAAKwvB,WAIhBxvB,KAAKwvB,SAGV7e,EAAS3D,QAAQ7M,OAEjBwQ,GAAS1M,QACRohB,QAAUrlB,KAAKwvB,SACf9c,OAAQ,GAAIlF,QAAQkF,QArExB,GAAI+c,GAActf,OAAOwf,IACrBC,EAAgBH,EAAc,OAAS,cAEvC9e,EAAW,GAAIsG,MAAKrP,MAEpBioB,EAAM,GAAIC,gBAIVC,EAAeD,eAAexvB,SAkElC,OAhEM,oBAAsByvB,IAE3BvvB,OAAOwvB,eAAeD,EAAc,oBACnC9qB,MAAO,eAGN+T,IACF6W,EAAI7W,iBAAkB,GAEvB6W,EAAI1U,KAAK,MAAO0G,GAAK,GACrBgO,EAAII,mBAAqBd,EAEd,QAARD,IACFW,EAAIK,aAAeN,GAGT,QAARV,GACFW,EAAIM,iBAAiB,SAAU,oBAGrB,OAARjB,GACFW,EAAIO,iBAAiB,YAGX,UAARlB,IACFW,EAAIK,aAAe,eAGpBL,EAAIQ,OAoCG1f,EAASC,SAGjBsG,OAAOoD,KAAKxU,QAAU,SAASwqB,GAC9B,GAAIC,KAEJ,KAAK,GAAIC,KAAUF,GAAK,CACvB,GAAIG,EACCH,GAAIlvB,eAAeovB,KACvBC,EAASH,EAAIE,GACbC,EAAOC,MAAQF,EACfD,EAAI3vB,KAAK6vB,IAIX,MAAOF,IAIRrZ,OAAOoD,KAAKwH,IAAM,SAASD,GAC1B,GAgBE8O,GACAC,EACAC,EAlBE/O,GACDU,SAAW,GACXI,KAAO,GACPX,KAAO,GACPU,OAAS,GACTmO,UAAY,GACZvO,KAAO,GACPJ,SAAW,GACXe,UAAY,GACZ6N,SAAW,GACXzS,KAAOuD,GAERmP,EAAOnP,EAAIzf,QAAQ,SACnB6uB,EAAcpP,EAAIzf,QAAQ,OAC1B8uB,EAASrP,EAAIzf,QAAQ,KACrB2uB,EAAWlP,EAAIzf,QAAQ,IAKzB,OAAY,KAAT4uB,GACFlP,EAAIU,SAAW,OACfV,EAAIS,KAAOV,EAAIzf,QAAQ,EAAG2uB,GACnBjP,IAGO,IAAZiP,IACFjP,EAAIiP,SAAWlP,EAAI/gB,MAAMiwB,EAAW,GACpClP,EAAMA,EAAI/gB,MAAM,EAAGiwB,IAGP,IAAVG,IACFpP,EAAIoP,OAASrP,EAAI/gB,MAAMowB,EAAS,GAChCrP,EAAMA,EAAI/gB,MAAM,EAAGowB,GACnB5S,KAAOuD,GAGU,IAAfoP,GACFnP,EAAIU,SAAWX,EAAI/gB,MAAM,EAAGmwB,GAC5BN,EAAkB9O,EAAI/gB,MAAMmwB,EAAY,GACxCJ,EAAaF,EAAgBvuB,QAAQ,KAEnB,KAAfyuB,GACF/O,EAAIc,KAAOd,EAAIG,KACfH,EAAIG,KAAO,KAEXH,EAAIc,KAAO+N,EAAgB7vB,MAAM,EAAG+vB,GACpC/O,EAAIG,KAAO0O,EAAgB7vB,MAAM+vB,IAIlC/O,EAAIa,OAASb,EAAIU,SAAW,MAAQV,EAAIc,KAExCd,EAAIgP,UAAY5Z,OAAOoD,KAAK6W,OAAOrP,EAAIG,MAEvCH,EAAIS,KAAOT,EAAIa,OAASb,EAAIgP,YAG5BhP,EAAIG,KAAOJ,EACXC,EAAIgP,UAAY5Z,OAAOoD,KAAK6W,OAAOtP,GACnCC,EAAIS,KAAOT,EAAIgP,WAIhBhP,EAAIK,SAAWN,EAAI5W,QAAQ6W,EAAIS,KAAM,IACrCqO,EAAM9O,EAAIK,SAAS7f,YAAY,KACrB,IAAPsuB,IACF9O,EAAIoB,UAAYpB,EAAIK,SAASrhB,MAAM8vB,EAAI,IAEjC9O,IAKR5K,OAAOoD,KAAK6W,OAAS,SAAStP,GAE7B,GAAIuP,GAAYvP,EAAIvf,YAAY,IAEhC,IAAgB,IAAb8uB,EAAiB,GAAID,GAAS,EAIjC,OAFAA,GAAStP,EAAI/gB,MAAM,EAAGswB,EAAY,IAOnCla,OAAOoD,KAAK+W,cAAgB,SAASC,GACpC,GACCnkB,GAAOokB,EAAaC,EAAKC,EAAWC,EADjCC,EAAgB,UAGpB,IAAsC,IAAlCL,EAAQlvB,QAAQuvB,GAKnB,MAJAxkB,GAAQmkB,EAAQlkB,MAAM,KACtBmkB,EAAcpkB,EAAM,GAAGC,MAAM,KAAK,GAClCokB,EAAMrkB,EAAM,GAEL,GAAIuiB,OAAM8B,IAAOtC,KAAMqC,GAG/BpkB,GAAQmkB,EAAQlkB,MAAMukB,GACtBJ,EAAcpkB,EAAM,GAAGC,MAAM,KAAK,GAClCokB,EAAMrhB,OAAOyhB,KAAKzkB,EAAM,IACxBskB,EAAYD,EAAIruB,OAEhBuuB,EAAa,GAAIG,YAAWJ,EAE5B,KAAK,GAAIhxB,GAAI,EAAOgxB,EAAJhxB,IAAiBA,EAChCixB,EAAWjxB,GAAK+wB,EAAIM,WAAWrxB,EAGhC,OAAO,IAAIivB,OAAMgC,IAAcxC,KAAMqC,KAItCra,OAAOoD,KAAKyX,UAAY,SAASvD,EAAKzhB,EAAU8Y,GAC/C,GAAIxkB,GAAGlB,CACPA,IAAI,EACJkB,EAAImO,SAAS2P,cAAc,UAC3B9d,EAAE6tB,KAAO,kBACT7tB,EAAEgU,OAAQ,EACVhU,EAAEmtB,IAAMA,EACRntB,EAAEutB,OAASvtB,EAAE4uB,mBAAqB,WAC3B9vB,GAAOH,KAAKovB,YAAiC,YAAnBpvB,KAAKovB,aACpCjvB,GAAI,EACD4M,GAAUA,MAGf8Y,EAASA,GAAUrW,SAASwiB,KAC5BnM,EAAOtG,YAAYle,IAGpB6V,OAAOoD,KAAK2X,WAAa,SAASC,EAAQnlB,EAAU8Y,GACnD,GAAIsM,GAAQD,EAAO/uB,OAClBivB,EAAO,EACPC,EAAK,WACJD,IACGD,GAASC,EACRrlB,GAAUA,IAEbmK,OAAOoD,KAAKyX,UAAUG,EAAOE,GAAOC,EAAIxM,GAI3C3O,QAAOoD,KAAKyX,UAAUG,EAAOE,GAAOC,EAAIxM,IAGzC3O,OAAOoD,KAAKgY,OAAS,SAAS9D,EAAKzhB,EAAU8Y,GAC5C,GAAIxkB,GAAGlB,CACPA,IAAI,EACJkB,EAAImO,SAAS2P,cAAc,QAC3B9d,EAAE6tB,KAAO,WACT7tB,EAAEkxB,IAAM,aACRlxB,EAAEid,KAAOkQ,EACTntB,EAAEutB,OAASvtB,EAAE4uB,mBAAqB,WAC3B9vB,GAAOH,KAAKovB,YAAiC,YAAnBpvB,KAAKovB,aACpCjvB,GAAI,EACD4M,GAAUA,MAGf8Y,EAASA,GAAUrW,SAASwiB,KAC5BnM,EAAOtG,YAAYle,IAGpB6V,OAAOoD,KAAKgN,SAAW,SAASkL,GAC/B,GAAIC,IAAW,SAAU,MAAO,IAAK,MAEpCC,EAAQF,EAAW,GAAGG,cAAgBH,EAAW1xB,MAAM,GACvDqC,EAASsvB,EAAQtvB,MAElB,IAA+C,mBAApCqM,UAASwiB,KAAK5S,MAAMoT,GAC9B,MAAOA,EAGR,KAAM,GAAI/xB,GAAE,EAAO0C,EAAJ1C,EAAYA,IAC1B,GAAuD,mBAA5C+O,UAASwiB,KAAK5S,MAAMqT,EAAQhyB,GAAKiyB,GAC3C,MAAOD,GAAQhyB,GAAKiyB,CAItB,OAAOF,IAGRtb,OAAOoD,KAAKyI,WAAa,SAASR,EAAMN,GACvC,GAAIJ,GAIHjF,EAHAgW,KACA9Q,EAAM5K,OAAOoD,KAAKwH,IAAIG,GACtB4Q,EAAUtQ,EAAKnV,MAAM,IAGtB,OAAG0U,GAAIc,KACCX,GAGR4Q,EAAQxpB,MAERuT,EAAQqF,EAAK7U,MAAM,KACnBwP,EAAMtb,QAAQ,SAASC,GACb,OAANA,EACFsxB,EAAQxpB,MAERupB,EAAShyB,KAAKW,KAIhBsgB,EAAMgR,EAAQ7xB,OAAO4xB,GAEd/Q,EAAI7W,KAAK,OAIjBkM,OAAOoD,KAAKwY,KAAO,WAClB,GAAIjxB,IAAI,GAAIiG,OAAOqO,UACf2c,EAAO,uCAAuC7nB,QAAQ,QAAS,SAASlK,GAC1E,GAAIZ,IAAK0B,EAAkB,GAAdkD,KAAKK,UAAa,GAAK,CAEpC,OADAvD,GAAIkD,KAAKqF,MAAMvI,EAAE,KACN,KAAHd,EAASZ,EAAO,EAAFA,EAAM,GAAMe,SAAS,KAE7C,OAAO4xB,IAKR5b,OAAOoD,KAAKyY,OAAS,SAAS3S,EAAMtS,EAAOklB,GAC1C,GAAItQ,GAAWxL,OAAOoD,KAAK2Y,WAAW7S,EAAMtS,EAAOklB,EAGnD,OAFAllB,GAAMuD,OAAOqR,EAAU,EAAGtC,GAEnBsC,GAGRxL,OAAOoD,KAAK2Y,WAAa,SAAS7S,EAAMtS,EAAOklB,EAAiBE,EAAQC,GACvE,GAGIC,GAHA/S,EAAQ6S,GAAU,EAClB1S,EAAM2S,GAAQrlB,EAAM3K,OACpBkwB,EAAQtN,SAAS1F,GAASG,EAAMH,GAAS,EAS7C,OAPI2S,KACHA,EAAkB,SAASryB,EAAG0B,GAC7B,MAAG1B,GAAI0B,EAAU,EACVA,EAAJ1B,EAAc,IACdA,EAAI0B,GAAU,EAAjB,SAGc,GAAbme,EAAIH,EACCgT,GAGRD,EAAWJ,EAAgBllB,EAAMulB,GAAQjT,GACtCI,EAAIH,IAAU,EACT+S,EAAW,EAAIC,EAAQA,EAAQ,EAGvB,IAAbD,EACKC,EAEQ,KAAbD,EACKlc,OAAOoD,KAAK2Y,WAAW7S,EAAMtS,EAAOklB,EAAiBK,EAAO7S,GAE5DtJ,OAAOoD,KAAK2Y,WAAW7S,EAAMtS,EAAOklB,EAAiB3S,EAAOgT,KAIrEnc,OAAOoD,KAAKgZ,cAAgB,SAASlT,EAAMtS,EAAOklB,EAAiBE,EAAQC,GAC1E,GAGIC,GAHA/S,EAAQ6S,GAAU,EAClB1S,EAAM2S,GAAQrlB,EAAM3K,OACpBkwB,EAAQtN,SAAS1F,GAASG,EAAMH,GAAS,EAS7C,OAPI2S,KACHA,EAAkB,SAASryB,EAAG0B,GAC7B,MAAG1B,GAAI0B,EAAU,EACVA,EAAJ1B,EAAc,IACdA,EAAI0B,GAAU,EAAjB,SAGc,GAAbme,EAAIH,EACC,IAGR+S,EAAWJ,EAAgBllB,EAAMulB,GAAQjT,GACtCI,EAAIH,IAAU,EACI,IAAb+S,EAAiBC,EAAQ,GAEjB,IAAbD,EACKC,EAEQ,KAAbD,EACKlc,OAAOoD,KAAKgZ,cAAclT,EAAMtS,EAAOklB,EAAiBK,EAAO7S,GAE/DtJ,OAAOoD,KAAKgZ,cAAclT,EAAMtS,EAAOklB,EAAiB3S,EAAOgT,KAKxEnc,OAAOoD,KAAKxK,MAAQ,SAASyjB,GAC5B,GAAIlZ,MACAmZ,EAAQD,EAER1O,EAAU,SAAS4O,EAAUC,EAAMC,GAMtC,MALAtZ,GAAGzZ,MACF6yB,SAAaA,EACbC,KAAaA,EACbC,QAAaA,IAEPtZ,GAGJ+K,EAAU,WACb,GAAIwO,EACDvZ,GAAGlX,SACLywB,EAASvZ,EAAGwZ,QAGZL,EAAMI,EAAOH,UAAUhvB,MAAMmvB,EAAOD,SAAWH,EAAOI,EAAOF,QAM3DxkB,EAAQ,WACX,KAAMmL,EAAGlX,QACRiiB,KAIE0O,EAAQ,WACXzZ,MAGGlX,EAAS,WACZ,MAAOkX,GAAGlX,OAGX,QACC0hB,QAAYA,EACZO,QAAYA,EACZlW,MAAUA,EACV4kB,MAAUA,EACV3wB,OAAWA,IAQb+T,OAAOoD,KAAK+Q,gBAAkB,SAASrM,GACtC,MAAIA,IAAWA,EAAQ0J,GACf,YAAc1J,EAAQ0J,GAAK,KAE3BxR,OAAOoD,KAAKyZ,oBAAoB/U,IAIzC9H,OAAOoD,KAAKyZ,oBAAsB,SAAS/U,GAC1C,GAEIzZ,GAAOyuB,EAAUC,EAASC,EAF1BtX,KACCuX,EAA2E,iCAAhEnV,EAAQoV,cAAcvJ,gBAAgB4D,aAAa,QAYnE,KATGzP,EAAQvV,WAAa4qB,KAAKC,YAE5B/uB,EAAQ2R,OAAOoD,KAAKia,gBAAgBvV,GAAW,EAE/CpC,EAAMhc,KAAK,UAAU2E,EAAM,KAC3ByZ,EAAUA,EAAQwV,YAIZxV,GAA+B,GAApBA,EAAQvV,SAAeuV,EAAUA,EAAQwV,WAC3D,CACCjvB,EAAQ,CACR,KAAK,GAAIkvB,GAAUzV,EAAQ0V,gBAAiBD,EAASA,EAAUA,EAAQC,gBAGlED,EAAQhrB,UAAY4qB,KAAKM,oBAGzBF,EAAQT,UAAYhV,EAAQgV,YAC7BzuB,CAGJyuB,GAAWhV,EAAQgV,SAASxH,cAC5ByH,EAAWE,EAAU,SAAWH,EAAWA,EAC3CE,EAAa3uB,EAAQ,KAAOA,EAAM,GAAK,IAAM,GAC7CqX,EAAMvL,OAAO,EAAG,EAAG4iB,EAAUC,GAG9B,MAAOtX,GAAMzZ,OAAS,KAAOyZ,EAAM5R,KAAK,KAAO,MAGhDkM,OAAOoD,KAAKgR,WAAa,SAASsJ,GACjC,GAAIC,IACHC,MAAU,+BACVC,KAAQ,+BAET,OAAOF,GAAGD,IAAW,MAItB1d,OAAOoD,KAAK4R,oBAAsB,SAAS8I,GACzC,GAAI7nB,GAAQ6nB,EAAIC,MAAM,eAWtB,OAVA9nB,GAAQA,EAAM3L,IAAI,SAAS8L,GACzB,MAAa,MAATA,EACK,OAGI,MAATA,EACK,OAEF,IAAOA,EAAO,MAEhB,aAAiBH,EAAMnC,KAAK,KAAO,KAG5CkM,OAAOoD,KAAKia,gBAAkB,SAASW,GAKtC,IAAK,GAFDC,GAFAjhB,EAASghB,EAASV,WAClBY,EAAWlhB,EAAOmhB,WAElB9vB,EAAQ,GACH9E,EAAI,EAAGA,EAAI20B,EAASjyB,SAC5BgyB,EAAMC,EAAS30B,GACZ00B,EAAI1rB,WAAa4qB,KAAKC,WACxB/uB,IAEE4vB,GAAOD,GAL0Bz0B,KAQrC,MAAO8E,IAER2R,OAAO+G,QAAU,SAASqX,GACxB,MAAGA,GAAet1B,KAAKsc,MAAMgZ,GAA7B,QAGFpe,OAAO+G,QAAQ3d,UAAUi1B,yBAA2B,SAASC,EAAiBC,EAAM/M,GAClF,GAAI9D,GAAMmB,SAAS0P,GACjBhY,EAAiB+X,EAAkB,EACnCpX,EAAM,IAAIX,EAAe,GAQ3B,OANAW,IAAmB,GAAXwG,EAAM,GAEX8D,IAAItK,GAAO,IAAMsK,EAAK,KAIlBtK,GAGTlH,OAAO+G,QAAQ3d,UAAUo1B,sBAAwB,SAASC,GACxD,GAAIxoB,KAaJ,OAXAwoB,GAAMr0B,QAAQ,SAASgM,GACrB,GAAIsoB,GAAU,EACdA,IAA8B,GAAlBtoB,EAAK/H,MAAQ,GAEtB+H,EAAKob,KACNkN,GAAW,IAAMtoB,EAAKob,GAAK,KAG7Bvb,EAAMvM,KAAKg1B,KAGNzoB,EAAMnC,KAAK,MAGpBkM,OAAO+G,QAAQ3d,UAAUu1B,uBAAyB,SAAS7W,EAASc,GAClE,GAAI6V,GAAQ31B,KAAK81B,OAAO9W,GACpBiD,EAAOjiB,KAAK01B,sBAAsBC,EACtC,OAAI1T,GAAK9e,OAKA,WAAa2c,EAAU,IAAMmC,EAAO,QAHpC,WAAanC,EAAU,SAOlC5I,OAAO+G,QAAQ3d,UAAUw1B,OAAS,SAASvmB,GAIzC,IAHA,GACI6lB,GADA1iB,KAGEnD,GAA4B,OAApBA,EAAKilB,YAAmD,GAA5BjlB,EAAKilB,WAAW/qB,UACxD2rB,EAAW7lB,EAAKilB,WAAWY,SAE3B1iB,EAAMqjB,SACJrN,GAAOnZ,EAAKmZ,GAEZuL,QAAY1kB,EAAK0kB,QACjB1uB,MAAU6vB,EAAW/0B,MAAMC,UAAU8B,QAAQgB,KAAKgyB,EAAU7lB,GAAQ,IAGtEA,EAAOA,EAAKilB,UAGd,OAAO9hB,IAGTwE,OAAO+G,QAAQ3d,UAAU01B,oBAAsB,SAASV,GAEtD,GAAIW,GAAWX,EAAOloB,MAAM,IAE5B,OAAO6oB,GAAS,IAGlB/e,OAAO+G,QAAQ3d,UAAU41B,iBAAmB,SAASZ,GAEnD,GAAIW,GAAWX,EAAOloB,MAAM,KACxB+oB,EAAgBF,EAAS,GAAKA,EAAS,GAAG7oB,MAAM,KAAO,EAE3D,OAAO+oB,GAAc,IAGvBjf,OAAO+G,QAAQ3d,UAAU81B,4BAA8B,SAASd,GAC9D,GAAIW,GAAWX,EAAOloB,MAAM,IAC5B,OAAO6oB,GAAS,IAAM,IAIxB/e,OAAO+G,QAAQ3d,UAAUgc,MAAQ,SAASgZ,GACxC,GACEe,GACAC,EACAH,EACAI,EACAC,EACAC,EACAxU,EACAzB,EACAkW,EATEtY,KAWFuY,EAAY,SAASrpB,GACnB,GAAI4hB,GAAM3pB,EAAOqxB,EAAclO,CAS/B,OAPAwG,GAAO,UACP3pB,EAAQwgB,SAASzY,GAAQ,EAAI,EAC7BspB,EAAetpB,EAAK2nB,MAAM,YACvB2B,GAAgBA,EAAa,KAC9BlO,EAAKkO,EAAa,KAIlB1H,KAASA,EACT3pB,MAAUA,EACVmjB,GAAOA,IAAM,GAInB,OAAqB,gBAAX4M,IACAnc,SAAU,KAGpBiF,EAAI4W,IAAMM,EAEwB,IAA/BA,EAAOlzB,QAAQ,aAAiD,MAA5BkzB,EAAOA,EAAOnyB,OAAO,KAE1DmyB,EAASA,EAAOx0B,MAAM,EAAGw0B,EAAOnyB,OAAO,IAGzCmzB,EAAmBt2B,KAAKg2B,oBAAoBV,GAC5Ca,EAAgBn2B,KAAKk2B,iBAAiBZ,IAAW,GACjDiB,EAA2Bv2B,KAAKo2B,4BAA4Bd,GAExDgB,IAKJD,EAAcC,EAAiBlpB,MAAM,KAAK,IAAM,KAGhDgR,EAAIjF,SAAY4M,SAASsQ,GAAe,EAAI,GAAO,EAEnDI,EAASJ,EAAYpB,MAAM,YAE3B7W,EAAIyY,QAAUJ,EAASA,EAAO,IAAK,EAEF,IAA9BN,EAAc/zB,QAAQ,MAEvB6a,QAAQiF,KAAK,gCAGfD,EAAOkU,EAAc/oB,MAAM,KAC3BoT,EAAMyB,EAAK5Y,MAEX+U,EAAIuX,SAEJ1T,EAAK3gB,QAAQ,SAASgM,GACpB,GAAIwpB,EAEDxpB,KACDwpB,EAAOH,EAAUrpB,GACjB8Q,EAAIuX,MAAM/0B,KAAKk2B,MAKnBJ,EAAS3Q,SAASvF,GACd5W,MAAM8sB,IAGNtY,EAAIuX,MAAM/0B,KADT81B,EAAS,IAAM,EACDC,EAAUnW,IAGvB0O,KAAS,OACT3pB,OAAWmxB,EAAS,GAAM,IAMhCF,EAAYD,EAAyBtB,MAAM,YACxCuB,GAAaA,EAAU,IACxBpY,EAAI2Y,gBAAkBhR,SAASwQ,EAAyBnpB,MAAM,KAAK,IAEnEgR,EAAI4Y,sBAAwBR,EAAU,IAEtCpY,EAAI2Y,gBAAkBhR,SAASwQ,GAG1BnY,IAxDGjF,SAAU,MA2DtBjC,OAAO+G,QAAQ3d,UAAU22B,UAAY,SAAS7Y,EAAK8Y,EAAMC,GACvD,GAEIjjB,GACAkjB,EACA1K,EACAtf,EALAkc,EAAM4N,GAAQ1nB,SACd6nB,EAASF,GAAWn3B,KAAKs3B,aAAahO,EAa1C,OAPkB,gBAARlL,KACRA,EAAMpe,KAAKsc,MAAM8B,IAGnBgZ,EAAWhZ,EAAIuX,MAAMvX,EAAIuX,MAAMxyB,OAAO,GAGlB,KAAjBib,EAAIjF,UAEE,GAITjF,EAASlU,KAAKu3B,WAAWnZ,EAAKkL,KAQ3B8N,GAA8B,SAAlBA,EAASlI,MACtBxC,EAAOxY,EAAOmhB,WAAW+B,EAAS7xB,OAC/B6Y,EAAI2Y,iBACL3pB,EAAQsf,EAAK8K,UAAUpZ,EAAI2Y,iBAC3BM,EAAOI,UAAUC,IAAI,oBACrBxjB,EAAOuV,aAAa4N,EAAQjqB,IAE5B8G,EAAOuV,aAAa4N,EAAQ3K,IAG9BxY,EAAOuV,aAAa4N,EAAQnjB,EAAOwV,YAG9B2N,IAhBE,GAmBXngB,OAAO+G,QAAQ3d,UAAUg3B,aAAe,SAASJ,GAC/C,GAAI5N,GAAM4N,GAAQ1nB,SACdwP,EAAUsK,EAAInK,cAAc,OAIhC,OAHAH,GAAQ0J,GAAK,qBAAsBxR,OAAOoD,KAAKwY,OAC/C9T,EAAQyY,UAAUC,IAAI,qBAEf1Y,GAGT9H,OAAO+G,QAAQ3d,UAAUq3B,aAAe,SAASN,EAAQH,GAKpDG,EAAOI,UAAUpzB,SAAS,qBAC3BuzB,QAAUP,EAAOQ,YACjBC,QAAUT,EAAO3C,gBACdkD,SACCE,SACqB,IAArBF,QAAQnuB,UACa,IAArBquB,QAAQruB,WAEVquB,QAAQ3L,aAAeyL,QAAQzL,YAC/BkL,EAAO7C,WAAW9T,YAAYkX,UAEhCP,EAAO7C,WAAW9T,YAAY2W,IACtBA,EAAOI,UAAUpzB,SAAS,sBAElCgzB,EAAO7C,WAAW9T,YAAY2W,IAKlCngB,OAAO+G,QAAQ3d,UAAUi3B,WAAa,SAASnZ,EAAK8Y,GAClD,GAGgB5pB,GAAMyqB,EAClBrL,EAJApD,EAAM4N,GAAQ1nB,SACdwP,EAAUsK,EAAIxG,qBAAqB,QAAQ,GAC3CsS,EAAW/0B,MAAMC,UAAUQ,MAAMsC,KAAK4b,EAAQoW,SASlD,IALkB,gBAARhX,KACRA,EAAMpe,KAAKsc,MAAM8B,IAGnB2Z,EAAW3Z,EAAIuX,MAAM70B,MAAM,IACvBi3B,EAAS50B,OACX,MAAOmmB,GAAIxG,qBAAqB,QAAQ,EAG1C,MAAMiV,GAAYA,EAAS50B,OAAS,GAAG,CAcrC,GAbAmK,EAAOyqB,EAASlE,QAEC,SAAdvmB,EAAK4hB,MACNxC,EAAO1N,EAAQqW,WAAW/nB,EAAK/H,OAC/ByZ,EAAU0N,EAAK8H,YAAcxV,GAG7BA,EADQ1R,EAAKob,GACHY,EAAIwF,eAAexhB,EAAKob,IAGxB0M,EAAS9nB,EAAK/H,OAGJ,mBAAZyZ,GAER,MADA/B,SAAQtK,MAAM,iBAAkBrF,EAAM8Q,EAAI4W,MACnC,CAGTI,GAAW/0B,MAAMC,UAAUQ,MAAMsC,KAAK4b,EAAQoW,UAGhD,MAAOpW,IAGT9H,OAAO+G,QAAQ3d,UAAU03B,QAAU,SAASC,EAAQC,GAQlD,GAPqB,gBAAXD,KACRA,EAAS,GAAI/gB,QAAO+G,QAAQga,IAET,gBAAXC,KACRA,EAAS,GAAIhhB,QAAO+G,QAAQia,IAG3BD,EAAO9e,SAAW+e,EAAO/e,SAC1B,MAAO,EAET,IAAG8e,EAAO9e,SAAW+e,EAAO/e,SAC1B,MAAO,EAKT,KAAK,GAAI1Y,GAAI,EAAGA,EAAIw3B,EAAOtC,MAAMxyB,OAAQ1C,IAAK,CAC5C,IAAIy3B,EAAOvC,MAAMl1B,GACf,MAAO,EAET,IAAGw3B,EAAOtC,MAAMl1B,GAAG8E,MAAQ2yB,EAAOvC,MAAMl1B,GAAG8E,MACzC,MAAO,EAET,IAAG0yB,EAAOtC,MAAMl1B,GAAG8E,MAAQ2yB,EAAOvC,MAAMl1B,GAAG8E,MACzC,MAAO,GAMX,MAAG0yB,GAAOtC,MAAMxyB,OAAS+0B,EAAOvC,MAAMxyB,OAC7B,GAIN80B,EAAOlB,gBAAkBmB,EAAOnB,gBAC1B,EAENkB,EAAOlB,gBAAkBmB,EAAOnB,gBAC1B,GAIF,GAGT7f,OAAO+G,QAAQ3d,UAAU+d,oBAAsB,SAASC,EAAM9C,GAC5D,GAIIuN,GAGA3C,EAPAtE,EAAM5K,OAAOoD,KAAKwH,IAAIxD,GACtB2D,EAAOH,EAAIG,KACX8O,EAAWjP,EAAIiP,SACf5X,EAAWqC,EAAK4B,gBAAgB6E,GAEhCtR,EAAW,GAAIsG,MAAKrP,MACpBoW,EAAU,GAAI9G,QAAO+G,OAczB,OAXuB,mBAAb9E,KACRiN,EAAY5K,EAAK9B,MAAMP,GACvB4P,EAASvN,EAAKiB,QAAQ2J,EAAUvE,KAChCkH,EAAOja,KAAK,SAASwa,GACnB,GACIlL,GADAY,EAAUsK,EAAIwF,eAAeiC,EAEjC3S,GAAMJ,EAAQ6X,uBAAuB7W,EAASoH,EAAUuC,SACxDhY,EAAS3D,QAAQoR,MAIdzN,EAASC,SAGlBsG,OAAO+G,QAAQ3d,UAAU63B,wBAA0B,SAASC,EAAQC,EAAQ9V,GAC1E,GAAIrO,GAASkkB,EAAO5D,WAChBmB,EAAQ31B,KAAK81B,OAAO5hB,GACpB+N,EAAOjiB,KAAK01B,sBAAsBC,GAClCpwB,EAAQ,EAAK,EAAIlF,MAAMC,UAAU8B,QAAQgB,KAAK8Q,EAAOmhB,WAAY+C,EACrE,OAAO,WAAa7V,EAAO,IAAMN,EAAO,IAAI1c,EAAM,KAAK8yB,GAAU,GAAG,KAGtEnhB,OAAO+G,QAAQ3d,UAAUg4B,2BAA6B,SAASlxB,EAAOmb,GACpE,GAAI6V,GAAShxB,EAAMmxB,WACfF,EAASjxB,EAAMoxB,YACnB,OAAOx4B,MAAKm4B,wBAAwBC,EAAQC,EAAQ9V,IAGtDrL,OAAO+G,QAAQ3d,UAAU8rB,qBAAuB,SAAShlB,EAAOmb,GAC9D,GAAIlC,GAAOoY,EAAcC,EAAYC,EAAW9M,EAAa+M,EACzDpY,EAAKqY,EAAYC,EAAUC,EAAShN,EAAWiN,CAInD,IAFA3Y,EAAQjZ,EAAM8jB,eAEQ,IAAnB7K,EAAM5W,SACPgvB,EAAepY,EAAMmU,WAErBoE,EAAa,EAAK,EAAI1hB,OAAOoD,KAAKia,gBAAgBlU,GAClDqY,EAAa14B,KAAK81B,OAAO2C,OACpB,CAAA,GAAGrxB,EAAMskB,UACd,MAAO1rB,MAAK61B,uBAAuBxV,EAAOkC,EAE1CmW,GAAa14B,KAAK81B,OAAOzV,GAM3B,MAHAsY,GAAY34B,KAAK01B,sBAAsBgD,GACvC7M,EAAczkB,EAAMykB,YAEhBzkB,EAAMskB,UA0BD,WAAanJ,EAAO,IAAMoW,EAAY,IAAKC,EAAY,IAAK/M,EAAa,KAzBhFrL,EAAMpZ,EAAM+jB,aAEQ,IAAjB3K,EAAI/W,UACLovB,EAAarY,EAAIgU,WAEjBwE,EAAW,EAAK,EAAI9hB,OAAOoD,KAAKia,gBAAgB/T,GAEhDsY,EAAW94B,KAAK81B,OAAO+C,IAEvBC,EAAW94B,KAAK81B,OAAOtV,GAGzBuY,EAAU/4B,KAAK01B,sBAAsBoD,GACrC/M,EAAY3kB,EAAM2kB,UAGlBgN,EAAUA,EAAQ9tB,QAAQ0tB,EAAW,IAEjCI,EAAQ51B,SACV41B,GAAoB,KAGf,WAAaxW,EAAO,IAAMoW,EAAY,IAAMC,EAAa,IAAM/M,EAAc,IAAMkN,EAAUC,EAAW,IAAMjN,EAAY,MAOrI7U,OAAO+G,QAAQ3d,UAAU24B,uBAAyB,SAAStD,GACzD,GAAIuD,IAAS,IAAK,IAclB,OAZAvD,GAAMr0B,QAAQ,SAASw1B,GACrB,GAAIqC,GAAWrC,EAAKvxB,MAAQ,CAG1B2zB,GAAMt4B,KADLk2B,EAAKpO,GACK,gBAAkByQ,EAAW,aAAerC,EAAKpO,GAAK,KAC3C,SAAdoO,EAAK5H,KACF,UAAYiK,EAAW,IAEvB,KAAOA,EAAW,OAI1BD,EAAMluB,KAAK,MAIpBkM,OAAO+G,QAAQ3d,UAAU84B,qBAAuB,SAAShb,EAAK8Y,GAC5D,GAEIE,GACA8B,EACAhO,EACAmO,EALA/P,EAAM4N,GAAQ1nB,SACdpI,EAAQkiB,EAAIqC,aAWhB,OALkB,gBAARvN,KACRA,EAAMpe,KAAKsc,MAAM8B,IAIC,KAAjBA,EAAIjF,UAEE,GAGT+f,EAAQl5B,KAAKi5B,uBAAuB7a,EAAIuX,OAGxCyB,EAAWhZ,EAAIuX,MAAMvX,EAAIuX,MAAMxyB,OAAO,IACtC+nB,EAAiB5B,EAAI9d,SAAS0tB,EAAO5P,EAAK,KAAMiC,YAAYC,wBAAyB,MAAMC,kBAMxFP,GAAkB9M,EAAI2Y,iBAAmB,GAC1CsC,EAAanO,EAAe/nB,OAEzBib,EAAI2Y,gBAAkBsC,GACvBjyB,EAAMwkB,SAASV,EAAgB9M,EAAI2Y,iBACnC3vB,EAAM0kB,OAAOZ,EAAgBmO,KAE7Bpc,QAAQqc,MAAM,8BAA+Blb,EAAI2Y,gBAAiBsC,GAClEjyB,EAAMwkB,SAASV,EAAgBmO,EAAa,GAC5CjyB,EAAM0kB,OAAOZ,EAAgBmO,KAEvBnO,GACR9jB,EAAMmyB,WAAWrO,GAGZ9jB,GAlBE,OAqBX8P,OAAO+G,QAAQ3d,UAAUk5B,YAAc,SAAS3T,GAC9C,MAAqB,gBAAXA,IACuB,IAA/BA,EAAOzjB,QAAQ,aACN,GAGJ,GAET8U,OAAOiK,OAAS,SAASmP,EAAKmJ,GAgB7B,MAdAz5B,MAAK05B,UAKJ15B,KAAKy5B,GAHFA,EAGOA,EAFAjqB,SAAS2P,cAAc,OAKlCmR,EAAIqJ,YAAc35B,KAAK25B,YACvBrJ,EAAIsJ,KAAO55B,KAAK45B,KAChBtJ,EAAIuJ,OAAS75B,KAAK65B,OAClBvJ,EAAIwJ,OAAS95B,KAAK85B,OAClBxJ,EAAIyJ,YAAc/5B,KAAK+5B,YAEhB/5B,MAGRkX,OAAOiK,OAAO7gB,UAAUq5B,YAAc,SAASK,GAC9C,GAAI55B,GAAI,GAAI65B,aAAYD,EAExB,OADAh6B,MAAK05B,OAAOM,GAAO55B,EACZA,GAGR8W,OAAOiK,OAAO7gB,UAAUs5B,KAAO,SAASI,EAAKE,GAC5C,GAAI95B,EAEAJ,MAAK05B,OAAOM,GAIf55B,EAAIJ,KAAK05B,OAAOM,IAHhB/c,QAAQiF,KAAK,YAAa8X,EAAK,0BAC/B55B,EAAIJ,KAAK25B,YAAYK,IAKnBE,IAAK95B,EAAE85B,IAAMA,GAChBl6B,KAAKy5B,GAAGU,cAAc/5B,IAIvB8W,OAAOiK,OAAO7gB,UAAUu5B,OAAS,SAASG,EAAKnN,EAAMuN,GACpD,MAAIp6B,MAAK05B,OAAOM,QAMbI,EACFp6B,KAAKy5B,GAAGre,iBAAiB4e,EAAKnN,EAAKlqB,KAAKy3B,IAAS,GAEjDp6B,KAAKy5B,GAAGre,iBAAiB4e,EAAKnN,GAAM,KARpC5P,QAAQiF,KAAK,YAAa8X,EAAK,8BAC/Bh6B,MAAK25B,YAAYK,KAYnB9iB,OAAOiK,OAAO7gB,UAAUw5B,OAAS,SAASE,EAAKnN,GAC9C7sB,KAAKy5B,GAAGtR,oBAAoB6R,EAAKnN,GAAM,IAGxC3V,OAAOiK,OAAO7gB,UAAUy5B,YAAc,SAASM,EAAOC,EAAQzN,EAAMuN,GAGnE,QAASG,KACRv6B,KAAK85B,OAAOO,EAAOxN,GACnB7sB,KAAK85B,OAAOQ,EAAQC,GAJrBv6B,KAAK65B,OAAOQ,EAAOxN,EAAMuN,GAOzBp6B,KAAK65B,OAAOS,EAAQC,EAAUv6B,OAE/BkX,OAAOsjB,SACPtjB,OAAO8R,MAAQ,WACd,QAASwR,MAmGT,MAhGAA,GAAMl6B,UAAU2oB,SAAW,WAC1B,GAAIwR,EACJz6B,MAAKw6B,SACLn6B,MAAMC,UAAUQ,MAAMsC,KAAKM,WAAWpC,QAAQ,SAAS0O,GACtDhQ,KAAKw6B,MAAMxqB,OACThQ,KAEH,KAAK,GAAI06B,KAAY16B,MAAKw6B,MACzBC,EAAQv6B,EAAE6F,OAAOmR,OAAOsjB,MAAME,IAE9BD,EAAMn5B,QAAQ,SAASq5B,GACtB36B,KAAK+kB,aAAa2V,EAAUC,IAC1B36B,OAMLw6B,EAAMl6B,UAAUykB,aAAe,SAASmK,EAAM0L,EAAOC,GAErB,mBAArB76B,MAAKw6B,MAAMtL,GAEC,kBAAZ,GACL2L,EACF76B,KAAKw6B,MAAMtL,GAAM6G,QAAQ6E,GAEzB56B,KAAKw6B,MAAMtL,GAAMtuB,KAAKg6B,GAEfv6B,MAAMmC,QAAQo4B,IACtBA,EAAMt5B,QAAQ,SAASq5B,GACnBE,EACF76B,KAAKw6B,MAAMtL,GAAM6G,QAAQ4E,GAEzB36B,KAAKw6B,MAAMtL,GAAMtuB,KAAK+5B,IAErB36B,OAIJA,KAAKw6B,MAAMtL,IAAS0L,GAEC,kBAAZ,GACR56B,KAAKw6B,MAAMtL,IAAS0L,GACZv6B,MAAMmC,QAAQo4B,KACtB56B,KAAKw6B,MAAMtL,MACX0L,EAAMt5B,QAAQ,SAASq5B,GACtB36B,KAAKw6B,MAAMtL,GAAMtuB,KAAK+5B,IACpB36B,SAMNw6B,EAAMl6B,UAAUw6B,WAAa,SAAS5L,EAAM6L,GAC3C,GAAIx1B,EAE2B,oBAArBvF,MAAKw6B,MAAMtL,KAEI,kBAAf,IACR3pB,EAAQvF,KAAKw6B,MAAMtL,GAAM9sB,QAAQ24B,GAC7Bx1B,EAAQ,IACXvF,KAAKw6B,MAAMtL,GAAM7d,OAAO9L,EAAO,IAExBlF,MAAMmC,QAAQu4B,IACtBA,EAASz5B,QAAQ,SAASq5B,GACzBp1B,EAAQvF,KAAKw6B,MAAMtL,GAAM9sB,QAAQu4B,GAC7Bp1B,EAAQ,IACXvF,KAAKw6B,MAAMtL,GAAM7d,OAAO9L,EAAO,IAE9BvF,QAKNw6B,EAAMl6B,UAAUqpB,aAAe,SAASuF,EAAMniB,EAAUiuB,GAYvD,QAASC,KACRtN,IACY,GAATA,GAAc5gB,GAAUA,IAb5B,GAAIytB,GAAO7M,CAEX,OAA+B,mBAArB3tB,MAAKw6B,MAAMtL,IAA8B,GAEnDsL,EAAQx6B,KAAKw6B,MAAMtL,GAEnBvB,EAAQ6M,EAAMr3B,OACD,IAAVwqB,GAAe5gB,GACjBA,QAQDytB,GAAMl5B,QAAQ,SAASq5B,GACtBA,EAAKM,EAAWD,QAKjBE,SAAU,SAASruB,GAElB,GAD0BqE,SAAvBgG,OAAOsjB,MAAM3tB,KAAuBqK,OAAOsjB,MAAM3tB,OACnB,gBAAvBqK,QAAOsjB,MAAM3tB,GAAsB,KAAM,uBAAuBA,CAC1E,OAAOqK,QAAOsjB,MAAM3tB,IAErB1B,MAAO,SAAShE,GACf,IAAK,GAAIiP,KAAQokB,GAAMl6B,UACtB6G,EAAOiP,GAAQokB,EAAMl6B,UAAU8V,QAMnCc,OAAOikB,OAASjkB,OAAOikB,WAEvBjkB,OAAOikB,OAAOC,WAAa,WAC1Bp7B,KAAK6qB,gBAAkB,KACvB7qB,KAAKq7B,YAAc,MAGpBnkB,OAAOikB,OAAOC,WAAW96B,UAAUg7B,OAAS,SAASzQ,EAAiBlM,EAAQC,EAAS2c,GAEtF,GAAIC,GAAatkB,OAAOoD,KAAKgN,SAAS,cAClCmU,EAAYvkB,OAAOoD,KAAKgN,SAAS,aACjCoU,EAAcxkB,OAAOoD,KAAKgN,SAAS,eACnCqU,EAAazkB,OAAOoD,KAAKgN,SAAS,cAGlClP,EAAQrT,KAAKqF,MAAMuU,GAEnB0H,EAAUthB,KAAKqF,MAAMgO,EAAQ,GAC7BK,EAAO8iB,GAAQ,EAAKA,EAASlV,EAAU,IAAM,EAAKA,EAAUA,EAAU,CAsB1E;MArBArmB,MAAK6qB,gBAAkBA,EAEvB7qB,KAAKq7B,YAAejjB,EAAQK,EAG5BoS,EAAgBzL,MAAME,SAAW,SAGjCuL,EAAgBzL,MAAMhH,MAAQA,EAAQ,KAGtCyS,EAAgBzL,MAAM/G,OAASuG,EAAU,KAGzCiM,EAAgBzL,MAAMoc,GAAc,aACpC3Q,EAAgBzL,MAAMuc,GAAc,OACpC9Q,EAAgBzL,MAAMsc,GAAetjB,EAAM,KAC3CyS,EAAgBzL,MAAMqc,GAAahjB,EAAI,KACvCzY,KAAK47B,SAAWxjB,EAChBpY,KAAKyY,IAAMA,GAGVojB,UAAY77B,KAAKq7B,YACjBS,WAAald,IAIf1H,OAAOikB,OAAOC,WAAW96B,UAAUy7B,eAAiB,WACnD,GAAIC,GAAYC,CAKhB,OAJAj8B,MAAK6qB,gBAAgBzL,MAAMhH,MAAQ,OACnC4jB,EAAah8B,KAAK6qB,gBAAgBqR,YAClCD,EAAiBl3B,KAAKsC,KAAK20B,EAAah8B,KAAKq7B,cAG5CY,eAAiBA,EACjBE,UAAYF,IAId/kB,OAAOikB,OAAOiB,kBAAoB,WACjCp8B,KAAK6qB,gBAAkB,KACvB7qB,KAAKq7B,YAAc,MAGpBnkB,OAAOikB,OAAOiB,kBAAkB97B,UAAUg7B,OAAS,SAASzQ,EAAiBlM,EAAQC,EAAS2c,GAC7F,GAAIC,GAAatkB,OAAOoD,KAAKgN,SAAS,cAClCmU,EAAYvkB,OAAOoD,KAAKgN,SAAS,aACjCoU,EAAcxkB,OAAOoD,KAAKgN,SAAS,eACnCqU,EAAazkB,OAAOoD,KAAKgN,SAAS,cAElC+U,EAAU,EAIVC,EAAYv3B,KAAKqF,MAAMuU,GACvBvG,EAASkkB,EAAY,IAAM,EAAKA,EAAYA,EAAY,EAExDjW,EAAUthB,KAAKqF,MAAMgO,EAAQ,GAC7BK,EAAO8iB,GAAQ,EAAKA,EAASlV,EAAU,IAAM,EAAKA,EAAUA,EAAU,EAGtEuV,EAAW72B,KAAKqF,OAAOgO,EAAQK,GAAO4jB,EAsB1C,OApBAr8B,MAAK6qB,gBAAkBA,EACvB7qB,KAAKq7B,aAAeO,EAAWnjB,GAAO4jB,EAGtCxR,EAAgBzL,MAAME,SAAW,SAGjCuL,EAAgBzL,MAAMhH,MAAQA,EAAQ,KAGtCyS,EAAgBzL,MAAM/G,OAASuG,EAAU,KAGzCiM,EAAgBzL,MAAMoc,GAAc,aACpC3Q,EAAgBzL,MAAMuc,GAAc,OACpC9Q,EAAgBzL,MAAMqc,GAAahjB,EAAI,KACvCoS,EAAgBzL,MAAMsc,GAAeE,EAAS,KAE9C57B,KAAK47B,SAAWA,EAChB57B,KAAKyY,IAAMA,GAEVojB,UAAY77B,KAAKq7B,YACjBS,WAAald,IAIf1H,OAAOikB,OAAOiB,kBAAkB97B,UAAUy7B,eAAiB,WAC1D,GAAIC,GAAah8B,KAAK6qB,gBAAgBqR,YAClCD,EAAiBl3B,KAAKsC,KAAK20B,EAAah8B,KAAKq7B,YAKjD,OAFAr7B,MAAK6qB,gBAAgBzL,MAAMhH,MAAU6jB,EAAiBj8B,KAAKq7B,YAAer7B,KAAKyY,IAAO,MAGrFwjB,eAAiBA,EACjBE,UAA6B,EAAjBF,IAId/kB,OAAOikB,OAAOoB,MAAQ,WACrBv8B,KAAK6qB,gBAAkB,MAGxB3T,OAAOikB,OAAOoB,MAAMj8B,UAAUg7B,OAAS,SAASzQ,GAC/C,GAEI2R,GACAtf,EACA9E,EAAOC,EAJPqjB,EAAcxkB,OAAOoD,KAAKgN,SAAS,eACnCmV,EAAW5R,EAAgBtB,cAAc,kBAiC7C,OA7BAvpB,MAAK6qB,gBAAkBA,EAKpB4R,GAAYA,EAASC,aAAa,aACpCF,EAAUC,EAAShO,aAAa,WAChCvR,EAAWsf,EAAQpvB,MAAM,KACtB8P,EAAS,KACX9E,EAAQ8E,EAAS,GAAGjS,QAAQ,SAAU,KAEpCiS,EAAS,KACX7E,EAAS6E,EAAS,GAAGjS,QAAQ,UAAW,MAK1C4f,EAAgBzL,MAAMhH,MAASA,EAAQ,MAAQ,OAC/CyS,EAAgBzL,MAAM/G,OAAUA,EAAS,MAAQ,OAGjDwS,EAAgBzL,MAAMsc,GAAe,OAGrC7Q,EAAgBzL,MAAME,SAAW,OAEjCtf,KAAK47B,SAAWxjB,EAChBpY,KAAKyY,IAAM,GAGVojB,UAAYzjB,EACZ0jB,WAAazjB,IAKfnB,OAAOikB,OAAOoB,MAAMj8B,UAAUy7B,eAAiB,WAC9C,OACCE,eAAiB,EACjBE,UAAY,IAIdjlB,OAAOyG,UAAY,SAASjE,EAAOwB,GACjClb,KAAK0Z,MAAQA,EACb1Z,KAAKkb,MAAQA,EAEblb,KAAKge,QAAU,GAAI9G,QAAO+G,QAE1Bje,KAAK28B,cACL38B,KAAKmyB,MAAQ,EAEbnyB,KAAK48B,MAAQ,IAEb58B,KAAK68B,SAAW,GAIlB3lB,OAAOyG,UAAUrd,UAAUw8B,SAAW,WACrC,CAAA,GAAInsB,GAAW,GAAIsG,MAAKrP,MACpBuR,EAAW,GACXwG,EAAc3f,KAAK0Z,MAAMvW,OACzB0c,EAAc,SAASlP,GAC1B,GAAImP,GACAC,EAAO5G,EAAW,EAClB6G,EAAOrP,GAAY,GAAIsG,MAAKrP,KAgBhC,OAdGmY,IAAQJ,EACVK,EAAKhT,WAELmM,EAAW4G,EACXD,EAAU,GAAI5I,QAAO+I,QAAQjgB,KAAK0Z,MAAMP,GAAWnZ,KAAKkb,OAErDlb,KAAKgP,QAAQ8Q,GAAShR,KAAK,WAE7BnH,WAAW,WACVkY,EAAYG,IACV,MAIEA,EAAKpP,SACXjO,KAAK3C,KAEQ6f,KAAc/Q,KAAK,WAC/B9O,KAAKmyB,MAAQnyB,KAAK28B,WAAWx5B,OAAO,EAEhCnD,KAAK+8B,cACP/8B,KAAKg9B,gBAAkBh9B,KAAK+8B,aAEhCpsB,EAAS3D,QAAQhN,KAAK28B,aACrBh6B,KAAK3C,OAEP,MAAO2Q,GAASC,SAGjBsG,OAAOyG,UAAUrd,UAAU0O,QAAU,SAAS8Q,GAC5C,MAAOA,GAAQmI,KAAKjoB,KAAKsiB,SACtBxT,KAAK,SAASooB,GAEb,GAAI9vB,GAIAoe,EAHA8D,EAAM4N,EACNha,EAAWoM,EAAIuB,gBACfjX,EAAU,CAGd5T,MAAKi9B,OAAO/f,EAAU,SAAS3N,GAC7B,GACI2tB,GADA1Y,EAAMjV,EAAKpM,OAEXyhB,EAAM,CAgBV,KAbgB,IAAZhR,IACFxM,EAAQkiB,EAAIqC,cACZvkB,EAAMwkB,SAASrc,EAAM,IAGvB2tB,EAAOl9B,KAAK48B,MAAQhpB,EAGjBspB,EAAO1Y,IACR5Q,GAAW4Q,EACXI,EAAMJ,GAGKA,EAANI,GACLhR,EAAU5T,KAAK48B,MACfhY,GAAO5kB,KAAK48B,MAGThY,GAAOJ,EAER5Q,EAAU4Q,GAAOI,EAAM5kB,KAAK48B,QAK5Bx1B,EAAM0kB,OAAOvc,EAAMqV,GACnBxG,IAAM0B,EAAQgL,aAAa1jB,GAC3BpH,KAAK28B,WAAW/7B,KAAKwd,KACrBxK,EAAU,EAGVgR,GAAO,EACPxd,EAAQkiB,EAAIqC,cACZvkB,EAAMwkB,SAASrc,EAAMqV,GAKzBY,GAAOjW,GAEP5M,KAAK3C,OAGHoH,IACFA,EAAM0kB,OAAOtG,EAAMA,EAAKriB,QACxBib,IAAM0B,EAAQgL,aAAa1jB,GAC3BpH,KAAK28B,WAAW/7B,KAAKwd,KACrBxK,EAAU,IAGZjR,KAAK3C,QAIXkX,OAAOyG,UAAUrd,UAAU28B,OAAS,SAAS3lB,EAAMuV,GAGlD,IAFA,GAAIC,GAAatd,SAASud,iBAAiBzV,EAAM0V,WAAWC,UAAW,MAAM,GAErE1d,KAAOud,EAAWQ,YACzBT,EAAKtd,OAKP2H,OAAOyG,UAAUrd,UAAU68B,gBAAkB,SAAS/e,GAErD,MAA8B,KAA3Bpe,KAAK28B,WAAWx5B,OACX,GAGA+T,OAAOoD,KAAK2Y,WAAW7U,EAAKpe,KAAK28B,WAAY38B,KAAKge,QAAQga,UAGnE9gB,OAAOyG,UAAUrd,UAAU88B,kBAAoB,SAAShf,GAEtD,GAAIif,GAAMr9B,KAAKm9B,gBAAgB/e,EAE/B,OAAOpe,MAAKs9B,uBAAuBD,IAGrCnmB,OAAOyG,UAAUrd,UAAUg9B,uBAAyB,SAASD,GAC3D,MAAKA,IAAQr9B,KAAKmyB,MAGVkL,EAAMr9B,KAAKmyB,MAFV,GAKXjb,OAAOyG,UAAUrd,UAAUi9B,gBAAkB,SAASF,GACrD,GAAIjf,GAAM,EAUV,OARiB,gBAAPif,KACTA,EAAMtX,SAASsX,IAGbA,GAAO,GAAKA,EAAMr9B,KAAK28B,WAAWx5B,SACpCib,EAAMpe,KAAK28B,WAAWU,IAGhBjf,GAGRlH,OAAOyG,UAAUrd,UAAUk9B,kBAAoB,SAASv4B,GACtD,GAAI0c,GAAc1c,EAAQ,EAAKA,EAAQ,IAAMA,EAC1Co4B,EAAMt4B,KAAKsC,KAAKrH,KAAKmyB,MAAQxQ,EAEjC,OAAO3hB,MAAKu9B,gBAAgBF,IAG7BnmB,OAAOyG,UAAUrd,UAAU2nB,KAAO,SAASvK,GAGzC,MAFD1d,MAAK28B,WAAa5b,KAAKzE,MAAMoB,GAC5B1d,KAAKmyB,MAAQnyB,KAAK28B,WAAWx5B,OAAO,EAC7BnD,KAAK28B,YAGdzlB,OAAOyG,UAAUrd,UAAUm9B,KAAO,WACjC,MAAO1c,MAAKyC,UAAUxjB,KAAK28B,aAG5BzlB,OAAOyG,UAAUrd,UAAUo9B,WAAa,WACvC,MAAO19B,MAAK68B,UAGb3lB,OAAOyG,UAAUrd,UAAUq9B,WAAa,SAASvL,GAC/C,GAAIiL,EAEJ,IAAkB,gBAARjL,GACRpyB,KAAK+8B,YAAc3K,MACd,CAAA,GAAmB,gBAARA,GAGhB,MAFApyB,MAAK68B,SAAWzK,EAKY,IAA3BpyB,KAAK28B,WAAWx5B,SAID,gBAARivB,IACRiL,EAAMr9B,KAAKm9B,gBAAgB/K,GAC3BpyB,KAAK68B,SAAWQ,GAEhBA,EAAMjL,EAGRpyB,KAAKiR,QAAQ,WACX0Q,WAAY3hB,KAAKs9B,uBAAuBD,OAI5C78B,OAAOwvB,eAAe9Y,OAAOyG,UAAUrd,UAAW,mBAChDs9B,IAAK,WACH,MAAO59B,MAAK68B,UAEdgB,IAAK,SAAUzL,GACbpyB,KAAK29B,WAAWvL,MAIpBnb,KAAKxG,YAAYtF,MAAM+L,OAAOyG,UAAUrd,WAExC4W,OAAO+C,WAAa,SAASH,GAC5B9Z,KAAK8oB,SACL9oB,KAAK0d,aACL1d,KAAKge,QAAU,GAAI9G,QAAO+G,QACvBnE,GAAYA,EAAS3W,QACvBnD,KAAKgP,QAAQ8K,IAIf5C,OAAO+C,WAAW3Z,UAAU0O,QAAU,SAAS8K,GAC9CA,EAASxY,QAAQ,SAAS8e,GACzBpgB,KAAK8oB,MAAMloB,KAAKwf,EAAKE,MACrBtgB,KAAK0d,UAAU9c,KAAKwf,EAAKhC,MACvBpe,MAEHA,KAAK8Z,SAAWA,EAChB9Z,KAAKumB,UAAYR,SAAS/lB,KAAK8oB,MAAM,IACrC9oB,KAAKklB,SAAWa,SAAS/lB,KAAK8oB,MAAM9oB,KAAK8oB,MAAM3lB,OAAO,IACtDnD,KAAK89B,WAAa99B,KAAKklB,SAAWllB,KAAKumB,WAGxCrP,OAAO+C,WAAW3Z,UAAUkhB,YAAc,SAASpD,GAClD,GAAID,GAAK,EAGT,IAA6B,IAA1Bne,KAAK0d,UAAUva,OACjB,MAAO,EAOR,IAAIoC,GAAQ2R,OAAOoD,KAAKgZ,cAAclV,EAAKpe,KAAK0d,UAAW1d,KAAKge,QAAQga,QAkBxE,OAjBY,IAATzyB,GAAeA,EAASvF,KAAK8oB,MAAM3lB,OAAO,EAC5Cgb,EAAKne,KAAK8oB,MAAMvjB,IAKhBA,EAAQ2R,OAAOoD,KAAK2Y,WAAW7U,EAAKpe,KAAK0d,UAAW1d,KAAKge,QAAQga,SAEjE7Z,EAAK5Y,EAAM,GAAK,EAAIvF,KAAK8oB,MAAMvjB,EAAM,GAAKvF,KAAK8oB,MAAM,GAC3C5X,SAAPiN,IAIFA,EAAK,KAIAA,GAGRjH,OAAO+C,WAAW3Z,UAAUkmB,YAAc,SAASrI,GAClD,GAAIC,GAAM,EAEM,iBAAND,KACTA,EAAK4H,SAAS5H,GAKf,IAAI5Y,GAAQvF,KAAK8oB,MAAM1mB,QAAQ+b,EAK/B,OAJY,IAAT5Y,IACF6Y,EAAMpe,KAAK0d,UAAUnY,IAGf6Y,GAGRlH,OAAO+C,WAAW3Z,UAAUmmB,mBAAqB,SAASnF,GACzD,GAAInD,GAAKpZ,KAAKg5B,MAAM/9B,KAAK89B,WAAaxc,EACtC,OAAOnD,IAIRjH,OAAO+C,WAAW3Z,UAAUmhB,mBAAqB,SAAStD,GACzD,GAAIwD,IAAcxD,EAAKne,KAAKumB,WAAavmB,KAAK89B,UAC9C,OAAO/4B,MAAKg5B,MAAmB,IAAbpc,GAAqB,KAIxCzK,OAAO+C,WAAW3Z,UAAU88B,kBAAoB,SAAShf,GACxD,GAAID,GAAKne,KAAKwhB,YAAYpD,GACtBuD,EAAa3hB,KAAKyhB,mBAAmBtD,EACzC,OAAOwD,IAERzK,OAAOqF,OAAS,SAASyhB,GACxBh+B,KAAKg+B,QAAUA,GAAW,IAG3B9mB,OAAOqF,OAAOjc,UAAUqc,UAAY,SAASD,GAE3C,GAAIuhB,GAAUC,EAAU/M,EAAQnU,CAEhC,OAAIN,IAKJuhB,EAAWvhB,EAAa6M,cAAc,cAOtC2U,EAAWD,EAASxP,aAAa,aACjC0C,EAASja,OAAOoD,KAAKwH,IAAIoc,GAAUpN,UACnC9T,EAAWN,EAAayhB,aAIvBphB,YAAgBmhB,EAChBphB,SAAaqU,EACbnU,SAAaA,QAZbC,SAAQtK,MAAM,yBAPdsK,SAAQtK,MAAM,6BAuBjBuE,OAAOqF,OAAOjc,UAAU0b,WAAa,SAASD,GAC7C,GAAIqiB,EAEJ,OAAIriB,IAKJqiB,EAAeriB,EAAWwN,cAAc,YAEpC6U,EAKGp+B,KAAKq+B,eAAeD,EAAc,kBAJxCnhB,SAAQtK,MAAM,0BAPdsK,SAAQtK,MAAM,2BAchBuE,OAAOqF,OAAOjc,UAAU6c,gBAAkB,SAASpB,EAAYiiB,GAC9D,GACII,GAAcE,EAAcC,EAC5B9kB,EAAUmE,EAASW,EAASf,EAC5BC,EACA/D,EACA0D,EACAzD,EANA2C,EAAQtc,IAUZ,OAFGg+B,KAASh+B,KAAKg+B,QAAUA,GAEvBjiB,GAKJqiB,EAAeriB,EAAWwN,cAAc,cAMxC+U,EAAeviB,EAAWwN,cAAc,cAMxCgV,EAAYxiB,EAAWwN,cAAc,WAMrC9P,EAAW6C,EAAM7C,SAAS6kB,GAC1B1gB,EAAUtB,EAAMkiB,YAAYF,GAC5B/f,EAAUjC,EAAMmiB,YAAYH,EAAcC,GAC1C/gB,EAAYlB,EAAMoiB,cAAcJ,GAEhC7gB,EAAiBpd,MAAMC,UAAU8B,QAAQgB,KAAKm7B,EAAU/J,WAAWa,WAAYkJ,GAE/E7kB,EAAQ4C,EAAM5C,MAAM6kB,EAAW9kB,GAE/B2D,KACA1D,EAAMpY,QAAQ,SAAS8e,GACtBhD,EAAgBgD,EAAK9B,MAAQ8B,EAAK7a,QAGnCoU,EAAW2C,EAAM3C,SAASykB,GAE1BzkB,EAASoK,UAAYwa,EAAU9P,aAAa,+BAG3C9U,SAAaA,EACbD,MAAaA,EACbD,SAAaA,EACbmE,QAAaA,EACbW,QAAaA,EACbf,UAAaA,EACbC,eAAmBA,EACnBL,gBAAoBA,QA9BpBH,SAAQtK,MAAM,sBANdsK,SAAQtK,MAAM,yBANdsK,SAAQtK,MAAM,yBANdsK,SAAQtK,MAAM,2BAqDhBuE,OAAOqF,OAAOjc,UAAUk+B,YAAc,SAASF,GAG7C,GAAI/uB,GAAO+uB,EAAa/U,cAAc,+EACtC,OAAOha,GAAOA,EAAKkf,aAAa,SAAU,GAI5CvX,OAAOqF,OAAOjc,UAAUm+B,YAAc,SAASH,EAAcC,GAC5D,GACII,GADApvB,EAAO+uB,EAAa/U,cAAc,8CAatC,OAPKha,KACJovB,EAAQJ,EAAU9P,aAAa,OAC5BkQ,IACFpvB,EAAO+uB,EAAa/U,cAAc,YAAcoV,EAAQ,QAInDpvB,EAAOA,EAAKkf,aAAa,SAAU,GAI3CvX,OAAOqF,OAAOjc,UAAUo+B,cAAgB,SAASJ,GAChD,GAAI/uB,GAAO+uB,EAAa/U,cAAc,iCACtC,OAAOha,GAAOA,EAAKkf,aAAa,SAAU,GAI3CvX,OAAOqF,OAAOjc,UAAUqZ,SAAW,SAASyP,GAC3C,GAAIzP,MACFpY,EAAIvB,IAmBN,OAjBA2Z,GAASilB,UAAYr9B,EAAE88B,eAAejV,EAAK,SAC3CzP,EAASklB,QAAUt9B,EAAE88B,eAAejV,EAAK,WACzCzP,EAASmlB,YAAcv9B,EAAE88B,eAAejV,EAAK,eAE7CzP,EAASolB,QAAUx9B,EAAE88B,eAAejV,EAAK,QAEzCzP,EAASqlB,UAAYz9B,EAAE88B,eAAejV,EAAK,aAE3CzP,EAASqC,WAAaza,EAAE88B,eAAejV,EAAK,cAC5CzP,EAASslB,SAAW19B,EAAE88B,eAAejV,EAAK,YAC1CzP,EAASulB,OAAS39B,EAAE88B,eAAejV,EAAK,UAExCzP,EAASwlB,cAAgB59B,EAAE69B,kBAAkBhW,EAAK,qCAClDzP,EAAS4O,OAAShnB,EAAE69B,kBAAkBhW,EAAK,qCAC3CzP,EAASpB,YAAchX,EAAE69B,kBAAkBhW,EAAK,0CAChDzP,EAAS6O,OAASjnB,EAAE69B,kBAAkBhW,EAAK,qCAEpCzP,GAGRzC,OAAOqF,OAAOjc,UAAU+9B,eAAiB,SAASjV,EAAKzB,GACtD,GACC8R,GADG4F,EAAQjW,EAAIkW,uBAAuB,mCAAoC3X,EAG3E,OAAI0X,IAA0B,IAAjBA,EAAMl8B,QAEnBs2B,EAAK4F,EAAM,GAER5F,EAAGpE,WAAWlyB,OACTs2B,EAAGpE,WAAW,GAAGkK,UAGlB,IARiC,IAYzCroB,OAAOqF,OAAOjc,UAAU8+B,kBAAoB,SAAShW,EAAKzd,GACzD,GAAI8tB,GAAKrQ,EAAIG,cAAc5d,EAE3B,OAAG8tB,IAAMA,EAAGpE,WAAWlyB,OACfs2B,EAAGpE,WAAW,GAAGkK,UAGlB,IAGRroB,OAAOqF,OAAOjc,UAAUmZ,SAAW,SAAS+lB,GAC3C,GAAIxB,GAAUh+B,KAAKg+B,QACjBvkB,KAGEgmB,EAAWD,EAAY9R,iBAAiB,QAC3CD,EAAQptB,MAAMC,UAAUQ,MAAMsC,KAAKq8B,EAkBpC,OAfAhS,GAAMnsB,QAAQ,SAAS8e,GACtB,GAAIsI,GAAKtI,EAAKqO,aAAa,MACzBnQ,EAAO8B,EAAKqO,aAAa,SAAW,GACpCS,EAAO9O,EAAKqO,aAAa,eAAiB,GAC1C7F,EAAaxI,EAAKqO,aAAa,eAAiB,EAElDhV,GAASiP,IACRpK,KAASA,EACTuD,IAAQmc,EAAU1f,EAClB4Q,KAASA,EACNtG,WAAeA,KAKbnP,GAIRvC,OAAOqF,OAAOjc,UAAUoZ,MAAQ,SAASgmB,EAAUjmB,GAClD,GAAIC,MAEA+lB,EAAWC,EAAS5c,qBAAqB,WAC3C2K,EAAQptB,MAAMC,UAAUQ,MAAMsC,KAAKq8B,GAEjChiB,EAAiBpd,MAAMC,UAAU8B,QAAQgB,KAAKs8B,EAASlL,WAAWa,WAAYqK,GAE9E1hB,EAAU,GAAI9G,QAAO+G,OAwBzB,OArBAwP,GAAMnsB,QAAQ,SAAS8e,EAAM7a,GAC5B,GAAIo6B,GAAKvf,EAAKqO,aAAa,SACvB9F,EAAU3K,EAAQuX,yBAAyB9X,EAAgBlY,EAAOo6B,GAClEC,EAAQxf,EAAKqO,aAAa,eAAiB,GAC3CoR,EAAYD,EAAMz8B,OAASy8B,EAAMxyB,MAAM,QACvC0yB,EAAgBrmB,EAASkmB,GAAI/W,WAC7BmX,EAAoBD,EAAc38B,OAAS28B,EAAc1yB,MAAM,QAC/D4yB,GACHtX,GAAOiX,EACPja,OAAWtF,EAAKqO,aAAa,WAAa,GAC1C7F,WAAeiX,EACfhX,mBAAuBkX,EACvBzhB,KAAS7E,EAASkmB,GAAIrhB,KACtBuD,IAASpI,EAASkmB,GAAI9d,IACtBtc,MAAUA,EACVojB,QAAYA,EACZvK,IAAQ,QAAUuK,EAAU,IAE7BjP,GAAM9Y,KAAKo/B,KAGLtmB,GAGRxC,OAAOqF,OAAOjc,UAAUyd,IAAM,SAASD,EAASV,EAAiB6iB,GAOhE,QAASC,GAAchsB,GACtB,GAAIuZ,KAYJ,OAVAptB,OAAMC,UAAUQ,MAAMsC,KAAK8Q,EAAOmhB,YAAY/zB,QAAQ,SAASiO,GAC3D,MAAQA,EAAK0kB,SACf5zB,MAAMC,UAAUQ,MAAMsC,KAAKmM,EAAK8lB,YAAY/zB,QAAQ,SAAS8e,GACzD,MAAQA,EAAK6T,SACfxG,EAAM7sB,KAAKwf,OAMRqN,EAKR,QAAS0S,GAAiBjsB,GACzB,GAAIkM,GAAO,IAQX,OANA/f,OAAMC,UAAUQ,MAAMsC,KAAK8Q,EAAOmhB,YAAY/zB,QAAQ,SAASiO,IAC3D,KAAOA,EAAK0kB,SAAW,QAAU1kB,EAAK0kB,WACxC7T,EAAO7Q,KAIF6Q,EAGR,QAASggB,GAAOlsB,GACf,GAAImsB,MACFC,EAAQJ,EAAchsB,GACtBuZ,EAAQptB,MAAMC,UAAUQ,MAAMsC,KAAKk9B,GACnCn9B,EAASsqB,EAAMtqB,MAGjB,OAAc,KAAXA,GAAqB,GAExBsqB,EAAMnsB,QAAQ,SAAS8e,GACtB,GAAIsI,GAAKtI,EAAKqO,aAAa,QAAS,EACnC+N,EAAU2D,EAAiB/f,GAC3B9B,EAAOke,EAAQ/N,aAAa,SAAW,GACvC/B,EAAO8P,EAAQrQ,aAAe,GAC9B/e,EAAQkR,EAAKlR,MAAM,KACnB4wB,EAAU5wB,EAAM,GAChBmzB,EAAWH,EAAOhgB,GAClBjH,EAAWiE,EAAgB4gB,GAC3B5X,EAAY6Z,EAAU9mB,GACtBiF,EAAOgI,EAAYA,EAAUhI,IAAM,EAEhCsK,KACAvP,GACFiN,EAAY6Z,EAAU9mB,GACtBuP,EAAKtC,EAAUsC,GACftK,EAAMgI,EAAUhI,KAEhBsK,EAAK,yBAA4B8X,KAInCpgB,EAAKoJ,aAAa,KAAMd,GACxB2X,EAAKz/B,MACJ8nB,GAAMA,EACNpK,KAAQA,EACRvQ,MAAS2e,EACT6T,SAAaA,EACbrsB,OAAWA,EAASA,EAAOua,aAAa,MAAQ,KAChDrQ,IAAQA,MAKHiiB,GA/ER,GAAII,GAAQ3iB,EAAQyL,cAAc,qBAChCiX,EAAY,CAEd,OAAIC,GA+EGL,EAAOK,OAGfvpB,OAAOqF,OAAOjc,UAAUuZ,IAAM,SAAS4E,EAAQrB,EAAiB6iB,GAI/D,QAASG,GAAOlsB,GACf,GAAImsB,MACHK,EAAWjiB,EAAOjT,SAAS,6BAA8B0I,EAAQ,KAAMqX,YAAYoV,2BAA4B,MAC/Gx9B,EAASu9B,EAASE,cAEnB,IAAc,IAAXz9B,EAAc,QAEjB,KAAM,GAAI1C,GAAE0C,EAAO,EAAI1C,GAAK,EAAGA,IAAM,CACpC,GAAI2f,GAAOsgB,EAASG,aAAapgC,GAE7BioB,EAAKtI,EAAKqO,aAAa,QAAS,EAClC+N,EAAUpc,EAAKmJ,cAAc,WAC7BiF,EAAMgO,EAAQ/N,aAAa,OAC3BqS,EAAW1gB,EAAKmJ,cAAc,YAC9BmD,EAAOoU,EAAS3U,YAAc2U,EAAS3U,YAAc,GACrD/e,EAAQohB,EAAIphB,MAAM,KAClB4wB,EAAU5wB,EAAM,GAChB+L,EAAWiE,EAAgB4gB,GAC3B5X,EAAY6Z,EAAU9mB,GACtBonB,EAAWH,EAAOhgB,GAClBhC,EAAOgI,EAAYA,EAAUhI,IAAM,EAEjCsK,KACAvP,GACFiN,EAAY6Z,EAAU9mB,GACtBuP,EAAKtC,EAAUsC,GACftK,EAAOgI,EAAUhI,KAEjBsK,EAAK,yBAA4B8X,aAInCH,EAAKtK,SACFrN,GAAMA,EACNpK,KAAQkQ,EACRzgB,MAAS2e,EACTvT,SAAYA,EACZonB,SAAaA,EACbrsB,OAAWA,EAASA,EAAOua,aAAa,MAAQ,KAChDrQ,IAAQA,IAKZ,MAAOiiB,GA/CR,GAAIU,GAAStiB,EAAO8K,cAAc,SAClC,OAAIwX,GAiDGX,EAAOW,OAGf7pB,OAAOqF,OAAOjc,UAAUwZ,SAAW,SAASgE,GAO3C,QAASoiB,GAAchsB,GACtB,GAAIuZ,KAYJ,OAVAptB,OAAMC,UAAUQ,MAAMsC,KAAK8Q,EAAOmhB,YAAY/zB,QAAQ,SAASiO,GAC3D,MAAQA,EAAK0kB,SACf5zB,MAAMC,UAAUQ,MAAMsC,KAAKmM,EAAK8lB,YAAY/zB,QAAQ,SAAS8e,GACzD,MAAQA,EAAK6T,SACfxG,EAAM7sB,KAAKwf,OAMRqN,EAKR,QAAS0S,GAAiBjsB,GACzB,GAAIkM,GAAO,IAQX,OANA/f,OAAMC,UAAUQ,MAAMsC,KAAK8Q,EAAOmhB,YAAY/zB,QAAQ,SAASiO,IAC3D,KAAOA,EAAK0kB,SAAW,QAAU1kB,EAAK0kB,WACxC7T,EAAO7Q,KAIF6Q,EAGR,QAAS+J,GAASjW,GACjB,GAAImsB,MACFC,EAAQJ,EAAchsB,GACtBuZ,EAAQptB,MAAMC,UAAUQ,MAAMsC,KAAKk9B,GACnCn9B,EAASsqB,EAAMtqB,MAGjB,OAAc,KAAXA,GAAqB,GAExBsqB,EAAMnsB,QAAQ,SAAS8e,GACtB,GAMChT,GACA0K,EACAsG,EAPAoe,GADQpc,EAAKqO,aAAa,QAAS,EACzB0R,EAAiB/f,IAC3B9B,EAAOke,EAAQ/N,aAAa,SAAW,GACvC/B,EAAO8P,EAAQrQ,aAAe,GAC9B7L,EAAOyF,SAAS2G,GAChBsU,EAAQ1iB,EAAKlc,QAAQ,UAKV,KAAT4+B,GACF5zB,EAAQkR,EAAKlR,MAAM,KACnB0K,EAAa1K,EAAM,GACnBgR,EAAMhR,EAAMjK,OAAS,EAAIiK,EAAM,IAAK,EACpCizB,EAAKz/B,MACJwd,IAAQA,EACRE,KAASA,EACTxG,WAAeA,EACfwI,KAASA,KAGV+f,EAAKz/B,MACJ0d,KAASA,EACTgC,KAASA,MAML+f,GA3ER,GAAII,GAAQ3iB,EAAQyL,cAAc,0BAGlC,OAAIkX,GA2EGtW,EAASsW,OAGjBvpB,OAAOG,OAAO4pB,OAAS,WACtBjhC,KAAKkhC,OAAS,KACdlhC,KAAKwP,SAAW,KAChBxP,KAAKmQ,OAAS,KACdnQ,KAAKmhC,MAAQ,KACbnhC,KAAKohC,OAAS,KAEdphC,KAAKqhC,QAAU,EACfrhC,KAAK67B,UAAY,EAEjB77B,KAAKshC,SAAWjoB,UAAUkoB,UAAUtM,MAAM,uCAI3C/d,OAAOG,OAAO4pB,OAAO3gC,UAAUkhC,OAAS,WASvC,MARAxhC,MAAKkhC,OAAS1xB,SAAS2P,cAAc,UACrCnf,KAAKkhC,OAAOxY,GAAK,iBAAmBxR,OAAOoD,KAAKwY,OAChD9yB,KAAKkhC,OAAOO,UAAY,KACxBzhC,KAAKkhC,OAAOQ,SAAW,WAEvB1hC,KAAKkhC,OAAO9hB,MAAMuiB,OAAS,OAE3B3hC,KAAKkhC,OAAO9lB,iBAAiB,OAAQpb,KAAK+oB,OAAOpmB,KAAK3C,OAAO,GACtDA,KAAKkhC,QAQbhqB,OAAOG,OAAO4pB,OAAO3gC,UAAU2nB,KAAO,SAAS/K,GAC9C,GAAIyH,GAAS3kB,KACX2Q,EAAW,GAAIsG,MAAKrP,KAiDrB,OA/CE5H,MAAKmQ,QACPnQ,KAAKqb,SAGNrb,KAAKkhC,OAAOtS,OAAS,WAGpBjK,EAAOnV,SAAWmV,EAAOuc,OAAOU,gBAChCjd,EAAOwc,MAAQxc,EAAOnV,SAASqb,gBAC/BlG,EAAOkd,OAASld,EAAOnV,SAAStJ,KAChCye,EAAOyc,OAASzc,EAAOnV,SAASwiB,MAAQrN,EAAOnV,SAAS+Z,cAAc,QACtE5E,EAAOxU,OAASwU,EAAOuc,OAAOY,cAE9Bnd,EAAOxU,OAAOiL,iBAAiB,SAAUuJ,EAAOod,QAAQp/B,KAAKgiB,IAAS,GAGtEA,EAAO0c,QAAU,EACjB1c,EAAOqd,QAAQ,GAGZrd,EAAOyc,SACTzc,EAAOyc,OAAOhiB,MAAM6iB,OAAS,KAMP,OAApBtd,EAAOZ,WAA0C,OAApBY,EAAOwc,MAAMe,MAC5Cvd,EAAOwc,MAAMe,IAAM,MACnBvd,EAAOwc,MAAM/hB,MAAM+Z,SAAW,WAC9BxU,EAAOwc,MAAM/hB,MAAM+iB,MAAQ,KAG5BxxB,EAAS3D,QAAQ2X,EAAOwc,QAGzBnhC,KAAKkhC,OAAOrS,QAAU,SAASzuB,GAE9BuQ,EAAS1M,QACPohB,QAAU,2BAA6BjlB,EACvCsS,OAAQ,GAAIlF,QAAQkF,SAKvB1S,KAAKwP,SAAWxP,KAAKkhC,OAAOU,gBAEvB5hC,KAAKwP,UAKTxP,KAAKwP,SAAS2L,OACdnb,KAAKwP,SAAS4yB,MAAMllB,GACpBld,KAAKwP,SAAS6yB,QAER1xB,EAASC,UARbD,EAAS1M,OAAO,GAAIuJ,OAAM,0BACnBmD,IAWXuG,OAAOG,OAAO4pB,OAAO3gC,UAAUyoB,OAAS,WACvC,GAAIlH,GAAM7hB,KAAKkhC,OAAOY,cAAcpf,SAASpE,IACnC,gBAAPuD,GACF7hB,KAAKiR,QAAQ,gBAAiB4Q,IAKhC3K,OAAOG,OAAO4pB,OAAO3gC,UAAUgiC,OAAS,SAASlqB,EAAOC,GAGnDrY,KAAKkhC,SAETlhC,KAAKkhC,OAAO7oB,OAASA,EAEjBzO,MAAMwO,IAAUA,EAAQ,IAAM,IACjCA,GAAS,GAGVpY,KAAKkhC,OAAO9oB,MAAQA,EAGpBpY,KAAKoY,MAAQpY,KAAKkhC,OAAOjiB,wBAAwB7G,OAASA,EAC1DpY,KAAKqY,OAASrY,KAAKkhC,OAAOjiB,wBAAwB5G,QAAUA,IAI7DnB,OAAOG,OAAO4pB,OAAO3gC,UAAUyhC,QAAU,WAExC/hC,KAAKoY,MAAQpY,KAAKkhC,OAAOjiB,wBAAwB7G,MACjDpY,KAAKqY,OAASrY,KAAKkhC,OAAOjiB,wBAAwB5G,QAGnDnB,OAAOG,OAAO4pB,OAAO3gC,UAAU07B,WAAa,WAC3C,MAAOh8B,MAAKmhC,MAAMjF,aAGnBhlB,OAAOG,OAAO4pB,OAAO3gC,UAAUiiC,YAAc,WAC5C,MAAOviC,MAAKmhC,MAAMqB,cAGnBtrB,OAAOG,OAAO4pB,OAAO3gC,UAAUmiC,kBAAoB,SAAS5G,EAAWC,GACtE97B,KAAK67B,UAAYA,EACjB77B,KAAK87B,WAAaA,GAKnB5kB,OAAOG,OAAO4pB,OAAO3gC,UAAU0jB,aAAe,SAASD,GAEtD/jB,KAAK+jB,UAAYA,EAGd/jB,KAAKmhC,OAA2B,OAAlBnhC,KAAKmhC,MAAMe,MAC3BliC,KAAKmhC,MAAMe,IAAM,MACjBliC,KAAKmhC,MAAM/hB,MAAM+Z,SAAW,SAC5Bn5B,KAAKmhC,MAAM/hB,MAAM+iB,MAAQ,SAK3BjrB,OAAOG,OAAO4pB,OAAO3gC,UAAU0hC,QAAU,SAASX,GAK7CrhC,KAAKshC,SACRthC,KAAKmhC,MAAM/hB,MAAM,qBAAuB,cAAgBiiB,EAAW,SAEnErhC,KAAKwP,SAASkzB,YAAYC,SAAStB,EAAS,IAK9CnqB,OAAOG,OAAO4pB,OAAO3gC,UAAU+mB,SAAW,SAASjI,EAAOpK,EAAKsS,GAC3DA,IACFlI,EAAQlI,OAAOoD,KAAKgN,SAASlI,IAG3Bpf,KAAKohC,SAAQphC,KAAKohC,OAAOhiB,MAAMA,GAASpK,IAG5CkC,OAAOG,OAAO4pB,OAAO3gC,UAAUmnB,YAAc,SAASrI,GAElDpf,KAAKohC,SAAQphC,KAAKohC,OAAOhiB,MAAMA,GAAS,KAI5ClI,OAAOG,OAAO4pB,OAAO3gC,UAAUonB,WAAa,SAASC,EAAKC,EAAOsP,GAChE,GAAI5N,GAAM4N,GAAQl3B,KAAKwP,SACnBozB,EAAQtZ,EAAInK,cAAcwI,GAC1Bka,EAASvY,EAAIpjB,IAEjB,KAAI,GAAI6nB,KAAQnG,GACfgb,EAAMpZ,aAAauE,EAAMnG,EAAMmG,GAG7B8T,IAAQA,EAAOpY,aAAamZ,EAAOf,EAAOnY,aAG9CxS,OAAOG,OAAO4pB,OAAO3gC,UAAUggB,KAAO,SAASnC,GAC9Cne,KAAKqhC,QAAUrhC,KAAK67B,WAAa1d,EAAG,GAGd,QAAnBne,KAAK+jB,YACP/jB,KAAKqhC,QAAyB,GAAfrhC,KAAKqhC,SAGrBrhC,KAAKgiC,QAAQhiC,KAAKqhC,UAInBnqB,OAAOG,OAAO4pB,OAAO3gC,UAAUuiC,uBAAyB,SAASpJ,GAChE,GAAIqJ,GAAM3kB,CACV,IAAIsb,EAMJ,MAJAqJ,GAAO9iC,KAAKqhC,QAAU5H,EAAGxa,wBAAwB6jB,KAEjD3kB,EAAKpZ,KAAKqF,MAAM04B,EAAO9iC,KAAK67B,WAAa,GAM1C3kB,OAAOG,OAAO4pB,OAAO3gC,UAAUyiC,oBAAsB,SAASC,GAC7D,GAAIF,GAAM3kB,CAKV,OAHA2kB,GAAO9iC,KAAKqhC,QAAU2B,EAAmBF,KACzC3kB,EAAKpZ,KAAKqF,MAAM04B,EAAO9iC,KAAK67B,WAAa,GAM1C3kB,OAAOG,OAAO4pB,OAAO3gC,UAAU2iC,eAAiB,WAC/C,MAAOjjC,MAAKohC,QAIblqB,OAAOG,OAAO4pB,OAAO3gC,UAAU4iC,mBAAqB,WACnD,MAAOljC,MAAKmhC,OAIbjqB,OAAOG,OAAO4pB,OAAO3gC,UAAU6iC,iBAAmB,SAAS1J,GAC1D,GAAI2J,GACAN,CAEJ,OAAGrJ,IAA0C,kBAA7BA,GAAGxa,wBAClBmkB,EAAO3J,EAAGxa,wBACV6jB,EAAOM,EAAKN,KACO,IAAfM,EAAKhrB,OACS,IAAhBgrB,EAAK/qB,QACLyqB,GAAQ,GACRA,EAAO9iC,KAAK67B,YACN,GAIF,GAIR3kB,OAAOG,OAAO4pB,OAAO3gC,UAAU+iC,OAAS,SAASC,GAE/CtjC,KAAKkhC,OAAOO,UADV6B,EACsB,MAEA,MAK1BpsB,OAAOG,OAAO4pB,OAAO3gC,UAAU+a,OAAS,WACvCrb,KAAKmQ,OAAOgY,oBAAoB,SAAUnoB,KAAK+hC,UAIhD9qB,KAAKxG,YAAYtF,MAAM+L,OAAOG,OAAO4pB,OAAO3gC,WAE5C4W,OAAO0D,SAAW,SAAS2oB,EAAcC,GAExCxjC,KAAKyjC,gBAAkB,UAAW,QAAS,aAAc,UAAW,YAAa,SACjFzjC,KAAK0jC,QAAU,UACf1jC,KAAK2jC,UAAY,YACd,gBAAkBn0B,UAASqb,kBAC7B7qB,KAAKyjC,eAAe7iC,KAAK,aAAc,YACvCZ,KAAK0jC,QAAU,WACf1jC,KAAK2jC,UAAY,cAMfJ,GAAuD,mBAAhCrsB,QAAOG,OAAOksB,GACvCvjC,KAAK2kB,OAAS,GAAIzN,QAAOG,OAAOksB,GAEhCtmB,QAAQtK,MAAM,gCAIf3S,KAAK2kB,OAAOnU,GAAG,gBAAiBxQ,KAAK+oB,OAAOpmB,KAAK3C,OAGjDA,KAAKkpB,UAGLlpB,KAAKge,QAAU,GAAI9G,QAAO+G,QAE1Bje,KAAKugB,SAAU,EACfvgB,KAAK4jC,gBAAiB,EACtB5jC,KAAK+hC,QAAU7hC,EAAE8H,SAAShI,KAAK6jC,UAAUlhC,KAAK3C,MAAO,KAErDA,KAAK8jC,kBAEL9jC,KAAKwjC,OAASA,IAAU,EAGxBtsB,OAAO8R,MAAM7d,MAAMnL,MAEnBA,KAAKipB,SAAS,wBAGdjpB,KAAKqa,GAAKnD,OAAOoD,KAAKxK,MAAM9P,MAE5BA,KAAKya,SAAU,GAKhBvD,OAAO0D,SAASta,UAAU6gB,QACzB,mBACA,iBACA,sBACA,mBACA,qBACA,iBACA,sBACA,oBACA,oBACA,2BACA,4BACA,2BACA,kCACA,mBACA,oBAODjK,OAAO0D,SAASta,UAAUkf,WAAa,SAASR,EAAS5G,EAAOC,GAC/DrY,KAAK2c,UAAYqC,EACjBhf,KAAKgf,QAAUhf,KAAK2kB,OAAO6c,SAE3BxhC,KAAK+jC,UAAY3rB,EACjBpY,KAAKgkC,WAAa3rB,EAElBrY,KAAKoY,MAAQA,GAASpY,KAAK2c,UAAUsnB,YACrCjkC,KAAKqY,OAASA,GAAUrY,KAAK2c,UAAUunB,aAEvClkC,KAAK2c,UAAU4C,YAAYvf,KAAKgf,SAE7B5G,GAASC,EACXrY,KAAK2kB,OAAO2d,OAAOtiC,KAAKoY,MAAOpY,KAAKqY,QAEpCrY,KAAK2kB,OAAO2d,OAAO,OAAQ,QAG5B9yB,SAAS4L,iBAAiB,oBAAqBpb,KAAK6jC,YAQrD3sB,OAAO0D,SAASta,UAAU4f,eAAiB,SAASJ,EAASqkB,GAE5D,MAAGnkC,MAAKya,YACPwC,SAAQtK,MAAM,0BAGf3S,KAAKya,SAAU,EAERqF,EAAQ6E,SACd7V,KAAK,SAASoO,GA0Bb,MAvBGld,MAAK+hB,iBACP/hB,KAAK+hB,eAAe1G,SAEjBrb,KAAK2kB,OAAOxU,QACdnQ,KAAK2kB,OAAOxU,OAAOgY,oBAAoB,SAAUnoB,KAAK+hC,SAGvD/hC,KAAKokC,uBACLpkC,KAAKqkC,2BACLrkC,KAAKiR,QAAQ,4BACbjR,KAAKkd,SAAW,KAChBld,KAAKspB,IAAM,KACXtpB,KAAKmgB,QAAU,MAGhBngB,KAAK+hB,eAAiBjC,EAEtB9f,KAAKskC,WAAa,EAElBtkC,KAAKukC,sBAAwBzkB,EAAQ6I,QAErC3oB,KAAK8jC,eAAiB9jC,KAAKwkC,wBAAwBL,EAAcrkB,EAAQ8I,YAElE5oB,KAAKioB,KAAK/K,EAAU4C,EAAQxB,OAElC3b,KAAK3C,SAUTkX,OAAO0D,SAASta,UAAU2nB,KAAO,SAAS/K,EAAU2E,GACnD,GAAIlR,GAAW,GAAIsG,MAAKrP,KAwDxB,OApDA5H,MAAKykC,aAAezkC,KAAK0kC,gBAAgB1kC,KAAK8jC,gBAC9C9jC,KAAKuoB,OAAS,GAAIrR,QAAOikB,OAAOn7B,KAAKykC,cAErCzkC,KAAK2kC,SAAQ,GAEbhgB,OAAS3kB,KAAK2kB,OAAOsD,KAAK/K,EAAU2E,GAEpC8C,OAAO7V,KAAK,SAASoO,GAEpBld,KAAK+hB,eAAesH,YAAYrpB,KAAK2kB,OAAOnV,UAC5CxP,KAAKkd,SAAWA,EAChBld,KAAKspB,IAAMtpB,KAAK2kB,OAAOnV,SAGvBxP,KAAK4kC,SAAW5kC,KAAKuoB,OAAO+S,OAAOpe,EAAUld,KAAK2kB,OAAOvM,MAAOpY,KAAK2kB,OAAOtM,OAAQrY,KAAKyY,KACzFzY,KAAK2kB,OAAO8d,kBAAkBziC,KAAK4kC,SAAS/I,UAAW77B,KAAK4kC,SAAS9I,YAGjE97B,KAAK+jC,WAAc/jC,KAAKgkC,YAC3BhkC,KAAK2kB,OAAOxU,OAAOiL,iBAAiB,SAAUpb,KAAK+hC,SAAS,GAG7D/hC,KAAK6kC,oBACL7kC,KAAK8kC,wBAGL9kC,KAAK+kC,cAAc,WAClB,GAAIjc,GAAQ9oB,KAAKuoB,OAAOwT,iBACpB7B,EAAMl6B,KAAK+hB,eACXijB,EAAShlC,KAAKqa,GAAGlX,QACrBnD,MAAKya,SAAU,EAEfza,KAAKilC,YAAYnc,GAEjB9oB,KAAKklC,gBAAkBllC,KAAKmlC,qBAC5BnlC,KAAK4lB,mBAAqB5lB,KAAKklC,gBAAgB7kB,MAEjC,IAAX2kB,IACFhlC,KAAKiR,QAAQ,2BAA4BjR,KAAK4lB,oBAC9C5lB,KAAKiR,QAAQ,+BAAgCjR,KAAKklC,kBAGnDhL,EAAI9b,IAAMpe,KAAK4lB,mBACf5lB,KAAKiR,QAAQ,4BAA6BipB,GAE1Cl6B,KAAK2kC,SAAQ,GAEbh0B,EAAS3D,QAAQhN,OAChB2C,KAAK3C,QAEN2C,KAAK3C,OAEA2Q,EAASC,SAGjBsG,OAAO0D,SAASta,UAAUyoB,OAAS,SAASlH,GAC3C7hB,KAAKiR,QAAQ,gBAAiB4Q,IAY/B3K,OAAO0D,SAASta,UAAUkkC,wBAA0B,SAASv7B,EAAQ6W,GACpE,GAAIlI,KAGJ,KAAK,GAAImW,KAAQ9kB,GACZA,EAAO7H,eAAe2sB,KACzBnW,EAASmW,GAAQ9kB,EAAO8kB,GAgB1B,OAZAjO,GAAQxe,QAAQ,SAAS8U,GACxB,GAEIrE,GAAU9M,EAFVmgC,EAAYhvB,EAAKnL,QAAQ,aAAc,IACvCmC,EAAQg4B,EAAUhjC,QAAQ,IAGlB,KAATgL,IACF2E,EAAWqzB,EAAUtkC,MAAM,EAAGsM,GAC9BnI,EAAQmgC,EAAUtkC,MAAMsM,EAAM,GAE9BwK,EAAS7F,GAAY9M,KAGhB2S,GASRV,OAAO0D,SAASta,UAAUokC,gBAAkB,SAAS9sB,GAEpD,GAAI2I,GAAUvgB,KAAKqlC,iBAAiBrlC,KAAKwY,gBACrCisB,EAAelkB,EAAU,oBAAsB,aAC/C8iB,GAAS,CAuBb,OArBuB,kBAApBzrB,EAAS2Q,SACXkc,EAAe,QACfpB,GAAS,EACT9iB,GAAU,GAGY,eAApB3I,EAAS2Q,QAA+C,SAApB3Q,EAAS4Q,SAC/Cic,EAAe,aACfpB,GAAS,EACT9iB,GAAU,GAGY,eAApB3I,EAAS2Q,QAA+C,SAApB3Q,EAAS4Q,SAC/Cic,EAAe,oBACfpB,GAAS,EACT9iB,GAAU,GAGXvgB,KAAKugB,QAAUA,EACfvgB,KAAK2kB,OAAO0e,OAAOA,GACnBrjC,KAAKiR,QAAQ,mBAAoBsP,GAC1BkkB,GAIRvtB,OAAO0D,SAASta,UAAUykC,cAAgB,SAASh4B,GAClD/M,KAAK2pB,aAAa,uBAAwB5c,EAAU/M,OAIrDkX,OAAO0D,SAASta,UAAU2kC,YAAc,WACvCjlC,KAAKmgB,QAAUngB,KAAKslC,UAInBtlC,KAAKi8B,eADFj8B,KAAKugB,QACcxb,KAAKsC,KAAKrH,KAAKmgB,QAAQhd,OAAS,GAEhCnD,KAAKmgB,QAAQhd,OAIpCnD,KAAK+hB,eAAe+G,MAAQ9oB,KAAKmgB,QAAQhd,OAEzCnD,KAAKqa,GAAGnL,SAITgI,OAAO0D,SAASta,UAAUknB,SAAW,WACpC,GACcsB,GADVnO,EAAW3a,IAEXA,MAAKkd,WAETqD,QAAUvgB,KAAKqlC,iBAAiBrlC,KAAKwY,gBAGlC+H,SAAWvgB,KAAKugB,UAClBvgB,KAAKugB,QAAUA,QACfvgB,KAAKykC,aAAezkC,KAAK0kC,gBAAgB1kC,KAAK8jC,gBAC9C9jC,KAAKuoB,OAAS,GAAIrR,QAAOikB,OAAOn7B,KAAKykC,eAItCzkC,KAAKskC,WAAa,EAElBtkC,KAAK2kB,OAAOrE,KAAKtgB,KAAKskC,YAKtB3pB,EAASiqB,SAAWjqB,EAAS4N,OAAO+S,OAAO3gB,EAASuC,SAAUvC,EAASgK,OAAOvM,MAAOuC,EAASgK,OAAOtM,OAAQsC,EAASlC,KACtHkC,EAASgK,OAAO8d,kBAAkB9nB,EAASiqB,SAAS/I,UAAWlhB,EAASiqB,SAAS9I,YAEjFhT,EAAQnO,EAAS4N,OAAOwT,iBACxBphB,EAASsqB,YAAYnc,GAGlBnO,EAASiL,oBACXjL,EAAS0J,QAAQ1J,EAASiL,sBAO5B1O,OAAO0D,SAASta,UAAUqkC,QAAU,SAASrB,GAC5C,MAAoB,mBAAX,GACDtjC,KAAKgf,QAAQI,MAAMC,gBAGxBikB,KAAS,GAAStjC,KAAKwjC,OAEjBF,KAAS,IACjBtjC,KAAKgf,QAAQI,MAAMC,WAAa,UAFhCrf,KAAKgf,QAAQI,MAAMC,WAAa,YAOlCnI,OAAO0D,SAASta,UAAUmgB,OAAS,WAC/BzgB,KAAK2kB,OAAOxU,SACdnQ,KAAK2kB,OAAOtJ,SACZrb,KAAK2kB,OAAOxU,OAAOgY,oBAAoB,SAAUnoB,KAAK+hC,SACtD/hC,KAAKokC,uBACLpkC,KAAKqkC,4BAGNrkC,KAAK2c,UAAU+D,YAAY1gB,KAAKgf,UAKjC9H,OAAO0D,SAASta,UAAU8nB,YAAc,SAAStP,GAChD,IAAK,GAAIsG,KAAStG,GACjB9Y,KAAK2kB,OAAO0C,SAASjI,EAAOtG,EAAOsG,KAIrClI,OAAO0D,SAASta,UAAU+mB,SAAW,SAASjI,EAAOpK,EAAKsS,GACzDtnB,KAAK2kB,OAAO0C,SAASjI,EAAOpK,EAAKsS,IAGlCpQ,OAAO0D,SAASta,UAAUmnB,YAAc,SAASrI,GAChDpf,KAAK2kB,OAAO8C,YAAYrI,IAIzBlI,OAAO0D,SAASta,UAAU+nB,cAAgB,SAAStP,GAClD,IAAM,GAAIwsB,KAAWxsB,GACpB/Y,KAAK2kB,OAAO+C,WAAW6d,EAASxsB,EAASwsB,KAM3CruB,OAAO0D,SAASta,UAAUggB,KAAO,SAASnC,GACzC,MAAIne,MAAKmgB,QAMNhC,GAAM,GAAKA,GAAMne,KAAKi8B,gBACxBj8B,KAAKskC,WAAanmB,EAElBne,KAAK2kB,OAAOrE,KAAKnC,GACjBne,KAAKklC,gBAAkBllC,KAAKmlC,qBAC5BnlC,KAAK4lB,mBAAqB5lB,KAAKklC,gBAAgB7kB,MAC/CrgB,KAAKiR,QAAQ,2BAA4BjR,KAAK4lB,oBAC9C5lB,KAAKiR,QAAQ,+BAAgCjR,KAAKklC,kBAE3C,IAGD,GAjBNjoB,QAAQiF,KAAK,4BACbliB,KAAKqa,GAAGwK,QAAQ,OAAQnhB,YACjB,IAoCTwT,OAAO0D,SAASta,UAAUglB,SAAW,WACpC,MAAOtlB,MAAKsgB,KAAKtgB,KAAKskC,WAAa,IAGpCptB,OAAO0D,SAASta,UAAUilB,SAAW,WACpC,MAAOvlB,MAAKsgB,KAAKtgB,KAAKskC,WAAa,IAIpCptB,OAAO0D,SAASta,UAAUklC,cAAgB,SAAS/L,GAClD,GAAItb,EACAsb,KAEJtb,EAAKne,KAAK2kB,OAAOke,uBAAuBpJ,GACxCz5B,KAAKsgB,KAAKnC,KAIXjH,OAAO0D,SAASta,UAAU4kB,SAAW,WACpC,MAAGllB,MAAKya,QACAza,KAAKqa,GAAGwK,QAAQ,WAAYnhB,eAGpC1D,MAAKsgB,KAAKtgB,KAAKi8B,iBAIhB/kB,OAAO0D,SAASta,UAAUimB,UAAY,WACrC,MAAGvmB,MAAKya,QACAza,KAAKqa,GAAGwK,QAAQ,YAAanhB,eAGrC1D,MAAKsgB,KAAK,IAIXpJ,OAAO0D,SAASta,UAAU+lB,QAAU,SAAS0K,GAC5C,GAAI0I,GAAKz5B,KAAKspB,IAAIwF,eAAeiC,EAG9B0I,IACFz5B,KAAKwlC,cAAc/L,IAKrBviB,OAAO0D,SAASta,UAAUmlC,uBAAyB,SAASl2B,GAC3D,GAAI6lB,GAAW7lB,EAAK8lB,WAChBqQ,EAAOtQ,EAASjyB,MAEpB,OAAGuiC,IACFtQ,EAAS,IACgB,IAAzBA,EAAS,GAAG3rB,UACZ2rB,EAAS,GAAGjJ,YAAYwZ,OAAOxiC,QACxB,GAED,GAGR+T,OAAO0D,SAASta,UAAUslC,WAAa,SAASr2B,GAC/C,GAAIs2B,IAAoB,QAAS,SAAU,QAAS,SAAU,MAAO,OAAQ,SAAU,MAAO,QAC9F,OAA6D,KAAzDA,EAAiBzjC,QAAQmN,EAAK0kB,QAAQzH,gBAElC,EAEDxsB,KAAKylC,uBAAuBl2B,IAIpC2H,OAAO0D,SAASta,UAAUwlC,KAAO,SAASv2B,EAAMhN,EAAGJ,GAQlD,IAPA,GAAIhC,GAAGi1B,EAAUsQ,EAEhBK,EADAC,EAAYz2B,EAEZmD,GAASszB,GAENC,EAAO,IAAOC,EAAK,GAEhB/lC,GAAKuS,EAAMvP,QAAQ,CAMzB,GALAoM,EAAOmD,EAAMmhB,QACT7zB,KAAKmmC,cAAc52B,EAAMhN,EAAGJ,IAAMnC,KAAK4lC,WAAWr2B,KACrDpP,EAAIoP,IAGDpP,GAAKoP,GAAQA,EAAK62B,kBAAoB,EAAE,CAE3C,GADAhR,EAAW7lB,EAAK6lB,UACZA,IAAYA,EAASjyB,OAGxB,MAAOhD,EAFPulC,GAAOtQ,EAASjyB,OAASiyB,EAASjyB,OAAS,CAI5C,KAAK,GAAI1C,GAAIilC,EAAK,EAAGjlC,GAAK,EAAGA,IACzB20B,EAAS30B,IAAMslC,GAAUrzB,EAAMqjB,QAAQX,EAAS30B,IAYrD,IARIN,GAAsB,IAAjBuS,EAAMvP,QAAgB6iC,GAAsC,OAAzBA,EAAUxR,aACrD9hB,EAAM9R,KAAKolC,EAAUxR,YACrBuR,EAAWC,EACXA,EAAYA,EAAUxR,YAIvB0R,IACGA,EAAOD,EAAM,CACfhpB,QAAQtK,MAAM,eACd,QAKF,MAAOxS,IAIR+W,OAAO0D,SAASta,UAAU6lC,cAAgB,SAAS1M,EAAIl3B,GACtD,GAAI6gC,EAEJ,OAAG3J,IAA0C,kBAA7BA,GAAGxa,wBAClBmkB,EAAO3J,EAAGxa,wBAGS,IAAfmkB,EAAKhrB,OACS,IAAhBgrB,EAAK/qB,QACL+qB,EAAKN,MAAQvgC,GACbA,GAAK6gC,EAAKN,KAAOM,EAAKhrB,QAChB,GAIF,GAGRlB,OAAO0D,SAASta,UAAUssB,WAAa,SAAStV,EAAMuV,GAWrD,IAVA,GASItd,GATAud,EAAatd,SAASud,iBAAiBzV,EAAM0V,WAAWC,WAC1DC,WAAY,SAAU3d,GACpB,MAAO,QAAQ4d,KAAK5d,EAAKK,MAGjBod,WAAWK,cAFXL,WAAWI,iBAKpB,GAEK7d,EAAOud,EAAWQ,YACzBT,EAAKtd,IAKP2H,OAAO0D,SAASta,UAAU28B,OAAS,SAAS3lB,EAAMuV,GAGjD,IAFA,GACItd,GADAud,EAAatd,SAASud,iBAAiBzV,EAAM0V,WAAWqZ,aAAc,MAAM,GAExE92B,EAAOud,EAAWQ,YACzBT,EAAKtd,IAKP2H,OAAO0D,SAASta,UAAUglC,QAAU,WACnC,GAQIgB,GACAloB,EATAzD,EAAW3a,KACXwB,KACA8V,EAAOtX,KAAK2kB,OAAOse,iBACnB3iB,EAAO,EACPlI,EAAQpY,KAAKuoB,OAAOqT,SAAW57B,KAAKuoB,OAAO9P,IAC3C4f,EAASr4B,KAAK4kC,SAAS/I,WAAa77B,KAAKskC,WAAW,GACpD3X,EAASvU,EAAQkI,EAAQ+X,EACzBkO,EAAU,EAGVC,EAAQ,SAASj3B,GACpB,GAAIk3B,GACAC,EACAtR,EAAW/0B,MAAMC,UAAUQ,MAAMsC,KAAKmM,EAAK8lB,WAC/C,IAAI9lB,EAAK9F,UAAY4qB,KAAKsS,aAAc,CAMvC,GAJAD,EAAUl3B,SAASmc,cACnB+a,EAAQE,mBAAmBr3B,GAC3Bk3B,EAAQC,EAAQznB,yBAEZwnB,GAA0B,IAAhBA,EAAMruB,OAAgC,IAAjBquB,EAAMpuB,OACxC,MAIEouB,GAAM3D,KAAOyD,GACfnR,EAAS9zB,QAAQ,SAASiO,GACtBA,EAAK9F,UAAY4qB,KAAKC,WACxB/kB,EAAK4c,YAAYwZ,OAAOxiC,QACxB0jC,EAAUt3B,KAMVk3B,EAAMtE,MAAQoE,GAChBnR,EAAS9zB,QAAQ,SAASiO,GACtBA,EAAK9F,UAAY4qB,KAAKC,WACxB/kB,EAAK4c,YAAYwZ,OAAOxiC,QACxB0jC,EAAUt3B,OAOXs3B,EAAY,SAASt3B,GACxB,GAAIu3B,GAASnsB,EAASosB,6BAA6Bx3B,EACnDu3B,GAAOxlC,QAAQ,SAAS8F,GACvB,GAAIwd,GAAMxd,EAAM6X,yBAEZ2F,GAAsB,IAAdA,EAAIxM,OAA8B,IAAfwM,EAAIvM,SAGhCuM,EAAIke,KAAOle,EAAIxM,MAAQuU,EACrBnrB,EAAI8e,EAAK,KACZlZ,EAAM4/B,UAAS,GACf5oB,EAAMzD,EAASoH,eAAe+I,aAAa1jB,GAE3C5F,EAAIZ,MAAOyf,MAAOjC,EAAKoC,IAAK,SAG1B8lB,IACFA,EAAUU,UAAS,GACnB5oB,EAAMzD,EAASoH,eAAe+I,aAAawb,GAC3C9kC,EAAIA,EAAI2B,OAAO,GAAGqd,IAAMpC,GAGzBhX,EAAM4/B,UAAS,GACf5oB,EAAMzD,EAASoH,eAAe+I,aAAa1jB,GAC3C5F,EAAIZ,MACFyf,MAAOjC,EACPoC,IAAK,OAGPF,GAAQ,EACRqM,EAASvU,EAAQkI,EAAQ+X,EACzBkO,EAAU5Z,GAGX2Z,EAAYl/B,MAKV+5B,EAAQnhC,KAAK2kB,OAAOue,qBACpBhB,EAAMf,EAAMe,GA4ChB,OAzCU,OAAPA,IACFf,EAAMe,IAAM,MACZf,EAAM/hB,MAAM+Z,SAAW,UAGxBn5B,KAAKi9B,OAAO3lB,EAAMkvB,GAGR,OAAPtE,IACFf,EAAMe,IAAMA,EACZf,EAAM/hB,MAAM0jB,KAAO,OACnB3B,EAAM/hB,MAAM+iB,MAAQ,KAKlBmE,IACFA,EAAUU,UAAS,GAEnB5oB,EAAMzD,EAASoH,eAAe+I,aAAawb,GAC3C9kC,EAAIA,EAAI2B,OAAO,GAAGqd,IAAMpC,GAIrB5c,EAAI2B,SACPiE,MAAQpH,KAAKspB,IAAIqC,cACjBvkB,MAAMw/B,mBAAmBtvB,GACzBlQ,MAAM4/B,UAAS,GAEf5oB,EAAMzD,EAASoH,eAAe+I,aAAa1jB,OAE3C5F,EAAIZ,MAAOyf,MAAOjC,EAAKoC,IAAKpC,KAK7BkoB,EAAY,KACZQ,OAAS,KACT1/B,MAAQ,KACRkQ,EAAO,KAEA9V,GAIR0V,OAAO0D,SAASta,UAAU2mC,qBAAuB,SAAUva,EAAMwa,GAChE,GAAIC,GAAkB,aAIhBD,KACLA,EAAgB,EAGjB,KAAK,GAAIzmC,GAAIymC,EAAezmC,EAAIisB,EAAKvpB,OAAQ1C,IAC5C,GAA+C,IAA3C0mC,EAAgB/kC,QAAQsqB,EAAKxf,OAAOzM,IACvC,MAAOA,EAIT,OAAO,IAIRyW,OAAO0D,SAASta,UAAUymC,6BAA+B,SAASx3B,GACjE,GAEInI,GAFA0/B,KACApa,EAAOnd,EAAK4c,YAAYwZ,MAS5B,IAFA/gB,IAAM5kB,KAAKinC,qBAAqBva,GAErB,KAAR9H,IAGF,MAFAxd,GAAQpH,KAAKspB,IAAIqC,cACjBvkB,EAAMw/B,mBAAmBr3B,IACjBnI,EAaT,KAVAA,EAAQpH,KAAKspB,IAAIqC,cACjBvkB,EAAMwkB,SAASrc,EAAM,GACrBnI,EAAM0kB,OAAOvc,EAAMqV,KACnBkiB,EAAOlmC,KAAKwG,GAIZA,EAAQpH,KAAKspB,IAAIqC,cACjBvkB,EAAMwkB,SAASrc,EAAMqV,IAAI,GAEV,IAAPA,KAEPA,IAAM5kB,KAAKinC,qBAAqBva,EAAM9H,IAAM,GACzCA,IAAM,IAELxd,IACFA,EAAM0kB,OAAOvc,EAAMqV,KACnBkiB,EAAOlmC,KAAKwG,IAGbA,EAAQpH,KAAKspB,IAAIqC,cACjBvkB,EAAMwkB,SAASrc,EAAMqV,IAAI,GAS3B,OALGxd,KACFA,EAAM0kB,OAAOvc,EAAMmd,EAAKvpB,QACxB2jC,EAAOlmC,KAAKwG,IAGN0/B,GAGR5vB,OAAO0D,SAASta,UAAU8mC,cAAgB,SAAShgC,GAClD,GAAIg8B,GACA/C,CAIJ,OAFAA,GAAOj5B,EAAMigC,iBAEVhH,EAAKl9B,OACPigC,EAAO/C,EAAK,GAIN,MA0BRnpB,OAAO0D,SAASta,UAAUgnC,WAAa,WACtC,GAAInpB,EAQJ,OAPIne,MAAKugB,SACRpC,EAAqB,EAAhBne,KAAKskC,WACViD,WAAavnC,KAAKmgB,QAAQhC,EAAG,KAE7BA,EAAKne,KAAKskC,WACViD,WAAavnC,KAAKmgB,QAAQhC,EAAG,IAEvBne,KAAKmgB,QAA2B,EAAlBngB,KAAKskC,WAAiB,GAAGjkB,OAG/CnJ,OAAO0D,SAASta,UAAUknC,SAAW,SAASjlC,EAAGJ,EAAGslC,GACnD,GACItO,GADA/xB,EAAQpH,KAAKspB,IAAIqC,aAmBrB,OAjBA8b,IAAe,EAC+B,mBAApCj4B,UAASk4B,wBAA2CD,EAGZ,mBAAjCj4B,UAASm4B,qBAAwCF,GAGjEznC,KAAK4nC,WAAa5nC,KAAK6nC,iBAAiBtlC,EAAGJ,GAC3CiF,EAAMwkB,SAAS5rB,KAAK4nC,WAAY,IAHhCxgC,EAAQpH,KAAKspB,IAAIqe,oBAAoBplC,EAAGJ,IAHxCg3B,EAAWn5B,KAAKspB,IAAIoe,uBAAuBnlC,EAAGJ,GAC9CiF,EAAMwkB,SAASuN,EAAS2O,WAAY3O,EAASd,SAcvCjxB,GAwBR8P,OAAO0D,SAASta,UAAUynC,sBAAwB,WACjD,GAAIC,GACA7kC,CAEJ,OAAInD,MAAKmgB,SAKThd,EAASnD,KAAKmgB,QAAQhd,OAGrB6kC,EADEhoC,KAAKugB,QACDxb,KAAKsC,KAAKlE,EAAS,GAEnBA,IATN8Z,QAAQiF,KAAK,wBACN,IAcThL,OAAO0D,SAASta,UAAU2nC,oBAAsB,WAC/C,GAAI9pB,EAEJ,OAAIne,MAAKmgB,QAMRhC,EADGne,KAAKugB,SAAWvgB,KAAKuoB,OAAO4T,UAAY,EACtB,EAAhBn8B,KAAKskC,WAELtkC,KAAKskC,YAPVrnB,QAAQiF,KAAK,wBACN,IAYThL,OAAO0D,SAASta,UAAU4nC,qBAAuB,WAChD,GAAI/pB,GACA+G,EACAijB,CAEJ,OAAInoC,MAAKmgB,SAKT+E,EAAWllB,KAAKmgB,QAAQhd,OAGvBgb,EADGne,KAAKugB,QACa,EAAhBvgB,KAAKskC,WAELtkC,KAAKskC,WAGX6D,EAAYjjB,EAAW/G,IAZtBlB,QAAQiF,KAAK,wBACN,IAgBThL,OAAO0D,SAASta,UAAU6kC,mBAAqB,WAC9C,GAAIhnB,GACAopB,EAAYa,CAEhB,OAAIpoC,MAAKmgB,SAKLngB,KAAKugB,SACRpC,EAAqB,EAAhBne,KAAKskC,WACViD,EAAavnC,KAAKmgB,QAAQhC,EAAG,GAC7BiqB,EAAWb,EAERvnC,KAAKuoB,OAAO4T,UAAY,IAC1BiM,EAAWpoC,KAAKmgB,QAAQhC,EAAG,MAG5BA,EAAKne,KAAKskC,WACViD,EAAavnC,KAAKmgB,QAAQhC,EAAG,GAC7BiqB,EAAWb,GAGRA,IACHtqB,QAAQiF,KAAK,mBAAoB/D,EAAIne,KAAKmgB,SAC1ConB,EAAavnC,KAAKmgB,QAAQngB,KAAKmgB,QAAQhd,OAAO,GAC9CilC,EAAWb,IAIXlnB,MAAOknB,EAAWlnB,MAClBG,IAAK4nB,EAAS5nB,OA1BdvD,QAAQiF,KAAK,wBACN,IA8BThL,OAAO0D,SAASta,UAAU+jB,QAAU,SAASjG,GAC5C,GAAID,GACAkZ,EACAjwB,CAEJ,IAAGpH,KAAKya,QACP,MAAOza,MAAKqa,GAAGwK,QAAQ,UAAWnhB,UAOnC,IAJGxD,EAAEqJ,SAAS6U,KACbA,EAAMpe,KAAKge,QAAQ1B,MAAM8B,IAGM,mBAAtB5O,UAAShE,SAClB6rB,EAASr3B,KAAKge,QAAQiZ,UAAU7Y,EAAKpe,KAAKspB,KACvC+N,IACFlZ,EAAKne,KAAK2kB,OAAOke,uBAAuBxL,GAExCr3B,KAAKge,QAAQ2Z,aAAaN,EAAQr3B,KAAKspB,KACvCtpB,KAAKsgB,KAAKnC,QAIX,IADA/W,EAAQpH,KAAKge,QAAQob,qBAAqBhb,EAAKpe,KAAKspB,KAC1C,CAMT,GAAI8Z,GAAOh8B,EAAM6X,uBAEhBd,GADGilB,EACEpjC,KAAK2kB,OAAOoe,oBAAoBK,GAIhC,EAGNpjC,KAAKsgB,KAAKnC,GAGVne,KAAK4lB,mBAAqBxH,EAAI4W,MAMjC9d,OAAO0D,SAASta,UAAU+nC,iBAAmB,SAASC,GACrD,GACIjJ,GADA5F,EAAK6O,GAAWtoC,KAAK2kB,OAAOse,gBAOhC,OAFA5D,GAAQr/B,KAAK8lC,KAAKrM,EAAI,EAAG,GAEtB4F,EACKA,EAEAiJ,GAKTpxB,OAAO0D,SAASta,UAAUunC,iBAAmB,SAAStlC,EAAGJ,EAAGmmC,GAC3D,GACIjJ,GADA5F,EAAK6O,GAAWtoC,KAAK2kB,OAAOse,gBAGhC,OADA5D,GAAQr/B,KAAK8lC,KAAKrM,EAAIl3B,EAAGJ,GACtBk9B,EACKA,EAEA5F,GAsBTviB,OAAO0D,SAASta,UAAUgiC,OAAS,SAASlqB,EAAOC,EAAQkwB,GAG1DvoC,KAAKoY,MAAQA,EACbpY,KAAKqY,OAASA,EAEXkwB,KAAY,GACdvoC,KAAK2kB,OAAO2d,OAAOtiC,KAAKoY,MAAOpY,KAAKqY,QAKlCrY,KAAKkd,UACPld,KAAKwnB,WAGNxnB,KAAKiR,QAAQ,oBACZmH,MAAOpY,KAAKoY,MACZC,OAAQrY,KAAKqY,UAMfnB,OAAO0D,SAASta,UAAUujC,UAAY,WACrC,GAAIzrB,GAAQpY,KAAK2c,UAAUsnB,YACvB5rB,EAASrY,KAAK2c,UAAUunB,YAE5BlkC,MAAKsiC,OAAOlqB,EAAOC,GAAQ,IAG5BnB,OAAO0D,SAASta,UAAUukC,kBAAoB,WACzC7kC,KAAK2kB,OAAOnV,UAGhBxP,KAAKyjC,eAAeniC,QAAQ,SAAS6P,GACpCnR,KAAK2kB,OAAOnV,SAAS4L,iBAAiBjK,EAAWnR,KAAKwoC,aAAa7lC,KAAK3C,OAAO,IAC7EA,OAIJkX,OAAO0D,SAASta,UAAU8jC,qBAAuB,WAC5CpkC,KAAK2kB,OAAOnV,UAGhBxP,KAAKyjC,eAAeniC,QAAQ,SAAS6P,GACpCnR,KAAK2kB,OAAOnV,SAAS2Y,oBAAoBhX,EAAWnR,KAAKwoC,cAAc,IACrExoC,OAKJkX,OAAO0D,SAASta,UAAUkoC,aAAe,SAASpoC,GACjDJ,KAAKiR,QAAQ,YAAY7Q,EAAE8uB,KAAM9uB,IAGlC8W,OAAO0D,SAASta,UAAUwkC,sBAAwB,WACjD9kC,KAAK2kB,OAAOnV,SAAS4L,iBAAiB,kBAAmBpb,KAAKyoC,kBAAkB9lC,KAAK3C,OAAO,IAG7FkX,OAAO0D,SAASta,UAAU+jC,yBAA2B,WAChDrkC,KAAK2kB,OAAOnV,UAGhBxP,KAAKspB,IAAInB,oBAAoB,kBAAmBnoB,KAAKyoC,mBAAmB,IAGzEvxB,OAAO0D,SAASta,UAAUmoC,kBAAoB,WACzCzoC,KAAK0oC,qBACR3gC,aAAa/H,KAAK0oC,qBAEnB1oC,KAAK0oC,oBAAsB/gC,WAAW,WACrC3H,KAAK2oC,cAAgB3oC,KAAK2kB,OAAOxU,OAAOy4B,eACxC5oC,KAAKiR,QAAQ,oBAAqBjR,KAAK2oC,gBACtChmC,KAAK3C,MAAO,MAMfkX,OAAO0D,SAASta,UAAUua,kBAAoB,SAASzC,GACtDpY,KAAKwY,eAAiBJ,EACtBpY,KAAKugB,QAAUvgB,KAAKqlC,iBAAiBjtB,IAGtClB,OAAO0D,SAASta,UAAU+kC,iBAAmB,SAASwD,GACrD,MAAG7oC,MAAK4jC,iBAAmBiF,GAAU7oC,KAAKoY,MAAQywB,GAC1C,GAEA,GAIT3xB,OAAO0D,SAASta,UAAU4e,YAAc,SAASokB,GAE/CtjC,KAAK4jC,eADHN,GACoB,GAGA,GAKxBpsB,OAAO0D,SAASta,UAAUwa,OAAS,SAASrC,GAC3CzY,KAAKyY,IAAMA,GAGZvB,OAAO0D,SAASta,UAAU0jB,aAAe,SAASD,GACjD/jB,KAAK+jB,UAAYA,EACjB/jB,KAAK2kB,OAAOX,aAAahkB,KAAK+jB,YAK/B7M,OAAO0D,SAASta,UAAU2K,QAAU,SAASshB,EAAOM,EAAMU,EAAUC,GACnE,GAAIC,GAAQztB,KAAKkd,SAASwQ,iBAAiBnB,GAC1CvH,EAAY3kB,MAAMC,UAAUQ,MAAMsC,KAAKqqB,GACvCE,EAAQ3I,EAAU7hB,MAGnB,OAAa,KAAVwqB,MACFJ,IAAS,OAGVvI,GAAU1jB,QAAQ,SAAS8e,GAC1B,GAAIwN,IAAS,EACTxlB,EAAQ,SAAS8C,EAAQ2iB,GACzBD,KAAW,IACbD,IACGH,GAAUA,EAAStiB,EAAQ2iB,EAAMF,GACxB,GAATA,GAAcJ,GAAUA,GAAS,GACpCK,GAAS,GAIXf,GAAKzM,EAAMhY,IAEVzF,KAAK3C,QAmFRiX,KAAKxG,YAAYtF,MAAM+L,OAAO0D,SAASta,UAEvC,IAAI4W,QAASA,UACbA,QAAOjM,WAGPiM,OAAOjM,QAAQqd,MAAQ,SAASvb,EAAU4N,GACzC,GAAIa,GAAOxb,KACP8oC,EAAc,SAASva,EAAMvO,GAChC,GAEE8Q,GACAiY,EAHEzqB,EAAOiQ,EAAKE,aAAa,QAC3Bua,EAAa1qB,EAAK4S,OAAO,MAK3B,IAAiB,IAAd8X,EAEFza,EAAK/E,aAAa,SAAU,cAExB,CAEK,GAAI1H,GAAM5K,OAAOoD,KAAKwH,IAAInH,EAASgK,OAAOxU,OAAOuS,SAASpE,KAE1DwS,GAAYhP,EAAIgP,UAQRiY,EANLjY,EAKsB,SAAjBhP,EAAIU,SACOtL,OAAOoD,KAAKyI,WAAWjB,EAAIS,KAAMjE,GAEjCpH,OAAOoD,KAAKyI,WAAW+N,EAAWxS,GAGtCA,EAGxBiQ,EAAK0a,QAAU,WAEd,MADAztB,GAAK3C,KAAKkwB,IACH,GAIT/oB,IAIDrF,GAAS1P,QAAQ,UAAW69B,EAAa/7B;EAI1CmK,OAAOjM,QAAQ/E,KAAO,SAAS6G,EAAU4N,GAExCA,EAASmT,kBAAkB,aAAc,OAAQ5W,OAAOjM,QAAQi+B,MAAOn8B,IAMxEmK,OAAOjM,QAAQ+Z,UAAY,SAASjY,EAAU4N,GAE7CA,EAASmT,kBAAkB,QAAS,MAAO5W,OAAOjM,QAAQk+B,KAAMp8B,IAIjEmK,OAAOjM,QAAQga,IAAM,SAASlY,EAAU4N,GAEvCA,EAASmT,kBAAkB,QAAS,aAAc,SAAS3E,EAAQ0E,EAAM7N,GACxEmJ,EAAOa,OAAO6D,GAAM/e,KAAKkR,IACvBjT,IAIJmK,OAAOjM,QAAQk+B,KAAO,SAAShgB,EAAQ0E,EAAM7N,GAE5CmJ,EAAOa,OAAO6D,GAAM/e,KAAKkR,IAK1B9I,OAAOjM,QAAQi+B,MAAQ,SAAS/f,EAAQ0E,EAAM7N,EAAMuO,GAEnB,eAA7BA,EAAKE,aAAa,OACpBvX,OAAOjM,QAAQm+B,YAAYjgB,EAAQ0E,GAAM/e,KAAK,SAAS+S,EAAKgM,GAE3D7N,EAAK6B,EAAKgM,IACP,WAEH7N,EAAK,QAGNmJ,EAAOa,OAAO6D,GAAM/e,KAAKkR,EAAM,WAE9BA,EAAK,SAKR9I,OAAOjM,QAAQm+B,YAAc,SAASjgB,EAAQ0E,GAC7C,GAAIld,GAAW,GAAIsG,MAAKrP,KAExB,IAAIuhB,EAqBJ,MAnBAA,GAAOkgB,QAAQxb,GAAM/e,KAAK,SAAS4d,GAGlCxV,OAAOjM,QAAQq+B,QAAQngB,EAAQ0E,EAAMnB,GAAM5d,KAAK,SAASy6B,GACxD,GAAIC,GAAOr5B,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,OAEhD1Y,EAAO,GAAItB,OAAM6Z,IAAYra,KAAS,aACxCrN,EAAM2nB,EAAKG,gBAAgB3Y,EAE7BrgB,GAAS3D,QAAQ6U,IAEf,SAASzT,GACXuC,EAAS1M,OAAOmK,MAGf,SAASA,GACXuC,EAAS1M,OAAOmK,KAGVuC,EAASC,SAGjBsG,OAAOjM,QAAQq+B,QAAU,SAASngB,EAAQ5G,EAAMmK,GAC/C,GAAI/b,GAAW,GAAIsG,MAAKrP,MACvB4J,KACA8a,EAAUI,EAAKuI,MAAM,sCAEtB,IAAI9L,EAEJ,MAAImD,IAKJA,EAAQhrB,QAAQ,SAAS0zB,GACxB,GAAInH,GAAO3W,OAAOoD,KAAKyI,WAAWR,EAAMyS,EAAI/pB,QAAQ,qBAAsB,KACtE2+B,EAAWzgB,EAAOa,OAAO6D,GAAM/e,KAAK,SAAS+S,GAChD6K,EAAOA,EAAKzhB,QAAQ+pB,EAAK,QAAQnT,EAAI,OACnC,SAASzT,GACXuC,EAAS1M,OAAOmK,IAGjBoD,GAAS5Q,KAAKgpC,KAGf3yB,KAAK/S,IAAIsN,GAAU1C,KAAK,WACvB6B,EAAS3D,QAAQ0f,KAGX/b,EAASC,UAnBfD,EAAS3D,QAAQ0f,GACV/b,EAASC,UAsBlBsG,OAAOgQ,QAAU,SAASlO,GAEzBhZ,KAAK6pC,oBACL7pC,KAAK8pC,YACL9pC,KAAKgZ,gBAAkBA,EACvBhZ,KAAK2vB,IAAMxf,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,OACpD1pC,KAAKonB,SAAU,GAIhBlQ,OAAOgQ,QAAQ5mB,UAAUupC,kBAAoB,WAClB,mBAAjB,cAA8B5sB,QAAQtK,MAAM,mCAGtDuE,OAAOgQ,QAAQ5mB,UAAUsmB,IAAM,SAASD,GACvC,GAAIhW,GAAW,GAAIsG,MAAKrP,MACpB+lB,EAAQhH,EAAOxjB,OACf4mC,EAAU,EACVhqB,EAAO,SAASpP,GACnB,GACIkR,GACAmoB,EAFAhqB,EAAOrP,GAAY,GAAIsG,MAAKrP,KAuBhC,OAnBGmiC,IAAWpc,EACb3N,EAAKhT,WAEL6U,EAAM8E,EAAOojB,GAASloB,IACtBmoB,EAAa75B,OAAO85B,mBAAmBpoB,GAEvC3K,OAAOoD,KAAKgI,QAAQT,EAAK,UACxB/S,KAAK,SAAUc,GACf,MAAOs6B,aAAY3mB,QAAQymB,EAAYp6B,KAEvCd,KAAK,WACLi7B,IAEApiC,WAAW,WACVoY,EAAKC,IACH,MAIEA,EAAKpP,SACXjO,KAAK3C,KAUP,OARIK,OAAMmC,QAAQmkB,KACjBA,GAAUA,IAGX5G,IAAOjR,KAAK,WACX6B,EAAS3D,WACRrK,KAAK3C,OAEA2Q,EAASC,SAGjBsG,OAAOgQ,QAAQ5mB,UAAU2mB,MAAQ,SAASpF,EAAK5c,GAC9C,GAAI+kC,GAAa75B,OAAO85B,mBAAmBpoB,EAC3C,OAAOqoB,aAAY3mB,QAAQymB,EAAY/kC,GACrC6J,KAAK,SAAU5D,GACf,MAAe,QAAXA,GACI,GAEA,KAKXgM,OAAOgQ,QAAQ5mB,UAAU0mB,SAAW,SAASnF,GAC5C,GAAImoB,GAAa75B,OAAO85B,mBAAmBpoB,EAC3C,OAAOqoB,aAAY7mB,QAAQ2mB,GACzBl7B,KAAK,SAAU5D,GACf,MAAe,QAAXA,GACI,GAEA,KAKXgM,OAAOgQ,QAAQ5mB,UAAU+oC,QAAU,SAASxnB,GAC3C,GAAImoB,GAAa75B,OAAO85B,mBAAmBpoB,EAE3C,OAAO3K,QAAOoD,KAAKgI,QAAQT,EAAK,cAAe7hB,KAAKgZ,iBAClDlK,KAAK,SAASq7B,GAOd,MALGnqC,MAAKonB,UACPpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAEzBi5B,YAAY3mB,QAAQymB,EAAYG,GACzBA,GACNxnC,KAAK3C,OACN8O,KAAK,SAASc,GACd,GAAIe,GAAW,GAAIsG,MAAKrP,MACpBwiC,EAAWlzB,OAAOoD,KAAK+vB,YAAYxoB,GACnCmP,EAAO,GAAItB,OAAM9f,IAAQsf,KAAOkb,IAChCE,EAAS,GAAIC,WAKjB,OAJAD,GAAOlvB,iBAAiB,UAAW,WAClCzK,EAAS3D,QAAQs9B,EAAOp/B,UAEzBo/B,EAAOE,WAAWxZ,EAAMoZ,GACjBz5B,EAASC,UAEhBkF,MAAM,WAEN,GAAInF,GAAW,GAAIsG,MAAKrP,MACpBgH,EAAQs7B,YAAY7mB,QAAQ2mB,EAOhC,OALIhqC,MAAKonB,UACRpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAGrBrC,GAQJA,EAAME,KAAK,SAASc,GACnB,GAAIw6B,GAAWlzB,OAAOoD,KAAK+vB,YAAYxoB,GACnCmP,EAAO,GAAItB,OAAM9f,IAAQsf,KAAOkb,IAChCE,EAAS,GAAIC,WACjBD,GAAOlvB,iBAAiB,UAAW,WAClCzK,EAAS3D,QAAQs9B,EAAOp/B,UAEzBo/B,EAAOE,WAAWxZ,EAAMoZ,KAGlBz5B,EAASC,UAjBfD,EAAS1M,QACRohB,QAAU,kCAAoCxD,EAC9CnP,OAAQ,GAAIlF,QAAQkF,QAEd/B,EAASC,UAchBjO,KAAK3C,QAGTkX,OAAOgQ,QAAQ5mB,UAAU0pB,OAAS,SAASnI,GAC1C,GAAImoB,GAAa75B,OAAO85B,mBAAmBpoB,EAE3C,OAAO3K,QAAOoD,KAAKgI,QAAQT,EAAK,cAAe7hB,KAAKgZ,iBAClDlK,KAAK,SAASq7B,GAMd,MALGnqC,MAAKonB,UACPpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAEzBi5B,YAAY3mB,QAAQymB,EAAYG,GACzBtoB,GACNlf,KAAK3C,OACN8V,MAAM,WACN,GACIlH,GAEAmb,EAHApZ,EAAW,GAAIsG,MAAKrP,MAEpB4hC,EAAOr5B,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,MAQpD,OALI1pC,MAAKonB,UACRpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAGtB+4B,IAAchqC,MAAK8pC,UACrBn5B,EAAS3D,QAAQhN,KAAK8pC,SAASE,IACxBr5B,EAASC,UAGjBhC,EAAQs7B,YAAY7mB,QAAQ2mB,KAU5Bp7B,EAAME,KAAK,SAASc,GACnB,GAAIohB,GAAO,GAAItB,OAAM9f,IAAQsf,KAAOhY,OAAOoD,KAAK+vB,YAAYxoB,IAC5DkI,GAAUyf,EAAKG,gBAAgB3Y,GAC/BrgB,EAAS3D,QAAQ+c,GACjB/pB,KAAK8pC,SAASE,GAAcjgB,GAC3BpnB,KAAK3C,OAGA2Q,EAASC,UAffD,EAAS1M,QACRohB,QAAU,kCAAoCxD,EAC9CnP,OAAQ,GAAIlF,QAAQkF,QAEd/B,EAASC,UAYjBjO,KAAK3C,QAGRkX,OAAOgQ,QAAQ5mB,UAAU+hB,OAAS,SAASR,GAC1C,GAAImoB,GAAa75B,OAAO85B,mBAAmBpoB,EAE3C,OAAO3K,QAAOoD,KAAKgI,QAAQT,EAAK,cAAe7hB,KAAKgZ,iBAClDlK,KAAK,SAASq7B,GAMd,MALGnqC,MAAKonB,UACPpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAEzBi5B,YAAY3mB,QAAQymB,EAAYG,GACzBA,GACNxnC,KAAK3C,OACN8O,KAAK,SAASc,GACd,GAAIe,GAAW,GAAIsG,MAAKrP,MACpBwiC,EAAWlzB,OAAOoD,KAAK+vB,YAAYxoB,GACnCmP,EAAO,GAAItB,OAAM9f,IAAQsf,KAAOkb,IAChCE,EAAS,GAAIC,WAOjB,OANAD,GAAOlvB,iBAAiB,UAAW,WAClC,GAAIqvB,GAAS,GAAIC,WACbphB,EAAMmhB,EAAOE,gBAAgBL,EAAOp/B,OAAQ,WAChDyF,GAAS3D,QAAQsc,KAElBghB,EAAOE,WAAWxZ,EAAMoZ,GACjBz5B,EAASC,UAEhBkF,MAAM,WACN,GAAInF,GAAW,GAAIsG,MAAKrP,MACpBgH,EAAQs7B,YAAY7mB,QAAQ2mB,EAOhC,OALIhqC,MAAKonB,UACRpnB,KAAKonB,SAAU,EACfpnB,KAAKiR,QAAQ,WAAW,IAGrBrC,GAQJA,EAAME,KAAK,SAASc,GACnB,GAAIw6B,GAAWlzB,OAAOoD,KAAK+vB,YAAYxoB,GACnCmP,EAAO,GAAItB,OAAM9f,IAAQsf,KAAOkb,IAChCE,EAAS,GAAIC,WACjBD,GAAOlvB,iBAAiB,UAAW,WAClC,GAAIqvB,GAAS,GAAIC,WACbphB,EAAMmhB,EAAOE,gBAAgBL,EAAOp/B,OAAQ,WAChDyF,GAAS3D,QAAQsc,KAElBghB,EAAOE,WAAWxZ,EAAMoZ,KAGlBz5B,EAASC,UAnBfD,EAAS1M,QACRohB,QAAU,kCAAoCxD,EAC9CnP,OAAQ,GAAIlF,QAAQkF,QAEd/B,EAASC,UAgBhBjO,KAAK3C,QAGTkX,OAAOgQ,QAAQ5mB,UAAUgqB,UAAY,SAASzI,GAC7C,GAAI2nB,GAAOr5B,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,OAChDkB,EAAY5qC,KAAK8pC,SAASjoB,EAC3B+oB,IAAWpB,EAAKqB,gBAAgBD,IAGpC1zB,OAAOgQ,QAAQ5mB,UAAUqU,OAAS,SAAShC,GAC1CsK,QAAQtK,MAAMA,IAGfsE,KAAKxG,YAAYtF,MAAM+L,OAAOgQ,QAAQ5mB,WAEtC4W,OAAO+L,WAAa,WAEnBjjB,KAAK6pC,oBACL7pC,KAAK8pC,aAKN5yB,OAAO+L,WAAW3iB,UAAUupC,kBAAoB,WAC3B,mBAAX,QAAwB5sB,QAAQtK,MAAM,yBAGhDuE,OAAO+L,WAAW3iB,UAAU6a,KAAO,SAAS2vB,GAC5B,GAAI7zB,MAAKrP,KAExB,OAAOsP,QAAOoD,KAAKgI,QAAQwoB,EAAQ,UAAUh8B,KAAK,SAASc,GAC1D5P,KAAKkH,IAAM,GAAI6jC,OAAMn7B,IACpBjN,KAAK3C,QAGRkX,OAAO+L,WAAW3iB,UAAU+hB,OAAS,SAASR,EAAK7E,GAClD,GAAIguB,GAAe76B,OAAO86B,mBAAmBppB,EAC7C,OAAO7hB,MAAKqpC,QAAQ2B,EAAchuB,GAChClO,KAAK,SAAS4d,GACb,GAAI+d,GAAS,GAAIC,UACjB,OAAOD,GAAOE,gBAAgBje,EAAM,eAKxCxV,OAAO+L,WAAW3iB,UAAU0pB,OAAS,SAASnI,GAC7C,GAKIkI,GACAiH,EANAka,EAAalrC,KACb2Q,EAAW,GAAIsG,MAAKrP,MACpBojC,EAAe76B,OAAO86B,mBAAmBppB,GACzCjT,EAAQ5O,KAAKkH,IAAIikC,KAAKH,GACtBxB,EAAOr5B,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,MAIpD,OAAI96B,GAQDiT,IAAO7hB,MAAK8pC,UACdn5B,EAAS3D,QAAQhN,KAAK8pC,SAASjoB,IACxBlR,EAASC,UAGjBogB,EAAO,GAAItB,OAAM9gB,EAAMw8B,iBAAkBlc,KAAOhY,OAAOoD,KAAK+vB,YAAYz7B,EAAM/B,QAE9Ekd,EAAUyf,EAAKG,gBAAgB3Y,GAC/BrgB,EAAS3D,QAAQ+c,GACjBmhB,EAAWpB,SAASjoB,GAAOkI,EAEpBpZ,EAASC,UAlBfD,EAAS1M,QACRohB,QAAU,+BAAiCxD,EAC3CnP,OAAQ,GAAIlF,QAAQkF,QAEd/B,EAASC,UAiBlBsG,OAAO+L,WAAW3iB,UAAU+oC,QAAU,SAASxnB,GAC9C,GAII6K,GAHA/b,EAAW,GAAIsG,MAAKrP,MACpBojC,EAAe76B,OAAO86B,mBAAmBppB,GACzCjT,EAAQ5O,KAAKkH,IAAIikC,KAAKH,EAG1B,OAAIp8B,IAQJ8d,EAAO9d,EAAMy8B,SACb16B,EAAS3D,QAAQ0f,GAEV/b,EAASC,UAVfD,EAAS1M,QACRohB,QAAU,+BAAiCxD,EAC3CnP,OAAQ,GAAIlF,QAAQkF,QAEd/B,EAASC,UASlBsG,OAAO+L,WAAW3iB,UAAUgqB,UAAY,SAASzI,GAChD,GAAI2nB,GAAOr5B,OAAOwf,KAAOxf,OAAOs5B,WAAat5B,OAAOu5B,OAChDkB,EAAY5qC,KAAK8pC,SAASjoB,EAC3B+oB,IAAWpB,EAAKqB,gBAAgBD,IAGpC1zB,OAAO+L,WAAW3iB,UAAUqU,OAAS,SAAShC,GAC7CsK,QAAQtK,MAAMA,IAGfuE,OAAO+L,WAAW3iB,UAAUgrC,WAAa,WACxCtrC,KAAK+M,YAGNmK,OAAO+L,WAAW3iB,UAAUwmB,UAAY,SAASxY,GAMhD,QAASvB,KACR4gB,IACa,IAAVA,GAAa4d,EAAKD,aAPtB,GAAI3c,GAAU,EACbjnB,EAAQ,GACR6jC,EAAOvrC,KACP2tB,EAAQrf,EAAQnL,MAOjBmL,GAAQhN,QAAQ,SAASsN,GAExBjH,WAAW,SAASiH,GACnB28B,EAAKC,uBAAuB58B,EAAO7B,IACjC4hB,EAAS/f,GAEZ+f,GAAWjnB,IAGZuV,QAAQ+O,IAAI,OAAQ2C"} \ No newline at end of file diff --git a/reader/js/epub.min.js b/reader/js/epub.min.js deleted file mode 100644 index 6df7137..0000000 --- a/reader/js/epub.min.js +++ /dev/null @@ -1,8273 +0,0 @@ -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); -(function(global) { -var define, requireModule, require, requirejs; - -(function() { - var registry = {}, seen = {}; - - define = function(name, deps, callback) { - registry[name] = { deps: deps, callback: callback }; - }; - - requirejs = require = requireModule = function(name) { - requirejs._eak_seen = registry; - - if (seen[name]) { return seen[name]; } - seen[name] = {}; - - if (!registry[name]) { - throw new Error("Could not find module " + name); - } - - var mod = registry[name], - deps = mod.deps, - callback = mod.callback, - reified = [], - exports; - - for (var i=0, l=deps.length; i 1; - }; - - RSVP.filter(promises, filterFn).then(function(result){ - // result is [ 2, 3 ] - }); - ``` - - If any of the `promises` given to `RSVP.filter` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - ```javascript - var promise1 = RSVP.resolve(1); - var promise2 = RSVP.reject(new Error("2")); - var promise3 = RSVP.reject(new Error("3")); - var promises = [ promise1, promise2, promise3 ]; - - var filterFn = function(item){ - return item > 1; - }; - - RSVP.filter(promises, filterFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === "2" - }); - ``` - - `RSVP.filter` will also wait for any promises returned from `filterFn`. - For instance, you may want to fetch a list of users then return a subset - of those users based on some asynchronous operation: - - ```javascript - - var alice = { name: 'alice' }; - var bob = { name: 'bob' }; - var users = [ alice, bob ]; - - var promises = users.map(function(user){ - return RSVP.resolve(user); - }); - - var filterFn = function(user){ - // Here, Alice has permissions to create a blog post, but Bob does not. - return getPrivilegesForUser(user).then(function(privs){ - return privs.can_create_blog_post === true; - }); - }; - RSVP.filter(promises, filterFn).then(function(users){ - // true, because the server told us only Alice can create a blog post. - users.length === 1; - // false, because Alice is the only user present in `users` - users[0] === bob; - }); - ``` - - @method filter - @for RSVP - @param {Array} promises - @param {Function} filterFn - function to be called on each resolved value to - filter the final results. - @param {String} label optional string describing the promise. Useful for - tooling. - @return {Promise} - */ - function filter(promises, filterFn, label) { - if (!isArray(promises)) { - throw new TypeError('You must pass an array to filter.'); - } - - if (!isFunction(filterFn)){ - throw new TypeError("You must pass a function to filter's second argument."); - } - - return all(promises, label).then(function(values){ - return map(promises, filterFn, label).then(function(filterResults){ - var i, - valuesLen = values.length, - filtered = []; - - for (i = 0; i < valuesLen; i++){ - if(filterResults[i]) filtered.push(values[i]); - } - return filtered; - }); - }); - } - - __exports__["default"] = filter; - }); -define("rsvp/hash", - ["./promise","./utils","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - var isNonThenable = __dependency2__.isNonThenable; - var keysOf = __dependency2__.keysOf; - - /** - `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array - for its `promises` argument. - - Returns a promise that is fulfilled when all the given promises have been - fulfilled, or rejected if any of them become rejected. The returned promise - is fulfilled with a hash that has the same key names as the `promises` object - argument. If any of the values in the object are not promises, they will - simply be copied over to the fulfilled object. - - Example: - - ```javascript - var promises = { - myPromise: RSVP.resolve(1), - yourPromise: RSVP.resolve(2), - theirPromise: RSVP.resolve(3), - notAPromise: 4 - }; - - RSVP.hash(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: 1, - // yourPromise: 2, - // theirPromise: 3, - // notAPromise: 4 - // } - }); - ```` - - If any of the `promises` given to `RSVP.hash` are rejected, the first promise - that is rejected will be given as as the first argument, or as the reason to - the rejection handler. For example: - - ```javascript - var promises = { - myPromise: RSVP.resolve(1), - rejectedPromise: RSVP.reject(new Error("rejectedPromise")), - anotherRejectedPromise: RSVP.reject(new Error("anotherRejectedPromise")), - }; - - RSVP.hash(promises).then(function(hash){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === "rejectedPromise" - }); - ``` - - An important note: `RSVP.hash` is intended for plain JavaScript objects that - are just a set of keys and values. `RSVP.hash` will NOT preserve prototype - chains. - - Example: - - ```javascript - function MyConstructor(){ - this.example = RSVP.resolve("Example"); - } - - MyConstructor.prototype = { - protoProperty: RSVP.resolve("Proto Property") - }; - - var myObject = new MyConstructor(); - - RSVP.hash(myObject).then(function(hash){ - // protoProperty will not be present, instead you will just have an - // object that looks like: - // { - // example: "Example" - // } - // - // hash.hasOwnProperty('protoProperty'); // false - // 'undefined' === typeof hash.protoProperty - }); - ``` - - @method hash - @for RSVP - @param {Object} promises - @param {String} label - optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all properties of `promises` - have been fulfilled, or rejected if any of them become rejected. - */ - __exports__["default"] = function hash(object, label) { - return new Promise(function(resolve, reject){ - var results = {}; - var keys = keysOf(object); - var remaining = keys.length; - var entry, property; - - if (remaining === 0) { - resolve(results); - return; - } - - function fulfilledTo(property) { - return function(value) { - results[property] = value; - if (--remaining === 0) { - resolve(results); - } - }; - } - - function onRejection(reason) { - remaining = 0; - reject(reason); - } - - for (var i = 0; i < keys.length; i++) { - property = keys[i]; - entry = object[property]; - - if (isNonThenable(entry)) { - results[property] = entry; - if (--remaining === 0) { - resolve(results); - } - } else { - Promise.cast(entry).then(fulfilledTo(property), onRejection); - } - } - }); - }; - }); -define("rsvp/instrument", - ["./config","./utils","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var config = __dependency1__.config; - var now = __dependency2__.now; - - __exports__["default"] = function instrument(eventName, promise, child) { - // instrumentation should not disrupt normal usage. - try { - config.trigger(eventName, { - guid: promise._guidKey + promise._id, - eventName: eventName, - detail: promise._detail, - childGuid: child && promise._guidKey + child._id, - label: promise._label, - timeStamp: now(), - stack: new Error(promise._label).stack - }); - } catch(error) { - setTimeout(function(){ - throw error; - }, 0); - } - }; - }); -define("rsvp/map", - ["./promise","./all","./utils","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - var all = __dependency2__["default"]; - var isArray = __dependency3__.isArray; - var isFunction = __dependency3__.isFunction; - - /** - - `RSVP.map` is similar to JavaScript's native `map` method, except that it - waits for all promises to become fulfilled before running the `mapFn` on - each item in given to `promises`. `RSVP.map` returns a promise that will - become fulfilled with the result of running `mapFn` on the values the promises - become fulfilled with. - - For example: - - ```javascript - - var promise1 = RSVP.resolve(1); - var promise2 = RSVP.resolve(2); - var promise3 = RSVP.resolve(3); - var promises = [ promise1, promise2, promise3 ]; - - var mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(result){ - // result is [ 2, 3, 4 ] - }); - ``` - - If any of the `promises` given to `RSVP.map` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - ```javascript - var promise1 = RSVP.resolve(1); - var promise2 = RSVP.reject(new Error("2")); - var promise3 = RSVP.reject(new Error("3")); - var promises = [ promise1, promise2, promise3 ]; - - var mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === "2" - }); - ``` - - `RSVP.map` will also wait if a promise is returned from `mapFn`. For example, - say you want to get all comments from a set of blog posts, but you need - the blog posts first becuase they contain a url to those comments. - - ```javscript - - var mapFn = function(blogPost){ - // getComments does some ajax and returns an RSVP.Promise that is fulfilled - // with some comments data - return getComments(blogPost.comments_url); - }; - - // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled - // with some blog post data - RSVP.map(getBlogPosts(), mapFn).then(function(comments){ - // comments is the result of asking the server for the comments - // of all blog posts returned from getBlogPosts() - }); - ``` - - @method map - @for RSVP - @param {Array} promises - @param {Function} mapFn function to be called on each fulfilled promise. - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled with the result of calling - `mapFn` on each fulfilled promise or value when they become fulfilled. - The promise will be rejected if any of the given `promises` become rejected. - */ - __exports__["default"] = function map(promises, mapFn, label) { - - if (!isArray(promises)) { - throw new TypeError('You must pass an array to map.'); - } - - if (!isFunction(mapFn)){ - throw new TypeError("You must pass a function to map's second argument."); - } - - return all(promises, label).then(function(results){ - var resultLen = results.length, - mappedResults = [], - i; - - for (i = 0; i < resultLen; i++){ - mappedResults.push(mapFn(results[i])); - } - - return all(mappedResults, label); - }); - }; - }); -define("rsvp/node", - ["./promise","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - - var slice = Array.prototype.slice; - - function makeNodeCallbackFor(resolve, reject) { - return function (error, value) { - if (error) { - reject(error); - } else if (arguments.length > 2) { - resolve(slice.call(arguments, 1)); - } else { - resolve(value); - } - }; - } - - /** - `RSVP.denodeify` takes a "node-style" function and returns a function that - will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the - browser when you'd prefer to use promises over using callbacks. For example, - `denodeify` transforms the following: - - ```javascript - var fs = require('fs'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) return handleError(err); - handleData(data); - }); - ``` - - into: - - ```javascript - var fs = require('fs'); - - var readFile = RSVP.denodeify(fs.readFile); - - readFile('myfile.txt').then(handleData, handleError); - ``` - - Using `denodeify` makes it easier to compose asynchronous operations instead - of using callbacks. For example, instead of: - - ```javascript - var fs = require('fs'); - var log = require('some-async-logger'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) return handleError(err); - fs.writeFile('myfile2.txt', data, function(err){ - if (err) throw err; - log('success', function(err) { - if (err) throw err; - }); - }); - }); - ``` - - You can chain the operations together using `then` from the returned promise: - - ```javascript - var fs = require('fs'); - var denodeify = RSVP.denodeify; - var readFile = denodeify(fs.readFile); - var writeFile = denodeify(fs.writeFile); - var log = denodeify(require('some-async-logger')); - - readFile('myfile.txt').then(function(data){ - return writeFile('myfile2.txt', data); - }).then(function(){ - return log('SUCCESS'); - }).then(function(){ - // success handler - }, function(reason){ - // rejection handler - }); - ``` - - @method denodeify - @for RSVP - @param {Function} nodeFunc a "node-style" function that takes a callback as - its last argument. The callback expects an error to be passed as its first - argument (if an error occurred, otherwise null), and the value from the - operation as its second argument ("function(err, value){ }"). - @param {Any} binding optional argument for binding the "this" value when - calling the `nodeFunc` function. - @return {Function} a function that wraps `nodeFunc` to return an - `RSVP.Promise` - */ - __exports__["default"] = function denodeify(nodeFunc, binding) { - return function() { - var nodeArgs = slice.call(arguments), resolve, reject; - var thisArg = this || binding; - - return new Promise(function(resolve, reject) { - Promise.all(nodeArgs).then(function(nodeArgs) { - try { - nodeArgs.push(makeNodeCallbackFor(resolve, reject)); - nodeFunc.apply(thisArg, nodeArgs); - } catch(e) { - reject(e); - } - }); - }); - }; - }; - }); -define("rsvp/promise", - ["./config","./events","./instrument","./utils","./promise/cast","./promise/all","./promise/race","./promise/resolve","./promise/reject","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) { - "use strict"; - var config = __dependency1__.config; - var EventTarget = __dependency2__["default"]; - var instrument = __dependency3__["default"]; - var objectOrFunction = __dependency4__.objectOrFunction; - var isFunction = __dependency4__.isFunction; - var now = __dependency4__.now; - var cast = __dependency5__["default"]; - var all = __dependency6__["default"]; - var race = __dependency7__["default"]; - var Resolve = __dependency8__["default"]; - var Reject = __dependency9__["default"]; - - var guidKey = 'rsvp_' + now() + '-'; - var counter = 0; - - function noop() {} - - __exports__["default"] = Promise; - - - /** - - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise’s eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - - Basic Usage: - ------------ - - ```js - var promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - var xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error("getJSON: `" + url + "` failed with status: [" + this.status + "]"); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class Promise - @param {function} - @param {String} label optional string for labeling the promise. - Useful for tooling. - @constructor - */ - function Promise(resolver, label) { - if (!isFunction(resolver)) { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); - } - - if (!(this instanceof Promise)) { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); - } - - this._id = counter++; - this._label = label; - this._subscribers = []; - - if (config.instrument) { - instrument('created', this); - } - - if (noop !== resolver) { - invokeResolver(resolver, this); - } - } - - function invokeResolver(resolver, promise) { - function resolvePromise(value) { - resolve(promise, value); - } - - function rejectPromise(reason) { - reject(promise, reason); - } - - try { - resolver(resolvePromise, rejectPromise); - } catch(e) { - rejectPromise(e); - } - } - - Promise.cast = cast; - Promise.all = all; - Promise.race = race; - Promise.resolve = Resolve; - Promise.reject = Reject; - - var PENDING = void 0; - var SEALED = 0; - var FULFILLED = 1; - var REJECTED = 2; - - function subscribe(parent, child, onFulfillment, onRejection) { - var subscribers = parent._subscribers; - var length = subscribers.length; - - subscribers[length] = child; - subscribers[length + FULFILLED] = onFulfillment; - subscribers[length + REJECTED] = onRejection; - } - - function publish(promise, settled) { - var child, callback, subscribers = promise._subscribers, detail = promise._detail; - - if (config.instrument) { - instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise); - } - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - invokeCallback(settled, child, callback, detail); - } - - promise._subscribers = null; - } - - Promise.prototype = { - /** - @property constructor - */ - constructor: Promise, - - _id: undefined, - _guidKey: guidKey, - _label: undefined, - - _state: undefined, - _detail: undefined, - _subscribers: undefined, - - _onerror: function (reason) { - config.trigger('error', reason); - }, - - /** - - A promise represents the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise's eventual value or the reason - why the promise cannot be fulfilled. - - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - - Chaining - -------- - - The return value of `then` is itself a promise. This second, "downstream" - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return "default name"; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `"default name"` - }); - - findUser().then(function (user) { - throw "Found user, but still unhappy"; - }, function (reason) { - throw "`findUser` rejected and we're unhappy"; - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be "Found user, but still unhappy". - // If `findUser` rejected, `reason` will be "`findUser` rejected and we're unhappy". - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - - ```js - findUser().then(function (user) { - throw new PedagogicalException("Upstream error"); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - - Assimilation - ------------ - - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - - If the assimliated promise rejects, then the downstream promise will also reject. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - - Simple Example - -------------- - - Synchronous Example - - ```javascript - var result; - - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - - Promise Example; - - ```javacsript - findResult().then(function(result){ - - }, function(reason){ - - }); - ``` - - Advanced Example - -------------- - - Synchronous Example - - ```javascript - var author, books; - - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - - function foundBooks(books) { - - } - - function failure(reason) { - - } - - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - - Promise Example; - - ```javacsript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong; - }); - ``` - - @method then - @param {Function} onFulfillment - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - then: function(onFulfillment, onRejection, label) { - var promise = this; - this._onerror = null; - - var thenPromise = new this.constructor(noop, label); - - if (this._state) { - var callbacks = arguments; - config.async(function invokePromiseCallback() { - invokeCallback(promise._state, thenPromise, callbacks[promise._state - 1], promise._detail); - }); - } else { - subscribe(this, thenPromise, onFulfillment, onRejection); - } - - if (config.instrument) { - instrument('chained', promise, thenPromise); - } - - return thenPromise; - }, - - /** - `catch` is simply sugar for `then(null, onRejection)` which makes it the same - as the catch block, of a try/catch statement. - - ```js - function findAuthor(){ - throw new Error("couldn't find that author"); - } - - // synchronous - try { - findAuthor(); - } catch(reason) { - - } - - // async with promises - findAuthor().catch(function(reason){ - // something went wrong; - }); - ``` - - @method catch - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'catch': function(onRejection, label) { - return this.then(null, onRejection, label); - }, - - /** - `finally` will be invoked regardless of the promise's fate just as native - try/catch/finally behaves - - ```js - findAuthor() { - if (Math.random() > 0.5) { - throw new Error(); - } - return new Author(); - } - - try { - return findAuthor(); // succeed or fail - } catch(error) { - return findOtherAuther(); - } finally { - // always runs - // doesn't effect the return value - } - - findAuthor().finally(function(){ - // author was either found, or not - }); - ``` - - @method finally - @param {Function} callback - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'finally': function(callback, label) { - var constructor = this.constructor; - - return this.then(function(value) { - return constructor.cast(callback()).then(function(){ - return value; - }); - }, function(reason) { - return constructor.cast(callback()).then(function(){ - throw reason; - }); - }, label); - } - }; - - function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value, error, succeeded, failed; - - if (hasCallback) { - try { - value = callback(detail); - succeeded = true; - } catch(e) { - failed = true; - error = e; - } - } else { - value = detail; - succeeded = true; - } - - if (handleThenable(promise, value)) { - return; - } else if (hasCallback && succeeded) { - resolve(promise, value); - } else if (failed) { - reject(promise, error); - } else if (settled === FULFILLED) { - resolve(promise, value); - } else if (settled === REJECTED) { - reject(promise, value); - } - } - - function handleThenable(promise, value) { - var then = null, - resolved; - - try { - if (promise === value) { - throw new TypeError("A promises callback cannot return that same promise."); - } - - if (objectOrFunction(value)) { - then = value.then; - - if (isFunction(then)) { - then.call(value, function(val) { - if (resolved) { return true; } - resolved = true; - - if (value !== val) { - resolve(promise, val); - } else { - fulfill(promise, val); - } - }, function(val) { - if (resolved) { return true; } - resolved = true; - - reject(promise, val); - }, 'derived from: ' + (promise._label || ' unknown promise')); - - return true; - } - } - } catch (error) { - if (resolved) { return true; } - reject(promise, error); - return true; - } - - return false; - } - - function resolve(promise, value) { - if (promise === value) { - fulfill(promise, value); - } else if (!handleThenable(promise, value)) { - fulfill(promise, value); - } - } - - function fulfill(promise, value) { - if (promise._state !== PENDING) { return; } - promise._state = SEALED; - promise._detail = value; - - config.async(publishFulfillment, promise); - } - - function reject(promise, reason) { - if (promise._state !== PENDING) { return; } - promise._state = SEALED; - promise._detail = reason; - - config.async(publishRejection, promise); - } - - function publishFulfillment(promise) { - publish(promise, promise._state = FULFILLED); - } - - function publishRejection(promise) { - if (promise._onerror) { - promise._onerror(promise._detail); - } - - publish(promise, promise._state = REJECTED); - } - }); -define("rsvp/promise/all", - ["../utils","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var isArray = __dependency1__.isArray; - var isNonThenable = __dependency1__.isNonThenable; - - /** - - `RSVP.Promise.all` returns a new promise which is fulfilled with an array of - fulfillment values for the passed promises, or rejects with the reason of the - first passed promise that rejects. It casts all elements of the passed iterable - to promises as it runs this algorithm. - - Example: - - ```javascript - var promise1 = RSVP.resolve(1); - var promise2 = RSVP.resolve(2); - var promise3 = RSVP.resolve(3); - var promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `RSVP.all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - var promise1 = RSVP.resolve(1); - var promise2 = RSVP.reject(new Error("2")); - var promise3 = RSVP.reject(new Error("3")); - var promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @for RSVP.Promise - @param {Array} promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - */ - __exports__["default"] = function all(entries, label) { - - /*jshint validthis:true */ - var Constructor = this; - - return new Constructor(function(resolve, reject) { - if (!isArray(entries)) { - throw new TypeError('You must pass an array to all.'); - } - - var remaining = entries.length; - var results = new Array(remaining); - var entry, pending = true; - - if (remaining === 0) { - resolve(results); - return; - } - - function fulfillmentAt(index) { - return function(value) { - results[index] = value; - if (--remaining === 0) { - resolve(results); - } - }; - } - - function onRejection(reason) { - remaining = 0; - reject(reason); - } - - for (var index = 0; index < entries.length; index++) { - entry = entries[index]; - if (isNonThenable(entry)) { - results[index] = entry; - if (--remaining === 0) { - resolve(results); - } - } else { - Constructor.cast(entry).then(fulfillmentAt(index), onRejection); - } - } - }, label); - }; - }); -define("rsvp/promise/cast", - ["exports"], - function(__exports__) { - "use strict"; - /** - - `RSVP.Promise.cast` cast coerces its argument to a promise, or returns the - argument if it is already a promise which shares a constructor with the caster; - - Example: - - ```javascript - var promise = RSVP.Promise.resolve(1); - var casted = RSVP.Promise.cast(promise); - - console.log(promise === casted); // true - ``` - - In the case of a promise whose constructor does not match, it is assimilated. - The resulting promise will fulfill or reject based on the outcome of the - promise being casted. - - In the case of a non-promise, a promise which will fulfill with that value is - returned. - - Example: - - ```javascript - var value = 1; // could be a number, boolean, string, undefined... - var casted = RSVP.Promise.cast(value); - - console.log(value === casted); // false - console.log(casted instanceof RSVP.Promise) // true - - casted.then(function(val) { - val === value // => true - }); - ``` - - `RSVP.Promise.cast` is similar to `RSVP.Promise.resolve`, but `RSVP.Promise.cast` differs in the - following ways: - - * `RSVP.Promise.cast` serves as a memory-efficient way of getting a promise, when you - have something that could either be a promise or a value. RSVP.resolve - will have the same effect but will create a new promise wrapper if the - argument is a promise. - * `RSVP.Promise.cast` is a way of casting incoming thenables or promise subclasses to - promises of the exact class specified, so that the resulting object's `then` is - ensured to have the behavior of the constructor you are calling cast on (i.e., RSVP.Promise). - - @method cast - @for RSVP.Promise - @param {Object} object to be casted - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise - */ - - __exports__["default"] = function cast(object, label) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - return new Constructor(function(resolve) { - resolve(object); - }, label); - }; - }); -define("rsvp/promise/race", - ["../utils","exports"], - function(__dependency1__, __exports__) { - "use strict"; - /* global toString */ - - var isArray = __dependency1__.isArray; - var isFunction = __dependency1__.isFunction; - var isNonThenable = __dependency1__.isNonThenable; - - /** - `RSVP.Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - var promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve("promise 1"); - }, 200); - }); - - var promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve("promise 2"); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // result === "promise 2" because it was resolved before promise1 - // was resolved. - }); - ``` - - `RSVP.Promise.race` is deterministic in that only the state of the first - completed promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first completed promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - var promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve("promise 1"); - }, 200); - }); - - var promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error("promise 2")); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs because there are rejected promises! - }, function(reason){ - // reason.message === "promise2" because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - @method race - @for RSVP.Promise - @param {Array} promises array of promises to observe - @param {String} label optional string for describing the promise returned. - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. - */ - __exports__["default"] = function race(entries, label) { - /*jshint validthis:true */ - var Constructor = this, entry; - - return new Constructor(function(resolve, reject) { - if (!isArray(entries)) { - throw new TypeError('You must pass an array to race.'); - } - - var pending = true; - - function onFulfillment(value) { if (pending) { pending = false; resolve(value); } } - function onRejection(reason) { if (pending) { pending = false; reject(reason); } } - - for (var i = 0; i < entries.length; i++) { - entry = entries[i]; - if (isNonThenable(entry)) { - pending = false; - resolve(entry); - return; - } else { - Constructor.cast(entry).then(onFulfillment, onRejection); - } - } - }, label); - }; - }); -define("rsvp/promise/reject", - ["exports"], - function(__exports__) { - "use strict"; - /** - `RSVP.Promise.reject` returns a promise rejected with the passed `reason`. - It is essentially shorthand for the following: - - ```javascript - var promise = new RSVP.Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - var promise = RSVP.Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @for RSVP.Promise - @param {Any} reason value that the returned promise will be rejected with. - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. - */ - __exports__["default"] = function reject(reason, label) { - /*jshint validthis:true */ - var Constructor = this; - - return new Constructor(function (resolve, reject) { - reject(reason); - }, label); - }; - }); -define("rsvp/promise/resolve", - ["exports"], - function(__exports__) { - "use strict"; - /** - `RSVP.Promise.resolve` returns a promise that will become fulfilled with the passed - `value`. It is essentially shorthand for the following: - - ```javascript - var promise = new RSVP.Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - var promise = RSVP.Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @for RSVP.Promise - @param {Any} value value that the returned promise will be resolved with - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` - */ - __exports__["default"] = function resolve(value, label) { - /*jshint validthis:true */ - var Constructor = this; - - return new Constructor(function(resolve, reject) { - resolve(value); - }, label); - }; - }); -define("rsvp/race", - ["./promise","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - - __exports__["default"] = function race(array, label) { - return Promise.race(array, label); - }; - }); -define("rsvp/reject", - ["./promise","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - - __exports__["default"] = function reject(reason, label) { - return Promise.reject(reason, label); - }; - }); -define("rsvp/resolve", - ["./promise","exports"], - function(__dependency1__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - - __exports__["default"] = function resolve(value, label) { - return Promise.resolve(value, label); - }; - }); -define("rsvp/rethrow", - ["exports"], - function(__exports__) { - "use strict"; - /** - `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event - loop in order to aid debugging. - - Promises A+ specifies that any exceptions that occur with a promise must be - caught by the promises implementation and bubbled to the last handler. For - this reason, it is recommended that you always specify a second rejection - handler function to `then`. However, `RSVP.rethrow` will throw the exception - outside of the promise, so it bubbles up to your console if in the browser, - or domain/cause uncaught exception in Node. `rethrow` will throw the error - again so the error can be handled by the promise. - - ```javascript - function throws(){ - throw new Error('Whoops!'); - } - - var promise = new RSVP.Promise(function(resolve, reject){ - throws(); - }); - - promise.catch(RSVP.rethrow).then(function(){ - // Code here doesn't run because the promise became rejected due to an - // error! - }, function (err){ - // handle the error here - }); - ``` - - The 'Whoops' error will be thrown on the next turn of the event loop - and you can watch for it in your console. You can also handle it using a - rejection handler given to `.then` or `.catch` on the returned promise. - - @method rethrow - @for RSVP - @param {Error} reason reason the promise became rejected. - @throws Error - */ - __exports__["default"] = function rethrow(reason) { - setTimeout(function() { - throw reason; - }); - throw reason; - }; - }); -define("rsvp/utils", - ["exports"], - function(__exports__) { - "use strict"; - function objectOrFunction(x) { - return typeof x === "function" || (typeof x === "object" && x !== null); - } - - __exports__.objectOrFunction = objectOrFunction;function isFunction(x) { - return typeof x === "function"; - } - - __exports__.isFunction = isFunction;function isNonThenable(x) { - return !objectOrFunction(x); - } - - __exports__.isNonThenable = isNonThenable;function isArray(x) { - return Object.prototype.toString.call(x) === "[object Array]"; - } - - __exports__.isArray = isArray;// Date.now is not available in browsers < IE9 - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility - var now = Date.now || function() { return new Date().getTime(); }; - __exports__.now = now; - var keysOf = Object.keys || function(object) { - var result = []; - - for (var prop in object) { - result.push(prop); - } - - return result; - }; - __exports__.keysOf = keysOf; - }); -define("rsvp", - ["./rsvp/promise","./rsvp/events","./rsvp/node","./rsvp/all","./rsvp/all_settled","./rsvp/race","./rsvp/hash","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/map","./rsvp/resolve","./rsvp/reject","./rsvp/asap","./rsvp/filter","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) { - "use strict"; - var Promise = __dependency1__["default"]; - var EventTarget = __dependency2__["default"]; - var denodeify = __dependency3__["default"]; - var all = __dependency4__["default"]; - var allSettled = __dependency5__["default"]; - var race = __dependency6__["default"]; - var hash = __dependency7__["default"]; - var rethrow = __dependency8__["default"]; - var defer = __dependency9__["default"]; - var config = __dependency10__.config; - var configure = __dependency10__.configure; - var map = __dependency11__["default"]; - var resolve = __dependency12__["default"]; - var reject = __dependency13__["default"]; - var asap = __dependency14__["default"]; - var filter = __dependency15__["default"]; - - config.async = asap; // default async is asap; - - function async(callback, arg) { - config.async(callback, arg); - } - - function on() { - config.on.apply(config, arguments); - } - - function off() { - config.off.apply(config, arguments); - } - - // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` - if (typeof window !== 'undefined' && typeof window.__PROMISE_INSTRUMENTATION__ === 'object') { - var callbacks = window.__PROMISE_INSTRUMENTATION__; - configure('instrument', true); - for (var eventName in callbacks) { - if (callbacks.hasOwnProperty(eventName)) { - on(eventName, callbacks[eventName]); - } - } - } - - __exports__.Promise = Promise; - __exports__.EventTarget = EventTarget; - __exports__.all = all; - __exports__.allSettled = allSettled; - __exports__.race = race; - __exports__.hash = hash; - __exports__.rethrow = rethrow; - __exports__.defer = defer; - __exports__.denodeify = denodeify; - __exports__.configure = configure; - __exports__.on = on; - __exports__.off = off; - __exports__.resolve = resolve; - __exports__.reject = reject; - __exports__.async = async; - __exports__.map = map; - __exports__.filter = filter; - }); -global.RSVP = requireModule('rsvp'); -}(window)); -'use strict'; - -var EPUBJS = EPUBJS || {}; -EPUBJS.VERSION = "0.2.7"; - -EPUBJS.plugins = EPUBJS.plugins || {}; - -EPUBJS.filePath = EPUBJS.filePath || "/epubjs/"; - -EPUBJS.Render = {}; - -(function(root) { - - var previousEpub = root.ePub || {}; - - var ePub = root.ePub = function() { - var bookPath, options; - - //-- var book = ePub("path/to/book.epub", { restore: true }) - if(typeof(arguments[0]) != 'undefined' && - typeof arguments[0] === 'string') { - - bookPath = arguments[0]; - - if( arguments[1] && typeof arguments[1] === 'object' ) { - options = arguments[1]; - options.bookPath = bookPath; - } else { - options = { 'bookPath' : bookPath }; - } - - } - - /* - * var book = ePub({ bookPath: "path/to/book.epub", restore: true }); - * - * - OR - - * - * var book = ePub({ restore: true }); - * book.open("path/to/book.epub"); - */ - - if( arguments[0] && typeof arguments[0] === 'object' ) { - options = arguments[0]; - } - - - return new EPUBJS.Book(options); - }; - - _.extend(ePub, { - noConflict : function() { - root.ePub = previousEpub; - return this; - } - }); - - //exports to multiple environments - if (typeof define === 'function' && define.amd) - //AMD - define(function(){ return ePub; }); - else if (typeof module != "undefined" && module.exports) - //Node - module.exports = ePub; - -})(window); - -EPUBJS.Book = function(options){ - - var book = this; - - this.settings = _.defaults(options || {}, { - bookPath : null, - bookKey : null, - packageUrl : null, - storage: false, //-- true (auto) or false (none) | override: 'ram', 'websqldatabase', 'indexeddb', 'filesystem' - fromStorage : false, - saved : false, - online : true, - contained : false, - width : null, - height: null, - layoutOveride : null, // Default: { spread: 'reflowable', layout: 'auto', orientation: 'auto'} - orientation : null, - minSpreadWidth: 800, //-- overridden by spread: none (never) / both (always) - gap: "auto", //-- "auto" or int - version: 1, - restore: false, - reload : false, - goto : false, - styles : {}, - headTags : {}, - withCredentials: false, - render_method: "Iframe" - }); - - this.settings.EPUBJSVERSION = EPUBJS.VERSION; - - this.spinePos = 0; - this.stored = false; - - //-- All Book events for listening - /* - book:ready - book:stored - book:online - book:offline - book:pageChanged - book:loadFailed - book:loadChapterFailed - */ - - //-- Adds Hook methods to the Book prototype - // Hooks will all return before triggering the callback. - // EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - // this.getHooks("beforeChapterDisplay"); - - this.online = this.settings.online || navigator.onLine; - this.networkListeners(); - - this.ready = { - manifest: new RSVP.defer(), - spine: new RSVP.defer(), - metadata: new RSVP.defer(), - cover: new RSVP.defer(), - toc: new RSVP.defer(), - pageList: new RSVP.defer() - }; - - this.readyPromises = [ - this.ready.manifest.promise, - this.ready.spine.promise, - this.ready.metadata.promise, - this.ready.cover.promise, - this.ready.toc.promise - ]; - - this.pageList = []; - this.pagination = new EPUBJS.Pagination(); - this.pageListReady = this.ready.pageList.promise; - - this.ready.all = RSVP.all(this.readyPromises); - - this.ready.all.then(this._ready.bind(this)); - - // Queue for methods used before rendering - this.isRendered = false; - this._q = EPUBJS.core.queue(this); - // Queue for rendering - this._rendering = false; - this._displayQ = EPUBJS.core.queue(this); - // Queue for going to another location - this._moving = false; - this._gotoQ = EPUBJS.core.queue(this); - - /** - * Creates a new renderer. - * The renderer will handle displaying the content using the method provided in the settings - */ - this.renderer = new EPUBJS.Renderer(this.settings.render_method); - //-- Set the width at which to switch from spreads to single pages - this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - this.renderer.setGap(this.settings.gap); - //-- Pass through the renderer events - this.listenToRenderer(this.renderer); - - this.defer_opened = new RSVP.defer(); - this.opened = this.defer_opened.promise; - - this.store = false; //-- False if not using storage; - - //-- Determine storage method - //-- Override options: none | ram | websqldatabase | indexeddb | filesystem - if(this.settings.storage !== false){ - // this.storage = new fileStorage.storage(this.settings.storage); - this.fromStorage(true); - } - - // BookUrl is optional, but if present start loading process - if(typeof this.settings.bookPath === 'string') { - this.open(this.settings.bookPath, this.settings.reload); - } - - window.addEventListener("beforeunload", this.unload.bind(this), false); - - //-- Listen for these promises: - //-- book.opened.then() - //-- book.rendered.then() -}; - -//-- Check bookUrl and start parsing book Assets or load them from storage -EPUBJS.Book.prototype.open = function(bookPath, forceReload){ - var book = this, - epubpackage, - opened = new RSVP.defer(); - - this.settings.bookPath = bookPath; - - //-- Get a absolute URL from the book path - this.bookUrl = this.urlFrom(bookPath); - - if(this.settings.contained || this.isContained(bookPath)){ - - this.settings.contained = this.contained = true; - - this.bookUrl = ''; - - epubpackage = this.unarchive(bookPath). - then(function(){ - return book.loadPackage(); - }); - - } else { - epubpackage = this.loadPackage(); - } - - if(this.settings.restore && !forceReload && localStorage){ - //-- Will load previous package json, or re-unpack if error - epubpackage.then(function(packageXml) { - var identifier = book.packageIdentifier(packageXml); - var restored = book.restore(identifier); - - if(!restored) { - book.unpack(packageXml); - } - opened.resolve(); - book.defer_opened.resolve(); - }); - - }else{ - - //-- Get package information from epub opf - epubpackage.then(function(packageXml) { - book.unpack(packageXml); - opened.resolve(); - book.defer_opened.resolve(); - }); - } - - this._registerReplacements(this.renderer); - - return opened.promise; - -}; - -EPUBJS.Book.prototype.loadPackage = function(_containerPath){ - var book = this, - parse = new EPUBJS.Parser(), - containerPath = _containerPath || "META-INF/container.xml", - containerXml, - packageXml; - - if(!this.settings.packageUrl) { //-- provide the packageUrl to skip this step - packageXml = book.loadXml(book.bookUrl + containerPath). - then(function(containerXml){ - return parse.container(containerXml); // Container has path to content - }). - then(function(paths){ - book.settings.contentsPath = book.bookUrl + paths.basePath; - book.settings.packageUrl = book.bookUrl + paths.packagePath; - book.settings.encoding = paths.encoding; - return book.loadXml(book.settings.packageUrl); // Containes manifest, spine and metadata - }); - } else { - packageXml = book.loadXml(book.settings.packageUrl); - } - - packageXml.catch(function(error) { - // handle errors in either of the two requests - console.error("Could not load book at: "+ containerPath); - book.trigger("book:loadFailed", containerPath); - }); - return packageXml; -}; - -EPUBJS.Book.prototype.packageIdentifier = function(packageXml){ - var book = this, - parse = new EPUBJS.Parser(); - - return parse.identifier(packageXml); -}; - -EPUBJS.Book.prototype.unpack = function(packageXml){ - var book = this, - parse = new EPUBJS.Parser(); - - book.contents = parse.packageContents(packageXml, book.settings.contentsPath); // Extract info from contents - - book.manifest = book.contents.manifest; - book.spine = book.contents.spine; - book.spineIndexByURL = book.contents.spineIndexByURL; - book.metadata = book.contents.metadata; - if(!book.settings.bookKey) { - book.settings.bookKey = book.generateBookKey(book.metadata.identifier); - } - - //-- Set Globbal Layout setting based on metadata - book.globalLayoutProperties = book.parseLayoutProperties(book.metadata); - - if(book.contents.coverPath) { - book.cover = book.contents.cover = book.settings.contentsPath + book.contents.coverPath; - } - - book.spineNodeIndex = book.contents.spineNodeIndex; - - book.ready.manifest.resolve(book.contents.manifest); - book.ready.spine.resolve(book.contents.spine); - book.ready.metadata.resolve(book.contents.metadata); - book.ready.cover.resolve(book.contents.cover); - - book.locations = new EPUBJS.Locations(book.spine); - - //-- Load the TOC, optional; either the EPUB3 XHTML Navigation file or the EPUB2 NCX file - if(book.contents.navPath) { - book.settings.navUrl = book.settings.contentsPath + book.contents.navPath; - - book.loadXml(book.settings.navUrl). - then(function(navHtml){ - return parse.nav(navHtml, book.spineIndexByURL, book.spine); // Grab Table of Contents - }).then(function(toc){ - book.toc = book.contents.toc = toc; - book.ready.toc.resolve(book.contents.toc); - }, function(error) { - book.ready.toc.resolve(false); - }); - - // Load the optional pageList - book.loadXml(book.settings.navUrl). - then(function(navHtml){ - return parse.pageList(navHtml, book.spineIndexByURL, book.spine); - }).then(function(pageList){ - var epubcfi = new EPUBJS.EpubCFI(); - var wait = 0; // need to generate a cfi - - // No pageList found - if(pageList.length === 0) { - return; - } - - book.pageList = book.contents.pageList = pageList; - - // Replace HREFs with CFI - book.pageList.forEach(function(pg){ - if(!pg.cfi) { - wait += 1; - epubcfi.generateCfiFromHref(pg.href, book).then(function(cfi){ - pg.cfi = cfi; - pg.packageUrl = book.settings.packageUrl; - - wait -= 1; - if(wait === 0) { - book.pagination.process(book.pageList); - book.ready.pageList.resolve(book.pageList); - } - }); - } - }); - - if(!wait) { - book.pagination.process(book.pageList); - book.ready.pageList.resolve(book.pageList); - } - - }, function(error) { - book.ready.pageList.resolve([]); - }); - } else if(book.contents.tocPath) { - book.settings.tocUrl = book.settings.contentsPath + book.contents.tocPath; - - book.loadXml(book.settings.tocUrl). - then(function(tocXml){ - return parse.toc(tocXml, book.spineIndexByURL, book.spine); // Grab Table of Contents - }).then(function(toc){ - book.toc = book.contents.toc = toc; - book.ready.toc.resolve(book.contents.toc); - }, function(error) { - book.ready.toc.resolve(false); - }); - - } else { - book.ready.toc.resolve(false); - } - -}; - -EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) { - var box = this.element.getBoundingClientRect(); - var width = _width || this.settings.width || box.width; - var height = _height || this.settings.height || box.height; - var hiddenContainer; - var hiddenEl; - renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - renderer.setGap(this.settings.gap); - - this._registerReplacements(renderer); - if(this.settings.forceSingle) { - renderer.forceSingle(true); - } - - hiddenContainer = document.createElement("div"); - hiddenContainer.style.visibility = "hidden"; - hiddenContainer.style.overflow = "hidden"; - hiddenContainer.style.width = "0"; - hiddenContainer.style.height = "0"; - this.element.appendChild(hiddenContainer); - - hiddenEl = document.createElement("div"); - hiddenEl.style.visibility = "hidden"; - hiddenEl.style.overflow = "hidden"; - hiddenEl.style.width = width + "px";//"0"; - hiddenEl.style.height = height +"px"; //"0"; - hiddenContainer.appendChild(hiddenEl); - - renderer.initialize(hiddenEl); - return hiddenContainer; -}; - -// Generates the pageList array by loading every chapter and paging through them -EPUBJS.Book.prototype.generatePageList = function(width, height){ - var pageList = []; - var pager = new EPUBJS.Renderer(this.settings.render_method, false); //hidden - var hiddenContainer = this.createHiddenRender(pager, width, height); - var deferred = new RSVP.defer(); - var spinePos = -1; - var spineLength = this.spine.length; - var totalPages = 0; - var currentPage = 0; - var nextChapter = function(deferred){ - var chapter; - var next = spinePos + 1; - var done = deferred || new RSVP.defer(); - var loaded; - if(next >= spineLength) { - done.resolve(); - } else { - spinePos = next; - chapter = new EPUBJS.Chapter(this.spine[spinePos], this.store); - pager.displayChapter(chapter, this.globalLayoutProperties).then(function(chap){ - pager.pageMap.forEach(function(item){ - currentPage += 1; - pageList.push({ - "cfi" : item.start, - "page" : currentPage - }); - - }); - - if(pager.pageMap.length % 2 > 0 && - pager.spreads) { - currentPage += 1; // Handle Spreads - pageList.push({ - "cfi" : pager.pageMap[pager.pageMap.length - 1].end, - "page" : currentPage - }); - } - - // Load up the next chapter - setTimeout(function(){ - nextChapter(done); - }, 1); - }); - } - return done.promise; - }.bind(this); - - var finished = nextChapter().then(function(){ - pager.remove(); - this.element.removeChild(hiddenContainer); - deferred.resolve(pageList); - }.bind(this)); - - return deferred.promise; -}; - -// Render out entire book and generate the pagination -// Width and Height are optional and will default to the current dimensions -EPUBJS.Book.prototype.generatePagination = function(width, height) { - var book = this; - var defered = new RSVP.defer(); - - this.ready.spine.promise.then(function(){ - book.generatePageList(width, height).then(function(pageList){ - book.pageList = book.contents.pageList = pageList; - book.pagination.process(pageList); - book.ready.pageList.resolve(book.pageList); - defered.resolve(book.pageList); - }); - }); - - return defered.promise; -}; - -// Process the pagination from a JSON array containing the pagelist -EPUBJS.Book.prototype.loadPagination = function(pagelistJSON) { - var pageList = JSON.parse(pagelistJSON); - - if(pageList && pageList.length) { - this.pageList = pageList; - this.pagination.process(this.pageList); - this.ready.pageList.resolve(this.pageList); - } - return this.pageList; -}; - -EPUBJS.Book.prototype.getPageList = function() { - return this.ready.pageList.promise; -}; - -EPUBJS.Book.prototype.getMetadata = function() { - return this.ready.metadata.promise; -}; - -EPUBJS.Book.prototype.getToc = function() { - return this.ready.toc.promise; -}; - -/* Private Helpers */ - -//-- Listeners for browser events -EPUBJS.Book.prototype.networkListeners = function(){ - var book = this; - window.addEventListener("offline", function(e) { - book.online = false; - if (book.settings.storage) { - book.fromStorage(true); - } - book.trigger("book:offline"); - }, false); - - window.addEventListener("online", function(e) { - book.online = true; - if (book.settings.storage) { - book.fromStorage(false); - } - book.trigger("book:online"); - }, false); - -}; - -// Listen to all events the renderer triggers and pass them as book events -EPUBJS.Book.prototype.listenToRenderer = function(renderer){ - var book = this; - renderer.Events.forEach(function(eventName){ - renderer.on(eventName, function(e){ - book.trigger(eventName, e); - }); - }); - - renderer.on("renderer:visibleRangeChanged", function(range) { - var startPage, endPage, percent; - var pageRange = []; - - if(this.pageList.length > 0) { - startPage = this.pagination.pageFromCfi(range.start); - percent = this.pagination.percentageFromPage(startPage); - pageRange.push(startPage); - - if(range.end) { - endPage = this.pagination.pageFromCfi(range.end); - //if(startPage != endPage) { - pageRange.push(endPage); - //} - } - this.trigger("book:pageChanged", { - "anchorPage": startPage, - "percentage": percent, - "pageRange" : pageRange - }); - - // TODO: Add event for first and last page. - // (though last is going to be hard, since it could be several reflowed pages long) - } - }.bind(this)); - - renderer.on("render:loaded", this.loadChange.bind(this)); -}; - -// Listens for load events from the Renderer and checks against the current chapter -// Prevents the Render from loading a different chapter when back button is pressed -EPUBJS.Book.prototype.loadChange = function(url){ - var uri = EPUBJS.core.uri(url); - var chapter; - - if(this.currentChapter) { - chapter = EPUBJS.core.uri(this.currentChapter.absolute); - } - - if(!this._rendering && this.currentChapter && uri.path != chapter.path){ - console.warn("Miss Match", uri.path, this.currentChapter.absolute); - this.goto(uri.filename); - } -}; - -EPUBJS.Book.prototype.unlistenToRenderer = function(renderer){ - renderer.Events.forEach(function(eventName){ - renderer.off(eventName); - } ); -}; - -//-- Choose between a request from store or a request from network -EPUBJS.Book.prototype.loadXml = function(url){ - if(this.settings.fromStorage) { - return this.store.getXml(url, this.settings.encoding); - } else if(this.settings.contained) { - return this.zip.getXml(url, this.settings.encoding); - }else{ - return EPUBJS.core.request(url, 'xml', this.settings.withCredentials); - } -}; - -//-- Turns a url into a absolute url -EPUBJS.Book.prototype.urlFrom = function(bookPath){ - var uri = EPUBJS.core.uri(bookPath), - absolute = uri.protocol, - fromRoot = uri.path[0] == "/", - location = window.location, - //-- Get URL orgin, try for native or combine - origin = location.origin || location.protocol + "//" + location.host, - baseTag = document.getElementsByTagName('base'), - base; - - - //-- Check is Base tag is set - - if(baseTag.length) { - base = baseTag[0].href; - } - - //-- 1. Check if url is absolute - if(uri.protocol){ - return uri.origin + uri.path; - } - - //-- 2. Check if url starts with /, add base url - if(!absolute && fromRoot){ - return (base || origin) + uri.path; - } - - //-- 3. Or find full path to url and add that - if(!absolute && !fromRoot){ - return EPUBJS.core.resolveUrl(base || location.pathname, uri.path); - } - -}; - - -EPUBJS.Book.prototype.unarchive = function(bookPath){ - var book = this, - unarchived; - - //-- Must use storage - // if(this.settings.storage == false ){ - // this.settings.storage = true; - // this.storage = new fileStorage.storage(); - // } - - this.zip = new EPUBJS.Unarchiver(); - this.store = this.zip; // Use zip storaged in ram - return this.zip.open(bookPath); -}; - -//-- Checks if url has a .epub or .zip extension -EPUBJS.Book.prototype.isContained = function(bookUrl){ - var uri = EPUBJS.core.uri(bookUrl); - - if(uri.extension && (uri.extension == "epub" || uri.extension == "zip")){ - return true; - } - - return false; -}; - -//-- Checks if the book can be retrieved from localStorage -EPUBJS.Book.prototype.isSaved = function(bookKey) { - var storedSettings; - - if(!localStorage) { - return false; - } - - storedSettings = localStorage.getItem(bookKey); - - if( !localStorage || - storedSettings === null) { - return false; - } else { - return true; - } -}; - -// Generates the Book Key using the identifer in the manifest or other string provided -EPUBJS.Book.prototype.generateBookKey = function(identifier){ - return "epubjs:" + EPUBJS.VERSION + ":" + window.location.host + ":" + identifier; -}; - -EPUBJS.Book.prototype.saveContents = function(){ - if(!localStorage) { - return false; - } - localStorage.setItem(this.settings.bookKey, JSON.stringify(this.contents)); -}; - -EPUBJS.Book.prototype.removeSavedContents = function() { - if(!localStorage) { - return false; - } - localStorage.removeItem(this.settings.bookKey); -}; - - - -//-- Takes a string or a element -EPUBJS.Book.prototype.renderTo = function(elem){ - var book = this, - rendered; - - if(_.isElement(elem)) { - this.element = elem; - } else if (typeof elem == "string") { - this.element = EPUBJS.core.getEl(elem); - } else { - console.error("Not an Element"); - return; - } - - rendered = this.opened. - then(function(){ - // book.render = new EPUBJS.Renderer[this.settings.renderer](book); - book.renderer.initialize(book.element, book.settings.width, book.settings.height); - - if(book.metadata.direction) { - book.renderer.setDirection(book.metadata.direction); - } - - book._rendered(); - return book.startDisplay(); - }); - - // rendered.then(null, function(error) { console.error(error); }); - - return rendered; -}; - -EPUBJS.Book.prototype.startDisplay = function(){ - var display; - - if(this.settings.goto) { - display = this.goto(this.settings.goto); - }else if(this.settings.previousLocationCfi) { - display = this.gotoCfi(this.settings.previousLocationCfi); - }else{ - display = this.displayChapter(this.spinePos); - } - - return display; -}; - -EPUBJS.Book.prototype.restore = function(identifier){ - - var book = this, - fetch = ['manifest', 'spine', 'metadata', 'cover', 'toc', 'spineNodeIndex', 'spineIndexByURL', 'globalLayoutProperties'], - reject = false, - bookKey = this.generateBookKey(identifier), - fromStore = localStorage.getItem(bookKey), - len = fetch.length, - i; - - if(this.settings.clearSaved) reject = true; - - if(!reject && fromStore != 'undefined' && fromStore !== null){ - book.contents = JSON.parse(fromStore); - - for(i = 0; i < len; i++) { - var item = fetch[i]; - - if(!book.contents[item]) { - reject = true; - break; - } - book[item] = book.contents[item]; - } - } - - if(reject || !fromStore || !this.contents || !this.settings.contentsPath){ - return false; - }else{ - this.settings.bookKey = bookKey; - this.ready.manifest.resolve(this.manifest); - this.ready.spine.resolve(this.spine); - this.ready.metadata.resolve(this.metadata); - this.ready.cover.resolve(this.cover); - this.ready.toc.resolve(this.toc); - return true; - } - -}; - -EPUBJS.Book.prototype.displayChapter = function(chap, end, deferred){ - var book = this, - render, - cfi, - pos, - store, - defer = deferred || new RSVP.defer(); - - var chapter; - - if(!this.isRendered) { - this._q.enqueue("displayChapter", arguments); - // Reject for now. TODO: pass promise to queue - defer.reject({ - message : "Rendering", - stack : new Error().stack - }); - return defer.promise; - } - - - if(this._rendering || this._rendering) { - // Pass along the current defer - this._displayQ.enqueue("displayChapter", [chap, end, defer]); - return defer.promise; - } - - if(_.isNumber(chap)){ - pos = chap; - }else{ - cfi = new EPUBJS.EpubCFI(chap); - pos = cfi.spinePos; - } - - if(pos < 0 || pos >= this.spine.length){ - console.warn("Not A Valid Location"); - pos = 0; - end = false; - cfi = false; - } - - //-- Create a new chapter - chapter = new EPUBJS.Chapter(this.spine[pos], this.store); - - this._rendering = true; - - if(this._needsAssetReplacement()) { - - chapter.registerHook("beforeChapterRender", [ - EPUBJS.replace.head, - EPUBJS.replace.resources, - EPUBJS.replace.svg - ], true); - - } - - render = book.renderer.displayChapter(chapter, this.globalLayoutProperties); - if(cfi) { - book.renderer.gotoCfi(cfi); - } else if(end) { - book.renderer.lastPage(); - } - //-- Success, Clear render queue - render.then(function(rendered){ - // var inwait; - //-- Set the book's spine position - book.spinePos = pos; - - defer.resolve(book.renderer); - - if(book.settings.fromStorage === false && - book.settings.contained === false) { - book.preloadNextChapter(); - } - - book.currentChapter = chapter; - book._rendering = false; - book._displayQ.dequeue(); - if(book._displayQ.length() === 0) { - book._gotoQ.dequeue(); - } - - }, function(error) { - // handle errors in either of the two requests - console.error("Could not load Chapter: "+ chapter.absolute, error); - book.trigger("book:chapterLoadFailed", chapter.absolute); - book._rendering = false; - defer.reject(error); - }); - - return defer.promise; -}; - -EPUBJS.Book.prototype.nextPage = function(){ - var next; - - if(!this.isRendered) return this._q.enqueue("nextPage", arguments); - - next = this.renderer.nextPage(); - - if(!next){ - return this.nextChapter(); - } -}; - -EPUBJS.Book.prototype.prevPage = function() { - var prev; - - if(!this.isRendered) return this._q.enqueue("prevPage", arguments); - - prev = this.renderer.prevPage(); - - if(!prev){ - return this.prevChapter(); - } -}; - -EPUBJS.Book.prototype.nextChapter = function() { - var next; - if (this.spinePos < this.spine.length - 1) { - next = this.spinePos + 1; - // Skip non linear chapters - while (this.spine[next] && this.spine[next].linear && this.spine[next].linear == 'no') { - next++; - } - if (next < this.spine.length) { - return this.displayChapter(next); - } else { - this.trigger("book:atEnd"); - } - - } else { - this.trigger("book:atEnd"); - } -}; - -EPUBJS.Book.prototype.prevChapter = function() { - var prev; - if (this.spinePos > 0) { - prev = this.spinePos - 1; - while (this.spine[prev] && this.spine[prev].linear && this.spine[prev].linear == 'no') { - prev--; - } - if (prev >= 0) { - return this.displayChapter(prev, true); - } else { - this.trigger("book:atStart"); - } - - } else { - this.trigger("book:atStart"); - } -}; - -EPUBJS.Book.prototype.getCurrentLocationCfi = function() { - if(!this.isRendered) return false; - return this.renderer.currentLocationCfi; -}; - -EPUBJS.Book.prototype.goto = function(target){ - - if(target.indexOf("epubcfi(") === 0) { - return this.gotoCfi(target); - } else if(target.indexOf("%") === target.length-1) { - return this.gotoPercentage(parseInt(target.substring(0, target.length-1))/100); - } else if(typeof target === "number" || isNaN(target) === false){ - return this.gotoPage(target); - } else { - return this.gotoHref(target); - } - -}; - -EPUBJS.Book.prototype.gotoCfi = function(cfiString, defer){ - var cfi, - spinePos, - spineItem, - rendered, - deferred = defer || new RSVP.defer(); - - if(!this.isRendered) { - console.warn("Not yet Rendered"); - this.settings.previousLocationCfi = cfiString; - return false; - } - - // Currently going to a chapter - if(this._moving || this._rendering) { - console.warn("Renderer is moving"); - this._gotoQ.enqueue("gotoCfi", [cfiString, deferred]); - return false; - } - - cfi = new EPUBJS.EpubCFI(cfiString); - spinePos = cfi.spinePos; - - if(spinePos == -1) { - return false; - } - - spineItem = this.spine[spinePos]; - promise = deferred.promise; - this._moving = true; - //-- If same chapter only stay on current chapter - if(this.currentChapter && this.spinePos === spinePos){ - this.renderer.gotoCfi(cfi); - this._moving = false; - deferred.resolve(this.renderer.currentLocationCfi); - } else { - - if(!spineItem || spinePos == -1) { - spinePos = 0; - spineItem = this.spine[spinePos]; - } - - this.currentChapter = new EPUBJS.Chapter(spineItem, this.store); - - if(this.currentChapter) { - this.spinePos = spinePos; - render = this.renderer.displayChapter(this.currentChapter, this.globalLayoutProperties); - - this.renderer.gotoCfi(cfi); - render.then(function(rendered){ - this._moving = false; - deferred.resolve(rendered.currentLocationCfi); - }.bind(this)); - } - } - - promise.then(function(){ - this._gotoQ.dequeue(); - }.bind(this)); - - return promise; -}; - -EPUBJS.Book.prototype.gotoHref = function(url, defer){ - var split, chapter, section, relativeURL, spinePos; - var deferred = defer || new RSVP.defer(); - - if(!this.isRendered) { - this.settings.goto = url; - return false; - } - - // Currently going to a chapter - if(this._moving || this._rendering) { - this._gotoQ.enqueue("gotoHref", [url, deferred]); - return false; - } - - split = url.split("#"); - chapter = split[0]; - section = split[1] || false; - // absoluteURL = (chapter.search("://") === -1) ? (this.settings.contentsPath + chapter) : chapter; - relativeURL = chapter.replace(this.settings.contentsPath, ''); - spinePos = this.spineIndexByURL[relativeURL]; - - //-- If link fragment only stay on current chapter - if(!chapter){ - spinePos = this.currentChapter ? this.currentChapter.spinePos : 0; - } - - //-- Check that URL is present in the index, or stop - if(typeof(spinePos) != "number") return false; - - if(!this.currentChapter || spinePos != this.currentChapter.spinePos){ - //-- Load new chapter if different than current - return this.displayChapter(spinePos).then(function(){ - if(section){ - this.renderer.section(section); - } - deferred.resolve(this.renderer.currentLocationCfi); - }.bind(this)); - }else{ - //-- Goto section - if(section) { - this.renderer.section(section); - } else { - // Or jump to the start - this.renderer.firstPage(); - } - deferred.resolve(this.renderer.currentLocationCfi); - } - - deferred.promise.then(function(){ - this._gotoQ.dequeue(); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Book.prototype.gotoPage = function(pg){ - var cfi = this.pagination.cfiFromPage(pg); - return this.gotoCfi(cfi); -}; - -EPUBJS.Book.prototype.gotoPercentage = function(percent){ - var pg = this.pagination.pageFromPercentage(percent); - return this.gotoPage(pg); -}; - -EPUBJS.Book.prototype.preloadNextChapter = function() { - var next; - var chap = this.spinePos + 1; - - if(chap >= this.spine.length){ - return false; - } - - next = new EPUBJS.Chapter(this.spine[chap]); - if(next) { - EPUBJS.core.request(next.absolute); - } -}; - -EPUBJS.Book.prototype.storeOffline = function() { - var book = this, - assets = _.values(this.manifest); - - //-- Creates a queue of all items to load - return this.store.put(assets). - then(function(){ - book.settings.stored = true; - book.trigger("book:stored"); - }); -}; - -EPUBJS.Book.prototype.availableOffline = function() { - return this.settings.stored > 0 ? true : false; -}; - -EPUBJS.Book.prototype.toStorage = function () { - var key = this.settings.bookKey; - this.store.isStored(key).then(function(stored) { - - if (stored === true) { - this.settings.stored = true; - return true; - } - - return this.storeOffline() - .then(function() { - this.store.token(key, true); - }.bind(this)); - - }.bind(this)); - -}; -EPUBJS.Book.prototype.fromStorage = function(stored) { - var hooks = [ - EPUBJS.replace.head, - EPUBJS.replace.resources, - EPUBJS.replace.svg - ]; - - if(this.contained || this.settings.contained) return; - - //-- If there is network connection, store the books contents - if(this.online){ - this.opened.then(this.toStorage.bind(this)); - } - - if(this.store && this.settings.fromStorage && stored === false){ - this.settings.fromStorage = false; - this.store.off("offline"); - // this.renderer.removeHook("beforeChapterRender", hooks, true); - this.store = false; - }else if(!this.settings.fromStorage){ - - this.store = new EPUBJS.Storage(this.settings.credentials); - this.store.on("offline", function (offline) { - if (!offline) { - // Online - this.offline = false; - this.settings.fromStorage = false; - // this.renderer.removeHook("beforeChapterRender", hooks, true); - this.trigger("book:online"); - } else { - // Offline - this.offline = true; - this.settings.fromStorage = true; - // this.renderer.registerHook("beforeChapterRender", hooks, true); - this.trigger("book:offline"); - } - }.bind(this)); - - } - -}; - -EPUBJS.Book.prototype.setStyle = function(style, val, prefixed) { - var noreflow = ["color", "background", "background-color"]; - - if(!this.isRendered) return this._q.enqueue("setStyle", arguments); - - this.settings.styles[style] = val; - - this.renderer.setStyle(style, val, prefixed); - - if(noreflow.indexOf(style) === -1) { - // clearTimeout(this.reformatTimeout); - // this.reformatTimeout = setTimeout(function(){ - this.renderer.reformat(); - // }.bind(this), 10); - } -}; - -EPUBJS.Book.prototype.removeStyle = function(style) { - if(!this.isRendered) return this._q.enqueue("removeStyle", arguments); - this.renderer.removeStyle(style); - this.renderer.reformat(); - delete this.settings.styles[style]; -}; - -EPUBJS.Book.prototype.addHeadTag = function(tag, attrs) { - if(!this.isRendered) return this._q.enqueue("addHeadTag", arguments); - this.settings.headTags[tag] = attrs; -}; - -EPUBJS.Book.prototype.useSpreads = function(use) { - console.warn("useSpreads is deprecated, use forceSingle or set a layoutOveride instead"); - if(use === false) { - this.forceSingle(true); - } else { - this.forceSingle(false); - } -}; - -EPUBJS.Book.prototype.forceSingle = function(_use) { - var force = typeof _use === "undefined" ? true : _use; - - this.renderer.forceSingle(force); - this.settings.forceSingle = force; - if(this.isRendered) { - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.setMinSpreadWidth = function(width) { - this.settings.minSpreadWidth = width; - if(this.isRendered) { - this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.setGap = function(gap) { - this.settings.gap = gap; - if(this.isRendered) { - this.renderer.setGap(this.settings.gap); - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.chapter = function(path) { - var spinePos = this.spineIndexByURL[path]; - var spineItem; - var chapter; - - if(spinePos){ - spineItem = this.spine[spinePos]; - chapter = new EPUBJS.Chapter(spineItem, this.store); - chapter.load(); - } - return chapter; -}; - -EPUBJS.Book.prototype.unload = function(){ - - if(this.settings.restore && localStorage) { - this.saveContents(); - } - - this.unlistenToRenderer(this.renderer); - - this.trigger("book:unload"); -}; - -EPUBJS.Book.prototype.destroy = function() { - - window.removeEventListener("beforeunload", this.unload); - - if(this.currentChapter) this.currentChapter.unload(); - - this.unload(); - - if(this.renderer) this.renderer.remove(); - -}; - -EPUBJS.Book.prototype._ready = function() { - - this.trigger("book:ready"); - -}; - -EPUBJS.Book.prototype._rendered = function(err) { - var book = this; - - this.isRendered = true; - this.trigger("book:rendered"); - - this._q.flush(); -}; - - -EPUBJS.Book.prototype.applyStyles = function(renderer, callback){ - // if(!this.isRendered) return this._q.enqueue("applyStyles", arguments); - renderer.applyStyles(this.settings.styles); - callback(); -}; - -EPUBJS.Book.prototype.applyHeadTags = function(renderer, callback){ - // if(!this.isRendered) return this._q.enqueue("applyHeadTags", arguments); - renderer.applyHeadTags(this.settings.headTags); - callback(); -}; - -EPUBJS.Book.prototype._registerReplacements = function(renderer){ - renderer.registerHook("beforeChapterDisplay", this.applyStyles.bind(this, renderer), true); - renderer.registerHook("beforeChapterDisplay", this.applyHeadTags.bind(this, renderer), true); - renderer.registerHook("beforeChapterDisplay", EPUBJS.replace.hrefs.bind(this), true); -}; - -EPUBJS.Book.prototype._needsAssetReplacement = function(){ - if(this.settings.fromStorage) { - - //-- Filesystem api links are relative, so no need to replace them - // if(this.storage.getStorageType() == "filesystem") { - // return false; - // } - - return true; - - } else if(this.settings.contained) { - - return true; - - } else { - - return false; - - } -}; - - -//-- http://www.idpf.org/epub/fxl/ -EPUBJS.Book.prototype.parseLayoutProperties = function(metadata){ - var layout = (this.layoutOveride && this.layoutOveride.layout) || metadata.layout || "reflowable"; - var spread = (this.layoutOveride && this.layoutOveride.spread) || metadata.spread || "auto"; - var orientation = (this.layoutOveride && this.layoutOveride.orientation) || metadata.orientation || "auto"; - return { - layout : layout, - spread : spread, - orientation : orientation - }; -}; - -//-- Enable binding events to book -RSVP.EventTarget.mixin(EPUBJS.Book.prototype); - -//-- Handle RSVP Errors -RSVP.on('error', function(event) { - //console.error(event, event.detail); -}); - -RSVP.configure('instrument', false); //-- true | will logging out all RSVP rejections -// RSVP.on('created', listener); -// RSVP.on('chained', listener); -// RSVP.on('fulfilled', listener); -// RSVP.on('rejected', function(event){ -// console.error(event.detail.message, event.detail.stack); -// }); - -EPUBJS.Chapter = function(spineObject, store){ - this.href = spineObject.href; - this.absolute = spineObject.url; - this.id = spineObject.id; - this.spinePos = spineObject.index; - this.cfiBase = spineObject.cfiBase; - this.properties = spineObject.properties; - this.manifestProperties = spineObject.manifestProperties; - this.linear = spineObject.linear; - this.pages = 1; - this.store = store; - this.epubcfi = new EPUBJS.EpubCFI(); - this.deferred = new RSVP.defer(); - this.loaded = this.deferred.promise; - - EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - this.getHooks("beforeChapterRender"); - - // Cached for replacement urls from storage - this.caches = {}; -}; - - -EPUBJS.Chapter.prototype.load = function(_store){ - var store = _store || this.store; - var promise; - // if(this.store && (!this.book.online || this.book.contained)) - if(store){ - promise = store.getXml(this.absolute); - }else{ - promise = EPUBJS.core.request(this.absolute, 'xml'); - } - - promise.then(function(xml){ - this.setDocument(xml); - this.deferred.resolve(this); - }.bind(this)); - - return promise; -}; - -EPUBJS.Chapter.prototype.render = function(_store){ - - return this.load().then(function(doc){ - - var head = doc.querySelector('head'); - var base = doc.createElement("base"); - - base.setAttribute("href", this.absolute); - head.insertBefore(base, head.firstChild); - - this.contents = doc; - - return new RSVP.Promise(function (resolve, reject) { - this.triggerHooks("beforeChapterRender", function () { - resolve(doc); - }.bind(this), this); - }.bind(this)); - - }.bind(this)) - .then(function(doc) { - var serializer = new XMLSerializer(); - var contents = serializer.serializeToString(doc); - return contents; - }.bind(this)); -}; - -EPUBJS.Chapter.prototype.url = function(_store){ - var deferred = new RSVP.defer(); - var store = _store || this.store; - var loaded; - var chapter = this; - var url; - - if(store){ - if(!this.tempUrl) { - store.getUrl(this.absolute).then(function(url){ - chapter.tempUrl = url; - deferred.resolve(url); - }); - } else { - url = this.tempUrl; - deferred.resolve(url); - } - }else{ - url = this.absolute; - deferred.resolve(url); - } - /* - loaded = EPUBJS.core.request(url, 'xml', false); - loaded.then(function(contents){ - chapter.contents = contents; - deferred.resolve(chapter.absolute); - }, function(error){ - deferred.reject(error); - }); - */ - - return deferred.promise; -}; - -EPUBJS.Chapter.prototype.setPages = function(num){ - this.pages = num; -}; - -EPUBJS.Chapter.prototype.getPages = function(num){ - return this.pages; -}; - -EPUBJS.Chapter.prototype.getID = function(){ - return this.ID; -}; - -EPUBJS.Chapter.prototype.unload = function(store){ - this.document = null; - if(this.tempUrl && store) { - store.revokeUrl(this.tempUrl); - this.tempUrl = false; - } -}; - -EPUBJS.Chapter.prototype.setDocument = function(_document){ - var uri = _document.namespaceURI; - var doctype = _document.doctype; - - // Creates an empty document - this.document = _document.implementation.createDocument( - uri, - null, - null - ); - this.contents = this.document.importNode( - _document.documentElement, //node to import - true //clone its descendants - ); - - this.document.appendChild(this.contents); - - // Fix to apply wgxpath to new document in IE - if(!this.document.evaluate && document.evaluate) { - this.document.evaluate = document.evaluate; - } - - // this.deferred.resolve(this.contents); -}; - -EPUBJS.Chapter.prototype.cfiFromRange = function(_range) { - var range; - var startXpath, endXpath; - var startContainer, endContainer; - var cleanTextContent, cleanEndTextContent; - - // Check for Contents - if(!this.document) return; - - if(typeof document.evaluate != 'undefined') { - - startXpath = EPUBJS.core.getElementXPath(_range.startContainer); - // console.log(startContainer) - endXpath = EPUBJS.core.getElementXPath(_range.endContainer); - - startContainer = this.document.evaluate(startXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(!_range.collapsed) { - endContainer = this.document.evaluate(endXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - } - - range = this.document.createRange(); - // Find Exact Range in original document - if(startContainer) { - try { - range.setStart(startContainer, _range.startOffset); - if(!_range.collapsed && endContainer) { - range.setEnd(endContainer, _range.endOffset); - } - } catch (e) { - console.log("missed"); - startContainer = false; - } - - } - - // Fuzzy Match - if(!startContainer) { - console.log("not found, try fuzzy match"); - cleanStartTextContent = EPUBJS.core.cleanStringForXpath(_range.startContainer.textContent); - startXpath = "//text()[contains(.," + cleanStartTextContent + ")]"; - - startContainer = this.document.evaluate(startXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(startContainer){ - // console.log("Found with Fuzzy"); - range.setStart(startContainer, _range.startOffset); - - if(!_range.collapsed) { - cleanEndTextContent = EPUBJS.core.cleanStringForXpath(_range.endContainer.textContent); - endXpath = "//text()[contains(.," + cleanEndTextContent + ")]"; - endContainer = this.document.evaluate(endXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - if(endContainer) { - range.setEnd(endContainer, _range.endOffset); - } - } - - } - } - } else { - range = _range; // Just evaluate the current documents range - } - - // Generate the Cfi - return this.epubcfi.generateCfiFromRange(range, this.cfiBase); -}; - -EPUBJS.Chapter.prototype.find = function(_query){ - var chapter = this; - var matches = []; - var query = _query.toLowerCase(); - //var xpath = this.document.evaluate(".//text()[contains(translate(., '"+query.toUpperCase()+"', '"+query+"'),'"+query+"')]", this.document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - var find = function(node){ - // Search String - var text = node.textContent.toLowerCase(); - var range = chapter.document.createRange(); - var cfi; - var pos; - var last = -1; - var excerpt; - var limit = 150; - - while (pos != -1) { - pos = text.indexOf(query, last + 1); - - if(pos != -1) { - // If Found, Create Range - range = chapter.document.createRange(); - range.setStart(node, pos); - range.setEnd(node, pos + query.length); - - //Generate CFI - cfi = chapter.cfiFromRange(range); - - // Generate Excerpt - if(node.textContent.length < limit) { - excerpt = node.textContent; - } else { - excerpt = node.textContent.substring(pos-limit/2,pos+limit/2); - excerpt = "..." + excerpt + "..."; - } - - //Add CFI to list - matches.push({ - cfi: cfi, - excerpt: excerpt - }); - } - - last = pos; - } - - }; - - // Grab text nodes - - /* - for ( var i=0 ; i < xpath.snapshotLength; i++ ) { - find(xpath.snapshotItem(i)); - } - */ - - this.textSprint(this.document, function(node){ - find(node); - }); - - - // Return List of CFIs - return matches; -}; - - -EPUBJS.Chapter.prototype.textSprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: function (node) { - if (node.data && ! /^\s*$/.test(node.data) ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - } - }, false); - var node; - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Chapter.prototype.replace = function(query, func, finished, progress){ - var items = this.contents.querySelectorAll(query), - resources = Array.prototype.slice.call(items), - count = resources.length; - - - if(count === 0) { - finished(false); - return; - } - resources.forEach(function(item){ - var called = false; - var after = function(result, full){ - if(called === false) { - count--; - if(progress) progress(result, full, count); - if(count <= 0 && finished) finished(true); - called = true; - } - }; - - func(item, after); - - }.bind(this)); - -}; - -EPUBJS.Chapter.prototype.replaceWithStored = function(query, attr, func, callback) { - var _oldUrls, - _newUrls = {}, - _store = this.store, - _cache = this.caches[query], - _uri = EPUBJS.core.uri(this.absolute), - _chapterBase = _uri.base, - _attr = attr, - _wait = 5, - progress = function(url, full, count) { - _newUrls[full] = url; - }, - finished = function(notempty) { - if(callback) callback(); - - _.each(_oldUrls, function(url){ - _store.revokeUrl(url); - }); - - _cache = _newUrls; - }; - - if(!_store) return; - - if(!_cache) _cache = {}; - _oldUrls = _.clone(_cache); - - this.replace(query, function(link, done){ - var src = link.getAttribute(_attr), - full = EPUBJS.core.resolveUrl(_chapterBase, src); - - var replaceUrl = function(url) { - var timeout; - link.onload = function(){ - clearTimeout(timeout); - done(url, full); - }; - - link.onerror = function(e){ - clearTimeout(timeout); - done(url, full); - console.error(e); - }; - - if(query == "image") { - //-- SVG needs this to trigger a load event - link.setAttribute("externalResourcesRequired", "true"); - } - - if(query == "link[href]" && link.getAttribute("rel") !== "stylesheet") { - //-- Only Stylesheet links seem to have a load events, just continue others - done(url, full); - } else { - timeout = setTimeout(function(){ - done(url, full); - }, _wait); - } - - link.setAttribute(_attr, url); - - - - }; - - if(full in _oldUrls){ - replaceUrl(_oldUrls[full]); - _newUrls[full] = _oldUrls[full]; - delete _oldUrls[full]; - }else{ - func(_store, full, replaceUrl, link); - } - - }, finished, progress); -}; - -var EPUBJS = EPUBJS || {}; -EPUBJS.core = {}; - -//-- Get a element for an id -EPUBJS.core.getEl = function(elem) { - return document.getElementById(elem); -}; - -//-- Get all elements for a class -EPUBJS.core.getEls = function(classes) { - return document.getElementsByClassName(classes); -}; - -EPUBJS.core.request = function(url, type, withCredentials) { - var supportsURL = window.URL; - var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; - - var deferred = new RSVP.defer(); - - var xhr = new XMLHttpRequest(); - - //-- Check from PDF.js: - // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js - var xhrPrototype = XMLHttpRequest.prototype; - - if (!('overrideMimeType' in xhrPrototype)) { - // IE10 might have response, but not overrideMimeType - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if(withCredentials) { - xhr.withCredentials = true; - } - xhr.open("GET", url, true); - xhr.onreadystatechange = handler; - - if(type == 'blob'){ - xhr.responseType = BLOB_RESPONSE; - } - - if(type == "json") { - xhr.setRequestHeader("Accept", "application/json"); - } - - if(type == 'xml') { - xhr.overrideMimeType('text/xml'); - } - - if(type == "binary") { - xhr.responseType = "arraybuffer"; - } - - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { // || this.responseXML-- Firefox is reporting 0 for blob urls - var r; - - if(type == 'xml'){ - r = this.responseXML; - }else - if(type == 'json'){ - r = JSON.parse(this.response); - }else - if(type == 'blob'){ - - if(supportsURL) { - r = this.response; - } else { - //-- Safari doesn't support responseType blob, so create a blob from arraybuffer - r = new Blob([this.response]); - } - - }else{ - r = this.response; - } - - deferred.resolve(r); - } else { - deferred.reject({ - message : this.response, - stack : new Error().stack - }); - } - } - } - - return deferred.promise; -}; - -EPUBJS.core.toArray = function(obj) { - var arr = []; - - for (var member in obj) { - var newitm; - if ( obj.hasOwnProperty(member) ) { - newitm = obj[member]; - newitm.ident = member; - arr.push(newitm); - } - } - - return arr; -}; - -//-- Parse the different parts of a url, returning a object -EPUBJS.core.uri = function(url){ - var uri = { - protocol : '', - host : '', - path : '', - origin : '', - directory : '', - base : '', - filename : '', - extension : '', - fragment : '', - href : url - }, - blob = url.indexOf('blob:'), - doubleSlash = url.indexOf('://'), - search = url.indexOf('?'), - fragment = url.indexOf("#"), - withoutProtocol, - dot, - firstSlash; - - if(blob === 0) { - uri.protocol = "blob"; - uri.base = url.indexOf(0, fragment); - return uri; - } - - if(fragment != -1) { - uri.fragment = url.slice(fragment + 1); - url = url.slice(0, fragment); - } - - if(search != -1) { - uri.search = url.slice(search + 1); - url = url.slice(0, search); - href = url; - } - - if(doubleSlash != -1) { - uri.protocol = url.slice(0, doubleSlash); - withoutProtocol = url.slice(doubleSlash+3); - firstSlash = withoutProtocol.indexOf('/'); - - if(firstSlash === -1) { - uri.host = uri.path; - uri.path = ""; - } else { - uri.host = withoutProtocol.slice(0, firstSlash); - uri.path = withoutProtocol.slice(firstSlash); - } - - - uri.origin = uri.protocol + "://" + uri.host; - - uri.directory = EPUBJS.core.folder(uri.path); - - uri.base = uri.origin + uri.directory; - // return origin; - } else { - uri.path = url; - uri.directory = EPUBJS.core.folder(url); - uri.base = uri.directory; - } - - //-- Filename - uri.filename = url.replace(uri.base, ''); - dot = uri.filename.lastIndexOf('.'); - if(dot != -1) { - uri.extension = uri.filename.slice(dot+1); - } - return uri; -}; - -//-- Parse out the folder, will return everything before the last slash - -EPUBJS.core.folder = function(url){ - - var lastSlash = url.lastIndexOf('/'); - - if(lastSlash == -1) var folder = ''; - - folder = url.slice(0, lastSlash + 1); - - return folder; - -}; - -//-- https://github.com/ebidel/filer.js/blob/master/src/filer.js#L128 -EPUBJS.core.dataURLToBlob = function(dataURL) { - var BASE64_MARKER = ';base64,', - parts, contentType, raw, rawLength, uInt8Array; - - if (dataURL.indexOf(BASE64_MARKER) == -1) { - parts = dataURL.split(','); - contentType = parts[0].split(':')[1]; - raw = parts[1]; - - return new Blob([raw], {type: contentType}); - } - - parts = dataURL.split(BASE64_MARKER); - contentType = parts[0].split(':')[1]; - raw = window.atob(parts[1]); - rawLength = raw.length; - - uInt8Array = new Uint8Array(rawLength); - - for (var i = 0; i < rawLength; ++i) { - uInt8Array[i] = raw.charCodeAt(i); - } - - return new Blob([uInt8Array], {type: contentType}); -}; - -//-- Load scripts async: http://stackoverflow.com/questions/7718935/load-scripts-asynchronously -EPUBJS.core.addScript = function(src, callback, target) { - var s, r; - r = false; - s = document.createElement('script'); - s.type = 'text/javascript'; - s.async = false; - s.src = src; - s.onload = s.onreadystatechange = function() { - if ( !r && (!this.readyState || this.readyState == 'complete') ) { - r = true; - if(callback) callback(); - } - }; - target = target || document.body; - target.appendChild(s); -}; - -EPUBJS.core.addScripts = function(srcArr, callback, target) { - var total = srcArr.length, - curr = 0, - cb = function(){ - curr++; - if(total == curr){ - if(callback) callback(); - }else{ - EPUBJS.core.addScript(srcArr[curr], cb, target); - } - }; - - EPUBJS.core.addScript(srcArr[curr], cb, target); -}; - -EPUBJS.core.addCss = function(src, callback, target) { - var s, r; - r = false; - s = document.createElement('link'); - s.type = 'text/css'; - s.rel = "stylesheet"; - s.href = src; - s.onload = s.onreadystatechange = function() { - if ( !r && (!this.readyState || this.readyState == 'complete') ) { - r = true; - if(callback) callback(); - } - }; - target = target || document.body; - target.appendChild(s); -}; - -EPUBJS.core.prefixed = function(unprefixed) { - var vendors = ["Webkit", "Moz", "O", "ms" ], - prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'], - upper = unprefixed[0].toUpperCase() + unprefixed.slice(1), - length = vendors.length; - - if (typeof(document.body.style[unprefixed]) != 'undefined') { - return unprefixed; - } - - for ( var i=0; i < length; i++ ) { - if (typeof(document.body.style[vendors[i] + upper]) != 'undefined') { - return vendors[i] + upper; - } - } - - return unprefixed; -}; - -EPUBJS.core.resolveUrl = function(base, path) { - var url, - segments = [], - uri = EPUBJS.core.uri(path), - folders = base.split("/"), - paths; - - if(uri.host) { - return path; - } - - folders.pop(); - - paths = path.split("/"); - paths.forEach(function(p){ - if(p === ".."){ - folders.pop(); - }else{ - segments.push(p); - } - }); - - url = folders.concat(segments); - - return url.join("/"); -}; - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -EPUBJS.core.uuid = function() { - var d = new Date().getTime(); - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x7|0x8)).toString(16); - }); - return uuid; -}; - -// Fast quicksort insert for sorted array -- based on: -// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers -EPUBJS.core.insert = function(item, array, compareFunction) { - var location = EPUBJS.core.locationOf(item, array, compareFunction); - array.splice(location, 0, item); - - return location; -}; - -EPUBJS.core.locationOf = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return pivot; - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared > 0 ? pivot : pivot + 1; - } - - if(compared === 0) { - return pivot; - } - if(compared === -1) { - return EPUBJS.core.locationOf(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.locationOf(item, array, compareFunction, start, pivot); - } -}; - -EPUBJS.core.indexOfSorted = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return -1; // Not found - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared === 0 ? pivot : -1; - } - if(compared === 0) { - return pivot; // Found - } - if(compared === -1) { - return EPUBJS.core.indexOfSorted(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.indexOfSorted(item, array, compareFunction, start, pivot); - } -}; - - -EPUBJS.core.queue = function(_scope){ - var _q = []; - var scope = _scope; - // Add an item to the queue - var enqueue = function(funcName, args, context) { - _q.push({ - "funcName" : funcName, - "args" : args, - "context" : context - }); - return _q; - }; - // Run one item - var dequeue = function(){ - var inwait; - if(_q.length) { - inwait = _q.shift(); - // Defer to any current tasks - // setTimeout(function(){ - scope[inwait.funcName].apply(inwait.context || scope, inwait.args); - // }, 0); - } - }; - - // Run All - var flush = function(){ - while(_q.length) { - dequeue(); - } - }; - // Clear all items in wait - var clear = function(){ - _q = []; - }; - - var length = function(){ - return _q.length; - }; - - return { - "enqueue" : enqueue, - "dequeue" : dequeue, - "flush" : flush, - "clear" : clear, - "length" : length - }; -}; - -// From: https://code.google.com/p/fbug/source/browse/branches/firebug1.10/content/firebug/lib/xpath.js -/** - * Gets an XPath for an element which describes its hierarchical location. - */ -EPUBJS.core.getElementXPath = function(element) { - if (element && element.id) { - return '//*[@id="' + element.id + '"]'; - } else { - return EPUBJS.core.getElementTreeXPath(element); - } -}; - -EPUBJS.core.getElementTreeXPath = function(element) { - var paths = []; - var isXhtml = (element.ownerDocument.documentElement.getAttribute('xmlns') === "http://www.w3.org/1999/xhtml"); - var index, nodeName, tagName, pathIndex; - - if(element.nodeType === Node.TEXT_NODE){ - // index = Array.prototype.indexOf.call(element.parentNode.childNodes, element) + 1; - index = EPUBJS.core.indexOfTextNode(element) + 1; - - paths.push("text()["+index+"]"); - element = element.parentNode; - } - - // Use nodeName (instead of localName) so namespace prefix is included (if any). - for (; element && element.nodeType == 1; element = element.parentNode) - { - index = 0; - for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling) - { - // Ignore document type declaration. - if (sibling.nodeType == Node.DOCUMENT_TYPE_NODE) { - continue; - } - if (sibling.nodeName == element.nodeName) { - ++index; - } - } - nodeName = element.nodeName.toLowerCase(); - tagName = (isXhtml ? "xhtml:" + nodeName : nodeName); - pathIndex = (index ? "[" + (index+1) + "]" : ""); - paths.splice(0, 0, tagName + pathIndex); - } - - return paths.length ? "./" + paths.join("/") : null; -}; - -EPUBJS.core.nsResolver = function(prefix) { - var ns = { - 'xhtml' : 'http://www.w3.org/1999/xhtml', - 'epub': 'http://www.idpf.org/2007/ops' - }; - return ns[prefix] || null; -}; - -//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496 -EPUBJS.core.cleanStringForXpath = function(str) { - var parts = str.match(/[^'"]+|['"]/g); - parts = parts.map(function(part){ - if (part === "'") { - return '\"\'\"'; // output "'" - } - - if (part === '"') { - return "\'\"\'"; // output '"' - } - return "\'" + part + "\'"; - }); - return "concat(\'\'," + parts.join(",") + ")"; -}; - -EPUBJS.core.indexOfTextNode = function(textNode){ - var parent = textNode.parentNode; - var children = parent.childNodes; - var sib; - var index = -1; - for (var i = 0; i < children.length; i++) { - sib = children[i]; - if(sib.nodeType === Node.TEXT_NODE){ - index++; - } - if(sib == textNode) break; - } - - return index; -}; -EPUBJS.EpubCFI = function(cfiStr){ - if(cfiStr) return this.parse(cfiStr); -}; - -EPUBJS.EpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) { - var pos = parseInt(_pos), - spineNodeIndex = _spineNodeIndex + 1, - cfi = '/'+spineNodeIndex+'/'; - - cfi += (pos + 1) * 2; - - if(id) cfi += "[" + id + "]"; - - //cfi += "!"; - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.generatePathComponent = function(steps) { - var parts = []; - - steps.forEach(function(part){ - var segment = ''; - segment += (part.index + 1) * 2; - - if(part.id) { - segment += "[" + part.id + "]"; - } - - parts.push(segment); - }); - - return parts.join('/'); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromElement = function(element, chapter) { - var steps = this.pathTo(element); - var path = this.generatePathComponent(steps); - if(!path.length) { - // Start of Chapter - return "epubcfi(" + chapter + "!/4/)"; - } else { - // First Text Node - return "epubcfi(" + chapter + "!" + path + "/1:0)"; - } -}; - -EPUBJS.EpubCFI.prototype.pathTo = function(node) { - var stack = [], - children; - - while(node && node.parentNode !== null && node.parentNode.nodeType != 9) { - children = node.parentNode.children; - - stack.unshift({ - 'id' : node.id, - // 'classList' : node.classList, - 'tagName' : node.tagName, - 'index' : children ? Array.prototype.indexOf.call(children, node) : 0 - }); - - node = node.parentNode; - } - - return stack; -}; - -EPUBJS.EpubCFI.prototype.getChapterComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - - return splitStr[0]; -}; - -EPUBJS.EpubCFI.prototype.getPathComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - var pathComponent = splitStr[1] ? splitStr[1].split(":") : ''; - - return pathComponent[0]; -}; - -EPUBJS.EpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) { - var splitStr = cfiStr.split(":"); - return splitStr[1] || ''; -}; - - -EPUBJS.EpubCFI.prototype.parse = function(cfiStr) { - var cfi = {}, - chapSegment, - chapterComponent, - pathComponent, - charecterOffsetComponent, - assertion, - chapId, - path, - end, - endInt, - text, - parseStep = function(part){ - var type, index, has_brackets, id; - - type = "element"; - index = parseInt(part) / 2 - 1; - has_brackets = part.match(/\[(.*)\]/); - if(has_brackets && has_brackets[1]){ - id = has_brackets[1]; - } - - return { - "type" : type, - 'index' : index, - 'id' : id || false - }; - }; - - if(typeof cfiStr !== "string") { - return {spinePos: -1}; - } - - cfi.str = cfiStr; - - if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { - // Remove intial epubcfi( and ending ) - cfiStr = cfiStr.slice(8, cfiStr.length-1); - } - - chapterComponent = this.getChapterComponent(cfiStr); - pathComponent = this.getPathComponent(cfiStr) || ''; - charecterOffsetComponent = this.getCharecterOffsetComponent(cfiStr); - // Make sure this is a valid cfi or return - if(!chapterComponent) { - return {spinePos: -1}; - } - - // Chapter segment is always the second one - chapSegment = chapterComponent.split("/")[2] || ''; - if(!chapSegment) return {spinePos:-1}; - - cfi.spinePos = (parseInt(chapSegment) / 2 - 1 ) || 0; - - chapId = chapSegment.match(/\[(.*)\]/); - - cfi.spineId = chapId ? chapId[1] : false; - - if(pathComponent.indexOf(',') != -1) { - // Handle ranges -- not supported yet - console.warn("CFI Ranges are not supported"); - } - - path = pathComponent.split('/'); - end = path.pop(); - - cfi.steps = []; - - path.forEach(function(part){ - var step; - - if(part) { - step = parseStep(part); - cfi.steps.push(step); - } - }); - - //-- Check if END is a text node or element - endInt = parseInt(end); - if(!isNaN(endInt)) { - - if(endInt % 2 === 0) { // Even = is an element - cfi.steps.push(parseStep(end)); - } else { - cfi.steps.push({ - "type" : "text", - 'index' : (endInt - 1 ) / 2 - }); - } - - } - - assertion = charecterOffsetComponent.match(/\[(.*)\]/); - if(assertion && assertion[1]){ - cfi.characterOffset = parseInt(charecterOffsetComponent.split('[')[0]); - // We arent handling these assertions yet - cfi.textLocationAssertion = assertion[1]; - } else { - cfi.characterOffset = parseInt(charecterOffsetComponent); - } - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.addMarker = function(cfi, _doc, _marker) { - var doc = _doc || document; - var marker = _marker || this.createMarker(doc); - var parent; - var lastStep; - var text; - var split; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - // Find the CFI elements parent - parent = this.findParent(cfi, doc); - - if(!parent) { - // CFI didn't return an element - // Maybe it isnt in the current chapter? - return false; - } - - if(lastStep && lastStep.type === "text") { - text = parent.childNodes[lastStep.index]; - if(cfi.characterOffset){ - split = text.splitText(cfi.characterOffset); - marker.classList.add("EPUBJS-CFI-SPLIT"); - parent.insertBefore(marker, split); - } else { - parent.insertBefore(marker, text); - } - } else { - parent.insertBefore(marker, parent.firstChild); - } - - return marker; -}; - -EPUBJS.EpubCFI.prototype.createMarker = function(_doc) { - var doc = _doc || document; - var element = doc.createElement('span'); - element.id = "EPUBJS-CFI-MARKER:"+ EPUBJS.core.uuid(); - element.classList.add("EPUBJS-CFI-MARKER"); - - return element; -}; - -EPUBJS.EpubCFI.prototype.removeMarker = function(marker, _doc) { - var doc = _doc || document; - // var id = marker.id; - - // Cleanup textnodes if they were split - if(marker.classList.contains("EPUBJS-CFI-SPLIT")){ - nextSib = marker.nextSibling; - prevSib = marker.previousSibling; - if(nextSib && - prevSib && - nextSib.nodeType === 3 && - prevSib.nodeType === 3){ - - prevSib.textContent += nextSib.textContent; - marker.parentNode.removeChild(nextSib); - } - marker.parentNode.removeChild(marker); - } else if(marker.classList.contains("EPUBJS-CFI-MARKER")) { - // Remove only elements added as markers - marker.parentNode.removeChild(marker); - } - -}; - -EPUBJS.EpubCFI.prototype.findParent = function(cfi, _doc) { - var doc = _doc || document, - element = doc.getElementsByTagName('html')[0], - children = Array.prototype.slice.call(element.children), - num, index, part, sections, - text, textBegin, textEnd; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - sections = cfi.steps.slice(0); // Clone steps array - if(!sections.length) { - return doc.getElementsByTagName('body')[0]; - } - - while(sections && sections.length > 0) { - part = sections.shift(); - // Find textNodes Parent - if(part.type === "text") { - text = element.childNodes[part.index]; - element = text.parentNode || element; - // Find element by id if present - } else if(part.id){ - element = doc.getElementById(part.id); - // Find element in parent - }else{ - element = children[part.index]; - } - // Element can't be found - if(typeof element === "undefined") { - console.error("No Element For", part, cfi.str); - return false; - } - // Get current element children and continue through steps - children = Array.prototype.slice.call(element.children); - } - - return element; -}; - -EPUBJS.EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { - if(typeof cfiOne === 'string') { - cfiOne = new EPUBJS.EpubCFI(cfiOne); - } - if(typeof cfiTwo === 'string') { - cfiTwo = new EPUBJS.EpubCFI(cfiTwo); - } - // Compare Spine Positions - if(cfiOne.spinePos > cfiTwo.spinePos) { - return 1; - } - if(cfiOne.spinePos < cfiTwo.spinePos) { - return -1; - } - - - // Compare Each Step in the First item - for (var i = 0; i < cfiOne.steps.length; i++) { - if(!cfiTwo.steps[i]) { - return 1; - } - if(cfiOne.steps[i].index > cfiTwo.steps[i].index) { - return 1; - } - if(cfiOne.steps[i].index < cfiTwo.steps[i].index) { - return -1; - } - // Otherwise continue checking - } - - // All steps in First present in Second - if(cfiOne.steps.length < cfiTwo.steps.length) { - return -1; - } - - // Compare the charecter offset of the text node - if(cfiOne.characterOffset > cfiTwo.characterOffset) { - return 1; - } - if(cfiOne.characterOffset < cfiTwo.characterOffset) { - return -1; - } - - // CFI's are equal - return 0; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromHref = function(href, book) { - var uri = EPUBJS.core.uri(href); - var path = uri.path; - var fragment = uri.fragment; - var spinePos = book.spineIndexByURL[path]; - var loaded; - var deferred = new RSVP.defer(); - var epubcfi = new EPUBJS.EpubCFI(); - var spineItem; - - if(typeof spinePos !== "undefined"){ - spineItem = book.spine[spinePos]; - loaded = book.loadXml(spineItem.url); - loaded.then(function(doc){ - var element = doc.getElementById(fragment); - var cfi; - cfi = epubcfi.generateCfiFromElement(element, spineItem.cfiBase); - deferred.resolve(cfi); - }); - } - - return deferred.promise; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromTextNode = function(anchor, offset, base) { - var parent = anchor.parentNode; - var steps = this.pathTo(parent); - var path = this.generatePathComponent(steps); - var index = 1 + (2 * Array.prototype.indexOf.call(parent.childNodes, anchor)); - return "epubcfi(" + base + "!" + path + "/"+index+":"+(offset || 0)+")"; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRangeAnchor = function(range, base) { - var anchor = range.anchorNode; - var offset = range.anchorOffset; - return this.generateCfiFromTextNode(anchor, offset, base); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRange = function(range, base) { - var start, startElement, startSteps, startPath, startOffset, startIndex; - var end, endElement, endSteps, endPath, endOffset, endIndex; - - start = range.startContainer; - - if(start.nodeType === 3) { // text node - startElement = start.parentNode; - //startIndex = 1 + (2 * Array.prototype.indexOf.call(startElement.childNodes, start)); - startIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(start)); - startSteps = this.pathTo(startElement); - } else if(range.collapsed) { - return this.generateCfiFromElement(start, base); // single element - } else { - startSteps = this.pathTo(start); - } - - startPath = this.generatePathComponent(startSteps); - startOffset = range.startOffset; - - if(!range.collapsed) { - end = range.endContainer; - - if(end.nodeType === 3) { // text node - endElement = end.parentNode; - // endIndex = 1 + (2 * Array.prototype.indexOf.call(endElement.childNodes, end)); - endIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(end)); - - endSteps = this.pathTo(endElement); - } else { - endSteps = this.pathTo(end); - } - - endPath = this.generatePathComponent(endSteps); - endOffset = range.endOffset; - - // Remove steps present in startPath - endPath = endPath.replace(startPath, ''); - - if (endPath.length) { - endPath = endPath + "/"; - } - - return "epubcfi(" + base + "!" + startPath + "/" + startIndex + ":" + startOffset + "," + endPath + endIndex + ":" + endOffset + ")"; - - } else { - return "epubcfi(" + base + "!" + startPath + "/"+ startIndex +":"+ startOffset +")"; - } -}; - -EPUBJS.EpubCFI.prototype.generateXpathFromSteps = function(steps) { - var xpath = [".", "*"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - xpath.push("*[position()=" + position + " and @id='" + step.id + "']"); - } else if(step.type === "text") { - xpath.push("text()[" + position + "]"); - } else { - xpath.push("*[" + position + "]"); - } - }); - - return xpath.join("/"); -}; - - -EPUBJS.EpubCFI.prototype.generateRangeFromCfi = function(cfi, _doc) { - var doc = _doc || document; - var range = doc.createRange(); - var lastStep; - var xpath; - var startContainer; - var textLength; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - xpath = this.generateXpathFromSteps(cfi.steps); - - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - startContainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(!startContainer) { - return null; - } - - if(startContainer && cfi.characterOffset >= 0) { - textLength = startContainer.length; - - if(cfi.characterOffset < textLength) { - range.setStart(startContainer, cfi.characterOffset); - range.setEnd(startContainer, textLength ); - } else { - console.debug("offset greater than length:", cfi.characterOffset, textLength); - range.setStart(startContainer, textLength - 1 ); - range.setEnd(startContainer, textLength ); - } - } else if(startContainer) { - range.selectNode(startContainer); - } - // doc.defaultView.getSelection().addRange(range); - return range; -}; - -EPUBJS.EpubCFI.prototype.isCfiString = function(target) { - if(typeof target === "string" && - target.indexOf("epubcfi(") === 0) { - return true; - } - - return false; -}; -EPUBJS.Events = function(obj, el){ - - this.events = {}; - - if(!el){ - this.el = document.createElement('div'); - }else{ - this.el = el; - } - - obj.createEvent = this.createEvent; - obj.tell = this.tell; - obj.listen = this.listen; - obj.deafen = this.deafen; - obj.listenUntil = this.listenUntil; - - return this; -}; - -EPUBJS.Events.prototype.createEvent = function(evt){ - var e = new CustomEvent(evt); - this.events[evt] = e; - return e; -}; - -EPUBJS.Events.prototype.tell = function(evt, msg){ - var e; - - if(!this.events[evt]){ - console.warn("No event:", evt, "defined yet, creating."); - e = this.createEvent(evt); - }else{ - e = this.events[evt]; - } - - if(msg) e.msg = msg; - this.el.dispatchEvent(e); - -}; - -EPUBJS.Events.prototype.listen = function(evt, func, bindto){ - if(!this.events[evt]){ - console.warn("No event:", evt, "defined yet, creating."); - this.createEvent(evt); - return; - } - - if(bindto){ - this.el.addEventListener(evt, func.bind(bindto), false); - }else{ - this.el.addEventListener(evt, func, false); - } - -}; - -EPUBJS.Events.prototype.deafen = function(evt, func){ - this.el.removeEventListener(evt, func, false); -}; - -EPUBJS.Events.prototype.listenUntil = function(OnEvt, OffEvt, func, bindto){ - this.listen(OnEvt, func, bindto); - - function unlisten(){ - this.deafen(OnEvt, func); - this.deafen(OffEvt, unlisten); - } - - this.listen(OffEvt, unlisten, this); -}; -EPUBJS.hooks = {}; -EPUBJS.Hooks = (function(){ - function hooks(){} - - //-- Get pre-registered hooks - hooks.prototype.getHooks = function(){ - var plugs; - this.hooks = {}; - Array.prototype.slice.call(arguments).forEach(function(arg){ - this.hooks[arg] = []; - }, this); - - for (var plugType in this.hooks) { - plugs = _.values(EPUBJS.hooks[plugType]); - - plugs.forEach(function(hook){ - this.registerHook(plugType, hook); - }, this); - } - }; - - //-- Hooks allow for injecting async functions that must all complete before continuing - // Functions must have a callback as their first argument. - hooks.prototype.registerHook = function(type, toAdd, toFront){ - - if(typeof(this.hooks[type]) != "undefined"){ - - if(typeof(toAdd) === "function"){ - if(toFront) { - this.hooks[type].unshift(toAdd); - }else{ - this.hooks[type].push(toAdd); - } - }else if(Array.isArray(toAdd)){ - toAdd.forEach(function(hook){ - if(toFront) { - this.hooks[type].unshift(hook); - }else{ - this.hooks[type].push(hook); - } - }, this); - } - }else{ - //-- Allows for undefined hooks - this.hooks[type] = [toAdd]; - - if(typeof(toAdd) === "function"){ - this.hooks[type] = [toAdd]; - }else if(Array.isArray(toAdd)){ - this.hooks[type] = []; - toAdd.forEach(function(hook){ - this.hooks[type].push(hook); - }, this); - } - - } - }; - - hooks.prototype.removeHook = function(type, toRemove){ - var index; - - if(typeof(this.hooks[type]) != "undefined"){ - - if(typeof(toRemove) === "function"){ - index = this.hooks[type].indexOf(toRemove); - if (index > -1) { - this.hooks[type].splice(index, 1); - } - }else if(Array.isArray(toRemove)){ - toRemove.forEach(function(hook){ - index = this.hooks[type].indexOf(hook); - if (index > -1) { - this.hooks[type].splice(index, 1); - } - }, this); - } - } - }; - - hooks.prototype.triggerHooks = function(type, callback, passed){ - var hooks, count; - - if(typeof(this.hooks[type]) == "undefined") return false; - - hooks = this.hooks[type]; - - count = hooks.length; - if(count === 0 && callback) { - callback(); - } - - function countdown(){ - count--; - if(count <= 0 && callback) callback(); - } - - hooks.forEach(function(hook){ - hook(countdown, passed); - }); - }; - - return { - register: function(name) { - if(EPUBJS.hooks[name] === undefined) { EPUBJS.hooks[name] = {}; } - if(typeof EPUBJS.hooks[name] !== 'object') { throw "Already registered: "+name; } - return EPUBJS.hooks[name]; - }, - mixin: function(object) { - for (var prop in hooks.prototype) { - object[prop] = hooks.prototype[prop]; - } - } - }; -})(); - -EPUBJS.Layout = EPUBJS.Layout || {}; - -EPUBJS.Layout.Reflowable = function(){ - this.documentElement = null; - this.spreadWidth = null; -}; - -EPUBJS.Layout.Reflowable.prototype.format = function(documentElement, _width, _height, _gap){ - // Get the prefixed CSS commands - var columnAxis = EPUBJS.core.prefixed('columnAxis'); - var columnGap = EPUBJS.core.prefixed('columnGap'); - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var columnFill = EPUBJS.core.prefixed('columnFill'); - - //-- Check the width and create even width columns - var width = Math.floor(_width); - // var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 0; // Not needed for single - var section = Math.floor(width / 8); - var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1); - this.documentElement = documentElement; - //-- Single Page - this.spreadWidth = (width + gap); - - - documentElement.style.overflow = "hidden"; - - // Must be set to the new calculated width or the columns will be off - documentElement.style.width = width + "px"; - - //-- Adjust height - documentElement.style.height = _height + "px"; - - //-- Add columns - documentElement.style[columnAxis] = "horizontal"; - documentElement.style[columnFill] = "auto"; - documentElement.style[columnWidth] = width+"px"; - documentElement.style[columnGap] = gap+"px"; - this.colWidth = width; - this.gap = gap; - - return { - pageWidth : this.spreadWidth, - pageHeight : _height - }; -}; - -EPUBJS.Layout.Reflowable.prototype.calculatePages = function() { - var totalWidth, displayedPages; - this.documentElement.style.width = "auto"; //-- reset width for calculations - totalWidth = this.documentElement.scrollWidth; - displayedPages = Math.ceil(totalWidth / this.spreadWidth); - - return { - displayedPages : displayedPages, - pageCount : displayedPages - }; -}; - -EPUBJS.Layout.ReflowableSpreads = function(){ - this.documentElement = null; - this.spreadWidth = null; -}; - -EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _width, _height, _gap){ - var columnAxis = EPUBJS.core.prefixed('columnAxis'); - var columnGap = EPUBJS.core.prefixed('columnGap'); - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var columnFill = EPUBJS.core.prefixed('columnFill'); - - var divisor = 2, - cutoff = 800; - - //-- Check the width and create even width columns - var fullWidth = Math.floor(_width); - var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 1; - - var section = Math.floor(width / 8); - var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1); - - //-- Double Page - var colWidth = Math.floor((width - gap) / divisor); - - this.documentElement = documentElement; - this.spreadWidth = (colWidth + gap) * divisor; - - - documentElement.style.overflow = "hidden"; - - // Must be set to the new calculated width or the columns will be off - documentElement.style.width = width + "px"; - - //-- Adjust height - documentElement.style.height = _height + "px"; - - //-- Add columns - documentElement.style[columnAxis] = "horizontal"; - documentElement.style[columnFill] = "auto"; - documentElement.style[columnGap] = gap+"px"; - documentElement.style[columnWidth] = colWidth+"px"; - - this.colWidth = colWidth; - this.gap = gap; - return { - pageWidth : this.spreadWidth, - pageHeight : _height - }; -}; - -EPUBJS.Layout.ReflowableSpreads.prototype.calculatePages = function() { - var totalWidth = this.documentElement.scrollWidth; - var displayedPages = Math.ceil(totalWidth / this.spreadWidth); - - //-- Add a page to the width of the document to account an for odd number of pages - this.documentElement.style.width = ((displayedPages * this.spreadWidth) - this.gap) + "px"; - - return { - displayedPages : displayedPages, - pageCount : displayedPages * 2 - }; -}; - -EPUBJS.Layout.Fixed = function(){ - this.documentElement = null; -}; - -EPUBJS.Layout.Fixed.prototype.format = function(documentElement, _width, _height, _gap){ - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var viewport = documentElement.querySelector("[name=viewport]"); - var content; - var contents; - var width, height; - this.documentElement = documentElement; - /** - * check for the viewport size - * - */ - if(viewport && viewport.hasAttribute("content")) { - content = viewport.getAttribute("content"); - contents = content.split(','); - if(contents[0]){ - width = contents[0].replace("width=", ''); - } - if(contents[1]){ - height = contents[1].replace("height=", ''); - } - } - - //-- Adjust width and height - documentElement.style.width = width + "px" || "auto"; - documentElement.style.height = height + "px" || "auto"; - - //-- Remove columns - documentElement.style[columnWidth] = "auto"; - - //-- Scroll - documentElement.style.overflow = "auto"; - - this.colWidth = width; - this.gap = 0; - - return { - pageWidth : width, - pageHeight : height - }; - -}; - -EPUBJS.Layout.Fixed.prototype.calculatePages = function(){ - return { - displayedPages : 1, - pageCount : 1 - }; -}; - -EPUBJS.Locations = function(spine, store) { - this.spine = spine; - this.store = store; - - this.epubcfi = new EPUBJS.EpubCFI(); - - this._locations = []; - this.total = 0; - - this.break = 150; - - this._current = 0; - -}; - -EPUBJS.Locations.prototype.generate = function(chars) { - var deferred = new RSVP.defer(); - var spinePos = -1; - var spineLength = this.spine.length; - var nextChapter = function(deferred){ - var chapter; - var next = spinePos + 1; - var done = deferred || new RSVP.defer(); - var loaded; - if(next >= spineLength) { - done.resolve(); - } else { - spinePos = next; - chapter = new EPUBJS.Chapter(this.spine[spinePos], this.store); - - this.process(chapter).then(function() { - // Load up the next chapter - setTimeout(function(){ - nextChapter(done); - }, 1); - - }); - } - return done.promise; - }.bind(this); - - var finished = nextChapter().then(function(){ - this.total = this._locations.length-1; - - if (this._currentCfi) { - this.currentLocation = this._currentCfi; - } - deferred.resolve(this._locations); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Locations.prototype.process = function(chapter) { - return chapter.load(this.request) - .then(function(_doc) { - - var range; - var doc = _doc; - var contents = doc.documentElement; - var counter = 0; - var prev; - - this.sprint(contents, function(node) { - var len = node.length; - var dist; - var pos = 0; - - // Start range - if (counter === 0) { - range = doc.createRange(); - range.setStart(node, 0); - } - - dist = this.break - counter; - - // Node is smaller than a break - if(dist > len){ - counter += len; - pos = len; - } - - while (pos < len) { - counter = this.break; - pos += this.break; - - // Gone over - if(pos >= len){ - // Continue counter for next node - counter = len - (pos - this.break); - - // At End - } else { - // End the previous range - range.setEnd(node, pos); - cfi = chapter.cfiFromRange(range); - this._locations.push(cfi); - counter = 0; - - // Start new range - pos += 1; - range = doc.createRange(); - range.setStart(node, pos); - } - - } - - prev = node; - - }.bind(this)); - - // Close remaining - if (range) { - range.setEnd(prev, prev.length); - cfi = chapter.cfiFromRange(range); - this._locations.push(cfi); - counter = 0; - } - - }.bind(this)); - -}; - -EPUBJS.Locations.prototype.sprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false); - - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Locations.prototype.locationFromCfi = function(cfi){ - // Check if the location has not been set yet - if(this._locations.length === 0) { - return -1; - } - - return EPUBJS.core.locationOf(cfi, this._locations, this.epubcfi.compare); -}; - -EPUBJS.Locations.prototype.percentageFromCfi = function(cfi) { - // Find closest cfi - var loc = this.locationFromCfi(cfi); - // Get percentage in total - return this.percentageFromLocation(loc); -}; - -EPUBJS.Locations.prototype.percentageFromLocation = function(loc) { - if (!loc || !this.total) { - return 0; - } - return (loc / this.total); -}; - -EPUBJS.Locations.prototype.cfiFromLocation = function(loc){ - var cfi = -1; - // check that pg is an int - if(typeof loc != "number"){ - loc = parseInt(loc); - } - - if(loc >= 0 && loc < this._locations.length) { - cfi = this._locations[loc]; - } - - return cfi; -}; - -EPUBJS.Locations.prototype.cfiFromPercentage = function(value){ - var percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1 - var loc = Math.ceil(this.total * percentage); - - return this.cfiFromLocation(loc); -}; - -EPUBJS.Locations.prototype.load = function(locations){ - this._locations = JSON.parse(locations); - this.total = this._locations.length-1; - return this._locations; -}; - -EPUBJS.Locations.prototype.save = function(json){ - return JSON.stringify(this._locations); -}; - -EPUBJS.Locations.prototype.getCurrent = function(json){ - return this._current; -}; - -EPUBJS.Locations.prototype.setCurrent = function(curr){ - var loc; - - if(typeof curr == "string"){ - this._currentCfi = curr; - } else if (typeof curr == "number") { - this._current = curr; - } else { - return; - } - - if(this._locations.length === 0) { - return; - } - - if(typeof curr == "string"){ - loc = this.locationFromCfi(curr); - this._current = loc; - } else { - loc = curr; - } - - this.trigger("changed", { - percentage: this.percentageFromLocation(loc) - }); -}; - -Object.defineProperty(EPUBJS.Locations.prototype, 'currentLocation', { - get: function () { - return this._current; - }, - set: function (curr) { - this.setCurrent(curr); - } -}); - -RSVP.EventTarget.mixin(EPUBJS.Locations.prototype); - -EPUBJS.Pagination = function(pageList) { - this.pages = []; - this.locations = []; - this.epubcfi = new EPUBJS.EpubCFI(); - if(pageList && pageList.length) { - this.process(pageList); - } -}; - -EPUBJS.Pagination.prototype.process = function(pageList){ - pageList.forEach(function(item){ - this.pages.push(item.page); - this.locations.push(item.cfi); - }, this); - - this.pageList = pageList; - this.firstPage = parseInt(this.pages[0]); - this.lastPage = parseInt(this.pages[this.pages.length-1]); - this.totalPages = this.lastPage - this.firstPage; -}; - -EPUBJS.Pagination.prototype.pageFromCfi = function(cfi){ - var pg = -1; - - // Check if the pageList has not been set yet - if(this.locations.length === 0) { - return -1; - } - - // TODO: check if CFI is valid? - - // check if the cfi is in the location list - // var index = this.locations.indexOf(cfi); - var index = EPUBJS.core.indexOfSorted(cfi, this.locations, this.epubcfi.compare); - if(index != -1 && index < (this.pages.length-1) ) { - pg = this.pages[index]; - } else { - // Otherwise add it to the list of locations - // Insert it in the correct position in the locations page - //index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare); - index = EPUBJS.core.locationOf(cfi, this.locations, this.epubcfi.compare); - // Get the page at the location just before the new one, or return the first - pg = index-1 >= 0 ? this.pages[index-1] : this.pages[0]; - if(pg !== undefined) { - // Add the new page in so that the locations and page array match up - //this.pages.splice(index, 0, pg); - } else { - pg = -1; - } - - } - return pg; -}; - -EPUBJS.Pagination.prototype.cfiFromPage = function(pg){ - var cfi = -1; - // check that pg is an int - if(typeof pg != "number"){ - pg = parseInt(pg); - } - - // check if the cfi is in the page list - // Pages could be unsorted. - var index = this.pages.indexOf(pg); - if(index != -1) { - cfi = this.locations[index]; - } - // TODO: handle pages not in the list - return cfi; -}; - -EPUBJS.Pagination.prototype.pageFromPercentage = function(percent){ - var pg = Math.round(this.totalPages * percent); - return pg; -}; - -// Returns a value between 0 - 1 corresponding to the location of a page -EPUBJS.Pagination.prototype.percentageFromPage = function(pg){ - var percentage = (pg - this.firstPage) / this.totalPages; - return Math.round(percentage * 1000) / 1000; -}; - -// Returns a value between 0 - 1 corresponding to the location of a cfi -EPUBJS.Pagination.prototype.percentageFromCfi = function(cfi){ - var pg = this.pageFromCfi(cfi); - var percentage = this.percentageFromPage(pg); - return percentage; -}; -EPUBJS.Parser = function(baseUrl){ - this.baseUrl = baseUrl || ''; -}; - -EPUBJS.Parser.prototype.container = function(containerXml){ - //-- - var rootfile, fullpath, folder, encoding; - - if(!containerXml) { - console.error("Container File Not Found"); - return; - } - - rootfile = containerXml.querySelector("rootfile"); - - if(!rootfile) { - console.error("No RootFile Found"); - return; - } - - fullpath = rootfile.getAttribute('full-path'); - folder = EPUBJS.core.uri(fullpath).directory; - encoding = containerXml.xmlEncoding; - - //-- Now that we have the path we can parse the contents - return { - 'packagePath' : fullpath, - 'basePath' : folder, - 'encoding' : encoding - }; -}; - -EPUBJS.Parser.prototype.identifier = function(packageXml){ - var metadataNode; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - return this.getElementText(metadataNode, "identifier"); -}; - -EPUBJS.Parser.prototype.packageContents = function(packageXml, baseUrl){ - var parse = this; - var metadataNode, manifestNode, spineNode; - var manifest, navPath, tocPath, coverPath; - var spineNodeIndex; - var spine; - var spineIndexByURL; - var metadata; - - if(baseUrl) this.baseUrl = baseUrl; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - manifestNode = packageXml.querySelector("manifest"); - if(!manifestNode) { - console.error("No Manifest Found"); - return; - } - - spineNode = packageXml.querySelector("spine"); - if(!spineNode) { - console.error("No Spine Found"); - return; - } - - manifest = parse.manifest(manifestNode); - navPath = parse.findNavPath(manifestNode); - tocPath = parse.findTocPath(manifestNode, spineNode); - coverPath = parse.findCoverPath(manifestNode); - - spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode); - - spine = parse.spine(spineNode, manifest); - - spineIndexByURL = {}; - spine.forEach(function(item){ - spineIndexByURL[item.href] = item.index; - }); - - metadata = parse.metadata(metadataNode); - - metadata.direction = spineNode.getAttribute("page-progression-direction"); - - return { - 'metadata' : metadata, - 'spine' : spine, - 'manifest' : manifest, - 'navPath' : navPath, - 'tocPath' : tocPath, - 'coverPath': coverPath, - 'spineNodeIndex' : spineNodeIndex, - 'spineIndexByURL' : spineIndexByURL - }; -}; - -//-- Find TOC NAV -EPUBJS.Parser.prototype.findNavPath = function(manifestNode){ - // Find item with property 'nav' - // Should catch nav irregardless of order - var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Find TOC NCX: media-type="application/x-dtbncx+xml" href="toc.ncx" -EPUBJS.Parser.prototype.findTocPath = function(manifestNode, spineNode){ - var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); - var tocId; - - // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as - // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, - // "The item that describes the NCX must be referenced by the spine toc attribute." - if (!node) { - tocId = spineNode.getAttribute("toc"); - if(tocId) { - node = manifestNode.querySelector("item[id='" + tocId + "']"); - } - } - - return node ? node.getAttribute('href') : false; -}; - -//-- Find Cover: -EPUBJS.Parser.prototype.findCoverPath = function(manifestNode){ - var node = manifestNode.querySelector("item[properties='cover-image']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Expanded to match Readium web components -EPUBJS.Parser.prototype.metadata = function(xml){ - var metadata = {}, - p = this; - - metadata.bookTitle = p.getElementText(xml, 'title'); - metadata.creator = p.getElementText(xml, 'creator'); - metadata.description = p.getElementText(xml, 'description'); - - metadata.pubdate = p.getElementText(xml, 'date'); - - metadata.publisher = p.getElementText(xml, 'publisher'); - - metadata.identifier = p.getElementText(xml, "identifier"); - metadata.language = p.getElementText(xml, "language"); - metadata.rights = p.getElementText(xml, "rights"); - - metadata.modified_date = p.querySelectorText(xml, "meta[property='dcterms:modified']"); - metadata.layout = p.querySelectorText(xml, "meta[property='rendition:layout']"); - metadata.orientation = p.querySelectorText(xml, "meta[property='rendition:orientation']"); - metadata.spread = p.querySelectorText(xml, "meta[property='rendition:spread']"); - - return metadata; -}; - -EPUBJS.Parser.prototype.getElementText = function(xml, tag){ - var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag), - el; - - if(!found || found.length === 0) return ''; - - el = found[0]; - - if(el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; - -}; - -EPUBJS.Parser.prototype.querySelectorText = function(xml, q){ - var el = xml.querySelector(q); - - if(el && el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; -}; - -EPUBJS.Parser.prototype.manifest = function(manifestXml){ - var baseUrl = this.baseUrl, - manifest = {}; - - //-- Turn items into an array - var selected = manifestXml.querySelectorAll("item"), - items = Array.prototype.slice.call(selected); - - //-- Create an object with the id as key - items.forEach(function(item){ - var id = item.getAttribute('id'), - href = item.getAttribute('href') || '', - type = item.getAttribute('media-type') || '', - properties = item.getAttribute('properties') || ''; - - manifest[id] = { - 'href' : href, - 'url' : baseUrl + href, //-- Absolute URL for loading with a web worker - 'type' : type, - 'properties' : properties - }; - - }); - - return manifest; - -}; - -EPUBJS.Parser.prototype.spine = function(spineXml, manifest){ - var spine = []; - - var selected = spineXml.getElementsByTagName("itemref"), - items = Array.prototype.slice.call(selected); - - var spineNodeIndex = Array.prototype.indexOf.call(spineXml.parentNode.childNodes, spineXml); - - var epubcfi = new EPUBJS.EpubCFI(); - - //-- Add to array to mantain ordering and cross reference with manifest - items.forEach(function(item, index){ - var Id = item.getAttribute('idref'); - var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); - var props = item.getAttribute('properties') || ''; - var propArray = props.length ? props.split(' ') : []; - var manifestProps = manifest[Id].properties; - var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : []; - var vert = { - 'id' : Id, - 'linear' : item.getAttribute('linear') || '', - 'properties' : propArray, - 'manifestProperties' : manifestPropArray, - 'href' : manifest[Id].href, - 'url' : manifest[Id].url, - 'index' : index, - 'cfiBase' : cfiBase, - 'cfi' : "epub(" + cfiBase + ")" - }; - spine.push(vert); - }); - - return spine; -}; - -EPUBJS.Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){ - var navEl = navHtml.querySelector('nav[*|type="toc"]'), //-- [*|type="toc"] * Doesn't seem to work - idCounter = 0; - - if(!navEl) return []; - - // Implements `> ol > li` - function findListItems(parent){ - var items = []; - - Array.prototype.slice.call(parent.childNodes).forEach(function(node){ - if('ol' == node.tagName){ - Array.prototype.slice.call(node.childNodes).forEach(function(item){ - if('li' == item.tagName){ - items.push(item); - } - }); - } - }); - - return items; - - } - - // Implements `> a, > span` - function findAnchorOrSpan(parent){ - var item = null; - - Array.prototype.slice.call(parent.childNodes).forEach(function(node){ - if('a' == node.tagName || 'span' == node.tagName){ - item = node; - } - }); - - return item; - } - - function getTOC(parent){ - var list = [], - nodes = findListItems(parent), - items = Array.prototype.slice.call(nodes), - length = items.length, - node; - - if(length === 0) return false; - - items.forEach(function(item){ - var id = item.getAttribute('id') || false, - content = findAnchorOrSpan(item), - href = content.getAttribute('href') || '', - text = content.textContent || "", - split = href.split("#"), - baseUrl = split[0], - subitems = getTOC(item), - spinePos = spineIndexByURL[baseUrl], - spineItem = bookSpine[spinePos], - cfi = spineItem ? spineItem.cfi : ''; - - if(!id) { - if(spinePos) { - spineItem = bookSpine[spinePos]; - id = spineItem.id; - cfi = spineItem.cfi; - } else { - id = 'epubjs-autogen-toc-id-' + (idCounter++); - } - } - - item.setAttribute('id', id); // Ensure all elements have an id - list.push({ - "id": id, - "href": href, - "label": text, - "subitems" : subitems, - "parent" : parent ? parent.getAttribute('id') : null, - "cfi" : cfi - }); - - }); - - return list; - } - - return getTOC(navEl); -}; - -EPUBJS.Parser.prototype.toc = function(tocXml, spineIndexByURL, bookSpine){ - var navMap = tocXml.querySelector("navMap"); - if(!navMap) return []; - - function getTOC(parent){ - var list = [], - snapshot = tocXml.evaluate("*[local-name()='navPoint']", parent, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), - length = snapshot.snapshotLength; - - if(length === 0) return []; - - for ( var i=length-1 ; i >= 0; i-- ) { - var item = snapshot.snapshotItem(i); - - var id = item.getAttribute('id') || false, - content = item.querySelector("content"), - src = content.getAttribute('src'), - navLabel = item.querySelector("navLabel"), - text = navLabel.textContent ? navLabel.textContent : "", - split = src.split("#"), - baseUrl = split[0], - spinePos = spineIndexByURL[baseUrl], - spineItem = bookSpine[spinePos], - subitems = getTOC(item), - cfi = spineItem ? spineItem.cfi : ''; - - if(!id) { - if(spinePos) { - spineItem = bookSpine[spinePos]; - id = spineItem.id; - cfi = spineItem.cfi; - } else { - id = 'epubjs-autogen-toc-id-' + (idCounter++); - } - } - - list.unshift({ - "id": id, - "href": src, - "label": text, - "spinePos": spinePos, - "subitems" : subitems, - "parent" : parent ? parent.getAttribute('id') : null, - "cfi" : cfi - }); - - } - - return list; - } - - return getTOC(navMap); -}; - -EPUBJS.Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){ - var navEl = navHtml.querySelector('nav[*|type="page-list"]'), - idCounter = 0; - - if(!navEl) return []; - - // Implements `> ol > li` - function findListItems(parent){ - var items = []; - - Array.prototype.slice.call(parent.childNodes).forEach(function(node){ - if('ol' == node.tagName){ - Array.prototype.slice.call(node.childNodes).forEach(function(item){ - if('li' == item.tagName){ - items.push(item); - } - }); - } - }); - - return items; - - } - - // Implements `> a, > span` - function findAnchorOrSpan(parent){ - var item = null; - - Array.prototype.slice.call(parent.childNodes).forEach(function(node){ - if('a' == node.tagName || 'span' == node.tagName){ - item = node; - } - }); - - return item; - } - - function getPages(parent){ - var list = [], - nodes = findListItems(parent), - items = Array.prototype.slice.call(nodes), - length = items.length, - node; - - if(length === 0) return false; - - items.forEach(function(item){ - var id = item.getAttribute('id') || false, - content = findAnchorOrSpan(item), - href = content.getAttribute('href') || '', - text = content.textContent || "", - page = parseInt(text), - isCfi = href.indexOf("epubcfi"), - split, - packageUrl, - cfi; - - if(isCfi != -1) { - split = href.split("#"); - packageUrl = split[0]; - cfi = split.length > 1 ? split[1] : false; - list.push({ - "cfi" : cfi, - "href" : href, - "packageUrl" : packageUrl, - "page" : page - }); - } else { - list.push({ - "href" : href, - "page" : page - }); - } - - }); - - return list; - } - - return getPages(navEl); -}; - -EPUBJS.Render.Iframe = function() { - this.iframe = null; - this.document = null; - this.window = null; - this.docEl = null; - this.bodyEl = null; - - this.leftPos = 0; - this.pageWidth = 0; - - this.isMobile = navigator.userAgent.match(/(iPad|iPhone|iPod|Mobile|Android)/g); -}; - -//-- Build up any html needed -EPUBJS.Render.Iframe.prototype.create = function(){ - this.iframe = document.createElement('iframe'); - this.iframe.id = "epubjs-iframe:" + EPUBJS.core.uuid(); - this.iframe.scrolling = "no"; - this.iframe.seamless = "seamless"; - // Back up if seamless isn't supported - this.iframe.style.border = "none"; - - this.iframe.addEventListener("load", this.loaded.bind(this), false); - return this.iframe; -}; - -/** -* Sets the source of the iframe with the given URL string -* Takes: Document Contents String -* Returns: promise with document element -*/ -EPUBJS.Render.Iframe.prototype.load = function(contents, url){ - var render = this, - deferred = new RSVP.defer(); - - if(this.window) { - this.unload(); - } - - this.iframe.onload = function(e) { - var title; - - render.document = render.iframe.contentDocument; - render.docEl = render.document.documentElement; - render.headEl = render.document.head; - render.bodyEl = render.document.body || render.document.querySelector("body"); - render.window = render.iframe.contentWindow; - - render.window.addEventListener("resize", render.resized.bind(render), false); - - // Reset the scroll position - render.leftPos = 0; - render.setLeft(0); - - //-- Clear Margins - if(render.bodyEl) { - render.bodyEl.style.margin = "0"; - } - - // HTML element must have direction set if RTL or columnns will - // not be in the correct direction in Firefox - // Firefox also need the html element to be position right - if(render.direction == "rtl" && render.docEl.dir != "rtl"){ - render.docEl.dir = "rtl"; - render.docEl.style.position = "absolute"; - render.docEl.style.right = "0"; - } - - deferred.resolve(render.docEl); - }; - - this.iframe.onerror = function(e) { - //console.error("Error Loading Contents", e); - deferred.reject({ - message : "Error Loading Contents: " + e, - stack : new Error().stack - }); - }; - - // this.iframe.contentWindow.location.replace(url); - this.document = this.iframe.contentDocument; - - if(!this.document) { - deferred.reject(new Error("No Document Available")); - return deferred; - } - - this.document.open(); - this.document.write(contents); - this.document.close(); - - return deferred.promise; -}; - - -EPUBJS.Render.Iframe.prototype.loaded = function(v){ - var url = this.iframe.contentWindow.location.href; - if(url != "about:blank"){ - this.trigger("render:loaded", url); - } -}; - -// Resize the iframe to the given width and height -EPUBJS.Render.Iframe.prototype.resize = function(width, height){ - var iframeBox; - - if(!this.iframe) return; - - this.iframe.height = height; - - if(!isNaN(width) && width % 2 !== 0){ - width += 1; //-- Prevent cutting off edges of text in columns - } - - this.iframe.width = width; - // Get the fractional height and width of the iframe - // Default to orginal if bounding rect is 0 - this.width = this.iframe.getBoundingClientRect().width || width; - this.height = this.iframe.getBoundingClientRect().height || height; -}; - - -EPUBJS.Render.Iframe.prototype.resized = function(e){ - // Get the fractional height and width of the iframe - this.width = this.iframe.getBoundingClientRect().width; - this.height = this.iframe.getBoundingClientRect().height; -}; - -EPUBJS.Render.Iframe.prototype.totalWidth = function(){ - return this.docEl.scrollWidth; -}; - -EPUBJS.Render.Iframe.prototype.totalHeight = function(){ - return this.docEl.scrollHeight; -}; - -EPUBJS.Render.Iframe.prototype.setPageDimensions = function(pageWidth, pageHeight){ - this.pageWidth = pageWidth; - this.pageHeight = pageHeight; - //-- Add a page to the width of the document to account an for odd number of pages - // this.docEl.style.width = this.docEl.scrollWidth + pageWidth + "px"; -}; - -EPUBJS.Render.Iframe.prototype.setDirection = function(direction){ - - this.direction = direction; - - // Undo previous changes if needed - if(this.docEl && this.docEl.dir == "rtl"){ - this.docEl.dir = "rtl"; - this.docEl.style.position = "static"; - this.docEl.style.right = "auto"; - } - -}; - -EPUBJS.Render.Iframe.prototype.setLeft = function(leftPos){ - // this.bodyEl.style.marginLeft = -leftPos + "px"; - // this.docEl.style.marginLeft = -leftPos + "px"; - // this.docEl.style[EPUBJS.Render.Iframe.transform] = 'translate('+ (-leftPos) + 'px, 0)'; - - if (this.isMobile) { - this.docEl.style["-webkit-transform"] = 'translate('+ (-leftPos) + 'px, 0)'; - } else { - this.document.defaultView.scrollTo(leftPos, 0); - } - -}; - -EPUBJS.Render.Iframe.prototype.setStyle = function(style, val, prefixed){ - if(prefixed) { - style = EPUBJS.core.prefixed(style); - } - - if(this.bodyEl) this.bodyEl.style[style] = val; -}; - -EPUBJS.Render.Iframe.prototype.removeStyle = function(style){ - - if(this.bodyEl) this.bodyEl.style[style] = ''; - -}; - -EPUBJS.Render.Iframe.prototype.addHeadTag = function(tag, attrs, _doc) { - var doc = _doc || this.document; - var tagEl = doc.createElement(tag); - var headEl = doc.head; - - for(var attr in attrs) { - tagEl.setAttribute(attr, attrs[attr]); - } - - if(headEl) headEl.insertBefore(tagEl, headEl.firstChild); -}; - -EPUBJS.Render.Iframe.prototype.page = function(pg){ - this.leftPos = this.pageWidth * (pg-1); //-- pages start at 1 - - // Reverse for rtl langs - if(this.direction === "rtl"){ - this.leftPos = this.leftPos * -1; - } - - this.setLeft(this.leftPos); -}; - -//-- Show the page containing an Element -EPUBJS.Render.Iframe.prototype.getPageNumberByElement = function(el){ - var left, pg; - if(!el) return; - - left = this.leftPos + el.getBoundingClientRect().left; //-- Calculate left offset compaired to scrolled position - - pg = Math.floor(left / this.pageWidth) + 1; //-- pages start at 1 - - return pg; -}; - -//-- Show the page containing an Element -EPUBJS.Render.Iframe.prototype.getPageNumberByRect = function(boundingClientRect){ - var left, pg; - - left = this.leftPos + boundingClientRect.left; //-- Calculate left offset compaired to scrolled position - pg = Math.floor(left / this.pageWidth) + 1; //-- pages start at 1 - - return pg; -}; - -// Return the root element of the content -EPUBJS.Render.Iframe.prototype.getBaseElement = function(){ - return this.bodyEl; -}; - -// Return the document element -EPUBJS.Render.Iframe.prototype.getDocumentElement = function(){ - return this.docEl; -}; - -// Checks if an element is on the screen -EPUBJS.Render.Iframe.prototype.isElementVisible = function(el){ - var rect; - var left; - - if(el && typeof el.getBoundingClientRect === 'function'){ - rect = el.getBoundingClientRect(); - left = rect.left; //+ rect.width; - if( rect.width !== 0 && - rect.height !== 0 && // Element not visible - left >= 0 && - left < this.pageWidth ) { - return true; - } - } - - return false; -}; - - -EPUBJS.Render.Iframe.prototype.scroll = function(bool){ - if(bool) { - this.iframe.scrolling = "yes"; - } else { - this.iframe.scrolling = "no"; - } -}; - -// Cleanup event listeners -EPUBJS.Render.Iframe.prototype.unload = function(){ - this.window.removeEventListener("resize", this.resized); -}; - -//-- Enable binding events to Render -RSVP.EventTarget.mixin(EPUBJS.Render.Iframe.prototype); - -EPUBJS.Renderer = function(renderMethod, hidden) { - // Dom events to listen for - this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click"]; - this.upEvent = "mouseup"; - this.downEvent = "mousedown"; - if('ontouchstart' in document.documentElement) { - this.listenedEvents.push("touchstart", "touchend"); - this.upEvent = "touchend"; - this.downEvent = "touchstart"; - } - /** - * Setup a render method. - * Options are: Iframe - */ - if(renderMethod && typeof(EPUBJS.Render[renderMethod]) != "undefined"){ - this.render = new EPUBJS.Render[renderMethod](); - } else { - console.error("Not a Valid Rendering Method"); - } - - // Listen for load events - this.render.on("render:loaded", this.loaded.bind(this)); - - // Cached for replacement urls from storage - this.caches = {}; - - // Blank Cfi for Parsing - this.epubcfi = new EPUBJS.EpubCFI(); - - this.spreads = true; - this.isForcedSingle = false; - this.resized = _.debounce(this.onResized.bind(this), 100); - - this.layoutSettings = {}; - - this.hidden = hidden || false; - //-- Adds Hook methods to the Book prototype - // Hooks will all return before triggering the callback. - EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - this.getHooks("beforeChapterDisplay"); - - //-- Queue up page changes if page map isn't ready - this._q = EPUBJS.core.queue(this); - - this._moving = false; - -}; - -//-- Renderer events for listening -EPUBJS.Renderer.prototype.Events = [ - "renderer:keydown", - "renderer:keyup", - "renderer:keypressed", - "renderer:mouseup", - "renderer:mousedown", - "renderer:click", - "renderer:touchstart", - "renderer:touchend", - "renderer:selected", - "renderer:chapterUnloaded", - "renderer:chapterDisplayed", - "renderer:locationChanged", - "renderer:visibleLocationChanged", - "renderer:resized", - "renderer:spreads" -]; - -/** -* Creates an element to render to. -* Resizes to passed width and height or to the elements size -*/ -EPUBJS.Renderer.prototype.initialize = function(element, width, height){ - this.container = element; - this.element = this.render.create(); - - this.initWidth = width; - this.initHeight = height; - - this.width = width || this.container.clientWidth; - this.height = height || this.container.clientHeight; - - this.container.appendChild(this.element); - - if(width && height){ - this.render.resize(this.width, this.height); - } else { - this.render.resize('100%', '100%'); - } - - document.addEventListener("orientationchange", this.onResized); -}; - -/** -* Display a chapter -* Takes: chapter object, global layout settings -* Returns: Promise with passed Renderer after pages has loaded -*/ -EPUBJS.Renderer.prototype.displayChapter = function(chapter, globalLayout){ - var store = false; - if(this._moving) { - console.error("Rendering In Progress"); - return; - } - this._moving = true; - // Get the url string from the chapter (may be from storage) - return chapter.render(). - then(function(contents) { - - // Unload the previous chapter listener - if(this.currentChapter) { - this.currentChapter.unload(); // Remove stored blobs - - if(this.render.window){ - this.render.window.removeEventListener("resize", this.resized); - } - - this.removeEventListeners(); - this.removeSelectionListeners(); - this.trigger("renderer:chapterUnloaded"); - this.contents = null; - this.doc = null; - this.pageMap = null; - } - - this.currentChapter = chapter; - - this.chapterPos = 1; - - this.currentChapterCfiBase = chapter.cfiBase; - - this.layoutSettings = this.reconcileLayoutSettings(globalLayout, chapter.properties); - - return this.load(contents, chapter.href); - - }.bind(this)); - -}; - -/** -* Loads a url (string) and renders it, -* attaching event listeners and triggering hooks. -* Returns: Promise with the rendered contents. -*/ - -EPUBJS.Renderer.prototype.load = function(contents, url){ - var deferred = new RSVP.defer(); - var loaded; - - // Switch to the required layout method for the settings - this.layoutMethod = this.determineLayout(this.layoutSettings); - this.layout = new EPUBJS.Layout[this.layoutMethod](); - - this.visible(false); - - render = this.render.load(contents, url); - - render.then(function(contents) { - var formated; - this.currentChapter.setDocument(this.render.document); - this.contents = contents; - this.doc = this.render.document; - - // Format the contents using the current layout method - this.formated = this.layout.format(contents, this.render.width, this.render.height, this.gap); - this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight); - - // window.addEventListener("orientationchange", this.onResized.bind(this), false); - if(!this.initWidth && !this.initHeight){ - this.render.window.addEventListener("resize", this.resized, false); - } - - this.addEventListeners(); - this.addSelectionListeners(); - - //-- Trigger registered hooks before displaying - this.beforeDisplay(function(){ - var pages = this.layout.calculatePages(); - var msg = this.currentChapter; - var queued = this._q.length(); - this._moving = false; - - this.updatePages(pages); - - this.visibleRangeCfi = this.getVisibleRangeCfi(); - this.currentLocationCfi = this.visibleRangeCfi.start; - - if(queued === 0) { - this.trigger("renderer:locationChanged", this.currentLocationCfi); - this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi); - } - - msg.cfi = this.currentLocationCfi; //TODO: why is this cfi passed to chapterDisplayed - this.trigger("renderer:chapterDisplayed", msg); - - this.visible(true); - - deferred.resolve(this); //-- why does this return the renderer? - }.bind(this)); - - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Renderer.prototype.loaded = function(url){ - this.trigger("render:loaded", url); - // var uri = EPUBJS.core.uri(url); - // var relative = uri.path.replace(book.bookUrl, ''); - // console.log(url, uri, relative); -}; - -/** -* Reconciles the current chapters layout properies with -* the global layout properities. -* Takes: global layout settings object, chapter properties string -* Returns: Object with layout properties -*/ -EPUBJS.Renderer.prototype.reconcileLayoutSettings = function(global, chapter){ - var settings = {}; - - //-- Get the global defaults - for (var attr in global) { - if (global.hasOwnProperty(attr)){ - settings[attr] = global[attr]; - } - } - //-- Get the chapter's display type - chapter.forEach(function(prop){ - var rendition = prop.replace("rendition:", ''); - var split = rendition.indexOf("-"); - var property, value; - - if(split != -1){ - property = rendition.slice(0, split); - value = rendition.slice(split+1); - - settings[property] = value; - } - }); - return settings; -}; - -/** -* Uses the settings to determine which Layout Method is needed -* Triggers events based on the method choosen -* Takes: Layout settings object -* Returns: String of appropriate for EPUBJS.Layout function -*/ -EPUBJS.Renderer.prototype.determineLayout = function(settings){ - // Default is layout: reflowable & spread: auto - var spreads = this.determineSpreads(this.minSpreadWidth); - var layoutMethod = spreads ? "ReflowableSpreads" : "Reflowable"; - var scroll = false; - - if(settings.layout === "pre-paginated") { - layoutMethod = "Fixed"; - scroll = true; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "none") { - layoutMethod = "Reflowable"; - scroll = false; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "both") { - layoutMethod = "ReflowableSpreads"; - scroll = false; - spreads = true; - } - - this.spreads = spreads; - this.render.scroll(scroll); - this.trigger("renderer:spreads", spreads); - return layoutMethod; -}; - -// Shortcut to trigger the hook before displaying the chapter -EPUBJS.Renderer.prototype.beforeDisplay = function(callback, renderer){ - this.triggerHooks("beforeChapterDisplay", callback, this); -}; - -// Update the renderer with the information passed by the layout -EPUBJS.Renderer.prototype.updatePages = function(layout){ - this.pageMap = this.mapPage(); - // this.displayedPages = layout.displayedPages; - - if (this.spreads) { - this.displayedPages = Math.ceil(this.pageMap.length / 2); - } else { - this.displayedPages = this.pageMap.length; - } - - // this.currentChapter.pages = layout.pageCount; - this.currentChapter.pages = this.pageMap.length; - - this._q.flush(); -}; - -// Apply the layout again and jump back to the previous cfi position -EPUBJS.Renderer.prototype.reformat = function(){ - var renderer = this; - var formated, pages; - if(!this.contents) return; - - spreads = this.determineSpreads(this.minSpreadWidth); - - // Only re-layout if the spreads have switched - if(spreads != this.spreads){ - this.spreads = spreads; - this.layoutMethod = this.determineLayout(this.layoutSettings); - this.layout = new EPUBJS.Layout[this.layoutMethod](); - } - - // Reset pages - this.chapterPos = 1; - - this.render.page(this.chapterPos); - // Give the css styles time to update - // clearTimeout(this.timeoutTillCfi); - // this.timeoutTillCfi = setTimeout(function(){ - - renderer.formated = renderer.layout.format(renderer.contents, renderer.render.width, renderer.render.height, renderer.gap); - renderer.render.setPageDimensions(renderer.formated.pageWidth, renderer.formated.pageHeight); - - pages = renderer.layout.calculatePages(); - renderer.updatePages(pages); - - //-- Go to current page after formating - if(renderer.currentLocationCfi){ - renderer.gotoCfi(renderer.currentLocationCfi); - } - // renderer.timeoutTillCfi = null; - -}; - -// Hide and show the render's container . -EPUBJS.Renderer.prototype.visible = function(bool){ - if(typeof(bool) === "undefined") { - return this.element.style.visibility; - } - - if(bool === true && !this.hidden){ - this.element.style.visibility = "visible"; - }else if(bool === false){ - this.element.style.visibility = "hidden"; - } -}; - -// Remove the render element and clean up listeners -EPUBJS.Renderer.prototype.remove = function() { - if(this.render.window) { - this.render.unload(); - this.render.window.removeEventListener("resize", this.resized); - this.removeEventListeners(); - this.removeSelectionListeners(); - } - - this.container.removeChild(this.element); -}; - -//-- STYLES - -EPUBJS.Renderer.prototype.applyStyles = function(styles) { - for (var style in styles) { - this.render.setStyle(style, styles[style]); - } -}; - -EPUBJS.Renderer.prototype.setStyle = function(style, val, prefixed){ - this.render.setStyle(style, val, prefixed); -}; - -EPUBJS.Renderer.prototype.removeStyle = function(style){ - this.render.removeStyle(style); -}; - -//-- HEAD TAGS -EPUBJS.Renderer.prototype.applyHeadTags = function(headTags) { - for ( var headTag in headTags ) { - this.render.addHeadTag(headTag, headTags[headTag]); - } -}; - -//-- NAVIGATION - -EPUBJS.Renderer.prototype.page = function(pg){ - if(!this.pageMap) { - console.warn("pageMap not set, queuing"); - this._q.enqueue("page", arguments); - return true; - } - - if(pg >= 1 && pg <= this.displayedPages){ - this.chapterPos = pg; - - this.render.page(pg); - this.visibleRangeCfi = this.getVisibleRangeCfi(); - this.currentLocationCfi = this.visibleRangeCfi.start; - this.trigger("renderer:locationChanged", this.currentLocationCfi); - this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi); - - return true; - } - //-- Return false if page is greater than the total - return false; -}; - -// Short cut to find next page's cfi starting at the last visible element -/* -EPUBJS.Renderer.prototype.nextPage = function(){ - var pg = this.chapterPos + 1; - if(pg <= this.displayedPages){ - this.chapterPos = pg; - - this.render.page(pg); - - this.currentLocationCfi = this.getPageCfi(this.visibileEl); - this.trigger("renderer:locationChanged", this.currentLocationCfi); - - return true; - } - //-- Return false if page is greater than the total - return false; -}; -*/ -EPUBJS.Renderer.prototype.nextPage = function(){ - return this.page(this.chapterPos + 1); -}; - -EPUBJS.Renderer.prototype.prevPage = function(){ - return this.page(this.chapterPos - 1); -}; - -//-- Show the page containing an Element -EPUBJS.Renderer.prototype.pageByElement = function(el){ - var pg; - if(!el) return; - - pg = this.render.getPageNumberByElement(el); - this.page(pg); -}; - -// Jump to the last page of the chapter -EPUBJS.Renderer.prototype.lastPage = function(){ - if(this._moving) { - return this._q.enqueue("lastPage", arguments); - } - - this.page(this.displayedPages); -}; - -// Jump to the first page of the chapter -EPUBJS.Renderer.prototype.firstPage = function(){ - if(this._moving) { - return this._q.enqueue("firstPage", arguments); - } - - this.page(1); -}; - -//-- Find a section by fragement id -EPUBJS.Renderer.prototype.section = function(fragment){ - var el = this.doc.getElementById(fragment), - left, pg; - - if(el){ - this.pageByElement(el); - } - -}; - -EPUBJS.Renderer.prototype.firstElementisTextNode = function(node) { - var children = node.childNodes; - var leng = children.length; - - if(leng && - children[0] && // First Child - children[0].nodeType === 3 && // This is a textNodes - children[0].textContent.trim().length) { // With non whitespace or return charecters - return true; - } - return false; -}; - -EPUBJS.Renderer.prototype.isGoodNode = function(node) { - var embeddedElements = ["audio", "canvas", "embed", "iframe", "img", "math", "object", "svg", "video"]; - if (embeddedElements.indexOf(node.tagName.toLowerCase()) !== -1) { - // Embedded elements usually do not have a text node as first element, but are also good nodes - return true; - } - return this.firstElementisTextNode(node); -}; - -// Walk the node tree from a start element to next visible element -EPUBJS.Renderer.prototype.walk = function(node, x, y) { - var r, children, leng, - startNode = node, - prevNode, - stack = [startNode]; - - var STOP = 10000, ITER=0; - - while(!r && stack.length) { - node = stack.shift(); - if( this.containsPoint(node, x, y) && this.isGoodNode(node)) { - r = node; - } - - if(!r && node && node.childElementCount > 0){ - children = node.children; - if (children && children.length) { - leng = children.length ? children.length : 0; - } else { - return r; - } - for (var i = leng-1; i >= 0; i--) { - if(children[i] != prevNode) stack.unshift(children[i]); - } - } - - if(!r && stack.length === 0 && startNode && startNode.parentNode !== null){ - stack.push(startNode.parentNode); - prevNode = startNode; - startNode = startNode.parentNode; - } - - - ITER++; - if(ITER > STOP) { - console.error("ENDLESS LOOP"); - break; - } - - } - - return r; -}; - -// Checks if an element is on the screen -EPUBJS.Renderer.prototype.containsPoint = function(el, x, y){ - var rect; - var left; - if(el && typeof el.getBoundingClientRect === 'function'){ - rect = el.getBoundingClientRect(); - // console.log(el, rect, x, y); - - if( rect.width !== 0 && - rect.height !== 0 && // Element not visible - rect.left >= x && - x <= rect.left + rect.width) { - return true; - } - } - - return false; -}; - -EPUBJS.Renderer.prototype.textSprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: function (node) { - if ( ! /^\s*$/.test(node.data) ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - } - }, false); - var node; - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Renderer.prototype.sprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null, false); - var node; - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Renderer.prototype.mapPage = function(){ - var renderer = this; - var map = []; - var root = this.render.getBaseElement(); - var page = 1; - var width = this.layout.colWidth + this.layout.gap; - var offset = this.formated.pageWidth * (this.chapterPos-1); - var limit = (width * page) - offset;// (width * page) - offset; - var elLimit = 0; - var prevRange; - var cfi; - var check = function(node) { - var elPos; - var elRange; - var children = Array.prototype.slice.call(node.childNodes); - if (node.nodeType == Node.ELEMENT_NODE) { - // elPos = node.getBoundingClientRect(); - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - - if(!elPos || (elPos.width === 0 && elPos.height === 0)) { - return; - } - - //-- Element starts new Col - if(elPos.left > elLimit) { - children.forEach(function(node){ - if(node.nodeType == Node.TEXT_NODE && - node.textContent.trim().length) { - checkText(node); - } - }); - } - - //-- Element Spans new Col - if(elPos.right > elLimit) { - children.forEach(function(node){ - if(node.nodeType == Node.TEXT_NODE && - node.textContent.trim().length) { - checkText(node); - } - }); - } - } - - }; - var checkText = function(node){ - var ranges = renderer.splitTextNodeIntoWordsRanges(node); - ranges.forEach(function(range){ - var pos = range.getBoundingClientRect(); - - if(!pos || (pos.width === 0 && pos.height === 0)) { - return; - } - if(pos.left + pos.width < limit) { - if(!map[page-1]){ - range.collapse(true); - cfi = renderer.currentChapter.cfiFromRange(range); - // map[page-1].start = cfi; - map.push({ start: cfi, end: null }); - } - } else { - if(prevRange){ - prevRange.collapse(true); - cfi = renderer.currentChapter.cfiFromRange(prevRange); - map[map.length-1].end = cfi; - } - - range.collapse(true); - cfi = renderer.currentChapter.cfiFromRange(range); - map.push({ - start: cfi, - end: null - }); - - page += 1; - limit = (width * page) - offset; - elLimit = limit; - } - - prevRange = range; - }); - - - }; - var docEl = this.render.getDocumentElement(); - var dir = docEl.dir; - - // Set back to ltr before sprinting to get correct order - if(dir == "rtl") { - docEl.dir = "ltr"; - docEl.style.position = "static"; - } - - this.sprint(root, check); - - // Reset back to previous RTL settings - if(dir == "rtl") { - docEl.dir = dir; - docEl.style.left = "auto"; - docEl.style.right = "0"; - } - - // this.textSprint(root, checkText); - - if(prevRange){ - prevRange.collapse(true); - - cfi = renderer.currentChapter.cfiFromRange(prevRange); - map[map.length-1].end = cfi; - } - - // Handle empty map - if(!map.length) { - range = this.doc.createRange(); - range.selectNodeContents(root); - range.collapse(true); - - cfi = renderer.currentChapter.cfiFromRange(range); - - map.push({ start: cfi, end: cfi }); - - } - - // clean up - prevRange = null; - ranges = null; - range = null; - root = null; - - return map; -}; - - -EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) { - var whiteCharacters = "\x2D\x20\t\r\n\b\f"; - // '-' \x2D - // ' ' \x20 - - if (! startPosition) { - startPosition = 0; - } - - for (var i = startPosition; i < text.length; i++) { - if (whiteCharacters.indexOf(text.charAt(i)) != -1) { - return i; - } - } - - return -1; -}; - - -EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ - var ranges = []; - var text = node.textContent.trim(); - var range; - var rect; - var list; - // jaroslaw.bielski@7bulls.com - // Usage of indexOf() function for space character as word delimiter - // is not sufficient in case of other breakable characters like \r\n- etc - pos = this.indexOfBreakableChar(text); - - if(pos === -1) { - range = this.doc.createRange(); - range.selectNodeContents(node); - return [range]; - } - - range = this.doc.createRange(); - range.setStart(node, 0); - range.setEnd(node, pos); - ranges.push(range); - - // jaroslaw.bielski@7bulls.com - // there was a word miss in case of one letter words - range = this.doc.createRange(); - range.setStart(node, pos+1); - - while ( pos != -1 ) { - - pos = this.indexOfBreakableChar(text, pos + 1); - if(pos > 0) { - - if(range) { - range.setEnd(node, pos); - ranges.push(range); - } - - range = this.doc.createRange(); - range.setStart(node, pos+1); - } - } - - if(range) { - range.setEnd(node, text.length); - ranges.push(range); - } - - return ranges; -}; - -EPUBJS.Renderer.prototype.rangePosition = function(range){ - var rect; - var list; - - list = range.getClientRects(); - - if(list.length) { - rect = list[0]; - return rect; - } - - return null; -}; - -/* -// Get the cfi of the current page -EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){ - var range = this.doc.createRange(); - var position; - // TODO : this might need to take margin / padding into account? - var x = 1;//this.formated.pageWidth/2; - var y = 1;//;this.formated.pageHeight/2; - - range = this.getRange(x, y); - - // var test = this.doc.defaultView.getSelection(); - // var r = this.doc.createRange(); - // test.removeAllRanges(); - // r.setStart(range.startContainer, range.startOffset); - // r.setEnd(range.startContainer, range.startOffset + 1); - // test.addRange(r); - - return this.currentChapter.cfiFromRange(range); -}; -*/ - -// Get the cfi of the current page -EPUBJS.Renderer.prototype.getPageCfi = function(){ - var pg; - if (this.spreads) { - pg = this.chapterPos*2; - startRange = this.pageMap[pg-2]; - } else { - pg = this.chapterPos; - startRange = this.pageMap[pg-1]; - } - return this.pageMap[(this.chapterPos * 2) -1].start; -}; - -EPUBJS.Renderer.prototype.getRange = function(x, y, forceElement){ - var range = this.doc.createRange(); - var position; - forceElement = true; // temp override - if(typeof document.caretPositionFromPoint !== "undefined" && !forceElement){ - position = this.doc.caretPositionFromPoint(x, y); - range.setStart(position.offsetNode, position.offset); - } else if(typeof document.caretRangeFromPoint !== "undefined" && !forceElement){ - range = this.doc.caretRangeFromPoint(x, y); - } else { - this.visibileEl = this.findElementAfter(x, y); - range.setStart(this.visibileEl, 1); - } - - // var test = this.doc.defaultView.getSelection(); - // var r = this.doc.createRange(); - // test.removeAllRanges(); - // r.setStart(range.startContainer, range.startOffset); - // r.setEnd(range.startContainer, range.startOffset + 1); - // test.addRange(r); - return range; -}; - -/* -EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){ - var startX = 0; - var startY = 0; - var endX = this.width-1; - var endY = this.height-1; - var startRange = this.getRange(startX, startY); - var endRange = this.getRange(endX, endY); //fix if carret not avail - var startCfi = this.currentChapter.cfiFromRange(startRange); - var endCfi; - if(endRange) { - endCfi = this.currentChapter.cfiFromRange(endRange); - } - - return { - start: startCfi, - end: endCfi || false - }; -}; -*/ - -EPUBJS.Renderer.prototype.pagesInCurrentChapter = function() { - var pgs; - var length; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - length = this.pageMap.length; - - if(this.spreads){ - pgs = Math.ceil(length / 2); - } else { - pgs = length; - } - - return pgs; -}; - -EPUBJS.Renderer.prototype.currentRenderedPage = function(){ - var pg; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - if (this.spreads && this.layout.pageCount > 1) { - pg = this.chapterPos*2; - } else { - pg = this.chapterPos; - } - - return pg; -}; - -EPUBJS.Renderer.prototype.getRenderedPagesLeft = function(){ - var pg; - var lastPage; - var pagesLeft; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - lastPage = this.pageMap.length; - - if (this.spreads) { - pg = this.chapterPos*2; - } else { - pg = this.chapterPos; - } - - pagesLeft = lastPage - pg; - return pagesLeft; - -}; - -EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(){ - var pg; - var startRange, endRange; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - if (this.spreads) { - pg = this.chapterPos*2; - startRange = this.pageMap[pg-2]; - endRange = startRange; - - if(this.layout.pageCount > 1) { - endRange = this.pageMap[pg-1]; - } - } else { - pg = this.chapterPos; - startRange = this.pageMap[pg-1]; - endRange = startRange; - } - - if(!startRange) { - console.warn("page range miss:", pg, this.pageMap); - startRange = this.pageMap[this.pageMap.length-1]; - endRange = startRange; - } - - return { - start: startRange.start, - end: endRange.end - }; -}; - -// Goto a cfi position in the current chapter -EPUBJS.Renderer.prototype.gotoCfi = function(cfi){ - var pg; - var marker; - var range; - - if(this._moving){ - return this._q.enqueue("gotoCfi", arguments); - } - - if(_.isString(cfi)){ - cfi = this.epubcfi.parse(cfi); - } - - if(typeof document.evaluate === 'undefined') { - marker = this.epubcfi.addMarker(cfi, this.doc); - if(marker) { - pg = this.render.getPageNumberByElement(marker); - // Must Clean up Marker before going to page - this.epubcfi.removeMarker(marker, this.doc); - this.page(pg); - } - } else { - range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); - if(range) { - // jaroslaw.bielski@7bulls.com - // It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter. - // It is always reproductible if few consecutive chapters have only one page. - // NOTE: This is only workaround and the issue needs an deeper investigation. - // NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T). - var rect = range.getBoundingClientRect(); - if (rect) { - pg = this.render.getPageNumberByRect(rect); - - } else { - // Goto first page in chapter - pg = 1; - } - - this.page(pg); - - // Reset the current location cfi to requested cfi - this.currentLocationCfi = cfi.str; - } - } -}; - -// Walk nodes until a visible element is found -EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ - var el = startEl || this.render.getBaseElement(); - var found; - // kgolunski@7bulls.com - // Looks like an old API usage - // Set x and y as 0 to fullfill walk method API. - found = this.walk(el, 0, 0); - - if(found) { - return found; - }else{ - return startEl; - } - -}; -// TODO: remove me - unsused -EPUBJS.Renderer.prototype.findElementAfter = function(x, y, startEl){ - var el = startEl || this.render.getBaseElement(); - var found; - found = this.walk(el, x, y); - if(found) { - return found; - }else{ - return el; - } - -}; - -/* -EPUBJS.Renderer.prototype.route = function(hash, callback){ - var location = window.location.hash.replace('#/', ''); - if(this.useHash && location.length && location != this.prevLocation){ - this.show(location, callback); - this.prevLocation = location; - return true; - } - return false; -} - -EPUBJS.Renderer.prototype.hideHashChanges = function(){ - this.useHash = false; -} - -*/ - -EPUBJS.Renderer.prototype.resize = function(width, height, setSize){ - var spreads; - - this.width = width; - this.height = height; - - if(setSize !== false) { - this.render.resize(this.width, this.height); - } - - - - if(this.contents){ - this.reformat(); - } - - this.trigger("renderer:resized", { - width: this.width, - height: this.height - }); -}; - -//-- Listeners for events in the frame - -EPUBJS.Renderer.prototype.onResized = function(e) { - var width = this.container.clientWidth; - var height = this.container.clientHeight; - - this.resize(width, height, false); -}; - -EPUBJS.Renderer.prototype.addEventListeners = function(){ - if(!this.render.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.render.document.addEventListener(eventName, this.triggerEvent.bind(this), false); - }, this); - -}; - -EPUBJS.Renderer.prototype.removeEventListeners = function(){ - if(!this.render.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.render.document.removeEventListener(eventName, this.triggerEvent, false); - }, this); - -}; - -// Pass browser events -EPUBJS.Renderer.prototype.triggerEvent = function(e){ - this.trigger("renderer:"+e.type, e); -}; - -EPUBJS.Renderer.prototype.addSelectionListeners = function(){ - this.render.document.addEventListener("selectionchange", this.onSelectionChange.bind(this), false); -}; - -EPUBJS.Renderer.prototype.removeSelectionListeners = function(){ - if(!this.render.document) { - return; - } - this.doc.removeEventListener("selectionchange", this.onSelectionChange, false); -}; - -EPUBJS.Renderer.prototype.onSelectionChange = function(e){ - if (this.selectionEndTimeout) { - clearTimeout(this.selectionEndTimeout); - } - this.selectionEndTimeout = setTimeout(function() { - this.selectedRange = this.render.window.getSelection(); - this.trigger("renderer:selected", this.selectedRange); - }.bind(this), 500); -}; - - -//-- Spreads - -EPUBJS.Renderer.prototype.setMinSpreadWidth = function(width){ - this.minSpreadWidth = width; - this.spreads = this.determineSpreads(width); -}; - -EPUBJS.Renderer.prototype.determineSpreads = function(cutoff){ - if(this.isForcedSingle || !cutoff || this.width < cutoff) { - return false; //-- Single Page - }else{ - return true; //-- Double Page - } -}; - -EPUBJS.Renderer.prototype.forceSingle = function(bool){ - if(bool) { - this.isForcedSingle = true; - // this.spreads = false; - } else { - this.isForcedSingle = false; - // this.spreads = this.determineSpreads(this.minSpreadWidth); - } -}; - -EPUBJS.Renderer.prototype.setGap = function(gap){ - this.gap = gap; //-- False == auto gap -}; - -EPUBJS.Renderer.prototype.setDirection = function(direction){ - this.direction = direction; - this.render.setDirection(this.direction); -}; - -//-- Content Replacements - -EPUBJS.Renderer.prototype.replace = function(query, func, finished, progress){ - var items = this.contents.querySelectorAll(query), - resources = Array.prototype.slice.call(items), - count = resources.length; - - - if(count === 0) { - finished(false); - return; - } - resources.forEach(function(item){ - var called = false; - var after = function(result, full){ - if(called === false) { - count--; - if(progress) progress(result, full, count); - if(count <= 0 && finished) finished(true); - called = true; - } - }; - - func(item, after); - - }.bind(this)); - -}; - -/* Moved to chapter - -EPUBJS.Renderer.prototype.replaceWithStored = function(query, attr, func, callback) { - var _oldUrls, - _newUrls = {}, - _store = this.currentChapter.store, - _cache = this.caches[query], - _uri = EPUBJS.core.uri(this.currentChapter.absolute), - _chapterBase = _uri.base, - _attr = attr, - _wait = 5, - progress = function(url, full, count) { - _newUrls[full] = url; - }, - finished = function(notempty) { - if(callback) callback(); - - _.each(_oldUrls, function(url){ - _store.revokeUrl(url); - }); - - _cache = _newUrls; - }; - - if(!_store) return; - - if(!_cache) _cache = {}; - _oldUrls = _.clone(_cache); - - this.replace(query, function(link, done){ - var src = link.getAttribute(_attr), - full = EPUBJS.core.resolveUrl(_chapterBase, src); - - var replaceUrl = function(url) { - var timeout; - link.onload = function(){ - clearTimeout(timeout); - done(url, full); - }; - - link.onerror = function(e){ - clearTimeout(timeout); - done(url, full); - console.error(e); - }; - - if(query == "image") { - //-- SVG needs this to trigger a load event - link.setAttribute("externalResourcesRequired", "true"); - } - - if(query == "link[href]" && link.getAttribute("rel") !== "stylesheet") { - //-- Only Stylesheet links seem to have a load events, just continue others - done(url, full); - } else { - timeout = setTimeout(function(){ - done(url, full); - }, _wait); - } - - link.setAttribute(_attr, url); - - - - }; - - if(full in _oldUrls){ - replaceUrl(_oldUrls[full]); - _newUrls[full] = _oldUrls[full]; - delete _oldUrls[full]; - }else{ - func(_store, full, replaceUrl, link); - } - - }, finished, progress); -}; -*/ - -//-- Enable binding events to Renderer -RSVP.EventTarget.mixin(EPUBJS.Renderer.prototype); - -var EPUBJS = EPUBJS || {}; -EPUBJS.replace = {}; - -//-- Replaces the relative links within the book to use our internal page changer -EPUBJS.replace.hrefs = function(callback, renderer){ - var book = this; - var replacments = function(link, done){ - var href = link.getAttribute("href"), - isRelative = href.search("://"), - directory, - relative, - location; - - if(isRelative != -1){ - - link.setAttribute("target", "_blank"); - - }else{ - // Links may need to be resolved, such as ../chp1.xhtml - var uri = EPUBJS.core.uri(renderer.render.window.location.href); - - directory = uri.directory; - - if(directory) { - // We must ensure that the file:// protocol is preserved for - // local file links, as in certain contexts (such as under - // Titanium), file links without the file:// protocol will not - // work - if (uri.protocol === "file") { - relative = EPUBJS.core.resolveUrl(uri.base, href); - } else { - relative = EPUBJS.core.resolveUrl(directory, href); - } - } else { - relative = href; - } - - link.onclick = function(){ - book.goto(relative); - return false; - }; - - } - done(); - - }; - - renderer.replace("a[href]", replacments, callback); - -}; - -EPUBJS.replace.head = function(callback, renderer) { - - renderer.replaceWithStored("link[href]", "href", EPUBJS.replace.links, callback); - -}; - - -//-- Replaces assets src's to point to stored version if browser is offline -EPUBJS.replace.resources = function(callback, renderer){ - //srcs = this.doc.querySelectorAll('[src]'); - renderer.replaceWithStored("[src]", "src", EPUBJS.replace.srcs, callback); - -}; - -EPUBJS.replace.svg = function(callback, renderer) { - - renderer.replaceWithStored("image", "xlink:href", function(_store, full, done){ - _store.getUrl(full).then(done); - }, callback); - -}; - -EPUBJS.replace.srcs = function(_store, full, done){ - - _store.getUrl(full).then(done); - -}; - -//-- Replaces links in head, such as stylesheets - link[href] -EPUBJS.replace.links = function(_store, full, done, link){ - //-- Handle replacing urls in CSS - if(link.getAttribute("rel") === "stylesheet") { - EPUBJS.replace.stylesheets(_store, full).then(function(url, full){ - // done - done(url, full); - }, function(reason) { - // we were unable to replace the style sheets - done(null); - }); - }else{ - _store.getUrl(full).then(done, function(reason) { - // we were unable to get the url, signal to upper layer - done(null); - }); - } -}; - -EPUBJS.replace.stylesheets = function(_store, full) { - var deferred = new RSVP.defer(); - - if(!_store) return; - - _store.getText(full).then(function(text){ - var url; - - EPUBJS.replace.cssUrls(_store, full, text).then(function(newText){ - var _URL = window.URL || window.webkitURL || window.mozURL; - - var blob = new Blob([newText], { "type" : "text\/css" }), - url = _URL.createObjectURL(blob); - - deferred.resolve(url); - - }, function(reason) { - deferred.reject(reason); - }); - - }, function(reason) { - deferred.reject(reason); - }); - - return deferred.promise; -}; - -EPUBJS.replace.cssUrls = function(_store, base, text){ - var deferred = new RSVP.defer(), - promises = [], - matches = text.match(/url\(\'?\"?([^\'|^\"^\)]*)\'?\"?\)/g); - - if(!_store) return; - - if(!matches){ - deferred.resolve(text); - return deferred.promise; - } - - matches.forEach(function(str){ - var full = EPUBJS.core.resolveUrl(base, str.replace(/url\(|[|\)|\'|\"]/g, '')); - var replaced = _store.getUrl(full).then(function(url){ - text = text.replace(str, 'url("'+url+'")'); - }, function(reason) { - deferred.reject(reason); - }); - - promises.push(replaced); - }); - - RSVP.all(promises).then(function(){ - deferred.resolve(text); - }); - - return deferred.promise; -}; - - -EPUBJS.Storage = function(withCredentials){ - - this.checkRequirements(); - this.urlCache = {}; - this.withCredentials = withCredentials; - this.URL = window.URL || window.webkitURL || window.mozURL; - this.offline = false; -}; - -//-- Load the zip lib and set the workerScriptsPath -EPUBJS.Storage.prototype.checkRequirements = function(callback){ - if(typeof(localforage) == "undefined") console.error("localForage library not loaded"); -}; - -EPUBJS.Storage.prototype.put = function(assets, store) { - var deferred = new RSVP.defer(); - var count = assets.length; - var current = 0; - var next = function(deferred){ - var done = deferred || new RSVP.defer(); - var url; - var encodedUrl; - - if(current >= count) { - done.resolve(); - } else { - url = assets[current].url; - encodedUrl = window.encodeURIComponent(url); - - EPUBJS.core.request(url, "binary") - .then(function (data) { - return localforage.setItem(encodedUrl, data); - }) - .then(function(data){ - current++; - // Load up the next - setTimeout(function(){ - next(done); - }, 1); - - }); - } - return done.promise; - }.bind(this); - - if(!Array.isArray(assets)) { - assets = [assets]; - } - - next().then(function(){ - deferred.resolve(); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Storage.prototype.token = function(url, value){ - var encodedUrl = window.encodeURIComponent(url); - return localforage.setItem(encodedUrl, value) - .then(function (result) { - if (result === null) { - return false; - } else { - return true; - } - }); -}; - -EPUBJS.Storage.prototype.isStored = function(url){ - var encodedUrl = window.encodeURIComponent(url); - return localforage.getItem(encodedUrl) - .then(function (result) { - if (result === null) { - return false; - } else { - return true; - } - }); -}; - -EPUBJS.Storage.prototype.getText = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return buffer; - }.bind(this)) - .then(function(data) { - var deferred = new RSVP.defer(); - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - deferred.resolve(reader.result); - }); - reader.readAsText(blob, mimeType); - return deferred.promise; - }) - .catch(function() { - - var deferred = new RSVP.defer(); - var entry = localforage.getItem(encodedUrl); - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - deferred.resolve(reader.result); - }); - reader.readAsText(blob, mimeType); - }); - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.getUrl = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return url; - }.bind(this)) - .catch(function() { - var deferred = new RSVP.defer(); - var entry; - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(encodedUrl in this.urlCache) { - deferred.resolve(this.urlCache[encodedUrl]); - return deferred.promise; - } - - entry = localforage.getItem(encodedUrl); - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var blob = new Blob([data], {type : EPUBJS.core.getMimeType(url)}); - tempUrl = _URL.createObjectURL(blob); - deferred.resolve(tempUrl); - this.urlCache[encodedUrl] = tempUrl; - }.bind(this)); - - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.getXml = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return buffer; - }.bind(this)) - .then(function(data) { - var deferred = new RSVP.defer(); - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - var parser = new DOMParser(); - var doc = parser.parseFromString(reader.result, "text/xml"); - deferred.resolve(doc); - }); - reader.readAsText(blob, mimeType); - return deferred.promise; - }) - .catch(function() { - var deferred = new RSVP.defer(); - var entry = localforage.getItem(encodedUrl); - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - var parser = new DOMParser(); - var doc = parser.parseFromString(reader.result, "text/xml"); - deferred.resolve(doc); - }); - reader.readAsText(blob, mimeType); - }); - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.revokeUrl = function(url){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var fromCache = this.urlCache[url]; - if(fromCache) _URL.revokeObjectURL(fromCache); -}; - -EPUBJS.Storage.prototype.failed = function(error){ - console.error(error); -}; - -RSVP.EventTarget.mixin(EPUBJS.Storage.prototype); - -EPUBJS.Unarchiver = function(url){ - - this.checkRequirements(); - this.urlCache = {}; - -}; - -//-- Load the zip lib and set the workerScriptsPath -EPUBJS.Unarchiver.prototype.checkRequirements = function(callback){ - if(typeof(JSZip) == "undefined") console.error("JSZip lib not loaded"); -}; - -EPUBJS.Unarchiver.prototype.open = function(zipUrl, callback){ - var deferred = new RSVP.defer(); - - return EPUBJS.core.request(zipUrl, "binary").then(function(data){ - this.zip = new JSZip(data); - }.bind(this)); -}; - -EPUBJS.Unarchiver.prototype.getXml = function(url, encoding){ - var decodededUrl = window.decodeURIComponent(url); - return this.getText(decodededUrl, encoding). - then(function(text){ - var parser = new DOMParser(); - return parser.parseFromString(text, "text/xml"); - }); - -}; - -EPUBJS.Unarchiver.prototype.getUrl = function(url, mime){ - var unarchiver = this; - var deferred = new RSVP.defer(); - var decodededUrl = window.decodeURIComponent(url); - var entry = this.zip.file(decodededUrl); - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - var blob; - - if(!entry) { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - if(url in this.urlCache) { - deferred.resolve(this.urlCache[url]); - return deferred.promise; - } - - blob = new Blob([entry.asUint8Array()], {type : EPUBJS.core.getMimeType(entry.name)}); - - tempUrl = _URL.createObjectURL(blob); - deferred.resolve(tempUrl); - unarchiver.urlCache[url] = tempUrl; - - return deferred.promise; -}; - -EPUBJS.Unarchiver.prototype.getText = function(url, encoding){ - var unarchiver = this; - var deferred = new RSVP.defer(); - var decodededUrl = window.decodeURIComponent(url); - var entry = this.zip.file(decodededUrl); - var text; - - if(!entry) { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - text = entry.asText(); - deferred.resolve(text); - - return deferred.promise; -}; - -EPUBJS.Unarchiver.prototype.revokeUrl = function(url){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var fromCache = this.urlCache[url]; - if(fromCache) _URL.revokeObjectURL(fromCache); -}; - -EPUBJS.Unarchiver.prototype.failed = function(error){ - console.error(error); -}; - -EPUBJS.Unarchiver.prototype.afterSaved = function(error){ - this.callback(); -}; - -EPUBJS.Unarchiver.prototype.toStorage = function(entries){ - var timeout = 0, - delay = 20, - that = this, - count = entries.length; - - function callback(){ - count--; - if(count === 0) that.afterSaved(); - } - - entries.forEach(function(entry){ - - setTimeout(function(entry){ - that.saveEntryFileToStorage(entry, callback); - }, timeout, entry); - - timeout += delay; - }); - - console.log("time", timeout); - - //entries.forEach(this.saveEntryFileToStorage.bind(this)); -}; - -// EPUBJS.Unarchiver.prototype.saveEntryFileToStorage = function(entry, callback){ -// var that = this; -// entry.getData(new zip.BlobWriter(), function(blob) { -// EPUBJS.storage.save(entry.filename, blob, callback); -// }); -// }; - -//# sourceMappingURL=epub.js.map \ No newline at end of file diff --git a/reader/js/hooks.js.map b/reader/js/hooks.js.map deleted file mode 100644 index 933ee4b..0000000 --- a/reader/js/hooks.js.map +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 3, - "file": "reader.js", - "sources": [ - "reader_src/reader.js", - "reader_src/controllers/bookmarks_controller.js", - "reader_src/controllers/controls_controller.js", - "reader_src/controllers/meta_controller.js", - "reader_src/controllers/notes_controller.js", - "reader_src/controllers/reader_controller.js", - "reader_src/controllers/settings_controller.js", - "reader_src/controllers/sidebar_controller.js", - "reader_src/controllers/toc_controller.js" - ], - "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gD;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA" -} \ No newline at end of file diff --git a/reader/js/hooks.min.js b/reader/js/hooks.min.js deleted file mode 100644 index 33049a9..0000000 --- a/reader/js/hooks.min.js +++ /dev/null @@ -1,2 +0,0 @@ -EPUBJS.Hooks.register("beforeChapterDisplay").endnotes=function(a,b){var c=b.contents.querySelectorAll("a[href]"),d=Array.prototype.slice.call(c),e="epub:type",f="noteref",g=EPUBJS.core.folder(location.pathname),h=g+EPUBJS.cssPath||g,i={};EPUBJS.core.addCss(h+"popup.css",!1,b.render.document.head),d.forEach(function(a){function c(){var c,e,f=b.height,j=b.width,p=225;o||(c=l.cloneNode(!0),o=c.querySelector("p")),i[k]||(i[k]=document.createElement("div"),i[k].setAttribute("class","popup"),pop_content=document.createElement("div"),i[k].appendChild(pop_content),pop_content.appendChild(o),pop_content.setAttribute("class","pop_content"),b.render.document.body.appendChild(i[k]),i[k].addEventListener("mouseover",d,!1),i[k].addEventListener("mouseout",g,!1),b.on("renderer:pageChanged",h,this),b.on("renderer:pageChanged",g,this)),c=i[k],e=a.getBoundingClientRect(),m=e.left,n=e.top,c.classList.add("show"),popRect=c.getBoundingClientRect(),c.style.left=m-popRect.width/2+"px",c.style.top=n+"px",p>f/2.5&&(p=f/2.5,pop_content.style.maxHeight=p+"px"),popRect.height+n>=f-25?(c.style.top=n-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),m-popRect.width<=0?(c.style.left=m+"px",c.classList.add("left")):c.classList.remove("left"),m+popRect.width/2>=j?(c.style.left=m-300+"px",popRect=c.getBoundingClientRect(),c.style.left=m-popRect.width+"px",popRect.height+n>=f-25?(c.style.top=n-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),c.classList.add("right")):c.classList.remove("right")}function d(){i[k].classList.add("on")}function g(){i[k].classList.remove("on")}function h(){setTimeout(function(){i[k].classList.remove("show")},100)}var j,k,l,m,n,o,p=a.getAttribute(e);p==f&&(j=a.getAttribute("href"),k=j.replace("#",""),l=b.render.document.getElementById(k),a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",h,!1))}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").mathml=function(a,b){if(-1!==b.currentChapter.manifestProperties.indexOf("mathml")){b.iframe.contentWindow.mathmlCallback=a;var c=document.createElement("script");c.type="text/x-mathjax-config",c.innerHTML=' MathJax.Hub.Register.StartupHook("End",function () { window.mathmlCallback(); }); MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); ',b.doc.body.appendChild(c),EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML",null,b.doc.head)}else a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").smartimages=function(a,b){var c=b.contents.querySelectorAll("img"),d=Array.prototype.slice.call(c),e=b.height;return"reflowable"!=b.layoutSettings.layout?void a():(d.forEach(function(a){function c(){var c,d=a.getBoundingClientRect(),f=d.height,g=d.top,h=a.getAttribute("data-height"),i=h||f,j=Number(getComputedStyle(a,"").fontSize.match(/(\d*(\.\d*)?)px/)[1]),k=j?j/2:0;e=b.contents.clientHeight,0>g&&(g=0),i+g>=e?(e/2>g?(c=e-g-k,a.style.maxHeight=c+"px",a.style.width="auto"):(i>e&&(a.style.maxHeight=e+"px",a.style.width="auto",d=a.getBoundingClientRect(),i=d.height),a.style.display="block",a.style.WebkitColumnBreakBefore="always",a.style.breakBefore="column"),a.setAttribute("data-height",c)):(a.style.removeProperty("max-height"),a.style.removeProperty("margin-top"))}a.addEventListener("load",c,!1),b.on("renderer:resized",c),b.on("renderer:chapterUnloaded",function(){a.removeEventListener("load",c),b.off("renderer:resized",c)}),c()}),void(a&&a()))},EPUBJS.Hooks.register("beforeChapterDisplay").transculsions=function(a,b){var c=b.contents.querySelectorAll("[transclusion]"),d=Array.prototype.slice.call(c);d.forEach(function(a){function c(){j=g,k=h,j>chapter.colWidth&&(d=chapter.colWidth/j,j=chapter.colWidth,k*=d),f.width=j,f.height=k}var d,e=a.getAttribute("ref"),f=document.createElement("iframe"),g=a.getAttribute("width"),h=a.getAttribute("height"),i=a.parentNode,j=g,k=h;c(),b.listenUntil("renderer:resized","renderer:chapterUnloaded",c),f.src=e,i.replaceChild(f,a)}),a&&a()}; -//# sourceMappingURL=hooks.min.map \ No newline at end of file diff --git a/reader/js/hooks/extensions/highlight.js b/reader/js/hooks/extensions/highlight.js deleted file mode 100644 index 1dd1c67..0000000 --- a/reader/js/hooks/extensions/highlight.js +++ /dev/null @@ -1,14 +0,0 @@ -EPUBJS.Hooks.register("beforeChapterDisplay").highlight = function(callback, renderer){ - - // EPUBJS.core.addScript("js/libs/jquery.highlight.js", null, renderer.doc.head); - - var s = document.createElement("style"); - s.innerHTML =".highlight { background: yellow; font-weight: normal; }"; - - renderer.render.document.head.appendChild(s); - - if(callback) callback(); - -} - - diff --git a/reader/js/libs/fileStorage.min.js b/reader/js/libs/fileStorage.min.js deleted file mode 100644 index 6fc082b..0000000 --- a/reader/js/libs/fileStorage.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! fileStorage - v0.1.0 - 2013-03-28 */var fileStorage = fileStorage || {}; -fileStorage.core=fileStorage.core||{},fileStorage.core.dataURLToBlob=function(e){var t=";base64,";if(e.indexOf(t)==-1){var n=e.split(","),r=n[0].split(":")[1],i=n[1];return new Blob([i],{type:r})}var n=e.split(t),r=n[0].split(":")[1],i=window.atob(n[1]),s=i.length,o=new Uint8Array(s);for(var u=0;ua?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=o.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return o.each(this,a,b)},map:function(a){return this.pushStack(o.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},o.extend=o.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||o.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},g[b]=o.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},o.extend({expando:"jQuery"+(n+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isPlainObject:function(a){if("object"!==o.type(a)||a.nodeType||o.isWindow(a))return!1;try{if(a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}return!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=o.trim(a),a&&(1===a.indexOf("use strict")?(b=m.createElement("script"),b.text=a,m.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":k.call(a)},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?o.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),o.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||o.guid++,f):void 0},now:Date.now,support:l}),o.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=o.type(a);return"function"===c||o.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);o.find=t,o.expr=t.selectors,o.expr[":"]=o.expr.pseudos,o.unique=t.uniqueSort,o.text=t.getText,o.isXMLDoc=t.isXML,o.contains=t.contains;var u=o.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(o.isFunction(b))return o.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return o.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return o.filter(b,a,c);b=o.filter(b,a)}return o.grep(a,function(a){return g.call(b,a)>=0!==c})}o.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?o.find.matchesSelector(d,a)?[d]:[]:o.find.matches(a,o.grep(b,function(a){return 1===a.nodeType}))},o.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(o(a).filter(function(){for(b=0;c>b;b++)if(o.contains(e[b],this))return!0}));for(b=0;c>b;b++)o.find(a,e[b],d);return d=this.pushStack(c>1?o.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?o(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=o.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof o?b[0]:b,o.merge(this,o.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:m,!0)),v.test(c[1])&&o.isPlainObject(b))for(c in b)o.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=m.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=m,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):o.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(o):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),o.makeArray(a,this))};A.prototype=o.fn,y=o(m);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};o.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&o(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),o.fn.extend({has:function(a){var b=o(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(o.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?o(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&o.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?o.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(o(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(o.unique(o.merge(this.get(),o(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}o.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return o.dir(a,"parentNode")},parentsUntil:function(a,b,c){return o.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return o.dir(a,"nextSibling")},prevAll:function(a){return o.dir(a,"previousSibling")},nextUntil:function(a,b,c){return o.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return o.dir(a,"previousSibling",c)},siblings:function(a){return o.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return o.sibling(a.firstChild)},contents:function(a){return a.contentDocument||o.merge([],a.childNodes)}},function(a,b){o.fn[a]=function(c,d){var e=o.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=o.filter(d,e)),this.length>1&&(C[a]||o.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return o.each(a.match(E)||[],function(a,c){b[c]=!0}),b}o.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):o.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){o.each(b,function(b,c){var d=o.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&o.each(arguments,function(a,b){var c;while((c=o.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?o.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},o.extend({Deferred:function(a){var b=[["resolve","done",o.Callbacks("once memory"),"resolved"],["reject","fail",o.Callbacks("once memory"),"rejected"],["notify","progress",o.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return o.Deferred(function(c){o.each(b,function(b,f){var g=o.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&o.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?o.extend(a,d):d}},e={};return d.pipe=d.then,o.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&o.isFunction(a.promise)?e:0,g=1===f?a:o.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&o.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;o.fn.ready=function(a){return o.ready.promise().done(a),this},o.extend({isReady:!1,readyWait:1,holdReady:function(a){a?o.readyWait++:o.ready(!0)},ready:function(a){(a===!0?--o.readyWait:o.isReady)||(o.isReady=!0,a!==!0&&--o.readyWait>0||(H.resolveWith(m,[o]),o.fn.trigger&&o(m).trigger("ready").off("ready")))}});function I(){m.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),o.ready()}o.ready.promise=function(b){return H||(H=o.Deferred(),"complete"===m.readyState?setTimeout(o.ready):(m.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},o.ready.promise();var J=o.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===o.type(c)){e=!0;for(h in c)o.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,o.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(o(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};o.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=o.expando+Math.random()}K.uid=1,K.accepts=o.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,o.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(o.isEmptyObject(f))o.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,o.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{o.isArray(b)?d=b.concat(b.map(o.camelCase)):(e=o.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!o.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?o.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}o.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),o.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length; -while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=o.camelCase(d.slice(5)),P(f,d,e[d]));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=o.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),o.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||o.isArray(c)?d=L.access(a,b,o.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=o.queue(a,b),d=c.length,e=c.shift(),f=o._queueHooks(a,b),g=function(){o.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:o.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),o.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";l.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return m.activeElement}catch(a){}}o.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=o.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof o!==U&&o.event.triggered!==b.type?o.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n&&(l=o.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=o.event.special[n]||{},k=o.extend({type:n,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&o.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),o.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n){l=o.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||o.removeEvent(a,n,r.handle),delete i[n])}else for(n in i)o.event.remove(a,n+b[j],c,d,!0);o.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,p=[d||m],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||m,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+o.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[o.expando]?b:new o.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:o.makeArray(c,[b]),n=o.event.special[q]||{},e||!n.trigger||n.trigger.apply(d,c)!==!1)){if(!e&&!n.noBubble&&!o.isWindow(d)){for(i=n.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||m)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:n.bindType||q,l=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),l&&l.apply(g,c),l=k&&g[k],l&&l.apply&&o.acceptData(g)&&(b.result=l.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||n._default&&n._default.apply(p.pop(),c)!==!1||!o.acceptData(d)||k&&o.isFunction(d[q])&&!o.isWindow(d)&&(h=d[k],h&&(d[k]=null),o.event.triggered=q,d[q](),o.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=o.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=o.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=o.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((o.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?o(e,this).index(i)>=0:o.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return o.nodeName(a,"table")&&o.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)o.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=o.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&o.nodeName(a,b)?o.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}o.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=o.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||o.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===o.type(e))o.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;o.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===o.inArray(e,d))&&(i=o.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f,g,h=o.event.special,i=0;void 0!==(c=a[i]);i++){if(o.acceptData(c)&&(f=c[L.expando],f&&(b=L.cache[f]))){if(d=Object.keys(b.events||{}),d.length)for(g=0;void 0!==(e=d[g]);g++)h[e]?o.event.remove(c,e):o.removeEvent(c,e,b.handle);L.cache[f]&&delete L.cache[f]}delete M.cache[c[M.expando]]}}}),o.fn.extend({text:function(a){return J(this,function(a){return void 0===a?o.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?o.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||o.cleanData(ob(c)),c.parentNode&&(b&&o.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(o.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return o.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(o.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,o.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,n=k-1,p=a[0],q=o.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(c=o.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=o.map(ob(c,"script"),kb),g=f.length;k>j;j++)h=c,j!==n&&(h=o.clone(h,!0,!0),g&&o.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,o.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&o.contains(i,h)&&(h.src?o._evalUrl&&o._evalUrl(h.src):o.globalEval(h.textContent.replace(hb,"")))}return this}}),o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){o.fn[a]=function(a){for(var c,d=[],e=o(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),o(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d=o(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:o.css(d[0],"display");return d.detach(),e}function tb(a){var b=m,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||o("