-{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///static/pdfannotator/pdf-annotate.min.js","webpack:///webpack/bootstrap eb9ae7feaedcd1f55f8b","webpack:///./src/index.js","webpack:///./src/PDFJSAnnotate.js","webpack:///./src/adapter/StoreAdapter.js","webpack:///./src/utils/abstractFunction.js","webpack:///./src/UI/event.js","webpack:///./~/events/events.js","webpack:///./src/UI/utils.js","webpack:///./~/create-stylesheet/index.js","webpack:///./src/adapter/CRFPAStoreAdapter.js","webpack:///./~/axios/index.js","webpack:///./~/axios/lib/axios.js","webpack:///./~/axios/lib/utils.js","webpack:///./~/axios/lib/helpers/bind.js","webpack:///./~/is-buffer/index.js","webpack:///./~/axios/lib/core/Axios.js","webpack:///./~/axios/lib/defaults.js","webpack:///./~/process/browser.js","webpack:///./~/axios/lib/helpers/normalizeHeaderName.js","webpack:///./~/axios/lib/adapters/xhr.js","webpack:///./~/axios/lib/core/settle.js","webpack:///./~/axios/lib/core/createError.js","webpack:///./~/axios/lib/core/enhanceError.js","webpack:///./~/axios/lib/helpers/buildURL.js","webpack:///./~/axios/lib/helpers/parseHeaders.js","webpack:///./~/axios/lib/helpers/isURLSameOrigin.js","webpack:///./~/axios/lib/helpers/btoa.js","webpack:///./~/axios/lib/helpers/cookies.js","webpack:///./~/axios/lib/core/InterceptorManager.js","webpack:///./~/axios/lib/core/dispatchRequest.js","webpack:///./~/axios/lib/core/transformData.js","webpack:///./~/axios/lib/cancel/isCancel.js","webpack:///./~/axios/lib/helpers/isAbsoluteURL.js","webpack:///./~/axios/lib/helpers/combineURLs.js","webpack:///./~/axios/lib/cancel/Cancel.js","webpack:///./~/axios/lib/cancel/CancelToken.js","webpack:///./~/axios/lib/helpers/spread.js","webpack:///./src/utils/uuid.js","webpack:///./src/initFile.js","webpack:///./src/UI/comments.js","webpack:///./~/twitter-text/twitter-text.js","webpack:///./src/UI/edit.js","webpack:///./src/render/appendChild.js","webpack:///./~/object-assign/index.js","webpack:///./src/render/renderLine.js","webpack:///./src/utils/setAttributes.js","webpack:///./src/utils/normalizeColor.js","webpack:///./src/render/renderPath.js","webpack:///./src/render/renderPoint.js","webpack:///./src/render/renderRect.js","webpack:///./src/render/renderText.js","webpack:///./src/render/index.js","webpack:///./src/a11y/renderScreenReaderHints.js","webpack:///./src/a11y/insertScreenReaderHint.js","webpack:///./src/a11y/createScreenReaderOnly.js","webpack:///./src/a11y/insertElementWithinChildren.js","webpack:///./src/a11y/insertElementWithinElement.js","webpack:///./src/a11y/renderScreenReaderComments.js","webpack:///./src/a11y/insertScreenReaderComment.js","webpack:///./src/a11y/initEventHandlers.js","webpack:///./src/UI/index.js","webpack:///./src/UI/pen.js","webpack:///./src/UI/point.js","webpack:///./src/UI/rect.js","webpack:///./src/UI/text.js","webpack:///./src/UI/page.js","webpack:///./src/initColorPicker.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","render","pdfjsLib","getDocument","RENDER_OPTIONS","documentId","then","pdf","pdfDocument","viewer","document","getElementById","innerHTML","NUM_PAGES","_pdfInfo","numPages","i","page","UI","createPage","appendChild","PDFJSAnnotate","getAnnotations","annotations","_loop","num","getPage","renderPage","_ref","_ref2","_slicedToArray","pdfPage","viewport","getViewport","scale","rotate","PAGE_HEIGHT","height","$","browser","mozilla","remove","Object","defineProperty","value","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","length","err","Array","isArray","TypeError","_PDFJSAnnotate","_PDFJSAnnotate2","_initFile","_twitterText","_initColorPicker","_initColorPicker2","_comments","documentUrl","enhanceTextSelection","parseFloat","localStorage","getItem","parseInt","setStoreAdapter","CRFPAStoreAdapter","readonly","initText","setText","size","color","initPen","querySelector","Option","setPen","penColor","penSize","modified","setItem","selected","classList","removeAttribute","add","setAttribute","handlePenSizeChange","e","target","addEventListener","setActiveToolbarItem","type","button","active","tooltype","disableEdit","disablePen","disableText","disablePoint","disableRect","enableEdit","enablePen","enableText","enablePoint","enableRect","handleToolbarClick","nodeName","getAttribute","setScaleRotate","handleScaleChange","handleRotateCWClick","handleRotateCCWClick","renderComments","_StoreAdapter","_StoreAdapter2","_CRFPAStoreAdapter","_CRFPAStoreAdapter2","_render","_render2","_UI","_UI2","StoreAdapter","__storeAdapter","getStoreAdapter","adapter","_getStoreAdapter","apply","arguments","_classCallCheck","instance","Constructor","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","prototype","_abstractFunction","_abstractFunction2","_event","_this","definition","keys","forEach","annotationId","pageNumber","annotation","content","commentId","get","__getAnnotations","set","fn","__addAnnotation","fireEvent","__editAnnotation","__deleteAnnotation","success","__addComment","comment","__deleteComment","abstractFunction","name","Error","emitter","emit","on","removeEventListener","removeListener","_events","_events2","_utils","EventEmitter","clickNode","findSVGAtPoint","clientX","clientY","findAnnotationAtPoint","_maxListeners","isFunction","arg","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","n","isNaN","er","handler","len","args","listeners","error","context","slice","addListener","listener","newListener","warned","console","trace","once","g","fired","list","position","splice","removeAllListeners","ret","listenerCount","evlistener","findSVGContainer","node","parentNode","toUpperCase","x","y","elements","querySelectorAll","l","el","rect","getBoundingClientRect","pointIntersectsRect","svg","getOffsetAnnotationRect","top","bottom","left","right","getAnnotationRect","_getOffset","getOffset","offsetLeft","offsetTop","h","w","LINE_OFFSET","toLowerCase","minX","maxX","minY","maxY","replace","split","s","map","width","_getOffset2","result","includes","scaleUp","_getMetadata","getMetadata","scaleDown","_getMetadata2","getScroll","scrollTop","scrollLeft","disableUserSelect","userSelectStyleSheet","head","enableUserSelect","removeChild","JSON","parse","BORDER_COLOR","_createStylesheet","_createStylesheet2","body","-webkit-user-select","-moz-user-select","-ms-user-select","user-select","processRuleSet","selector","block","processDeclarationBlock","prop","processDeclaration","join","hyphenate","match","blocks","style","createElement","text","createTextNode","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_axios","_axios2","_uuid","_uuid2","_StoreAdapter3","axios","defaults","xsrfCookieName","xsrfHeaderName","API","baseURL","timeout","withCredentials","headers","Accept","Content-Type","Access-Control-Allow-Origin","getPrototypeOf","params","fileUuid","response","data","getAnnotation","addAnnotation","uuid","post","editAnnotation","deleteAnnotation","getComments","addComment","createInstance","defaultConfig","Axios","bind","request","utils","extend","instanceConfig","merge","Cancel","CancelToken","isCancel","all","promises","Promise","spread","val","toString","isArrayBuffer","isFormData","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isString","isDate","isFile","isBlob","isStream","pipe","isURLSearchParams","URLSearchParams","trim","str","isStandardBrowserEnv","navigator","product","window","hasOwnProperty","assignValue","a","b","thisArg","isBuffer","isSlowBuffer","readFloatLE","_isBuffer","interceptors","InterceptorManager","dispatchRequest","config","url","method","chain","promise","resolve","interceptor","unshift","fulfilled","rejected","shift","process","setContentTypeIfUnset","getDefaultAdapter","XMLHttpRequest","normalizeHeaderName","DEFAULT_CONTENT_TYPE","transformRequest","stringify","transformResponse","maxContentLength","validateStatus","status","common","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","run","Item","array","noop","nextTick","title","env","argv","version","versions","off","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","normalizedName","settle","buildURL","parseHeaders","isURLSameOrigin","createError","btoa","reject","requestData","requestHeaders","loadEvent","xDomain","NODE_ENV","XDomainRequest","onprogress","ontimeout","auth","username","password","Authorization","open","paramsSerializer","readyState","responseURL","indexOf","responseHeaders","getAllResponseHeaders","responseData","responseType","responseText","statusText","onerror","cookies","xsrfValue","read","setRequestHeader","onDownloadProgress","onUploadProgress","upload","cancelToken","cancel","abort","send","enhanceError","message","code","encode","encodeURIComponent","serializedParams","parts","v","toISOString","ignoreDuplicateOf","parsed","line","substr","resolveURL","href","msie","urlParsingNode","protocol","host","search","hash","hostname","port","pathname","charAt","originURL","test","userAgent","location","requestURL","E","input","charCode","String","output","idx","chars","charCodeAt","write","expires","path","domain","secure","cookie","Date","toGMTString","RegExp","decodeURIComponent","now","handlers","use","eject","throwIfCancellationRequested","throwIfRequested","transformData","isAbsoluteURL","combineURLs","reason","fns","__CANCEL__","relativeURL","executor","resolvePromise","token","source","callback","replacement","r","Math","random","PATTERN","REGEXP","dataset","filepath","comments","commentList","html","commentForm","hide","insertComment","child","addClass","attr","twitter","autoLink","htmlEscape","handleCommentClick","append","selectComment","scrollToView","element","offset","is","css","visibility","show","display","visible_area_start","visible_area_end","innerHeight","hasClass","animate","removeClass","_edit","createEditOverlay","_twitterText2","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","regexSupplant","regex","flags","global","ignoreCase","multiline","newRegex","twttr","txt","regexen","stringSupplant","values","clone","o","k","isValidMatch","string","optional","HTML_ENTITIES","&",">","<","\"","'","character","spaces_group","spaces","invalid_chars_group","invalid_chars","punct","rtl_chars","non_bmp_code_pairs","latinAccentChars","bmpLetterAndMarks","astralLetterAndMarks","bmpNumerals","astralNumerals","hashtagSpecialChars","hashSigns","hashtagAlpha","hashtagAlphaNumeric","endHashtagMatch","codePoint","hashtagBoundary","validHashtag","validMentionPrecedingChars","atSigns","validMentionOrList","validReply","endMentionMatch","validUrlPrecedingChars","invalidUrlWithoutProtocolPrecedingChars","invalidDomainChars","validDomainChars","validSubdomain","validDomainName","validGTLD","validCCTLD","validPunycode","validSpecialCCTLD","validDomain","validAsciiDomain","invalidShortDomain","validSpecialShortDomain","validPortNumber","cyrillicLettersAndMarks","validGeneralUrlPathChars","validUrlBalancedParens","validUrlPathEndingChars","validUrlPath","validUrlQueryChars","validUrlQueryEndingChars","extractUrl","validTcoUrl","urlHasProtocol","urlHasHttps","cashtag","validCashtag","validateUrlUnreserved","validateUrlPctEncoded","validateUrlSubDelims","validateUrlPchar","validateUrlScheme","validateUrlUserinfo","validateUrlDecOctet","validateUrlIpv4","validateUrlIpv6","validateUrlIp","validateUrlSubDomainSegment","validateUrlDomainSegment","validateUrlDomainTld","validateUrlDomain","validateUrlHost","validateUrlUnicodeSubDomainSegment","validateUrlUnicodeDomainSegment","validateUrlUnicodeDomainTld","validateUrlUnicodeDomain","validateUrlUnicodeHost","validateUrlPort","validateUrlUnicodeAuthority","validateUrlAuthority","validateUrlPath","validateUrlQuery","validateUrlFragment","validateUrlUnencoded","DEFAULT_LIST_CLASS","DEFAULT_USERNAME_CLASS","DEFAULT_HASHTAG_CLASS","DEFAULT_CASHTAG_CLASS","OPTIONS_NOT_ATTRIBUTES","urlClass","listClass","usernameClass","hashtagClass","cashtagClass","usernameUrlBase","listUrlBase","hashtagUrlBase","cashtagUrlBase","usernameUrlBlock","listUrlBlock","hashtagUrlBlock","linkUrlBlock","usernameIncludeSymbol","suppressLists","suppressNoFollow","targetBlank","suppressDataScreenName","urlEntities","symbolTag","textWithSymbolTag","urlTarget","invisibleTagAttrs","linkAttributeBlock","linkTextBlock","htmlEscapeNonEntities","BOOLEAN_ATTRIBUTES","disabled","multiple","checked","tagAttrs","attributes","htmlAttrs","linkToText","entity","options","rel","d","linkToTextWithSymbol","symbol","taggedSymbol","taggedText","linkToHashtag","substring","indices","hashtag","attrs","linkToCashtag","linkToMentionAndList","at","user","screenName","slashListname","listSlug","isList","linkToUrl","displayUrl","linkText","urlEntity","display_url","linkTextWithEntity","expanded_url","expandedUrl","displayUrlSansEllipses","displayUrlIndex","beforeDisplayUrl","afterDisplayUrl","precedingEllipsis","followingEllipsis","autoLinkEntities","entities","extractHtmlAttrsFromOptions","beginIndex","sort","nonEntity","autoLinkWithJSON","json","user_mentions","screen_name","hashtags","symbols","modifyIndicesFromUnicodeToUTF16","extractEntitiesWithIndices","extractUrlsWithoutProtocol","autoLinkUsernamesOrLists","extractMentionsOrListsWithIndices","autoLinkHashtags","extractHashtagsWithIndices","autoLinkCashtags","extractCashtagsWithIndices","autoLinkUrlsCustom","extractUrlsWithIndices","removeOverlappingEntities","prev","checkUrlOverlap","extractMentions","screenNamesOnly","screenNamesWithIndices","extractMentionsWithIndices","mentionOrList","mentions","mentionsOrLists","possibleNames","before","atSign","chunk","after","startPosition","endPosition","extractReplies","possibleScreenName","rightContext","extractUrls","urlsOnly","urlsWithIndices","urls","exec","$2","$3","$4","$5","$7","lastIndex","lastMatch","lastUrl","asciiEndPosition","asciiDomain","asciiStartPosition","extractHashtags","hashtagsOnly","hashtagsWithIndices","tags","hashText","extractCashtags","cashtagsOnly","cashtagsWithIndices","dollar","convertUnicodeIndices","modifyIndicesFromUTF16ToUnicode","getUnicodeTextLength","indicesInUTF16","charIndex","codePointIndex","entityIndex","splitTags","secondSplits","firstSplits","allSplits","j","hitHighlight","hits","defaultHighlightTag","index","hit","tag","placed","hitSpot","tagName","chunks","chunkIndex","prevChunksLen","chunkCursor","startInChunk","chunkChars","flatHits","MAX_LENGTH","getTweetLength","short_url_length","short_url_length_https","textLength","isInvalidTweet","hasInvalidCharacters","isValidTweetText","isValidUsername","extracted","VALID_LIST_RE","isValidList","usernameList","isValidHashtag","isValidUrl","unicodeDomains","requireProtocol","urlParts","scheme","authority","query","fragment","_toConsumableArray","arr2","from","destroyEditOverlay","overlay","anchor","styleLeft","OVERLAY_BORDER_SIZE","styleTop","boxSizing","border","borderRadius","background","fontSize","padding","textAlign","textDecoration","handleDocumentClick","handleDocumentKeyup","handleDocumentMousedown","borderColor","boxShadow","isDragging","handleDocumentMousemove","handleDocumentMouseup","nodes","keyCode","dragOffsetX","dragOffsetY","dragStartX","dragStartY","cursor","offsetHeight","offsetWidth","getDelta","propX","propY","calcDelta","deltaX","deltaY","_getDelta","t","modelY","viewY","rectangles","modelX","viewX","_annotation$lines$","lines","originX","originY","_calcDelta","_annotation$lines$i","_appendChild2","handleAnnotationClick","_enabled","_appendChild","getTranslation","rotation","transform","trans","isFirefox","_objectAssign2","_renderRect2","_renderLine2","_renderPoint2","_renderText2","_renderPath2","_objectAssign","_renderLine","_renderPath","_renderPoint","_renderRect","_renderText","toObject","shouldUseNative","assign","test1","getOwnPropertyNames","test2","fromCharCode","order2","test3","letter","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","to","renderLine","group","createElementNS","_setAttributes2","stroke","_normalizeColor2","strokeWidth","x1","y1","x2","y2","_setAttributes","_normalizeColor","setAttributes","keyCase","UPPER_REGEX","BLACKLIST","normalizeColor","REGEX_HASHLESS_HEX","renderPath","p1","p2","fill","renderPoint","outerSVG","innerSVG","SIZE","viewBox","D","renderRect","fillOpacity","createRect","renderText","_renderScreenReaderHints","renderScreenReaderHints","SORT_TYPES","sortBy","filter","_insertScreenReaderHint2","sortByPoint","sortByRectPoint","sortByLinePoint","lineA","lineB","_insertScreenReaderHint","_initEventHandlers","_initEventHandlers2","highlight","strikeout","drawing","textbox","point","area","insertScreenReaderHint","rects","first","last","_insertElementWithinElement2","_createScreenReaderOnly2","_insertElementWithinChildren2","COMMENT_TYPES","_renderScreenReaderComments2","_createScreenReaderOnly","_insertElementWithinChildren","_insertElementWithinElement","_renderScreenReaderComments","createScreenReaderOnly","overflow","insertElementWithinChildren","insertBefore","textLayer","textRect","insertElementWithinElement","OFFSET_ADJUST","max","textLayerElementFromPoint","temp","cloneNode","tail","pop","outerHTML","renderScreenReaderComments","insertScreenReaderComment","_insertScreenReaderComment","_insertScreenReaderComment2","item","initEventHandlers","reorderAnnotationsByType","removeAnnotation","removeComment","annotationsByPage","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","removeElementById","elementId","_renderScreenReaderHints2","_pen","_point","_rect","_text","_page","_penSize","_penColor","savePoint","handleInputBlur","handleInputKeyup","focus","closeInput","getSelectionRects","selection","getSelection","range","getRangeAt","getClientRects","_type","saveRect","removeAllRanges","boundingRect","_textSize","saveText","_textColor","log","textSize","textColor","PAGE_TEMPLATE","children","canvas","mozOpaque","renderOptions","canvasContext","getContext","alpha","scalePage","getTextContent","normalizeWhitespace","textContent","textLayerFactory","pdfjsViewer","DefaultTextLayerFactory","textLayerBuilder","createTextLayerBuilder","setTextContent","wrapper","outputScale","getOutputScale","scaled","sx","sy","sfx","approximateFraction","sfy","roundToDivide","floor","xinv","limit","x_","q","ctx","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","div","round","initColorPicker","onChange","setColor","fireOnChange","currentValue","closePicker","togglePicker","isPickerOpen","openPicker","picker","COLORS","createColorOption","margin","onclick","className","hex"],"mappings":"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","file":"static/pdfannotator/pdf-annotate.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"PDFAnnotate\"] = factory();\n\telse\n\t\troot[\"PDFAnnotate\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"PDFAnnotate\"] = factory();\n\telse\n\t\troot[\"PDFAnnotate\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tvar _twitterText = __webpack_require__(39);\n\t\n\tvar _twitterText2 = _interopRequireDefault(_twitterText);\n\t\n\tvar _initColorPicker = __webpack_require__(65);\n\t\n\tvar _initColorPicker2 = _interopRequireDefault(_initColorPicker);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = _PDFJSAnnotate2.default;\n\tvar UI = _PDFJSAnnotate2.default.UI;\n\t\n\t\n\tvar PAGE_HEIGHT = void 0;\n\tvar RENDER_OPTIONS = {\n\t documentId: _initFile.documentUrl,\n\t pdfDocument: null,\n\t enhanceTextSelection: true,\n\t scale: parseFloat(localStorage.getItem(_initFile.documentId + '/scale'), 10) || 1.33,\n\t rotate: parseInt(localStorage.getItem(_initFile.documentId + '/rotate'), 10) || 0\n\t};\n\t\n\t_PDFJSAnnotate2.default.setStoreAdapter(new _PDFJSAnnotate2.default.CRFPAStoreAdapter());\n\t// pdfjsLib.workerSrc = '/static/pdfannotator/pdf.worker.js';\n\t\n\t// Render stuff\n\t\n\t// let renderedPages = {};\n\t// document.getElementById('content-wrapper').addEventListener('scroll', function (e) {\n\t// let visiblePageNum = Math.round(e.target.scrollTop / PAGE_HEIGHT) + 1;\n\t// let visiblePage = document.querySelector(`.page[data-page-number=\"${visiblePageNum}\"][data-loaded=\"false\"]`);\n\t// if (visiblePage) {\n\t// // Prevent invoking UI.renderPage on the same page more than once.\n\t// \tif ( !renderedPages[visiblePageNum] ) {\n\t// \t renderedPages[visiblePageNum] = true;\n\t// \t setTimeout(function () {\n\t// \t\tUI.renderPage(visiblePageNum, RENDER_OPTIONS);\n\t// \t });\n\t// \t}\n\t// }\n\t// });\n\t\n\tvar NUM_PAGES = 0;\n\tfunction render() {\n\t\n\t pdfjsLib.getDocument(RENDER_OPTIONS.documentId).then(function (pdf) {\n\t RENDER_OPTIONS.pdfDocument = pdf;\n\t\n\t var viewer = document.getElementById('viewer');\n\t viewer.innerHTML = '';\n\t NUM_PAGES = pdf._pdfInfo.numPages;\n\t for (var i = 0; i < NUM_PAGES; i++) {\n\t var page = UI.createPage(i + 1);\n\t viewer.appendChild(page);\n\t }\n\t\n\t _PDFJSAnnotate2.default.getAnnotations(_initFile.documentId).then(function (annotations) {\n\t var _loop = function _loop(num) {\n\t pdf.getPage(num).then(function () {\n\t UI.renderPage(num, annotations, RENDER_OPTIONS).then(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t pdfPage = _ref2[0],\n\t annotations = _ref2[1];\n\t\n\t var viewport = pdfPage.getViewport(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate);\n\t PAGE_HEIGHT = viewport.height;\n\t if ($.browser.mozilla) $('.textLayer>.endOfContent').remove();\n\t });\n\t });\n\t };\n\t\n\t for (var num = 1; num <= NUM_PAGES; num++) {\n\t _loop(num);\n\t }\n\t });\n\t });\n\t}\n\trender();\n\t\n\tif (!_initFile.readonly) {\n\t // Text stuff\n\t (function () {\n\t var textSize = void 0;\n\t var textColor = void 0;\n\t\n\t function initText() {\n\t // let size = document.querySelector('.toolbar .text-size');\n\t // [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96].forEach((s) => {\n\t // size.appendChild(new Option(s, s));\n\t // });\n\t //\n\t // setText(\n\t // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/size`) || 12,\n\t // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/color`) || '#EF4437'\n\t // );\n\t setText(12, '#EF4437');\n\t\n\t // initColorPicker(document.querySelector('.text-color'), textColor, function (value) {\n\t // setText(textSize, value);\n\t // });\n\t }\n\t\n\t function setText(size, color) {\n\t // let modified = false;\n\t //\n\t // if (textSize !== size) {\n\t // modified = true;\n\t // textSize = size;\n\t // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/size`, textSize);\n\t // // document.querySelector('.toolbar .text-size').value = textSize;\n\t // }\n\t //\n\t // if (textColor !== color) {\n\t // modified = true;\n\t // textColor = color;\n\t // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/color`, textColor);\n\t //\n\t // let selected = document.querySelector('.toolbar .text-color.color-selected');\n\t // if (selected) {\n\t // selected.classList.remove('color-selected');\n\t // selected.removeAttribute('aria-selected');\n\t // }\n\t //\n\t // selected = document.querySelector(`.toolbar .text-color[data-color=\"${color}\"]`);\n\t // if (selected) {\n\t // selected.classList.add('color-selected');\n\t // selected.setAttribute('aria-selected', true);\n\t // }\n\t //\n\t // }\n\t\n\t // if (modified) {\n\t UI.setText(size, color);\n\t // }\n\t }\n\t\n\t // function handleTextSizeChange(e) {\n\t // setText(e.target.value, textColor);\n\t // }\n\t\n\t // document.querySelector('.toolbar .text-size').addEventListener('change', handleTextSizeChange);\n\t\n\t initText();\n\t })();\n\t\n\t // Pen stuff\n\t (function () {\n\t var penSize = void 0;\n\t var penColor = void 0;\n\t\n\t function initPen() {\n\t var size = document.querySelector('.toolbar .pen-size');\n\t for (var i = 0; i < 20; i++) {\n\t size.appendChild(new Option(i + 1, i + 1));\n\t }\n\t\n\t setPen(localStorage.getItem(RENDER_OPTIONS.documentId + '/pen/size') || 1, localStorage.getItem(RENDER_OPTIONS.documentId + '/pen/color') || '#000000');\n\t\n\t (0, _initColorPicker2.default)(document.querySelector('.pen-color'), penColor, function (value) {\n\t setPen(penSize, value);\n\t });\n\t }\n\t\n\t function setPen(size, color) {\n\t var modified = false;\n\t\n\t if (penSize !== size) {\n\t modified = true;\n\t penSize = size;\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/pen/size', penSize);\n\t document.querySelector('.toolbar .pen-size').value = penSize;\n\t }\n\t\n\t if (penColor !== color) {\n\t modified = true;\n\t penColor = color;\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/pen/color', penColor);\n\t\n\t var selected = document.querySelector('.toolbar .pen-color.color-selected');\n\t if (selected) {\n\t selected.classList.remove('color-selected');\n\t selected.removeAttribute('aria-selected');\n\t }\n\t\n\t selected = document.querySelector('.toolbar .pen-color[data-color=\"' + color + '\"]');\n\t if (selected) {\n\t selected.classList.add('color-selected');\n\t selected.setAttribute('aria-selected', true);\n\t }\n\t }\n\t\n\t if (modified) {\n\t UI.setPen(penSize, penColor);\n\t }\n\t }\n\t\n\t function handlePenSizeChange(e) {\n\t setPen(e.target.value, penColor);\n\t }\n\t\n\t document.querySelector('.toolbar .pen-size').addEventListener('change', handlePenSizeChange);\n\t\n\t initPen();\n\t })();\n\t\n\t // Toolbar buttons\n\t (function () {\n\t var tooltype = localStorage.getItem(RENDER_OPTIONS.documentId + '/tooltype') || 'cursor';\n\t if (tooltype) {\n\t setActiveToolbarItem(tooltype, document.querySelector('.toolbar button[data-tooltype=' + tooltype + ']'));\n\t }\n\t\n\t function setActiveToolbarItem(type, button) {\n\t var active = document.querySelector('.toolbar button.active');\n\t if (active) {\n\t active.classList.remove('active');\n\t\n\t switch (tooltype) {\n\t case 'cursor':\n\t UI.disableEdit();\n\t break;\n\t case 'draw':\n\t UI.disablePen();\n\t break;\n\t case 'text':\n\t UI.disableText();\n\t break;\n\t case 'point':\n\t UI.disablePoint();\n\t break;\n\t case 'area':\n\t case 'highlight':\n\t case 'strikeout':\n\t UI.disableRect();\n\t break;\n\t }\n\t }\n\t\n\t if (button) {\n\t button.classList.add('active');\n\t }\n\t if (tooltype !== type) {\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/tooltype', type);\n\t }\n\t tooltype = type;\n\t\n\t switch (type) {\n\t case 'cursor':\n\t UI.enableEdit();\n\t break;\n\t case 'draw':\n\t UI.enablePen();\n\t break;\n\t case 'text':\n\t UI.enableText();\n\t break;\n\t case 'point':\n\t UI.enablePoint();\n\t break;\n\t case 'area':\n\t case 'highlight':\n\t case 'strikeout':\n\t UI.enableRect(type);\n\t break;\n\t }\n\t }\n\t\n\t function handleToolbarClick(e) {\n\t if (e.target.nodeName === 'BUTTON') {\n\t setActiveToolbarItem(e.target.getAttribute('data-tooltype'), e.target);\n\t }\n\t }\n\t\n\t document.querySelector('.toolbar').addEventListener('click', handleToolbarClick);\n\t })();\n\t}\n\t\n\tif (_initFile.readonly) UI.enableEdit();\n\t\n\t// Scale/rotate\n\t(function () {\n\t function setScaleRotate(scale, rotate) {\n\t scale = parseFloat(scale, 10);\n\t rotate = parseInt(rotate, 10);\n\t\n\t if (RENDER_OPTIONS.scale !== scale || RENDER_OPTIONS.rotate !== rotate) {\n\t RENDER_OPTIONS.scale = scale;\n\t RENDER_OPTIONS.rotate = rotate;\n\t\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/scale', RENDER_OPTIONS.scale);\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/rotate', RENDER_OPTIONS.rotate % 360);\n\t\n\t render();\n\t }\n\t }\n\t\n\t function handleScaleChange(e) {\n\t setScaleRotate(e.target.value, RENDER_OPTIONS.rotate);\n\t }\n\t\n\t function handleRotateCWClick() {\n\t setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate + 90);\n\t }\n\t\n\t function handleRotateCCWClick() {\n\t setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate - 90);\n\t }\n\t\n\t document.querySelector('.toolbar select.scale').value = RENDER_OPTIONS.scale;\n\t document.querySelector('.toolbar select.scale').addEventListener('change', handleScaleChange);\n\t document.querySelector('.toolbar .rotate-ccw').addEventListener('click', handleRotateCCWClick);\n\t document.querySelector('.toolbar .rotate-cw').addEventListener('click', handleRotateCWClick);\n\t})();\n\t\n\t(0, _comments.renderComments)(_initFile.documentId);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _StoreAdapter = __webpack_require__(2);\n\t\n\tvar _StoreAdapter2 = _interopRequireDefault(_StoreAdapter);\n\t\n\tvar _CRFPAStoreAdapter = __webpack_require__(8);\n\t\n\tvar _CRFPAStoreAdapter2 = _interopRequireDefault(_CRFPAStoreAdapter);\n\t\n\tvar _render = __webpack_require__(50);\n\t\n\tvar _render2 = _interopRequireDefault(_render);\n\t\n\tvar _UI = __webpack_require__(59);\n\t\n\tvar _UI2 = _interopRequireDefault(_UI);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t /**\n\t * Abstract class that needs to be defined so PDFJSAnnotate\n\t * knows how to communicate with your server.\n\t */\n\t StoreAdapter: _StoreAdapter2.default,\n\t\n\t /**\n\t * Implementation of StoreAdapter that stores annotation data to localStorage.\n\t */\n\t CRFPAStoreAdapter: _CRFPAStoreAdapter2.default,\n\t\n\t /**\n\t * Abstract instance of StoreAdapter\n\t */\n\t __storeAdapter: new _StoreAdapter2.default(),\n\t\n\t /**\n\t * Getter for the underlying StoreAdapter property\n\t *\n\t * @return {StoreAdapter}\n\t */\n\t getStoreAdapter: function getStoreAdapter() {\n\t return this.__storeAdapter;\n\t },\n\t\n\t\n\t /**\n\t * Setter for the underlying StoreAdapter property\n\t *\n\t * @param {StoreAdapter} adapter The StoreAdapter implementation to be used.\n\t */\n\t setStoreAdapter: function setStoreAdapter(adapter) {\n\t // TODO this throws an error when bundled\n\t // if (!(adapter instanceof StoreAdapter)) {\n\t // throw new Error('adapter must be an instance of StoreAdapter');\n\t // }\n\t\n\t this.__storeAdapter = adapter;\n\t },\n\t\n\t\n\t /**\n\t * UI is a helper for instrumenting UI interactions for creating,\n\t * editing, and deleting annotations in the browser.\n\t */\n\t UI: _UI2.default,\n\t\n\t /**\n\t * Render the annotations for a page in the PDF Document\n\t *\n\t * @param {SVGElement} svg The SVG element that annotations should be rendered to\n\t * @param {PageViewport} viewport The PDFPage.getViewport data\n\t * @param {Object} data The StoreAdapter.getAnnotations data\n\t * @return {Promise}\n\t */\n\t render: _render2.default,\n\t\n\t /**\n\t * Convenience method for getting annotation data\n\t *\n\t * @alias StoreAdapter.getAnnotations\n\t * @param {String} documentId The ID of the document\n\t * @return {Promise}\n\t */\n\t getAnnotations: function getAnnotations(documentId) {\n\t var _getStoreAdapter;\n\t\n\t return (_getStoreAdapter = this.getStoreAdapter()).getAnnotations.apply(_getStoreAdapter, arguments);\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _abstractFunction = __webpack_require__(3);\n\t\n\tvar _abstractFunction2 = _interopRequireDefault(_abstractFunction);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Adapter should never be invoked publicly\n\tvar StoreAdapter = function () {\n\t /**\n\t * Create a new StoreAdapter instance\n\t *\n\t * @param {Object} [definition] The definition to use for overriding abstract methods\n\t */\n\t function StoreAdapter() {\n\t var _this = this;\n\t\n\t var definition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t\n\t _classCallCheck(this, StoreAdapter);\n\t\n\t // Copy each function from definition if it is a function we know about\n\t Object.keys(definition).forEach(function (key) {\n\t if (typeof definition[key] === 'function' && typeof _this[key] === 'function') {\n\t _this[key] = definition[key];\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Get all the annotations for a given document and page number.\n\t *\n\t * @param {String} documentId The ID for the document the annotations belong to\n\t * @param {Number} pageNumber The number of the page the annotations belong to\n\t * @return {Promise}\n\t */\n\t\n\t\n\t _createClass(StoreAdapter, [{\n\t key: '__getAnnotations',\n\t value: function __getAnnotations(documentId) {\n\t (0, _abstractFunction2.default)('getAnnotations');\n\t }\n\t }, {\n\t key: 'getAnnotation',\n\t\n\t\n\t /**\n\t * Get the definition for a specific annotation.\n\t *\n\t * @param {String} documentId The ID for the document the annotation belongs to\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function getAnnotation(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('getAnnotation');\n\t }\n\t\n\t /**\n\t * Add an annotation\n\t *\n\t * @param {String} documentId The ID for the document to add the annotation to\n\t * @param {String} pageNumber The page number to add the annotation to\n\t * @param {Object} annotation The definition for the new annotation\n\t * @return {Promise}\n\t */\n\t\n\t }, {\n\t key: '__addAnnotation',\n\t value: function __addAnnotation(documentId, pageNumber, annotation) {\n\t (0, _abstractFunction2.default)('addAnnotation');\n\t }\n\t }, {\n\t key: '__editAnnotation',\n\t\n\t\n\t /**\n\t * Edit an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} pageNumber the page number of the annotation\n\t * @param {Object} annotation The definition of the modified annotation\n\t * @return {Promise}\n\t */\n\t value: function __editAnnotation(documentId, pageNumber, annotation) {\n\t (0, _abstractFunction2.default)('editAnnotation');\n\t }\n\t }, {\n\t key: '__deleteAnnotation',\n\t\n\t\n\t /**\n\t * Delete an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function __deleteAnnotation(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('deleteAnnotation');\n\t }\n\t }, {\n\t key: 'getComments',\n\t\n\t\n\t /**\n\t * Get all the comments for an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function getComments(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('getComments');\n\t }\n\t\n\t /**\n\t * Add a new comment\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @param {Object} content The definition of the comment\n\t * @return {Promise}\n\t */\n\t\n\t }, {\n\t key: '__addComment',\n\t value: function __addComment(documentId, annotationId, content) {\n\t (0, _abstractFunction2.default)('addComment');\n\t }\n\t }, {\n\t key: '__deleteComment',\n\t\n\t\n\t /**\n\t * Delete a comment\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} commentId The ID for the comment\n\t * @return {Promise}\n\t */\n\t value: function __deleteComment(documentId, commentId) {\n\t (0, _abstractFunction2.default)('deleteComment');\n\t }\n\t }, {\n\t key: 'getAnnotations',\n\t get: function get() {\n\t return this.__getAnnotations;\n\t },\n\t set: function set(fn) {\n\t this.__getAnnotations = function getAnnotations(documentId) {\n\t return fn.apply(undefined, arguments).then(function (annotations) {\n\t // TODO may be best to have this happen on the server\n\t // if (annotations) {\n\t // annotations.forEach((a) => {\n\t // a.documentId = documentId;\n\t // });\n\t // }\n\t return annotations;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'addAnnotation',\n\t get: function get() {\n\t return this.__addAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__addAnnotation = function addAnnotation(documentId, pageNumber, annotation) {\n\t return fn.apply(undefined, arguments).then(function (annotation) {\n\t (0, _event.fireEvent)('annotation:add', documentId, pageNumber, annotation);\n\t return annotation;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'editAnnotation',\n\t get: function get() {\n\t return this.__editAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__editAnnotation = function editAnnotation(documentId, annotationId, annotation) {\n\t return fn.apply(undefined, arguments).then(function (annotation) {\n\t (0, _event.fireEvent)('annotation:edit', documentId, annotationId, annotation);\n\t return annotation;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'deleteAnnotation',\n\t get: function get() {\n\t return this.__deleteAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__deleteAnnotation = function deleteAnnotation(documentId, annotationId) {\n\t return fn.apply(undefined, arguments).then(function (success) {\n\t if (success) {\n\t (0, _event.fireEvent)('annotation:delete', documentId, annotationId);\n\t }\n\t return success;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'addComment',\n\t get: function get() {\n\t return this.__addComment;\n\t },\n\t set: function set(fn) {\n\t this.__addComment = function addComment(documentId, annotationId, content) {\n\t return fn.apply(undefined, arguments).then(function (comment) {\n\t (0, _event.fireEvent)('comment:add', documentId, annotationId, comment);\n\t return comment;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'deleteComment',\n\t get: function get() {\n\t return this.__deleteComment;\n\t },\n\t set: function set(fn) {\n\t this.__deleteComment = function deleteComment(documentId, commentId) {\n\t return fn.apply(undefined, arguments).then(function (success) {\n\t if (success) {\n\t (0, _event.fireEvent)('comment:delete', documentId, commentId);\n\t }\n\t return success;\n\t });\n\t };\n\t }\n\t }]);\n\t\n\t return StoreAdapter;\n\t}();\n\t\n\texports.default = StoreAdapter;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = abstractFunction;\n\t/**\n\t * Throw an Error for an abstract function that hasn't been implemented.\n\t *\n\t * @param {String} name The name of the abstract function\n\t */\n\tfunction abstractFunction(name) {\n\t throw new Error(name + ' is not implemented');\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.fireEvent = fireEvent;\n\texports.addEventListener = addEventListener;\n\texports.removeEventListener = removeEventListener;\n\t\n\tvar _events = __webpack_require__(5);\n\t\n\tvar _events2 = _interopRequireDefault(_events);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar emitter = new _events2.default();\n\t\n\tvar clickNode = void 0;\n\t\n\t/**\n\t * Handle document.click event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\t// document.addEventListener('mousedown', function handleDocumentClick(e) {\n\t\n\tdocument.addEventListener('click', function handleDocumentClick(e) {\n\t if (!(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t var target = (0, _utils.findAnnotationAtPoint)(e.clientX, e.clientY);\n\t\n\t // Emit annotation:blur if clickNode is no longer clicked\n\t if (clickNode && clickNode !== target) {\n\t emitter.emit('annotation:blur', clickNode);\n\t }\n\t\n\t // Emit annotation:click if target was clicked\n\t if (target) {\n\t emitter.emit('annotation:click', target);\n\t }\n\t\n\t clickNode = target;\n\t});\n\t\n\t// let mouseOverNode;\n\t// document.addEventListener('mousemove', function handleDocumentMousemove(e) {\n\t// let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\t//\n\t// // Emit annotation:mouseout if target was mouseout'd\n\t// if (mouseOverNode && !target) {\n\t// emitter.emit('annotation:mouseout', mouseOverNode);\n\t// }\n\t//\n\t// // Emit annotation:mouseover if target was mouseover'd\n\t// if (target && mouseOverNode !== target) {\n\t// emitter.emit('annotation:mouseover', target);\n\t// }\n\t//\n\t// mouseOverNode = target;\n\t// });\n\t\n\tfunction fireEvent() {\n\t emitter.emit.apply(emitter, arguments);\n\t};\n\tfunction addEventListener() {\n\t emitter.on.apply(emitter, arguments);\n\t};\n\tfunction removeEventListener() {\n\t emitter.removeListener.apply(emitter, arguments);\n\t};\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tfunction EventEmitter() {\n\t this._events = this._events || {};\n\t this._maxListeners = this._maxListeners || undefined;\n\t}\n\tmodule.exports = EventEmitter;\n\t\n\t// Backwards-compat with node 0.10.x\n\tEventEmitter.EventEmitter = EventEmitter;\n\t\n\tEventEmitter.prototype._events = undefined;\n\tEventEmitter.prototype._maxListeners = undefined;\n\t\n\t// By default EventEmitters will print a warning if more than 10 listeners are\n\t// added to it. This is a useful default which helps finding memory leaks.\n\tEventEmitter.defaultMaxListeners = 10;\n\t\n\t// Obviously not all Emitters should be limited to 10. This function allows\n\t// that to be increased. Set to zero for unlimited.\n\tEventEmitter.prototype.setMaxListeners = function(n) {\n\t if (!isNumber(n) || n < 0 || isNaN(n))\n\t throw TypeError('n must be a positive number');\n\t this._maxListeners = n;\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.emit = function(type) {\n\t var er, handler, len, args, i, listeners;\n\t\n\t if (!this._events)\n\t this._events = {};\n\t\n\t // If there is no 'error' event listener then throw.\n\t if (type === 'error') {\n\t if (!this._events.error ||\n\t (isObject(this._events.error) && !this._events.error.length)) {\n\t er = arguments[1];\n\t if (er instanceof Error) {\n\t throw er; // Unhandled 'error' event\n\t } else {\n\t // At least give some kind of context to the user\n\t var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n\t err.context = er;\n\t throw err;\n\t }\n\t }\n\t }\n\t\n\t handler = this._events[type];\n\t\n\t if (isUndefined(handler))\n\t return false;\n\t\n\t if (isFunction(handler)) {\n\t switch (arguments.length) {\n\t // fast cases\n\t case 1:\n\t handler.call(this);\n\t break;\n\t case 2:\n\t handler.call(this, arguments[1]);\n\t break;\n\t case 3:\n\t handler.call(this, arguments[1], arguments[2]);\n\t break;\n\t // slower\n\t default:\n\t args = Array.prototype.slice.call(arguments, 1);\n\t handler.apply(this, args);\n\t }\n\t } else if (isObject(handler)) {\n\t args = Array.prototype.slice.call(arguments, 1);\n\t listeners = handler.slice();\n\t len = listeners.length;\n\t for (i = 0; i < len; i++)\n\t listeners[i].apply(this, args);\n\t }\n\t\n\t return true;\n\t};\n\t\n\tEventEmitter.prototype.addListener = function(type, listener) {\n\t var m;\n\t\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t if (!this._events)\n\t this._events = {};\n\t\n\t // To avoid recursion in the case that type === \"newListener\"! Before\n\t // adding it to the listeners, first emit \"newListener\".\n\t if (this._events.newListener)\n\t this.emit('newListener', type,\n\t isFunction(listener.listener) ?\n\t listener.listener : listener);\n\t\n\t if (!this._events[type])\n\t // Optimize the case of one listener. Don't need the extra array object.\n\t this._events[type] = listener;\n\t else if (isObject(this._events[type]))\n\t // If we've already got an array, just append.\n\t this._events[type].push(listener);\n\t else\n\t // Adding the second element, need to change to array.\n\t this._events[type] = [this._events[type], listener];\n\t\n\t // Check for listener leak\n\t if (isObject(this._events[type]) && !this._events[type].warned) {\n\t if (!isUndefined(this._maxListeners)) {\n\t m = this._maxListeners;\n\t } else {\n\t m = EventEmitter.defaultMaxListeners;\n\t }\n\t\n\t if (m && m > 0 && this._events[type].length > m) {\n\t this._events[type].warned = true;\n\t console.error('(node) warning: possible EventEmitter memory ' +\n\t 'leak detected. %d listeners added. ' +\n\t 'Use emitter.setMaxListeners() to increase limit.',\n\t this._events[type].length);\n\t if (typeof console.trace === 'function') {\n\t // not supported in IE 10\n\t console.trace();\n\t }\n\t }\n\t }\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\t\n\tEventEmitter.prototype.once = function(type, listener) {\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t var fired = false;\n\t\n\t function g() {\n\t this.removeListener(type, g);\n\t\n\t if (!fired) {\n\t fired = true;\n\t listener.apply(this, arguments);\n\t }\n\t }\n\t\n\t g.listener = listener;\n\t this.on(type, g);\n\t\n\t return this;\n\t};\n\t\n\t// emits a 'removeListener' event iff the listener was removed\n\tEventEmitter.prototype.removeListener = function(type, listener) {\n\t var list, position, length, i;\n\t\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t if (!this._events || !this._events[type])\n\t return this;\n\t\n\t list = this._events[type];\n\t length = list.length;\n\t position = -1;\n\t\n\t if (list === listener ||\n\t (isFunction(list.listener) && list.listener === listener)) {\n\t delete this._events[type];\n\t if (this._events.removeListener)\n\t this.emit('removeListener', type, listener);\n\t\n\t } else if (isObject(list)) {\n\t for (i = length; i-- > 0;) {\n\t if (list[i] === listener ||\n\t (list[i].listener && list[i].listener === listener)) {\n\t position = i;\n\t break;\n\t }\n\t }\n\t\n\t if (position < 0)\n\t return this;\n\t\n\t if (list.length === 1) {\n\t list.length = 0;\n\t delete this._events[type];\n\t } else {\n\t list.splice(position, 1);\n\t }\n\t\n\t if (this._events.removeListener)\n\t this.emit('removeListener', type, listener);\n\t }\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.removeAllListeners = function(type) {\n\t var key, listeners;\n\t\n\t if (!this._events)\n\t return this;\n\t\n\t // not listening for removeListener, no need to emit\n\t if (!this._events.removeListener) {\n\t if (arguments.length === 0)\n\t this._events = {};\n\t else if (this._events[type])\n\t delete this._events[type];\n\t return this;\n\t }\n\t\n\t // emit removeListener for all listeners on all events\n\t if (arguments.length === 0) {\n\t for (key in this._events) {\n\t if (key === 'removeListener') continue;\n\t this.removeAllListeners(key);\n\t }\n\t this.removeAllListeners('removeListener');\n\t this._events = {};\n\t return this;\n\t }\n\t\n\t listeners = this._events[type];\n\t\n\t if (isFunction(listeners)) {\n\t this.removeListener(type, listeners);\n\t } else if (listeners) {\n\t // LIFO order\n\t while (listeners.length)\n\t this.removeListener(type, listeners[listeners.length - 1]);\n\t }\n\t delete this._events[type];\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.listeners = function(type) {\n\t var ret;\n\t if (!this._events || !this._events[type])\n\t ret = [];\n\t else if (isFunction(this._events[type]))\n\t ret = [this._events[type]];\n\t else\n\t ret = this._events[type].slice();\n\t return ret;\n\t};\n\t\n\tEventEmitter.prototype.listenerCount = function(type) {\n\t if (this._events) {\n\t var evlistener = this._events[type];\n\t\n\t if (isFunction(evlistener))\n\t return 1;\n\t else if (evlistener)\n\t return evlistener.length;\n\t }\n\t return 0;\n\t};\n\t\n\tEventEmitter.listenerCount = function(emitter, type) {\n\t return emitter.listenerCount(type);\n\t};\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.BORDER_COLOR = undefined;\n\texports.findSVGContainer = findSVGContainer;\n\texports.findSVGAtPoint = findSVGAtPoint;\n\texports.findAnnotationAtPoint = findAnnotationAtPoint;\n\texports.pointIntersectsRect = pointIntersectsRect;\n\texports.getOffsetAnnotationRect = getOffsetAnnotationRect;\n\texports.getAnnotationRect = getAnnotationRect;\n\texports.scaleUp = scaleUp;\n\texports.scaleDown = scaleDown;\n\texports.getScroll = getScroll;\n\texports.getOffset = getOffset;\n\texports.disableUserSelect = disableUserSelect;\n\texports.enableUserSelect = enableUserSelect;\n\texports.getMetadata = getMetadata;\n\t\n\tvar _createStylesheet = __webpack_require__(7);\n\t\n\tvar _createStylesheet2 = _interopRequireDefault(_createStylesheet);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar BORDER_COLOR = exports.BORDER_COLOR = '#00BFFF';\n\t\n\tvar userSelectStyleSheet = (0, _createStylesheet2.default)({\n\t body: {\n\t '-webkit-user-select': 'none',\n\t '-moz-user-select': 'none',\n\t '-ms-user-select': 'none',\n\t 'user-select': 'none'\n\t }\n\t});\n\tuserSelectStyleSheet.setAttribute('data-pdf-annotate-user-select', 'true');\n\t\n\t/**\n\t * Find the SVGElement that contains all the annotations for a page\n\t *\n\t * @param {Element} node An annotation within that container\n\t * @return {SVGElement} The container SVG or null if it can't be found\n\t */\n\tfunction findSVGContainer(node) {\n\t var parentNode = node;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t if (parentNode.nodeName.toUpperCase() === 'SVG' && parentNode.getAttribute('data-pdf-annotate-container') === 'true') {\n\t return parentNode;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Find an SVGElement container at a given point\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @return {SVGElement} The container SVG or null if one can't be found\n\t */\n\tfunction findSVGAtPoint(x, y) {\n\t var elements = document.querySelectorAll('svg[data-pdf-annotate-container=\"true\"]');\n\t for (var i = 0, l = elements.length; i < l; i++) {\n\t var el = elements[i];\n\t var rect = el.getBoundingClientRect();\n\t\n\t if (pointIntersectsRect(x, y, rect)) {\n\t return el;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Find an Element that represents an annotation at a given point\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @return {Element} The annotation element or null if one can't be found\n\t */\n\tfunction findAnnotationAtPoint(x, y) {\n\t var svg = findSVGAtPoint(x, y);\n\t if (!svg) {\n\t return;\n\t }\n\t var elements = svg.querySelectorAll('[data-pdf-annotate-type]');\n\t\n\t // Find a target element within SVG\n\t for (var i = 0, l = elements.length; i < l; i++) {\n\t var el = elements[i];\n\t if (pointIntersectsRect(x, y, getOffsetAnnotationRect(el))) {\n\t return el;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Determine if a point intersects a rect\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Object} rect The points of a rect (likely from getBoundingClientRect)\n\t * @return {Boolean} True if a collision occurs, otherwise false\n\t */\n\tfunction pointIntersectsRect(x, y, rect) {\n\t return y >= rect.top && y <= rect.bottom && x >= rect.left && x <= rect.right;\n\t}\n\t\n\t/**\n\t * Get the rect of an annotation element accounting for offset.\n\t *\n\t * @param {Element} el The element to get the rect of\n\t * @return {Object} The dimensions of the element\n\t */\n\tfunction getOffsetAnnotationRect(el) {\n\t var rect = getAnnotationRect(el);\n\t\n\t var _getOffset = getOffset(el),\n\t offsetLeft = _getOffset.offsetLeft,\n\t offsetTop = _getOffset.offsetTop;\n\t\n\t return {\n\t top: rect.top + offsetTop,\n\t left: rect.left + offsetLeft,\n\t right: rect.right + offsetLeft,\n\t bottom: rect.bottom + offsetTop\n\t };\n\t}\n\t\n\t/**\n\t * Get the rect of an annotation element.\n\t *\n\t * @param {Element} el The element to get the rect of\n\t * @return {Object} The dimensions of the element\n\t */\n\tfunction getAnnotationRect(el) {\n\t var h = 0,\n\t w = 0,\n\t x = 0,\n\t y = 0;\n\t var rect = el.getBoundingClientRect();\n\t // TODO this should be calculated somehow\n\t var LINE_OFFSET = 16;\n\t // debugger;\n\t switch (el.nodeName.toLowerCase()) {\n\t case 'path':\n\t var minX = void 0,\n\t maxX = void 0,\n\t minY = void 0,\n\t maxY = void 0;\n\t\n\t el.getAttribute('d').replace(/Z/, '').split('M').splice(1).forEach(function (p) {\n\t var s = p.split(' ').map(function (i) {\n\t return parseInt(i, 10);\n\t });\n\t\n\t if (typeof minX === 'undefined' || s[0] < minX) {\n\t minX = s[0];\n\t }\n\t if (typeof maxX === 'undefined' || s[2] > maxX) {\n\t maxX = s[2];\n\t }\n\t if (typeof minY === 'undefined' || s[1] < minY) {\n\t minY = s[1];\n\t }\n\t if (typeof maxY === 'undefined' || s[3] > maxY) {\n\t maxY = s[3];\n\t }\n\t });\n\t\n\t h = maxY - minY;\n\t w = maxX - minX;\n\t x = minX;\n\t y = minY;\n\t break;\n\t\n\t case 'line':\n\t h = parseInt(el.getAttribute('y2'), 10) - parseInt(el.getAttribute('y1'), 10);\n\t w = parseInt(el.getAttribute('x2'), 10) - parseInt(el.getAttribute('x1'), 10);\n\t x = parseInt(el.getAttribute('x1'), 10);\n\t y = parseInt(el.getAttribute('y1'), 10);\n\t\n\t if (h === 0) {\n\t h += LINE_OFFSET;\n\t y -= LINE_OFFSET / 2;\n\t }\n\t break;\n\t\n\t case 'text':\n\t h = rect.height;\n\t w = rect.width;\n\t x = parseInt(el.getAttribute('x'), 10);\n\t y = parseInt(el.getAttribute('y'), 10) - h;\n\t break;\n\t\n\t case 'g':\n\t var _getOffset2 = getOffset(el),\n\t offsetLeft = _getOffset2.offsetLeft,\n\t offsetTop = _getOffset2.offsetTop;\n\t\n\t h = rect.height;\n\t w = rect.width;\n\t x = rect.left - offsetLeft;\n\t y = rect.top - offsetTop;\n\t\n\t if (el.getAttribute('data-pdf-annotate-type') === 'strikeout') {\n\t h += LINE_OFFSET;\n\t y -= LINE_OFFSET / 2;\n\t }\n\t break;\n\t\n\t case 'rect':\n\t case 'svg':\n\t h = parseInt(el.getAttribute('height'), 10);\n\t w = parseInt(el.getAttribute('width'), 10);\n\t x = parseInt(el.getAttribute('x'), 10);\n\t y = parseInt(el.getAttribute('y'), 10);\n\t break;\n\t }\n\t\n\t // Result provides same properties as getBoundingClientRect\n\t var result = {\n\t top: y,\n\t left: x,\n\t width: w,\n\t height: h,\n\t right: x + w,\n\t bottom: y + h\n\t };\n\t\n\t // For the case of nested SVG (point annotations) and grouped\n\t // lines or rects no adjustment needs to be made for scale.\n\t // I assume that the scale is already being handled\n\t // natively by virtue of the `transform` attribute.\n\t if (!['svg', 'g'].includes(el.nodeName.toLowerCase())) {\n\t result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n\t }\n\t\n\t // // comment point need to be scaled on FF\n\t if (el.nodeName.toLowerCase() == 'svg' && $.browser.mozilla) {\n\t result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n\t }\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Adjust scale from normalized scale (100%) to rendered scale.\n\t *\n\t * @param {SVGElement} svg The SVG to gather metadata from\n\t * @param {Object} rect A map of numeric values to scale\n\t * @return {Object} A copy of `rect` with values scaled up\n\t */\n\tfunction scaleUp(svg, rect) {\n\t var result = {};\n\t\n\t var _getMetadata = getMetadata(svg),\n\t viewport = _getMetadata.viewport;\n\t\n\t Object.keys(rect).forEach(function (key) {\n\t result[key] = rect[key] * viewport.scale;\n\t });\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Adjust scale from rendered scale to a normalized scale (100%).\n\t *\n\t * @param {SVGElement} svg The SVG to gather metadata from\n\t * @param {Object} rect A map of numeric values to scale\n\t * @return {Object} A copy of `rect` with values scaled down\n\t */\n\tfunction scaleDown(svg, rect) {\n\t var result = {};\n\t\n\t var _getMetadata2 = getMetadata(svg),\n\t viewport = _getMetadata2.viewport;\n\t\n\t Object.keys(rect).forEach(function (key) {\n\t result[key] = rect[key] / viewport.scale;\n\t });\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Get the scroll position of an element, accounting for parent elements\n\t *\n\t * @param {Element} el The element to get the scroll position for\n\t * @return {Object} The scrollTop and scrollLeft position\n\t */\n\tfunction getScroll(el) {\n\t var scrollTop = 0;\n\t var scrollLeft = 0;\n\t var parentNode = el;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t scrollTop += parentNode.scrollTop;\n\t scrollLeft += parentNode.scrollLeft;\n\t }\n\t\n\t return { scrollTop: scrollTop, scrollLeft: scrollLeft };\n\t}\n\t\n\t/**\n\t * Get the offset position of an element, accounting for parent elements\n\t *\n\t * @param {Element} el The element to get the offset position for\n\t * @return {Object} The offsetTop and offsetLeft position\n\t */\n\tfunction getOffset(el) {\n\t var parentNode = el;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t if (parentNode.nodeName.toUpperCase() === 'SVG') {\n\t break;\n\t }\n\t }\n\t\n\t var rect = parentNode.getBoundingClientRect();\n\t\n\t return { offsetLeft: rect.left, offsetTop: rect.top };\n\t}\n\t\n\t/**\n\t * Disable user ability to select text on page\n\t */\n\tfunction disableUserSelect() {\n\t if (!userSelectStyleSheet.parentNode) {\n\t document.head.appendChild(userSelectStyleSheet);\n\t }\n\t}\n\t\n\t/**\n\t * Enable user ability to select text on page\n\t */\n\tfunction enableUserSelect() {\n\t if (userSelectStyleSheet.parentNode) {\n\t userSelectStyleSheet.parentNode.removeChild(userSelectStyleSheet);\n\t }\n\t}\n\t\n\t/**\n\t * Get the metadata for a SVG container\n\t *\n\t * @param {SVGElement} svg The SVG container to get metadata for\n\t */\n\tfunction getMetadata(svg) {\n\t return {\n\t documentId: svg.getAttribute('data-pdf-annotate-document'),\n\t pageNumber: parseInt(svg.getAttribute('data-pdf-annotate-page'), 10),\n\t viewport: JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'))\n\t };\n\t}\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function createStyleSheet(blocks) {\n\t var style = document.createElement('style');\n\t var text = Object.keys(blocks).map(function (selector) {\n\t return processRuleSet(selector, blocks[selector]);\n\t }).join('\\n');\n\t \n\t style.setAttribute('type', 'text/css');\n\t style.appendChild(document.createTextNode(text));\n\t\n\t return style;\n\t}\n\t\n\tfunction processRuleSet(selector, block) {\n\t return selector + ' {\\n' + processDeclarationBlock(block) + '\\n}';\n\t}\n\t\n\tfunction processDeclarationBlock(block) {\n\t return Object.keys(block).map(function (prop) {\n\t return processDeclaration(prop, block[prop]);\n\t }).join('\\n');\n\t}\n\t\n\tfunction processDeclaration(prop, value) {\n\t if (!isNaN(value) && value != 0) {\n\t value = value + 'px';\n\t }\n\t\n\t return hyphenate(prop) + ': ' + value + ';';\n\t}\n\t\n\tfunction hyphenate(prop) {\n\t return prop.replace(/[A-Z]/g, function (match) {\n\t return '-' + match.toLowerCase();\n\t });\n\t}\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _axios = __webpack_require__(9);\n\t\n\tvar _axios2 = _interopRequireDefault(_axios);\n\t\n\tvar _uuid = __webpack_require__(36);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _StoreAdapter2 = __webpack_require__(2);\n\t\n\tvar _StoreAdapter3 = _interopRequireDefault(_StoreAdapter2);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t_axios2.default.defaults.xsrfCookieName = 'csrftoken';\n\t_axios2.default.defaults.xsrfHeaderName = 'X-CSRFToken';\n\t\n\tvar CRFPAStoreAdapter = function (_StoreAdapter) {\n\t _inherits(CRFPAStoreAdapter, _StoreAdapter);\n\t\n\t function CRFPAStoreAdapter() {\n\t _classCallCheck(this, CRFPAStoreAdapter);\n\t\n\t var API = _axios2.default.create({\n\t baseURL: '/pdfannotator',\n\t timeout: 10000,\n\t withCredentials: true,\n\t headers: {\n\t 'Accept': 'application/json',\n\t 'Content-Type': 'application/json',\n\t 'Access-Control-Allow-Origin': '*'\n\t }\n\t });\n\t\n\t return _possibleConstructorReturn(this, (CRFPAStoreAdapter.__proto__ || Object.getPrototypeOf(CRFPAStoreAdapter)).call(this, {\n\t getAnnotations: function getAnnotations(documentId) {\n\t\n\t return API.get('/get-annotations/', {\n\t params: {\n\t fileUuid: _initFile.documentId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let annotations = getAnnotations(documentId).filter((i) => {\n\t // return i.page === pageNumber && i.class === 'Annotation';\n\t // });\n\t //\n\t // resolve({\n\t // documentId,\n\t // pageNumber,\n\t // annotations\n\t // });\n\t // });\n\t },\n\t getAnnotation: function getAnnotation(documentId, annotationId) {\n\t return API.get('/get-annotation/', {\n\t params: {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t },\n\t addAnnotation: function addAnnotation(documentId, pageNumber, annotation) {\n\t\n\t annotation.class = 'Annotation';\n\t annotation.page = pageNumber;\n\t annotation.uuid = (0, _uuid2.default)();\n\t\n\t return API.post('/add-annotation/', {\n\t fileUuid: _initFile.documentId,\n\t page: pageNumber,\n\t annotation: annotation\n\t }).then(function (response) {\n\t return annotation;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t\n\t // annotation.class = 'Annotation';\n\t // annotation.uuid = uuid();\n\t // annotation.page = pageNumber;\n\t\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.push(annotation);\n\t // updateAnnotations(documentId, annotations);\n\t\n\t // resolve(annotation);\n\t // });\n\t },\n\t editAnnotation: function editAnnotation(documentId, annotationId, annotation) {\n\t return API.post('/update-annotation/', {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId,\n\t annotation: annotation\n\t }).then(function (response) {\n\t if (annotation.type === 'point') (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return annotation;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let annotations = getAnnotations(documentId);\n\t // annotations[findAnnotation(documentId, annotationId)] = annotation;\n\t // updateAnnotations(documentId, annotations);\n\t //\n\t // resolve(annotation);\n\t // });\n\t },\n\t deleteAnnotation: function deleteAnnotation(documentId, annotationId) {\n\t return API.post('/delete-annotation/', {\n\t annotationId: annotationId,\n\t fileUuid: _initFile.documentId\n\t }).then(function (response) {\n\t (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return true;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let index = findAnnotation(documentId, annotationId);\n\t // if (index > -1) {\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.splice(index, 1);\n\t // updateAnnotations(documentId, annotations);\n\t // }\n\t //\n\t // resolve(true);\n\t // });\n\t },\n\t getComments: function getComments(documentId) {\n\t return API.get('/get-comments/', {\n\t params: {\n\t fileUuid: _initFile.documentId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // resolve(getAnnotations(documentId).filter((i) => {\n\t // return i.class === 'Comment' && i.annotation === annotationId;\n\t // }));\n\t // });\n\t },\n\t addComment: function addComment(documentId, annotationId, content) {\n\t\n\t return API.post('/add-comment/', {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId,\n\t content: content\n\t }).then(function (response) {\n\t (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return content;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let comment = {\n\t // class: 'Comment',\n\t // uuid: uuid(),\n\t // annotation: annotationId,\n\t // content: content\n\t // };\n\t //\n\t //\n\t //\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.push(comment);\n\t // updateAnnotations(documentId, annotations);\n\t //\n\t // resolve(comment);\n\t // });\n\t }\n\t }\n\t\n\t // deleteComment(documentId, commentId) {\n\t //\n\t // return API.post('/delete-comment/', {\n\t // fileUuid,\n\t // commentId,\n\t // }).then(function (response) {\n\t // return true;\n\t // });\n\t // }\n\t ));\n\t }\n\t\n\t return CRFPAStoreAdapter;\n\t}(_StoreAdapter3.default);\n\t//\n\t// function getAnnotations(documentId) {\n\t// return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || [];\n\t// }\n\t//\n\t// function updateAnnotations(documentId, annotations) {\n\t// localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations));\n\t// }\n\t\n\t// function findAnnotation(documentId, annotationId) {\n\t// let index = -1;\n\t// let annotations = getAnnotations(documentId);\n\t// for (let i=0, l=annotations.length; i<l; i++) {\n\t// if (annotations[i].uuid === annotationId) {\n\t// index = i;\n\t// break;\n\t// }\n\t// }\n\t// return index;\n\t// }\n\t\n\t\n\texports.default = CRFPAStoreAdapter;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(10);\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar bind = __webpack_require__(12);\n\tvar Axios = __webpack_require__(14);\n\tvar defaults = __webpack_require__(15);\n\t\n\t/**\n\t * Create an instance of Axios\n\t *\n\t * @param {Object} defaultConfig The default config for the instance\n\t * @return {Axios} A new instance of Axios\n\t */\n\tfunction createInstance(defaultConfig) {\n\t var context = new Axios(defaultConfig);\n\t var instance = bind(Axios.prototype.request, context);\n\t\n\t // Copy axios.prototype to instance\n\t utils.extend(instance, Axios.prototype, context);\n\t\n\t // Copy context to instance\n\t utils.extend(instance, context);\n\t\n\t return instance;\n\t}\n\t\n\t// Create the default instance to be exported\n\tvar axios = createInstance(defaults);\n\t\n\t// Expose Axios class to allow class inheritance\n\taxios.Axios = Axios;\n\t\n\t// Factory for creating new instances\n\taxios.create = function create(instanceConfig) {\n\t return createInstance(utils.merge(defaults, instanceConfig));\n\t};\n\t\n\t// Expose Cancel & CancelToken\n\taxios.Cancel = __webpack_require__(33);\n\taxios.CancelToken = __webpack_require__(34);\n\taxios.isCancel = __webpack_require__(30);\n\t\n\t// Expose all/spread\n\taxios.all = function all(promises) {\n\t return Promise.all(promises);\n\t};\n\taxios.spread = __webpack_require__(35);\n\t\n\tmodule.exports = axios;\n\t\n\t// Allow use of default import syntax in TypeScript\n\tmodule.exports.default = axios;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar bind = __webpack_require__(12);\n\tvar isBuffer = __webpack_require__(13);\n\t\n\t/*global toString:true*/\n\t\n\t// utils is a library of generic helper functions non-specific to axios\n\t\n\tvar toString = Object.prototype.toString;\n\t\n\t/**\n\t * Determine if a value is an Array\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Array, otherwise false\n\t */\n\tfunction isArray(val) {\n\t return toString.call(val) === '[object Array]';\n\t}\n\t\n\t/**\n\t * Determine if a value is an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBuffer(val) {\n\t return toString.call(val) === '[object ArrayBuffer]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a FormData\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an FormData, otherwise false\n\t */\n\tfunction isFormData(val) {\n\t return (typeof FormData !== 'undefined') && (val instanceof FormData);\n\t}\n\t\n\t/**\n\t * Determine if a value is a view on an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBufferView(val) {\n\t var result;\n\t if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n\t result = ArrayBuffer.isView(val);\n\t } else {\n\t result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Determine if a value is a String\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a String, otherwise false\n\t */\n\tfunction isString(val) {\n\t return typeof val === 'string';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Number\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Number, otherwise false\n\t */\n\tfunction isNumber(val) {\n\t return typeof val === 'number';\n\t}\n\t\n\t/**\n\t * Determine if a value is undefined\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if the value is undefined, otherwise false\n\t */\n\tfunction isUndefined(val) {\n\t return typeof val === 'undefined';\n\t}\n\t\n\t/**\n\t * Determine if a value is an Object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Object, otherwise false\n\t */\n\tfunction isObject(val) {\n\t return val !== null && typeof val === 'object';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Date\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Date, otherwise false\n\t */\n\tfunction isDate(val) {\n\t return toString.call(val) === '[object Date]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a File\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a File, otherwise false\n\t */\n\tfunction isFile(val) {\n\t return toString.call(val) === '[object File]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Blob\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Blob, otherwise false\n\t */\n\tfunction isBlob(val) {\n\t return toString.call(val) === '[object Blob]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Function\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Function, otherwise false\n\t */\n\tfunction isFunction(val) {\n\t return toString.call(val) === '[object Function]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Stream\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Stream, otherwise false\n\t */\n\tfunction isStream(val) {\n\t return isObject(val) && isFunction(val.pipe);\n\t}\n\t\n\t/**\n\t * Determine if a value is a URLSearchParams object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n\t */\n\tfunction isURLSearchParams(val) {\n\t return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n\t}\n\t\n\t/**\n\t * Trim excess whitespace off the beginning and end of a string\n\t *\n\t * @param {String} str The String to trim\n\t * @returns {String} The String freed of excess whitespace\n\t */\n\tfunction trim(str) {\n\t return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n\t}\n\t\n\t/**\n\t * Determine if we're running in a standard browser environment\n\t *\n\t * This allows axios to run in a web worker, and react-native.\n\t * Both environments support XMLHttpRequest, but not fully standard globals.\n\t *\n\t * web workers:\n\t * typeof window -> undefined\n\t * typeof document -> undefined\n\t *\n\t * react-native:\n\t * navigator.product -> 'ReactNative'\n\t */\n\tfunction isStandardBrowserEnv() {\n\t if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n\t return false;\n\t }\n\t return (\n\t typeof window !== 'undefined' &&\n\t typeof document !== 'undefined'\n\t );\n\t}\n\t\n\t/**\n\t * Iterate over an Array or an Object invoking a function for each item.\n\t *\n\t * If `obj` is an Array callback will be called passing\n\t * the value, index, and complete array for each item.\n\t *\n\t * If 'obj' is an Object callback will be called passing\n\t * the value, key, and complete object for each property.\n\t *\n\t * @param {Object|Array} obj The object to iterate\n\t * @param {Function} fn The callback to invoke for each item\n\t */\n\tfunction forEach(obj, fn) {\n\t // Don't bother if no value provided\n\t if (obj === null || typeof obj === 'undefined') {\n\t return;\n\t }\n\t\n\t // Force an array if not already something iterable\n\t if (typeof obj !== 'object') {\n\t /*eslint no-param-reassign:0*/\n\t obj = [obj];\n\t }\n\t\n\t if (isArray(obj)) {\n\t // Iterate over array values\n\t for (var i = 0, l = obj.length; i < l; i++) {\n\t fn.call(null, obj[i], i, obj);\n\t }\n\t } else {\n\t // Iterate over object keys\n\t for (var key in obj) {\n\t if (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t fn.call(null, obj[key], key, obj);\n\t }\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Accepts varargs expecting each argument to be an object, then\n\t * immutably merges the properties of each object and returns result.\n\t *\n\t * When multiple objects contain the same key the later object in\n\t * the arguments list will take precedence.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * var result = merge({foo: 123}, {foo: 456});\n\t * console.log(result.foo); // outputs 456\n\t * ```\n\t *\n\t * @param {Object} obj1 Object to merge\n\t * @returns {Object} Result of all merge properties\n\t */\n\tfunction merge(/* obj1, obj2, obj3, ... */) {\n\t var result = {};\n\t function assignValue(val, key) {\n\t if (typeof result[key] === 'object' && typeof val === 'object') {\n\t result[key] = merge(result[key], val);\n\t } else {\n\t result[key] = val;\n\t }\n\t }\n\t\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t forEach(arguments[i], assignValue);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Extends object a by mutably adding to it the properties of object b.\n\t *\n\t * @param {Object} a The object to be extended\n\t * @param {Object} b The object to copy properties from\n\t * @param {Object} thisArg The object to bind function to\n\t * @return {Object} The resulting value of object a\n\t */\n\tfunction extend(a, b, thisArg) {\n\t forEach(b, function assignValue(val, key) {\n\t if (thisArg && typeof val === 'function') {\n\t a[key] = bind(val, thisArg);\n\t } else {\n\t a[key] = val;\n\t }\n\t });\n\t return a;\n\t}\n\t\n\tmodule.exports = {\n\t isArray: isArray,\n\t isArrayBuffer: isArrayBuffer,\n\t isBuffer: isBuffer,\n\t isFormData: isFormData,\n\t isArrayBufferView: isArrayBufferView,\n\t isString: isString,\n\t isNumber: isNumber,\n\t isObject: isObject,\n\t isUndefined: isUndefined,\n\t isDate: isDate,\n\t isFile: isFile,\n\t isBlob: isBlob,\n\t isFunction: isFunction,\n\t isStream: isStream,\n\t isURLSearchParams: isURLSearchParams,\n\t isStandardBrowserEnv: isStandardBrowserEnv,\n\t forEach: forEach,\n\t merge: merge,\n\t extend: extend,\n\t trim: trim\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function bind(fn, thisArg) {\n\t return function wrap() {\n\t var args = new Array(arguments.length);\n\t for (var i = 0; i < args.length; i++) {\n\t args[i] = arguments[i];\n\t }\n\t return fn.apply(thisArg, args);\n\t };\n\t};\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t/*!\n\t * Determine if an object is a Buffer\n\t *\n\t * @author Feross Aboukhadijeh <https://feross.org>\n\t * @license MIT\n\t */\n\t\n\t// The _isBuffer check is for Safari 5-7 support, because it's missing\n\t// Object.prototype.constructor. Remove this eventually\n\tmodule.exports = function (obj) {\n\t return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n\t}\n\t\n\tfunction isBuffer (obj) {\n\t return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n\t}\n\t\n\t// For Node v0.10 support. Remove this eventually.\n\tfunction isSlowBuffer (obj) {\n\t return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n\t}\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar defaults = __webpack_require__(15);\n\tvar utils = __webpack_require__(11);\n\tvar InterceptorManager = __webpack_require__(27);\n\tvar dispatchRequest = __webpack_require__(28);\n\t\n\t/**\n\t * Create a new instance of Axios\n\t *\n\t * @param {Object} instanceConfig The default config for the instance\n\t */\n\tfunction Axios(instanceConfig) {\n\t this.defaults = instanceConfig;\n\t this.interceptors = {\n\t request: new InterceptorManager(),\n\t response: new InterceptorManager()\n\t };\n\t}\n\t\n\t/**\n\t * Dispatch a request\n\t *\n\t * @param {Object} config The config specific for this request (merged with this.defaults)\n\t */\n\tAxios.prototype.request = function request(config) {\n\t /*eslint no-param-reassign:0*/\n\t // Allow for axios('example/url'[, config]) a la fetch API\n\t if (typeof config === 'string') {\n\t config = utils.merge({\n\t url: arguments[0]\n\t }, arguments[1]);\n\t }\n\t\n\t config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n\t config.method = config.method.toLowerCase();\n\t\n\t // Hook up interceptors middleware\n\t var chain = [dispatchRequest, undefined];\n\t var promise = Promise.resolve(config);\n\t\n\t this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n\t chain.unshift(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n\t chain.push(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t while (chain.length) {\n\t promise = promise.then(chain.shift(), chain.shift());\n\t }\n\t\n\t return promise;\n\t};\n\t\n\t// Provide aliases for supported request methods\n\tutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url\n\t }));\n\t };\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, data, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url,\n\t data: data\n\t }));\n\t };\n\t});\n\t\n\tmodule.exports = Axios;\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar normalizeHeaderName = __webpack_require__(17);\n\t\n\tvar DEFAULT_CONTENT_TYPE = {\n\t 'Content-Type': 'application/x-www-form-urlencoded'\n\t};\n\t\n\tfunction setContentTypeIfUnset(headers, value) {\n\t if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n\t headers['Content-Type'] = value;\n\t }\n\t}\n\t\n\tfunction getDefaultAdapter() {\n\t var adapter;\n\t if (typeof XMLHttpRequest !== 'undefined') {\n\t // For browsers use XHR adapter\n\t adapter = __webpack_require__(18);\n\t } else if (typeof process !== 'undefined') {\n\t // For node use HTTP adapter\n\t adapter = __webpack_require__(18);\n\t }\n\t return adapter;\n\t}\n\t\n\tvar defaults = {\n\t adapter: getDefaultAdapter(),\n\t\n\t transformRequest: [function transformRequest(data, headers) {\n\t normalizeHeaderName(headers, 'Content-Type');\n\t if (utils.isFormData(data) ||\n\t utils.isArrayBuffer(data) ||\n\t utils.isBuffer(data) ||\n\t utils.isStream(data) ||\n\t utils.isFile(data) ||\n\t utils.isBlob(data)\n\t ) {\n\t return data;\n\t }\n\t if (utils.isArrayBufferView(data)) {\n\t return data.buffer;\n\t }\n\t if (utils.isURLSearchParams(data)) {\n\t setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n\t return data.toString();\n\t }\n\t if (utils.isObject(data)) {\n\t setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n\t return JSON.stringify(data);\n\t }\n\t return data;\n\t }],\n\t\n\t transformResponse: [function transformResponse(data) {\n\t /*eslint no-param-reassign:0*/\n\t if (typeof data === 'string') {\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) { /* Ignore */ }\n\t }\n\t return data;\n\t }],\n\t\n\t /**\n\t * A timeout in milliseconds to abort a request. If set to 0 (default) a\n\t * timeout is not created.\n\t */\n\t timeout: 0,\n\t\n\t xsrfCookieName: 'XSRF-TOKEN',\n\t xsrfHeaderName: 'X-XSRF-TOKEN',\n\t\n\t maxContentLength: -1,\n\t\n\t validateStatus: function validateStatus(status) {\n\t return status >= 200 && status < 300;\n\t }\n\t};\n\t\n\tdefaults.headers = {\n\t common: {\n\t 'Accept': 'application/json, text/plain, */*'\n\t }\n\t};\n\t\n\tutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n\t defaults.headers[method] = {};\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n\t});\n\t\n\tmodule.exports = defaults;\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\t\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things. But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals. It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\t\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\t\n\tfunction defaultSetTimout() {\n\t throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t try {\n\t if (typeof setTimeout === 'function') {\n\t cachedSetTimeout = setTimeout;\n\t } else {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t } catch (e) {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t try {\n\t if (typeof clearTimeout === 'function') {\n\t cachedClearTimeout = clearTimeout;\n\t } else {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t } catch (e) {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t} ())\n\tfunction runTimeout(fun) {\n\t if (cachedSetTimeout === setTimeout) {\n\t //normal enviroments in sane situations\n\t return setTimeout(fun, 0);\n\t }\n\t // if setTimeout wasn't available but was latter defined\n\t if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t cachedSetTimeout = setTimeout;\n\t return setTimeout(fun, 0);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedSetTimeout(fun, 0);\n\t } catch(e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedSetTimeout.call(null, fun, 0);\n\t } catch(e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t return cachedSetTimeout.call(this, fun, 0);\n\t }\n\t }\n\t\n\t\n\t}\n\tfunction runClearTimeout(marker) {\n\t if (cachedClearTimeout === clearTimeout) {\n\t //normal enviroments in sane situations\n\t return clearTimeout(marker);\n\t }\n\t // if clearTimeout wasn't available but was latter defined\n\t if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t cachedClearTimeout = clearTimeout;\n\t return clearTimeout(marker);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedClearTimeout(marker);\n\t } catch (e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedClearTimeout.call(null, marker);\n\t } catch (e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t return cachedClearTimeout.call(this, marker);\n\t }\n\t }\n\t\n\t\n\t\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t if (!draining || !currentQueue) {\n\t return;\n\t }\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = runTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t runClearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t runTimeout(drainQueue);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\tprocess.prependListener = noop;\n\tprocess.prependOnceListener = noop;\n\t\n\tprocess.listeners = function (name) { return [] }\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n\t utils.forEach(headers, function processHeader(value, name) {\n\t if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n\t headers[normalizedName] = value;\n\t delete headers[name];\n\t }\n\t });\n\t};\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar settle = __webpack_require__(19);\n\tvar buildURL = __webpack_require__(22);\n\tvar parseHeaders = __webpack_require__(23);\n\tvar isURLSameOrigin = __webpack_require__(24);\n\tvar createError = __webpack_require__(20);\n\tvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(25);\n\t\n\tmodule.exports = function xhrAdapter(config) {\n\t return new Promise(function dispatchXhrRequest(resolve, reject) {\n\t var requestData = config.data;\n\t var requestHeaders = config.headers;\n\t\n\t if (utils.isFormData(requestData)) {\n\t delete requestHeaders['Content-Type']; // Let the browser set it\n\t }\n\t\n\t var request = new XMLHttpRequest();\n\t var loadEvent = 'onreadystatechange';\n\t var xDomain = false;\n\t\n\t // For IE 8/9 CORS support\n\t // Only supports POST and GET calls and doesn't returns the response headers.\n\t // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n\t if (process.env.NODE_ENV !== 'test' &&\n\t typeof window !== 'undefined' &&\n\t window.XDomainRequest && !('withCredentials' in request) &&\n\t !isURLSameOrigin(config.url)) {\n\t request = new window.XDomainRequest();\n\t loadEvent = 'onload';\n\t xDomain = true;\n\t request.onprogress = function handleProgress() {};\n\t request.ontimeout = function handleTimeout() {};\n\t }\n\t\n\t // HTTP basic authentication\n\t if (config.auth) {\n\t var username = config.auth.username || '';\n\t var password = config.auth.password || '';\n\t requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n\t }\n\t\n\t request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\t\n\t // Set the request timeout in MS\n\t request.timeout = config.timeout;\n\t\n\t // Listen for ready state\n\t request[loadEvent] = function handleLoad() {\n\t if (!request || (request.readyState !== 4 && !xDomain)) {\n\t return;\n\t }\n\t\n\t // The request errored out and we didn't get a response, this will be\n\t // handled by onerror instead\n\t // With one exception: request that using file: protocol, most browsers\n\t // will return status as 0 even though it's a successful request\n\t if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n\t return;\n\t }\n\t\n\t // Prepare the response\n\t var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n\t var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n\t var response = {\n\t data: responseData,\n\t // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n\t status: request.status === 1223 ? 204 : request.status,\n\t statusText: request.status === 1223 ? 'No Content' : request.statusText,\n\t headers: responseHeaders,\n\t config: config,\n\t request: request\n\t };\n\t\n\t settle(resolve, reject, response);\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle low level network errors\n\t request.onerror = function handleError() {\n\t // Real errors are hidden from us by the browser\n\t // onerror should only fire if it's a network error\n\t reject(createError('Network Error', config, null, request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle timeout\n\t request.ontimeout = function handleTimeout() {\n\t reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n\t request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Add xsrf header\n\t // This is only done if running in a standard browser environment.\n\t // Specifically not if we're in a web worker, or react-native.\n\t if (utils.isStandardBrowserEnv()) {\n\t var cookies = __webpack_require__(26);\n\t\n\t // Add xsrf header\n\t var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n\t cookies.read(config.xsrfCookieName) :\n\t undefined;\n\t\n\t if (xsrfValue) {\n\t requestHeaders[config.xsrfHeaderName] = xsrfValue;\n\t }\n\t }\n\t\n\t // Add headers to the request\n\t if ('setRequestHeader' in request) {\n\t utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n\t if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n\t // Remove Content-Type if data is undefined\n\t delete requestHeaders[key];\n\t } else {\n\t // Otherwise add header to the request\n\t request.setRequestHeader(key, val);\n\t }\n\t });\n\t }\n\t\n\t // Add withCredentials to request if needed\n\t if (config.withCredentials) {\n\t request.withCredentials = true;\n\t }\n\t\n\t // Add responseType to request if needed\n\t if (config.responseType) {\n\t try {\n\t request.responseType = config.responseType;\n\t } catch (e) {\n\t // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n\t // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n\t if (config.responseType !== 'json') {\n\t throw e;\n\t }\n\t }\n\t }\n\t\n\t // Handle progress if needed\n\t if (typeof config.onDownloadProgress === 'function') {\n\t request.addEventListener('progress', config.onDownloadProgress);\n\t }\n\t\n\t // Not all browsers support upload events\n\t if (typeof config.onUploadProgress === 'function' && request.upload) {\n\t request.upload.addEventListener('progress', config.onUploadProgress);\n\t }\n\t\n\t if (config.cancelToken) {\n\t // Handle cancellation\n\t config.cancelToken.promise.then(function onCanceled(cancel) {\n\t if (!request) {\n\t return;\n\t }\n\t\n\t request.abort();\n\t reject(cancel);\n\t // Clean up request\n\t request = null;\n\t });\n\t }\n\t\n\t if (requestData === undefined) {\n\t requestData = null;\n\t }\n\t\n\t // Send the request\n\t request.send(requestData);\n\t });\n\t};\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar createError = __webpack_require__(20);\n\t\n\t/**\n\t * Resolve or reject a Promise based on response status.\n\t *\n\t * @param {Function} resolve A function that resolves the promise.\n\t * @param {Function} reject A function that rejects the promise.\n\t * @param {object} response The response.\n\t */\n\tmodule.exports = function settle(resolve, reject, response) {\n\t var validateStatus = response.config.validateStatus;\n\t // Note: status is not exposed by XDomainRequest\n\t if (!response.status || !validateStatus || validateStatus(response.status)) {\n\t resolve(response);\n\t } else {\n\t reject(createError(\n\t 'Request failed with status code ' + response.status,\n\t response.config,\n\t null,\n\t response.request,\n\t response\n\t ));\n\t }\n\t};\n\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar enhanceError = __webpack_require__(21);\n\t\n\t/**\n\t * Create an Error with the specified message, config, error code, request and response.\n\t *\n\t * @param {string} message The error message.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The created error.\n\t */\n\tmodule.exports = function createError(message, config, code, request, response) {\n\t var error = new Error(message);\n\t return enhanceError(error, config, code, request, response);\n\t};\n\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Update an Error with the specified config, error code, and response.\n\t *\n\t * @param {Error} error The error to update.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The error.\n\t */\n\tmodule.exports = function enhanceError(error, config, code, request, response) {\n\t error.config = config;\n\t if (code) {\n\t error.code = code;\n\t }\n\t error.request = request;\n\t error.response = response;\n\t return error;\n\t};\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tfunction encode(val) {\n\t return encodeURIComponent(val).\n\t replace(/%40/gi, '@').\n\t replace(/%3A/gi, ':').\n\t replace(/%24/g, '$').\n\t replace(/%2C/gi, ',').\n\t replace(/%20/g, '+').\n\t replace(/%5B/gi, '[').\n\t replace(/%5D/gi, ']');\n\t}\n\t\n\t/**\n\t * Build a URL by appending params to the end\n\t *\n\t * @param {string} url The base of the url (e.g., http://www.google.com)\n\t * @param {object} [params] The params to be appended\n\t * @returns {string} The formatted url\n\t */\n\tmodule.exports = function buildURL(url, params, paramsSerializer) {\n\t /*eslint no-param-reassign:0*/\n\t if (!params) {\n\t return url;\n\t }\n\t\n\t var serializedParams;\n\t if (paramsSerializer) {\n\t serializedParams = paramsSerializer(params);\n\t } else if (utils.isURLSearchParams(params)) {\n\t serializedParams = params.toString();\n\t } else {\n\t var parts = [];\n\t\n\t utils.forEach(params, function serialize(val, key) {\n\t if (val === null || typeof val === 'undefined') {\n\t return;\n\t }\n\t\n\t if (utils.isArray(val)) {\n\t key = key + '[]';\n\t } else {\n\t val = [val];\n\t }\n\t\n\t utils.forEach(val, function parseValue(v) {\n\t if (utils.isDate(v)) {\n\t v = v.toISOString();\n\t } else if (utils.isObject(v)) {\n\t v = JSON.stringify(v);\n\t }\n\t parts.push(encode(key) + '=' + encode(v));\n\t });\n\t });\n\t\n\t serializedParams = parts.join('&');\n\t }\n\t\n\t if (serializedParams) {\n\t url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n\t }\n\t\n\t return url;\n\t};\n\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\t// Headers whose duplicates are ignored by node\n\t// c.f. https://nodejs.org/api/http.html#http_message_headers\n\tvar ignoreDuplicateOf = [\n\t 'age', 'authorization', 'content-length', 'content-type', 'etag',\n\t 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n\t 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n\t 'referer', 'retry-after', 'user-agent'\n\t];\n\t\n\t/**\n\t * Parse headers into an object\n\t *\n\t * ```\n\t * Date: Wed, 27 Aug 2014 08:58:49 GMT\n\t * Content-Type: application/json\n\t * Connection: keep-alive\n\t * Transfer-Encoding: chunked\n\t * ```\n\t *\n\t * @param {String} headers Headers needing to be parsed\n\t * @returns {Object} Headers parsed into an object\n\t */\n\tmodule.exports = function parseHeaders(headers) {\n\t var parsed = {};\n\t var key;\n\t var val;\n\t var i;\n\t\n\t if (!headers) { return parsed; }\n\t\n\t utils.forEach(headers.split('\\n'), function parser(line) {\n\t i = line.indexOf(':');\n\t key = utils.trim(line.substr(0, i)).toLowerCase();\n\t val = utils.trim(line.substr(i + 1));\n\t\n\t if (key) {\n\t if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n\t return;\n\t }\n\t if (key === 'set-cookie') {\n\t parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n\t } else {\n\t parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n\t }\n\t }\n\t });\n\t\n\t return parsed;\n\t};\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs have full support of the APIs needed to test\n\t // whether the request URL is of the same origin as current location.\n\t (function standardBrowserEnv() {\n\t var msie = /(msie|trident)/i.test(navigator.userAgent);\n\t var urlParsingNode = document.createElement('a');\n\t var originURL;\n\t\n\t /**\n\t * Parse a URL to discover it's components\n\t *\n\t * @param {String} url The URL to be parsed\n\t * @returns {Object}\n\t */\n\t function resolveURL(url) {\n\t var href = url;\n\t\n\t if (msie) {\n\t // IE needs attribute set twice to normalize properties\n\t urlParsingNode.setAttribute('href', href);\n\t href = urlParsingNode.href;\n\t }\n\t\n\t urlParsingNode.setAttribute('href', href);\n\t\n\t // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n\t return {\n\t href: urlParsingNode.href,\n\t protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n\t host: urlParsingNode.host,\n\t search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n\t hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n\t hostname: urlParsingNode.hostname,\n\t port: urlParsingNode.port,\n\t pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n\t urlParsingNode.pathname :\n\t '/' + urlParsingNode.pathname\n\t };\n\t }\n\t\n\t originURL = resolveURL(window.location.href);\n\t\n\t /**\n\t * Determine if a URL shares the same origin as the current location\n\t *\n\t * @param {String} requestURL The URL to test\n\t * @returns {boolean} True if URL shares the same origin, otherwise false\n\t */\n\t return function isURLSameOrigin(requestURL) {\n\t var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n\t return (parsed.protocol === originURL.protocol &&\n\t parsed.host === originURL.host);\n\t };\n\t })() :\n\t\n\t // Non standard browser envs (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return function isURLSameOrigin() {\n\t return true;\n\t };\n\t })()\n\t);\n\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\t\n\tvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\t\n\tfunction E() {\n\t this.message = 'String contains an invalid character';\n\t}\n\tE.prototype = new Error;\n\tE.prototype.code = 5;\n\tE.prototype.name = 'InvalidCharacterError';\n\t\n\tfunction btoa(input) {\n\t var str = String(input);\n\t var output = '';\n\t for (\n\t // initialize result and counter\n\t var block, charCode, idx = 0, map = chars;\n\t // if the next str index does not exist:\n\t // change the mapping table to \"=\"\n\t // check if d has no fractional digits\n\t str.charAt(idx | 0) || (map = '=', idx % 1);\n\t // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n\t output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n\t ) {\n\t charCode = str.charCodeAt(idx += 3 / 4);\n\t if (charCode > 0xFF) {\n\t throw new E();\n\t }\n\t block = block << 8 | charCode;\n\t }\n\t return output;\n\t}\n\t\n\tmodule.exports = btoa;\n\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs support document.cookie\n\t (function standardBrowserEnv() {\n\t return {\n\t write: function write(name, value, expires, path, domain, secure) {\n\t var cookie = [];\n\t cookie.push(name + '=' + encodeURIComponent(value));\n\t\n\t if (utils.isNumber(expires)) {\n\t cookie.push('expires=' + new Date(expires).toGMTString());\n\t }\n\t\n\t if (utils.isString(path)) {\n\t cookie.push('path=' + path);\n\t }\n\t\n\t if (utils.isString(domain)) {\n\t cookie.push('domain=' + domain);\n\t }\n\t\n\t if (secure === true) {\n\t cookie.push('secure');\n\t }\n\t\n\t document.cookie = cookie.join('; ');\n\t },\n\t\n\t read: function read(name) {\n\t var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n\t return (match ? decodeURIComponent(match[3]) : null);\n\t },\n\t\n\t remove: function remove(name) {\n\t this.write(name, '', Date.now() - 86400000);\n\t }\n\t };\n\t })() :\n\t\n\t // Non standard browser env (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return {\n\t write: function write() {},\n\t read: function read() { return null; },\n\t remove: function remove() {}\n\t };\n\t })()\n\t);\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tfunction InterceptorManager() {\n\t this.handlers = [];\n\t}\n\t\n\t/**\n\t * Add a new interceptor to the stack\n\t *\n\t * @param {Function} fulfilled The function to handle `then` for a `Promise`\n\t * @param {Function} rejected The function to handle `reject` for a `Promise`\n\t *\n\t * @return {Number} An ID used to remove interceptor later\n\t */\n\tInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n\t this.handlers.push({\n\t fulfilled: fulfilled,\n\t rejected: rejected\n\t });\n\t return this.handlers.length - 1;\n\t};\n\t\n\t/**\n\t * Remove an interceptor from the stack\n\t *\n\t * @param {Number} id The ID that was returned by `use`\n\t */\n\tInterceptorManager.prototype.eject = function eject(id) {\n\t if (this.handlers[id]) {\n\t this.handlers[id] = null;\n\t }\n\t};\n\t\n\t/**\n\t * Iterate over all the registered interceptors\n\t *\n\t * This method is particularly useful for skipping over any\n\t * interceptors that may have become `null` calling `eject`.\n\t *\n\t * @param {Function} fn The function to call for each interceptor\n\t */\n\tInterceptorManager.prototype.forEach = function forEach(fn) {\n\t utils.forEach(this.handlers, function forEachHandler(h) {\n\t if (h !== null) {\n\t fn(h);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = InterceptorManager;\n\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar transformData = __webpack_require__(29);\n\tvar isCancel = __webpack_require__(30);\n\tvar defaults = __webpack_require__(15);\n\tvar isAbsoluteURL = __webpack_require__(31);\n\tvar combineURLs = __webpack_require__(32);\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tfunction throwIfCancellationRequested(config) {\n\t if (config.cancelToken) {\n\t config.cancelToken.throwIfRequested();\n\t }\n\t}\n\t\n\t/**\n\t * Dispatch a request to the server using the configured adapter.\n\t *\n\t * @param {object} config The config that is to be used for the request\n\t * @returns {Promise} The Promise to be fulfilled\n\t */\n\tmodule.exports = function dispatchRequest(config) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Support baseURL config\n\t if (config.baseURL && !isAbsoluteURL(config.url)) {\n\t config.url = combineURLs(config.baseURL, config.url);\n\t }\n\t\n\t // Ensure headers exist\n\t config.headers = config.headers || {};\n\t\n\t // Transform request data\n\t config.data = transformData(\n\t config.data,\n\t config.headers,\n\t config.transformRequest\n\t );\n\t\n\t // Flatten headers\n\t config.headers = utils.merge(\n\t config.headers.common || {},\n\t config.headers[config.method] || {},\n\t config.headers || {}\n\t );\n\t\n\t utils.forEach(\n\t ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n\t function cleanHeaderConfig(method) {\n\t delete config.headers[method];\n\t }\n\t );\n\t\n\t var adapter = config.adapter || defaults.adapter;\n\t\n\t return adapter(config).then(function onAdapterResolution(response) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t response.data = transformData(\n\t response.data,\n\t response.headers,\n\t config.transformResponse\n\t );\n\t\n\t return response;\n\t }, function onAdapterRejection(reason) {\n\t if (!isCancel(reason)) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t if (reason && reason.response) {\n\t reason.response.data = transformData(\n\t reason.response.data,\n\t reason.response.headers,\n\t config.transformResponse\n\t );\n\t }\n\t }\n\t\n\t return Promise.reject(reason);\n\t });\n\t};\n\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\t/**\n\t * Transform the data for a request or a response\n\t *\n\t * @param {Object|String} data The data to be transformed\n\t * @param {Array} headers The headers for the request or response\n\t * @param {Array|Function} fns A single function or Array of functions\n\t * @returns {*} The resulting transformed data\n\t */\n\tmodule.exports = function transformData(data, headers, fns) {\n\t /*eslint no-param-reassign:0*/\n\t utils.forEach(fns, function transform(fn) {\n\t data = fn(data, headers);\n\t });\n\t\n\t return data;\n\t};\n\n\n/***/ },\n/* 30 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function isCancel(value) {\n\t return !!(value && value.__CANCEL__);\n\t};\n\n\n/***/ },\n/* 31 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Determines whether the specified URL is absolute\n\t *\n\t * @param {string} url The URL to test\n\t * @returns {boolean} True if the specified URL is absolute, otherwise false\n\t */\n\tmodule.exports = function isAbsoluteURL(url) {\n\t // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n\t // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n\t // by any combination of letters, digits, plus, period, or hyphen.\n\t return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n\t};\n\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Creates a new URL by combining the specified URLs\n\t *\n\t * @param {string} baseURL The base URL\n\t * @param {string} relativeURL The relative URL\n\t * @returns {string} The combined URL\n\t */\n\tmodule.exports = function combineURLs(baseURL, relativeURL) {\n\t return relativeURL\n\t ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n\t : baseURL;\n\t};\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * A `Cancel` is an object that is thrown when an operation is canceled.\n\t *\n\t * @class\n\t * @param {string=} message The message.\n\t */\n\tfunction Cancel(message) {\n\t this.message = message;\n\t}\n\t\n\tCancel.prototype.toString = function toString() {\n\t return 'Cancel' + (this.message ? ': ' + this.message : '');\n\t};\n\t\n\tCancel.prototype.__CANCEL__ = true;\n\t\n\tmodule.exports = Cancel;\n\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar Cancel = __webpack_require__(33);\n\t\n\t/**\n\t * A `CancelToken` is an object that can be used to request cancellation of an operation.\n\t *\n\t * @class\n\t * @param {Function} executor The executor function.\n\t */\n\tfunction CancelToken(executor) {\n\t if (typeof executor !== 'function') {\n\t throw new TypeError('executor must be a function.');\n\t }\n\t\n\t var resolvePromise;\n\t this.promise = new Promise(function promiseExecutor(resolve) {\n\t resolvePromise = resolve;\n\t });\n\t\n\t var token = this;\n\t executor(function cancel(message) {\n\t if (token.reason) {\n\t // Cancellation has already been requested\n\t return;\n\t }\n\t\n\t token.reason = new Cancel(message);\n\t resolvePromise(token.reason);\n\t });\n\t}\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n\t if (this.reason) {\n\t throw this.reason;\n\t }\n\t};\n\t\n\t/**\n\t * Returns an object that contains a new `CancelToken` and a function that, when called,\n\t * cancels the `CancelToken`.\n\t */\n\tCancelToken.source = function source() {\n\t var cancel;\n\t var token = new CancelToken(function executor(c) {\n\t cancel = c;\n\t });\n\t return {\n\t token: token,\n\t cancel: cancel\n\t };\n\t};\n\t\n\tmodule.exports = CancelToken;\n\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Syntactic sugar for invoking a function and expanding an array for arguments.\n\t *\n\t * Common use case would be to use `Function.prototype.apply`.\n\t *\n\t * ```js\n\t * function f(x, y, z) {}\n\t * var args = [1, 2, 3];\n\t * f.apply(null, args);\n\t * ```\n\t *\n\t * With `spread` this example can be re-written.\n\t *\n\t * ```js\n\t * spread(function(x, y, z) {})([1, 2, 3]);\n\t * ```\n\t *\n\t * @param {Function} callback\n\t * @returns {Function}\n\t */\n\tmodule.exports = function spread(callback) {\n\t return function wrap(arr) {\n\t return callback.apply(null, arr);\n\t };\n\t};\n\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = uuid;\n\tvar REGEXP = /[xy]/g;\n\tvar PATTERN = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n\t\n\tfunction replacement(c) {\n\t var r = Math.random() * 16 | 0;\n\t var v = c == 'x' ? r : r & 0x3 | 0x8;\n\t return v.toString(16);\n\t}\n\t\n\t/**\n\t * Generate a univierally unique identifier\n\t *\n\t * @return {String}\n\t */\n\tfunction uuid() {\n\t return PATTERN.replace(REGEXP, replacement);\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar documentUrl = exports.documentUrl = document.getElementById('pdf-data').dataset.filepath;\n\tvar documentId = exports.documentId = document.getElementById('pdf-data').dataset.uuid;\n\tvar readonly = exports.readonly = document.getElementById('pdf-data').dataset.readonly === 'True';\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.renderComments = renderComments;\n\texports.selectComment = selectComment;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _twitterText = __webpack_require__(39);\n\t\n\tvar _twitterText2 = _interopRequireDefault(_twitterText);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _edit = __webpack_require__(40);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar commentList = $('#comment-wrapper .comment-list-container');\n\tvar commentForm = $('#comment-wrapper .comment-list-form');\n\t\n\t// let commentText = commentForm.querySelector('input[type=\"text\"]');\n\t\n\tfunction renderComments(documentId) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().getComments(documentId).then(function (comments) {\n\t\n\t commentList.html('');\n\t commentForm.hide();\n\t // commentText.focus();\n\t\n\t // commentForm.onsubmit = function () {\n\t // PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n\t // .then(insertComment)\n\t // .then(() => {\n\t // commentText.value = '';\n\t // commentText.focus();\n\t // });\n\t //\n\t // return false;\n\t // };\n\t\n\t comments.forEach(insertComment);\n\t });\n\t}\n\t\n\tfunction supportsComments(target) {\n\t var type = target.getAttribute('data-pdf-annotate-type');\n\t return ['point', 'highlight', 'area'].indexOf(type) > -1;\n\t}\n\t\n\tfunction insertComment(comment) {\n\t var child = $('<div></div>');\n\t child.addClass('comment-list-item');\n\t child.attr('uuid', comment.annotation);\n\t child.html(_twitterText2.default.autoLink(_twitterText2.default.htmlEscape(comment.content)));\n\t child.bind('click', handleCommentClick);\n\t commentList.append(child);\n\t}\n\t\n\tfunction handleCommentClick(e) {\n\t var comment = $(e.target);\n\t selectComment(comment.attr('uuid'));\n\t}\n\t\n\tfunction scrollToView(element) {\n\t var offset = element.offset().top;\n\t if (!element.is(\":visible\")) {\n\t element.css({ \"visibility\": \"hidden\" }).show();\n\t var offset = element.offset().top;\n\t element.css({ \"visibility\": \"\", \"display\": \"\" });\n\t }\n\t\n\t var visible_area_start = $(window).scrollTop();\n\t var visible_area_end = visible_area_start + window.innerHeight;\n\t\n\t if (offset < visible_area_start || offset > visible_area_end) {\n\t // Not in view so scroll to it\n\t if (element.hasClass('comment-list-item')) {\n\t $('.comment-list-container').animate({ scrollTop: offset - window.innerHeight / 3 }, 300);\n\t } else {\n\t $('#content-wrapper').animate({ scrollTop: offset - window.innerHeight / 3 }, 300);\n\t }\n\t return false;\n\t }\n\t return true;\n\t}\n\t\n\tfunction selectComment(uuid) {\n\t var comment = $(\".comment-list-item[uuid=\" + uuid + \"]\");\n\t $('.comment-list-item').removeClass('selected');\n\t comment.addClass('selected');\n\t var annotation = $(\"[data-pdf-annotate-id=\" + uuid + \"]\")[0];\n\t (0, _edit.createEditOverlay)(annotation);\n\t scrollToView($(annotation));\n\t scrollToView(comment);\n\t}\n\t\n\t// function handleAnnotationClick(target) {\n\t// if (supportsComments(target)) {\n\t// let documentId = target.parentNode.getAttribute('data-pdf-annotate-document');\n\t// let annotationId = target.getAttribute('data-pdf-annotate-id');\n\t//\n\t// PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId).then((comments) => {\n\t// commentList.innerHTML = '';\n\t// commentForm.style.display = '';\n\t// commentText.focus();\n\t//\n\t// commentForm.onsubmit = function () {\n\t// PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n\t// .then(insertComment)\n\t// .then(() => {\n\t// commentText.value = '';\n\t// commentText.focus();\n\t// });\n\t//\n\t// return false;\n\t// };\n\t//\n\t// comments.forEach(insertComment);\n\t// });\n\t// }\n\t// }\n\t//\n\t// function handleAnnotationBlur(target) {\n\t// if (supportsComments(target)) {\n\t// commentList.innerHTML = '';\n\t// commentForm.style.display = 'none';\n\t// commentForm.onsubmit = null;\n\t//\n\t// insertComment({content: 'No comments'});\n\t// }\n\t// }\n\t\n\t\n\t// UI.addEventListener('annotation:click', handleAnnotationClick);\n\t// UI.addEventListener('annotation:blur', handleAnnotationBlur);\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function() {\n\t if (typeof twttr === \"undefined\" || twttr === null) {\n\t var twttr = {};\n\t }\n\t\n\t twttr.txt = {};\n\t twttr.txt.regexen = {};\n\t\n\t var HTML_ENTITIES = {\n\t '&': '&',\n\t '>': '>',\n\t '<': '<',\n\t '\"': '"',\n\t \"'\": '''\n\t };\n\t\n\t // HTML escaping\n\t twttr.txt.htmlEscape = function(text) {\n\t return text && text.replace(/[&\"'><]/g, function(character) {\n\t return HTML_ENTITIES[character];\n\t });\n\t };\n\t\n\t // Builds a RegExp\n\t function regexSupplant(regex, flags) {\n\t flags = flags || \"\";\n\t if (typeof regex !== \"string\") {\n\t if (regex.global && flags.indexOf(\"g\") < 0) {\n\t flags += \"g\";\n\t }\n\t if (regex.ignoreCase && flags.indexOf(\"i\") < 0) {\n\t flags += \"i\";\n\t }\n\t if (regex.multiline && flags.indexOf(\"m\") < 0) {\n\t flags += \"m\";\n\t }\n\t\n\t regex = regex.source;\n\t }\n\t\n\t return new RegExp(regex.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n\t var newRegex = twttr.txt.regexen[name] || \"\";\n\t if (typeof newRegex !== \"string\") {\n\t newRegex = newRegex.source;\n\t }\n\t return newRegex;\n\t }), flags);\n\t }\n\t\n\t twttr.txt.regexSupplant = regexSupplant;\n\t\n\t // simple string interpolation\n\t function stringSupplant(str, values) {\n\t return str.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n\t return values[name] || \"\";\n\t });\n\t }\n\t\n\t twttr.txt.stringSupplant = stringSupplant;\n\t\n\t twttr.txt.regexen.spaces_group = /\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000/;\n\t twttr.txt.regexen.spaces = regexSupplant(/[#{spaces_group}]/);\n\t twttr.txt.regexen.invalid_chars_group = /\\uFFFE\\uFEFF\\uFFFF\\u202A-\\u202E/;\n\t twttr.txt.regexen.invalid_chars = regexSupplant(/[#{invalid_chars_group}]/);\n\t twttr.txt.regexen.punct = /\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$/;\n\t twttr.txt.regexen.rtl_chars = /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg;\n\t twttr.txt.regexen.non_bmp_code_pairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/mg;\n\t\n\t twttr.txt.regexen.latinAccentChars = /\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF/;\n\t\n\t // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{L}\\p{M}\n\t twttr.txt.regexen.bmpLetterAndMarks = /A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0300-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u0483-\\u052f\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06df-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710-\\u074a\\u074d-\\u07b1\\u07ca-\\u07f5\\u07fa\\u0800-\\u082d\\u0840-\\u085b\\u08a0-\\u08b2\\u08e4-\\u0963\\u0971-\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bc-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e3\\u09f0\\u09f1\\u0a01-\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a59-\\u0a5c\\u0a5e\\u0a70-\\u0a75\\u0a81-\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abc-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ad0\\u0ae0-\\u0ae3\\u0b01-\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3c-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b63\\u0b71\\u0b82\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd0\\u0bd7\\u0c00-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c58\\u0c59\\u0c60-\\u0c63\\u0c81-\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbc-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0cde\\u0ce0-\\u0ce3\\u0cf1\\u0cf2\\u0d01-\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4e\\u0d57\\u0d60-\\u0d63\\u0d7a-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb9\\u0ebb-\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ec8-\\u0ecd\\u0edc-\\u0edf\\u0f00\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f71-\\u0f84\\u0f86-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u103f\\u1050-\\u108f\\u109a-\\u109d\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u135d-\\u135f\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16f1-\\u16f8\\u1700-\\u170c\\u170e-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176c\\u176e-\\u1770\\u1772\\u1773\\u1780-\\u17d3\\u17d7\\u17dc\\u17dd\\u180b-\\u180d\\u1820-\\u1877\\u1880-\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1920-\\u192b\\u1930-\\u193b\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a1b\\u1a20-\\u1a5e\\u1a60-\\u1a7c\\u1a7f\\u1aa7\\u1ab0-\\u1abe\\u1b00-\\u1b4b\\u1b6b-\\u1b73\\u1b80-\\u1baf\\u1bba-\\u1bf3\\u1c00-\\u1c37\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1cd0-\\u1cd2\\u1cd4-\\u1cf6\\u1cf8\\u1cf9\\u1d00-\\u1df5\\u1dfc-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u20d0-\\u20f0\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2183\\u2184\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d7f-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2de0-\\u2dff\\u2e2f\\u3005\\u3006\\u302a-\\u302f\\u3031-\\u3035\\u303b\\u303c\\u3041-\\u3096\\u3099\\u309a\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua672\\ua674-\\ua67d\\ua67f-\\ua69d\\ua69f-\\ua6e5\\ua6f0\\ua6f1\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua7ad\\ua7b0\\ua7b1\\ua7f7-\\ua827\\ua840-\\ua873\\ua880-\\ua8c4\\ua8e0-\\ua8f7\\ua8fb\\ua90a-\\ua92d\\ua930-\\ua953\\ua960-\\ua97c\\ua980-\\ua9c0\\ua9cf\\ua9e0-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa36\\uaa40-\\uaa4d\\uaa60-\\uaa76\\uaa7a-\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaef\\uaaf2-\\uaaf6\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab5f\\uab64\\uab65\\uabc0-\\uabea\\uabec\\uabed\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf870-\\uf87f\\uf882\\uf884-\\uf89f\\uf8b8\\uf8c1-\\uf8d6\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe00-\\ufe0f\\ufe20-\\ufe2d\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc/;\n\t twttr.txt.regexen.astralLetterAndMarks = /\\ud800[\\udc00-\\udc0b\\udc0d-\\udc26\\udc28-\\udc3a\\udc3c\\udc3d\\udc3f-\\udc4d\\udc50-\\udc5d\\udc80-\\udcfa\\uddfd\\ude80-\\ude9c\\udea0-\\uded0\\udee0\\udf00-\\udf1f\\udf30-\\udf40\\udf42-\\udf49\\udf50-\\udf7a\\udf80-\\udf9d\\udfa0-\\udfc3\\udfc8-\\udfcf]|\\ud801[\\udc00-\\udc9d\\udd00-\\udd27\\udd30-\\udd63\\ude00-\\udf36\\udf40-\\udf55\\udf60-\\udf67]|\\ud802[\\udc00-\\udc05\\udc08\\udc0a-\\udc35\\udc37\\udc38\\udc3c\\udc3f-\\udc55\\udc60-\\udc76\\udc80-\\udc9e\\udd00-\\udd15\\udd20-\\udd39\\udd80-\\uddb7\\uddbe\\uddbf\\ude00-\\ude03\\ude05\\ude06\\ude0c-\\ude13\\ude15-\\ude17\\ude19-\\ude33\\ude38-\\ude3a\\ude3f\\ude60-\\ude7c\\ude80-\\ude9c\\udec0-\\udec7\\udec9-\\udee6\\udf00-\\udf35\\udf40-\\udf55\\udf60-\\udf72\\udf80-\\udf91]|\\ud803[\\udc00-\\udc48]|\\ud804[\\udc00-\\udc46\\udc7f-\\udcba\\udcd0-\\udce8\\udd00-\\udd34\\udd50-\\udd73\\udd76\\udd80-\\uddc4\\uddda\\ude00-\\ude11\\ude13-\\ude37\\udeb0-\\udeea\\udf01-\\udf03\\udf05-\\udf0c\\udf0f\\udf10\\udf13-\\udf28\\udf2a-\\udf30\\udf32\\udf33\\udf35-\\udf39\\udf3c-\\udf44\\udf47\\udf48\\udf4b-\\udf4d\\udf57\\udf5d-\\udf63\\udf66-\\udf6c\\udf70-\\udf74]|\\ud805[\\udc80-\\udcc5\\udcc7\\udd80-\\uddb5\\uddb8-\\uddc0\\ude00-\\ude40\\ude44\\ude80-\\udeb7]|\\ud806[\\udca0-\\udcdf\\udcff\\udec0-\\udef8]|\\ud808[\\udc00-\\udf98]|\\ud80c[\\udc00-\\udfff]|\\ud80d[\\udc00-\\udc2e]|\\ud81a[\\udc00-\\ude38\\ude40-\\ude5e\\uded0-\\udeed\\udef0-\\udef4\\udf00-\\udf36\\udf40-\\udf43\\udf63-\\udf77\\udf7d-\\udf8f]|\\ud81b[\\udf00-\\udf44\\udf50-\\udf7e\\udf8f-\\udf9f]|\\ud82c[\\udc00\\udc01]|\\ud82f[\\udc00-\\udc6a\\udc70-\\udc7c\\udc80-\\udc88\\udc90-\\udc99\\udc9d\\udc9e]|\\ud834[\\udd65-\\udd69\\udd6d-\\udd72\\udd7b-\\udd82\\udd85-\\udd8b\\uddaa-\\uddad\\ude42-\\ude44]|\\ud835[\\udc00-\\udc54\\udc56-\\udc9c\\udc9e\\udc9f\\udca2\\udca5\\udca6\\udca9-\\udcac\\udcae-\\udcb9\\udcbb\\udcbd-\\udcc3\\udcc5-\\udd05\\udd07-\\udd0a\\udd0d-\\udd14\\udd16-\\udd1c\\udd1e-\\udd39\\udd3b-\\udd3e\\udd40-\\udd44\\udd46\\udd4a-\\udd50\\udd52-\\udea5\\udea8-\\udec0\\udec2-\\udeda\\udedc-\\udefa\\udefc-\\udf14\\udf16-\\udf34\\udf36-\\udf4e\\udf50-\\udf6e\\udf70-\\udf88\\udf8a-\\udfa8\\udfaa-\\udfc2\\udfc4-\\udfcb]|\\ud83a[\\udc00-\\udcc4\\udcd0-\\udcd6]|\\ud83b[\\ude00-\\ude03\\ude05-\\ude1f\\ude21\\ude22\\ude24\\ude27\\ude29-\\ude32\\ude34-\\ude37\\ude39\\ude3b\\ude42\\ude47\\ude49\\ude4b\\ude4d-\\ude4f\\ude51\\ude52\\ude54\\ude57\\ude59\\ude5b\\ude5d\\ude5f\\ude61\\ude62\\ude64\\ude67-\\ude6a\\ude6c-\\ude72\\ude74-\\ude77\\ude79-\\ude7c\\ude7e\\ude80-\\ude89\\ude8b-\\ude9b\\udea1-\\udea3\\udea5-\\udea9\\udeab-\\udebb]|\\ud840[\\udc00-\\udfff]|\\ud841[\\udc00-\\udfff]|\\ud842[\\udc00-\\udfff]|\\ud843[\\udc00-\\udfff]|\\ud844[\\udc00-\\udfff]|\\ud845[\\udc00-\\udfff]|\\ud846[\\udc00-\\udfff]|\\ud847[\\udc00-\\udfff]|\\ud848[\\udc00-\\udfff]|\\ud849[\\udc00-\\udfff]|\\ud84a[\\udc00-\\udfff]|\\ud84b[\\udc00-\\udfff]|\\ud84c[\\udc00-\\udfff]|\\ud84d[\\udc00-\\udfff]|\\ud84e[\\udc00-\\udfff]|\\ud84f[\\udc00-\\udfff]|\\ud850[\\udc00-\\udfff]|\\ud851[\\udc00-\\udfff]|\\ud852[\\udc00-\\udfff]|\\ud853[\\udc00-\\udfff]|\\ud854[\\udc00-\\udfff]|\\ud855[\\udc00-\\udfff]|\\ud856[\\udc00-\\udfff]|\\ud857[\\udc00-\\udfff]|\\ud858[\\udc00-\\udfff]|\\ud859[\\udc00-\\udfff]|\\ud85a[\\udc00-\\udfff]|\\ud85b[\\udc00-\\udfff]|\\ud85c[\\udc00-\\udfff]|\\ud85d[\\udc00-\\udfff]|\\ud85e[\\udc00-\\udfff]|\\ud85f[\\udc00-\\udfff]|\\ud860[\\udc00-\\udfff]|\\ud861[\\udc00-\\udfff]|\\ud862[\\udc00-\\udfff]|\\ud863[\\udc00-\\udfff]|\\ud864[\\udc00-\\udfff]|\\ud865[\\udc00-\\udfff]|\\ud866[\\udc00-\\udfff]|\\ud867[\\udc00-\\udfff]|\\ud868[\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86a[\\udc00-\\udfff]|\\ud86b[\\udc00-\\udfff]|\\ud86c[\\udc00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d]|\\ud87e[\\udc00-\\ude1d]|\\udb40[\\udd00-\\uddef]/;\n\t\n\t // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{Nd}\n\t twttr.txt.regexen.bmpNumerals = /0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u07c0-\\u07c9\\u0966-\\u096f\\u09e6-\\u09ef\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0de6-\\u0def\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\\u1040-\\u1049\\u1090-\\u1099\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1b50-\\u1b59\\u1bb0-\\u1bb9\\u1c40-\\u1c49\\u1c50-\\u1c59\\ua620-\\ua629\\ua8d0-\\ua8d9\\ua900-\\ua909\\ua9d0-\\ua9d9\\ua9f0-\\ua9f9\\uaa50-\\uaa59\\uabf0-\\uabf9\\uff10-\\uff19/;\n\t twttr.txt.regexen.astralNumerals = /\\ud801[\\udca0-\\udca9]|\\ud804[\\udc66-\\udc6f\\udcf0-\\udcf9\\udd36-\\udd3f\\uddd0-\\uddd9\\udef0-\\udef9]|\\ud805[\\udcd0-\\udcd9\\ude50-\\ude59\\udec0-\\udec9]|\\ud806[\\udce0-\\udce9]|\\ud81a[\\ude60-\\ude69\\udf50-\\udf59]|\\ud835[\\udfce-\\udfff]/;\n\t\n\t twttr.txt.regexen.hashtagSpecialChars = /_\\u200c\\u200d\\ua67e\\u05be\\u05f3\\u05f4\\uff5e\\u301c\\u309b\\u309c\\u30a0\\u30fb\\u3003\\u0f0b\\u0f0c\\xb7/;\n\t\n\t // A hashtag must contain at least one unicode letter or mark, as well as numbers, underscores, and select special characters.\n\t twttr.txt.regexen.hashSigns = /[##]/;\n\t twttr.txt.regexen.hashtagAlpha = regexSupplant(/(?:[#{bmpLetterAndMarks}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}))/);\n\t twttr.txt.regexen.hashtagAlphaNumeric = regexSupplant(/(?:[#{bmpLetterAndMarks}#{bmpNumerals}#{hashtagSpecialChars}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}|#{astralNumerals}))/);\n\t twttr.txt.regexen.endHashtagMatch = regexSupplant(/^(?:#{hashSigns}|:\\/\\/)/);\n\t twttr.txt.regexen.codePoint = /(?:[^\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/;\n\t twttr.txt.regexen.hashtagBoundary = regexSupplant(/(?:^|\\uFE0E|\\uFE0F|$|(?!#{hashtagAlphaNumeric}|&)#{codePoint})/);\n\t twttr.txt.regexen.validHashtag = regexSupplant(/(#{hashtagBoundary})(#{hashSigns})(?!\\uFE0F|\\u20E3)(#{hashtagAlphaNumeric}*#{hashtagAlpha}#{hashtagAlphaNumeric}*)/gi);\n\t\n\t // Mention related regex collection\n\t twttr.txt.regexen.validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@@]|(?:^|[^a-zA-Z0-9_+~.-])(?:rt|RT|rT|Rt):?)/;\n\t twttr.txt.regexen.atSigns = /[@@]/;\n\t twttr.txt.regexen.validMentionOrList = regexSupplant(\n\t '(#{validMentionPrecedingChars})' + // $1: Preceding character\n\t '(#{atSigns})' + // $2: At mark\n\t '([a-zA-Z0-9_]{1,20})' + // $3: Screen name\n\t '(\\/[a-zA-Z][a-zA-Z0-9_\\-]{0,24})?' // $4: List (optional)\n\t , 'g');\n\t twttr.txt.regexen.validReply = regexSupplant(/^(?:#{spaces})*#{atSigns}([a-zA-Z0-9_]{1,20})/);\n\t twttr.txt.regexen.endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\\/\\/)/);\n\t\n\t // URL related regex collection\n\t twttr.txt.regexen.validUrlPrecedingChars = regexSupplant(/(?:[^A-Za-z0-9@@$###{invalid_chars_group}]|^)/);\n\t twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars = /[-_.\\/]$/;\n\t twttr.txt.regexen.invalidDomainChars = stringSupplant(\"#{punct}#{spaces_group}#{invalid_chars_group}\", twttr.txt.regexen);\n\t twttr.txt.regexen.validDomainChars = regexSupplant(/[^#{invalidDomainChars}]/);\n\t twttr.txt.regexen.validSubdomain = regexSupplant(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n\t twttr.txt.regexen.validDomainName = regexSupplant(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n\t twttr.txt.regexen.validGTLD = regexSupplant(RegExp(\n\t'(?:(?:' +\n\t '삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|' +\n\t '政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|' +\n\t 'ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|' +\n\t 'بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|' +\n\t 'zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|' +\n\t 'yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|' +\n\t 'wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|' +\n\t 'website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|' +\n\t 'wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|' +\n\t 'vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|' +\n\t 'vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|' +\n\t 'university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|' +\n\t 'travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|' +\n\t 'toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|' +\n\t 'tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|' +\n\t 'tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|' +\n\t 'swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|' +\n\t 'stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|' +\n\t 'stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|' +\n\t 'softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|' +\n\t 'showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|' +\n\t 'sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|' +\n\t 'science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|' +\n\t 'sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|' +\n\t 'saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|' +\n\t 'rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|' +\n\t 'repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|' +\n\t 'realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|' +\n\t 'protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|' +\n\t 'pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|' +\n\t 'pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|' +\n\t 'pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|' +\n\t 'pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|' +\n\t 'onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|' +\n\t 'obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|' +\n\t 'nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|' +\n\t 'net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|' +\n\t 'msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|' +\n\t 'monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|' +\n\t 'miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|' +\n\t 'mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|' +\n\t 'makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|' +\n\t 'lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|' +\n\t 'limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|' +\n\t 'lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|' +\n\t 'lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|' +\n\t 'komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|' +\n\t 'kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|' +\n\t 'jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|' +\n\t 'investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|' +\n\t 'industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|' +\n\t 'hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|' +\n\t 'honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|' +\n\t 'hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|' +\n\t 'hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|' +\n\t 'gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|' +\n\t 'globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|' +\n\t 'garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|' +\n\t 'ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|' +\n\t 'football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|' +\n\t 'fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|' +\n\t 'ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|' +\n\t 'extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|' +\n\t 'estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|' +\n\t 'email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|' +\n\t 'download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|' +\n\t 'direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|' +\n\t 'delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|' +\n\t 'cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|' +\n\t 'coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|' +\n\t 'construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|' +\n\t 'college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|' +\n\t 'cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|' +\n\t 'chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|' +\n\t 'catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|' +\n\t 'capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|' +\n\t 'bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|' +\n\t 'bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|' +\n\t 'boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|' +\n\t 'black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|' +\n\t 'beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|' +\n\t 'barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|' +\n\t 'autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|' +\n\t 'art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|' +\n\t 'amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|' +\n\t 'alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|' +\n\t 'afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|' +\n\t 'academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion' +\n\t')(?=[^0-9a-zA-Z@]|$))'));\n\t twttr.txt.regexen.validCCTLD = regexSupplant(RegExp(\n\t'(?:(?:' +\n\t '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|' +\n\t 'ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|' +\n\t 'بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|' +\n\t 'zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|' +\n\t 'tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|' +\n\t 're|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|' +\n\t 'mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|' +\n\t 'ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|' +\n\t 'gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|' +\n\t 'do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|' +\n\t 'bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac' +\n\t')(?=[^0-9a-zA-Z@]|$))'));\n\t twttr.txt.regexen.validPunycode = /(?:xn--[0-9a-z]+)/;\n\t twttr.txt.regexen.validSpecialCCTLD = /(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/;\n\t twttr.txt.regexen.validDomain = regexSupplant(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/);\n\t twttr.txt.regexen.validAsciiDomain = regexSupplant(/(?:(?:[\\-a-z0-9#{latinAccentChars}]+)\\.)+(?:#{validGTLD}|#{validCCTLD}|#{validPunycode})/gi);\n\t twttr.txt.regexen.invalidShortDomain = regexSupplant(/^#{validDomainName}#{validCCTLD}$/i);\n\t twttr.txt.regexen.validSpecialShortDomain = regexSupplant(/^#{validDomainName}#{validSpecialCCTLD}$/i);\n\t twttr.txt.regexen.validPortNumber = /[0-9]+/;\n\t twttr.txt.regexen.cyrillicLettersAndMarks = /\\u0400-\\u04FF/;\n\t twttr.txt.regexen.validGeneralUrlPathChars = regexSupplant(/[a-z#{cyrillicLettersAndMarks}0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-_~@\\|&#{latinAccentChars}]/i);\n\t // Allow URL paths to contain up to two nested levels of balanced parens\n\t // 1. Used in Wikipedia URLs like /Primer_(film)\n\t // 2. Used in IIS sessions like /S(dfd346)/\n\t // 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/\n\t twttr.txt.regexen.validUrlBalancedParens = regexSupplant(\n\t '\\\\(' +\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}+' +\n\t '|' +\n\t // allow one nested level of balanced parentheses\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}*' +\n\t '\\\\(' +\n\t '#{validGeneralUrlPathChars}+' +\n\t '\\\\)' +\n\t '#{validGeneralUrlPathChars}*' +\n\t ')' +\n\t ')' +\n\t '\\\\)'\n\t , 'i');\n\t // Valid end-of-path chracters (so /foo. does not gobble the period).\n\t // 1. Allow =&# for empty URL parameters and other URL-join artifacts\n\t twttr.txt.regexen.validUrlPathEndingChars = regexSupplant(/[\\+\\-a-z#{cyrillicLettersAndMarks}0-9=_#\\/#{latinAccentChars}]|(?:#{validUrlBalancedParens})/i);\n\t // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/\n\t twttr.txt.regexen.validUrlPath = regexSupplant('(?:' +\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}*' +\n\t '(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*' +\n\t '#{validUrlPathEndingChars}'+\n\t ')|(?:@#{validGeneralUrlPathChars}+\\/)'+\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validUrlQueryChars = /[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]/i;\n\t twttr.txt.regexen.validUrlQueryEndingChars = /[a-z0-9_&=#\\/]/i;\n\t twttr.txt.regexen.extractUrl = regexSupplant(\n\t '(' + // $1 total match\n\t '(#{validUrlPrecedingChars})' + // $2 Preceeding chracter\n\t '(' + // $3 URL\n\t '(https?:\\\\/\\\\/)?' + // $4 Protocol (optional)\n\t '(#{validDomain})' + // $5 Domain(s)\n\t '(?::(#{validPortNumber}))?' + // $6 Port number (optional)\n\t '(\\\\/#{validUrlPath}*)?' + // $7 URL Path\n\t '(\\\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?' + // $8 Query String\n\t ')' +\n\t ')'\n\t , 'gi');\n\t\n\t twttr.txt.regexen.validTcoUrl = /^https?:\\/\\/t\\.co\\/[a-z0-9]+/i;\n\t twttr.txt.regexen.urlHasProtocol = /^https?:\\/\\//i;\n\t twttr.txt.regexen.urlHasHttps = /^https:\\/\\//i;\n\t\n\t // cashtag related regex\n\t twttr.txt.regexen.cashtag = /[a-z]{1,6}(?:[._][a-z]{1,2})?/i;\n\t twttr.txt.regexen.validCashtag = regexSupplant('(^|#{spaces})(\\\\$)(#{cashtag})(?=$|\\\\s|[#{punct}])', 'gi');\n\t\n\t // These URL validation pattern strings are based on the ABNF from RFC 3986\n\t twttr.txt.regexen.validateUrlUnreserved = /[a-z\\u0400-\\u04FF0-9\\-._~]/i;\n\t twttr.txt.regexen.validateUrlPctEncoded = /(?:%[0-9a-f]{2})/i;\n\t twttr.txt.regexen.validateUrlSubDelims = /[!$&'()*+,;=]/i;\n\t twttr.txt.regexen.validateUrlPchar = regexSupplant('(?:' +\n\t '#{validateUrlUnreserved}|' +\n\t '#{validateUrlPctEncoded}|' +\n\t '#{validateUrlSubDelims}|' +\n\t '[:|@]' +\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validateUrlScheme = /(?:[a-z][a-z0-9+\\-.]*)/i;\n\t twttr.txt.regexen.validateUrlUserinfo = regexSupplant('(?:' +\n\t '#{validateUrlUnreserved}|' +\n\t '#{validateUrlPctEncoded}|' +\n\t '#{validateUrlSubDelims}|' +\n\t ':' +\n\t ')*', 'i');\n\t\n\t twttr.txt.regexen.validateUrlDecOctet = /(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9]{2})|(?:2[0-4][0-9])|(?:25[0-5]))/i;\n\t twttr.txt.regexen.validateUrlIpv4 = regexSupplant(/(?:#{validateUrlDecOctet}(?:\\.#{validateUrlDecOctet}){3})/i);\n\t\n\t // Punting on real IPv6 validation for now\n\t twttr.txt.regexen.validateUrlIpv6 = /(?:\\[[a-f0-9:\\.]+\\])/i;\n\t\n\t // Also punting on IPvFuture for now\n\t twttr.txt.regexen.validateUrlIp = regexSupplant('(?:' +\n\t '#{validateUrlIpv4}|' +\n\t '#{validateUrlIpv6}' +\n\t ')', 'i');\n\t\n\t // This is more strict than the rfc specifies\n\t twttr.txt.regexen.validateUrlSubDomainSegment = /(?:[a-z0-9](?:[a-z0-9_\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomainSegment = /(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomainTld = /(?:[a-z](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomain = regexSupplant(/(?:(?:#{validateUrlSubDomainSegment}\\.)*(?:#{validateUrlDomainSegment}\\.)#{validateUrlDomainTld})/i);\n\t\n\t twttr.txt.regexen.validateUrlHost = regexSupplant('(?:' +\n\t '#{validateUrlIp}|' +\n\t '#{validateUrlDomain}' +\n\t ')', 'i');\n\t\n\t // Unencoded internationalized domains - this doesn't check for invalid UTF-8 sequences\n\t twttr.txt.regexen.validateUrlUnicodeSubDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9_\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomainTld = /(?:(?:[a-z]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomain = regexSupplant(/(?:(?:#{validateUrlUnicodeSubDomainSegment}\\.)*(?:#{validateUrlUnicodeDomainSegment}\\.)#{validateUrlUnicodeDomainTld})/i);\n\t\n\t twttr.txt.regexen.validateUrlUnicodeHost = regexSupplant('(?:' +\n\t '#{validateUrlIp}|' +\n\t '#{validateUrlUnicodeDomain}' +\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validateUrlPort = /[0-9]{1,5}/;\n\t\n\t twttr.txt.regexen.validateUrlUnicodeAuthority = regexSupplant(\n\t '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n\t '(#{validateUrlUnicodeHost})' + // $2 host\n\t '(?::(#{validateUrlPort}))?' //$3 port\n\t , \"i\");\n\t\n\t twttr.txt.regexen.validateUrlAuthority = regexSupplant(\n\t '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n\t '(#{validateUrlHost})' + // $2 host\n\t '(?::(#{validateUrlPort}))?' // $3 port\n\t , \"i\");\n\t\n\t twttr.txt.regexen.validateUrlPath = regexSupplant(/(\\/#{validateUrlPchar}*)*/i);\n\t twttr.txt.regexen.validateUrlQuery = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\t twttr.txt.regexen.validateUrlFragment = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\t\n\t // Modified version of RFC 3986 Appendix B\n\t twttr.txt.regexen.validateUrlUnencoded = regexSupplant(\n\t '^' + // Full URL\n\t '(?:' +\n\t '([^:/?#]+):\\\\/\\\\/' + // $1 Scheme\n\t ')?' +\n\t '([^/?#]*)' + // $2 Authority\n\t '([^?#]*)' + // $3 Path\n\t '(?:' +\n\t '\\\\?([^#]*)' + // $4 Query\n\t ')?' +\n\t '(?:' +\n\t '#(.*)' + // $5 Fragment\n\t ')?$'\n\t , \"i\");\n\t\n\t\n\t // Default CSS class for auto-linked lists (along with the url class)\n\t var DEFAULT_LIST_CLASS = \"tweet-url list-slug\";\n\t // Default CSS class for auto-linked usernames (along with the url class)\n\t var DEFAULT_USERNAME_CLASS = \"tweet-url username\";\n\t // Default CSS class for auto-linked hashtags (along with the url class)\n\t var DEFAULT_HASHTAG_CLASS = \"tweet-url hashtag\";\n\t // Default CSS class for auto-linked cashtags (along with the url class)\n\t var DEFAULT_CASHTAG_CLASS = \"tweet-url cashtag\";\n\t // Options which should not be passed as HTML attributes\n\t var OPTIONS_NOT_ATTRIBUTES = {'urlClass':true, 'listClass':true, 'usernameClass':true, 'hashtagClass':true, 'cashtagClass':true,\n\t 'usernameUrlBase':true, 'listUrlBase':true, 'hashtagUrlBase':true, 'cashtagUrlBase':true,\n\t 'usernameUrlBlock':true, 'listUrlBlock':true, 'hashtagUrlBlock':true, 'linkUrlBlock':true,\n\t 'usernameIncludeSymbol':true, 'suppressLists':true, 'suppressNoFollow':true, 'targetBlank':true,\n\t 'suppressDataScreenName':true, 'urlEntities':true, 'symbolTag':true, 'textWithSymbolTag':true, 'urlTarget':true,\n\t 'invisibleTagAttrs':true, 'linkAttributeBlock':true, 'linkTextBlock': true, 'htmlEscapeNonEntities': true\n\t };\n\t\n\t var BOOLEAN_ATTRIBUTES = {'disabled':true, 'readonly':true, 'multiple':true, 'checked':true};\n\t\n\t // Simple object cloning function for simple objects\n\t function clone(o) {\n\t var r = {};\n\t for (var k in o) {\n\t if (o.hasOwnProperty(k)) {\n\t r[k] = o[k];\n\t }\n\t }\n\t\n\t return r;\n\t }\n\t\n\t twttr.txt.tagAttrs = function(attributes) {\n\t var htmlAttrs = \"\";\n\t for (var k in attributes) {\n\t var v = attributes[k];\n\t if (BOOLEAN_ATTRIBUTES[k]) {\n\t v = v ? k : null;\n\t }\n\t if (v == null) continue;\n\t htmlAttrs += \" \" + twttr.txt.htmlEscape(k) + \"=\\\"\" + twttr.txt.htmlEscape(v.toString()) + \"\\\"\";\n\t }\n\t return htmlAttrs;\n\t };\n\t\n\t twttr.txt.linkToText = function(entity, text, attributes, options) {\n\t if (!options.suppressNoFollow) {\n\t attributes.rel = \"nofollow\";\n\t }\n\t // if linkAttributeBlock is specified, call it to modify the attributes\n\t if (options.linkAttributeBlock) {\n\t options.linkAttributeBlock(entity, attributes);\n\t }\n\t // if linkTextBlock is specified, call it to get a new/modified link text\n\t if (options.linkTextBlock) {\n\t text = options.linkTextBlock(entity, text);\n\t }\n\t var d = {\n\t text: text,\n\t attr: twttr.txt.tagAttrs(attributes)\n\t };\n\t return stringSupplant(\"<a#{attr}>#{text}</a>\", d);\n\t };\n\t\n\t twttr.txt.linkToTextWithSymbol = function(entity, symbol, text, attributes, options) {\n\t var taggedSymbol = options.symbolTag ? \"<\" + options.symbolTag + \">\" + symbol + \"</\"+ options.symbolTag + \">\" : symbol;\n\t text = twttr.txt.htmlEscape(text);\n\t var taggedText = options.textWithSymbolTag ? \"<\" + options.textWithSymbolTag + \">\" + text + \"</\"+ options.textWithSymbolTag + \">\" : text;\n\t\n\t if (options.usernameIncludeSymbol || !symbol.match(twttr.txt.regexen.atSigns)) {\n\t return twttr.txt.linkToText(entity, taggedSymbol + taggedText, attributes, options);\n\t } else {\n\t return taggedSymbol + twttr.txt.linkToText(entity, taggedText, attributes, options);\n\t }\n\t };\n\t\n\t twttr.txt.linkToHashtag = function(entity, text, options) {\n\t var hash = text.substring(entity.indices[0], entity.indices[0] + 1);\n\t var hashtag = twttr.txt.htmlEscape(entity.hashtag);\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs.href = options.hashtagUrlBase + hashtag;\n\t attrs.title = \"#\" + hashtag;\n\t attrs[\"class\"] = options.hashtagClass;\n\t if (hashtag.charAt(0).match(twttr.txt.regexen.rtl_chars)){\n\t attrs[\"class\"] += \" rtl\";\n\t }\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, hash, hashtag, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToCashtag = function(entity, text, options) {\n\t var cashtag = twttr.txt.htmlEscape(entity.cashtag);\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs.href = options.cashtagUrlBase + cashtag;\n\t attrs.title = \"$\" + cashtag;\n\t attrs[\"class\"] = options.cashtagClass;\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, \"$\", cashtag, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToMentionAndList = function(entity, text, options) {\n\t var at = text.substring(entity.indices[0], entity.indices[0] + 1);\n\t var user = twttr.txt.htmlEscape(entity.screenName);\n\t var slashListname = twttr.txt.htmlEscape(entity.listSlug);\n\t var isList = entity.listSlug && !options.suppressLists;\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs[\"class\"] = (isList ? options.listClass : options.usernameClass);\n\t attrs.href = isList ? options.listUrlBase + user + slashListname : options.usernameUrlBase + user;\n\t if (!isList && !options.suppressDataScreenName) {\n\t attrs['data-screen-name'] = user;\n\t }\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, at, isList ? user + slashListname : user, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToUrl = function(entity, text, options) {\n\t var url = entity.url;\n\t var displayUrl = url;\n\t var linkText = twttr.txt.htmlEscape(displayUrl);\n\t\n\t // If the caller passed a urlEntities object (provided by a Twitter API\n\t // response with include_entities=true), we use that to render the display_url\n\t // for each URL instead of it's underlying t.co URL.\n\t var urlEntity = (options.urlEntities && options.urlEntities[url]) || entity;\n\t if (urlEntity.display_url) {\n\t linkText = twttr.txt.linkTextWithEntity(urlEntity, options);\n\t }\n\t\n\t var attrs = clone(options.htmlAttrs || {});\n\t\n\t if (!url.match(twttr.txt.regexen.urlHasProtocol)) {\n\t url = \"http://\" + url;\n\t }\n\t attrs.href = url;\n\t\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t // set class only if urlClass is specified.\n\t if (options.urlClass) {\n\t attrs[\"class\"] = options.urlClass;\n\t }\n\t\n\t // set target only if urlTarget is specified.\n\t if (options.urlTarget) {\n\t attrs.target = options.urlTarget;\n\t }\n\t\n\t if (!options.title && urlEntity.display_url) {\n\t attrs.title = urlEntity.expanded_url;\n\t }\n\t\n\t return twttr.txt.linkToText(entity, linkText, attrs, options);\n\t };\n\t\n\t twttr.txt.linkTextWithEntity = function (entity, options) {\n\t var displayUrl = entity.display_url;\n\t var expandedUrl = entity.expanded_url;\n\t\n\t // Goal: If a user copies and pastes a tweet containing t.co'ed link, the resulting paste\n\t // should contain the full original URL (expanded_url), not the display URL.\n\t //\n\t // Method: Whenever possible, we actually emit HTML that contains expanded_url, and use\n\t // font-size:0 to hide those parts that should not be displayed (because they are not part of display_url).\n\t // Elements with font-size:0 get copied even though they are not visible.\n\t // Note that display:none doesn't work here. Elements with display:none don't get copied.\n\t //\n\t // Additionally, we want to *display* ellipses, but we don't want them copied. To make this happen we\n\t // wrap the ellipses in a tco-ellipsis class and provide an onCopy handler that sets display:none on\n\t // everything with the tco-ellipsis class.\n\t //\n\t // Exception: pic.twitter.com images, for which expandedUrl = \"https://twitter.com/#!/username/status/1234/photo/1\n\t // For those URLs, display_url is not a substring of expanded_url, so we don't do anything special to render the elided parts.\n\t // For a pic.twitter.com URL, the only elided part will be the \"https://\", so this is fine.\n\t\n\t var displayUrlSansEllipses = displayUrl.replace(/…/g, \"\"); // We have to disregard ellipses for matching\n\t // Note: we currently only support eliding parts of the URL at the beginning or the end.\n\t // Eventually we may want to elide parts of the URL in the *middle*. If so, this code will\n\t // become more complicated. We will probably want to create a regexp out of display URL,\n\t // replacing every ellipsis with a \".*\".\n\t if (expandedUrl.indexOf(displayUrlSansEllipses) != -1) {\n\t var displayUrlIndex = expandedUrl.indexOf(displayUrlSansEllipses);\n\t var v = {\n\t displayUrlSansEllipses: displayUrlSansEllipses,\n\t // Portion of expandedUrl that precedes the displayUrl substring\n\t beforeDisplayUrl: expandedUrl.substr(0, displayUrlIndex),\n\t // Portion of expandedUrl that comes after displayUrl\n\t afterDisplayUrl: expandedUrl.substr(displayUrlIndex + displayUrlSansEllipses.length),\n\t precedingEllipsis: displayUrl.match(/^…/) ? \"…\" : \"\",\n\t followingEllipsis: displayUrl.match(/…$/) ? \"…\" : \"\"\n\t };\n\t for (var k in v) {\n\t if (v.hasOwnProperty(k)) {\n\t v[k] = twttr.txt.htmlEscape(v[k]);\n\t }\n\t }\n\t // As an example: The user tweets \"hi http://longdomainname.com/foo\"\n\t // This gets shortened to \"hi http://t.co/xyzabc\", with display_url = \"…nname.com/foo\"\n\t // This will get rendered as:\n\t // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n\t // …\n\t // <!-- There's a chance the onCopy event handler might not fire. In case that happens,\n\t // we include an here so that the … doesn't bump up against the URL and ruin it.\n\t // The is inside the tco-ellipsis span so that when the onCopy handler *does*\n\t // fire, it doesn't get copied. Otherwise the copied text would have two spaces in a row,\n\t // e.g. \"hi http://longdomainname.com/foo\".\n\t // <span style='font-size:0'> </span>\n\t // </span>\n\t // <span style='font-size:0'> <!-- This stuff should get copied but not displayed -->\n\t // http://longdomai\n\t // </span>\n\t // <span class='js-display-url'> <!-- This stuff should get displayed *and* copied -->\n\t // nname.com/foo\n\t // </span>\n\t // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n\t // <span style='font-size:0'> </span>\n\t // …\n\t // </span>\n\t v['invisible'] = options.invisibleTagAttrs;\n\t return stringSupplant(\"<span class='tco-ellipsis'>#{precedingEllipsis}<span #{invisible}> </span></span><span #{invisible}>#{beforeDisplayUrl}</span><span class='js-display-url'>#{displayUrlSansEllipses}</span><span #{invisible}>#{afterDisplayUrl}</span><span class='tco-ellipsis'><span #{invisible}> </span>#{followingEllipsis}</span>\", v);\n\t }\n\t return displayUrl;\n\t };\n\t\n\t twttr.txt.autoLinkEntities = function(text, entities, options) {\n\t options = clone(options || {});\n\t\n\t options.hashtagClass = options.hashtagClass || DEFAULT_HASHTAG_CLASS;\n\t options.hashtagUrlBase = options.hashtagUrlBase || \"https://twitter.com/#!/search?q=%23\";\n\t options.cashtagClass = options.cashtagClass || DEFAULT_CASHTAG_CLASS;\n\t options.cashtagUrlBase = options.cashtagUrlBase || \"https://twitter.com/#!/search?q=%24\";\n\t options.listClass = options.listClass || DEFAULT_LIST_CLASS;\n\t options.usernameClass = options.usernameClass || DEFAULT_USERNAME_CLASS;\n\t options.usernameUrlBase = options.usernameUrlBase || \"https://twitter.com/\";\n\t options.listUrlBase = options.listUrlBase || \"https://twitter.com/\";\n\t options.htmlAttrs = twttr.txt.extractHtmlAttrsFromOptions(options);\n\t options.invisibleTagAttrs = options.invisibleTagAttrs || \"style='position:absolute;left:-9999px;'\";\n\t\n\t // remap url entities to hash\n\t var urlEntities, i, len;\n\t if(options.urlEntities) {\n\t urlEntities = {};\n\t for(i = 0, len = options.urlEntities.length; i < len; i++) {\n\t urlEntities[options.urlEntities[i].url] = options.urlEntities[i];\n\t }\n\t options.urlEntities = urlEntities;\n\t }\n\t\n\t var result = \"\";\n\t var beginIndex = 0;\n\t\n\t // sort entities by start index\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t\n\t var nonEntity = options.htmlEscapeNonEntities ? twttr.txt.htmlEscape : function(text) {\n\t return text;\n\t };\n\t\n\t for (var i = 0; i < entities.length; i++) {\n\t var entity = entities[i];\n\t result += nonEntity(text.substring(beginIndex, entity.indices[0]));\n\t\n\t if (entity.url) {\n\t result += twttr.txt.linkToUrl(entity, text, options);\n\t } else if (entity.hashtag) {\n\t result += twttr.txt.linkToHashtag(entity, text, options);\n\t } else if (entity.screenName) {\n\t result += twttr.txt.linkToMentionAndList(entity, text, options);\n\t } else if (entity.cashtag) {\n\t result += twttr.txt.linkToCashtag(entity, text, options);\n\t }\n\t beginIndex = entity.indices[1];\n\t }\n\t result += nonEntity(text.substring(beginIndex, text.length));\n\t return result;\n\t };\n\t\n\t twttr.txt.autoLinkWithJSON = function(text, json, options) {\n\t // map JSON entity to twitter-text entity\n\t if (json.user_mentions) {\n\t for (var i = 0; i < json.user_mentions.length; i++) {\n\t // this is a @mention\n\t json.user_mentions[i].screenName = json.user_mentions[i].screen_name;\n\t }\n\t }\n\t\n\t if (json.hashtags) {\n\t for (var i = 0; i < json.hashtags.length; i++) {\n\t // this is a #hashtag\n\t json.hashtags[i].hashtag = json.hashtags[i].text;\n\t }\n\t }\n\t\n\t if (json.symbols) {\n\t for (var i = 0; i < json.symbols.length; i++) {\n\t // this is a $CASH tag\n\t json.symbols[i].cashtag = json.symbols[i].text;\n\t }\n\t }\n\t\n\t // concatenate all entities\n\t var entities = [];\n\t for (var key in json) {\n\t entities = entities.concat(json[key]);\n\t }\n\t\n\t // modify indices to UTF-16\n\t twttr.txt.modifyIndicesFromUnicodeToUTF16(text, entities);\n\t\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.extractHtmlAttrsFromOptions = function(options) {\n\t var htmlAttrs = {};\n\t for (var k in options) {\n\t var v = options[k];\n\t if (OPTIONS_NOT_ATTRIBUTES[k]) continue;\n\t if (BOOLEAN_ATTRIBUTES[k]) {\n\t v = v ? k : null;\n\t }\n\t if (v == null) continue;\n\t htmlAttrs[k] = v;\n\t }\n\t return htmlAttrs;\n\t };\n\t\n\t twttr.txt.autoLink = function(text, options) {\n\t var entities = twttr.txt.extractEntitiesWithIndices(text, {extractUrlsWithoutProtocol: false});\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkUsernamesOrLists = function(text, options) {\n\t var entities = twttr.txt.extractMentionsOrListsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkHashtags = function(text, options) {\n\t var entities = twttr.txt.extractHashtagsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkCashtags = function(text, options) {\n\t var entities = twttr.txt.extractCashtagsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkUrlsCustom = function(text, options) {\n\t var entities = twttr.txt.extractUrlsWithIndices(text, {extractUrlsWithoutProtocol: false});\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.removeOverlappingEntities = function(entities) {\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t\n\t var prev = entities[0];\n\t for (var i = 1; i < entities.length; i++) {\n\t if (prev.indices[1] > entities[i].indices[0]) {\n\t entities.splice(i, 1);\n\t i--;\n\t } else {\n\t prev = entities[i];\n\t }\n\t }\n\t };\n\t\n\t twttr.txt.extractEntitiesWithIndices = function(text, options) {\n\t var entities = twttr.txt.extractUrlsWithIndices(text, options)\n\t .concat(twttr.txt.extractMentionsOrListsWithIndices(text))\n\t .concat(twttr.txt.extractHashtagsWithIndices(text, {checkUrlOverlap: false}))\n\t .concat(twttr.txt.extractCashtagsWithIndices(text));\n\t\n\t if (entities.length == 0) {\n\t return [];\n\t }\n\t\n\t twttr.txt.removeOverlappingEntities(entities);\n\t return entities;\n\t };\n\t\n\t twttr.txt.extractMentions = function(text) {\n\t var screenNamesOnly = [],\n\t screenNamesWithIndices = twttr.txt.extractMentionsWithIndices(text);\n\t\n\t for (var i = 0; i < screenNamesWithIndices.length; i++) {\n\t var screenName = screenNamesWithIndices[i].screenName;\n\t screenNamesOnly.push(screenName);\n\t }\n\t\n\t return screenNamesOnly;\n\t };\n\t\n\t twttr.txt.extractMentionsWithIndices = function(text) {\n\t var mentions = [],\n\t mentionOrList,\n\t mentionsOrLists = twttr.txt.extractMentionsOrListsWithIndices(text);\n\t\n\t for (var i = 0 ; i < mentionsOrLists.length; i++) {\n\t mentionOrList = mentionsOrLists[i];\n\t if (mentionOrList.listSlug == '') {\n\t mentions.push({\n\t screenName: mentionOrList.screenName,\n\t indices: mentionOrList.indices\n\t });\n\t }\n\t }\n\t\n\t return mentions;\n\t };\n\t\n\t /**\n\t * Extract list or user mentions.\n\t * (Presence of listSlug indicates a list)\n\t */\n\t twttr.txt.extractMentionsOrListsWithIndices = function(text) {\n\t if (!text || !text.match(twttr.txt.regexen.atSigns)) {\n\t return [];\n\t }\n\t\n\t var possibleNames = [],\n\t slashListname;\n\t\n\t text.replace(twttr.txt.regexen.validMentionOrList, function(match, before, atSign, screenName, slashListname, offset, chunk) {\n\t var after = chunk.slice(offset + match.length);\n\t if (!after.match(twttr.txt.regexen.endMentionMatch)) {\n\t slashListname = slashListname || '';\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + screenName.length + slashListname.length + 1;\n\t possibleNames.push({\n\t screenName: screenName,\n\t listSlug: slashListname,\n\t indices: [startPosition, endPosition]\n\t });\n\t }\n\t });\n\t\n\t return possibleNames;\n\t };\n\t\n\t\n\t twttr.txt.extractReplies = function(text) {\n\t if (!text) {\n\t return null;\n\t }\n\t\n\t var possibleScreenName = text.match(twttr.txt.regexen.validReply);\n\t if (!possibleScreenName ||\n\t RegExp.rightContext.match(twttr.txt.regexen.endMentionMatch)) {\n\t return null;\n\t }\n\t\n\t return possibleScreenName[1];\n\t };\n\t\n\t twttr.txt.extractUrls = function(text, options) {\n\t var urlsOnly = [],\n\t urlsWithIndices = twttr.txt.extractUrlsWithIndices(text, options);\n\t\n\t for (var i = 0; i < urlsWithIndices.length; i++) {\n\t urlsOnly.push(urlsWithIndices[i].url);\n\t }\n\t\n\t return urlsOnly;\n\t };\n\t\n\t twttr.txt.extractUrlsWithIndices = function(text, options) {\n\t if (!options) {\n\t options = {extractUrlsWithoutProtocol: true};\n\t }\n\t if (!text || (options.extractUrlsWithoutProtocol ? !text.match(/\\./) : !text.match(/:/))) {\n\t return [];\n\t }\n\t\n\t var urls = [];\n\t\n\t while (twttr.txt.regexen.extractUrl.exec(text)) {\n\t var before = RegExp.$2, url = RegExp.$3, protocol = RegExp.$4, domain = RegExp.$5, path = RegExp.$7;\n\t var endPosition = twttr.txt.regexen.extractUrl.lastIndex,\n\t startPosition = endPosition - url.length;\n\t\n\t // if protocol is missing and domain contains non-ASCII characters,\n\t // extract ASCII-only domains.\n\t if (!protocol) {\n\t if (!options.extractUrlsWithoutProtocol\n\t || before.match(twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars)) {\n\t continue;\n\t }\n\t var lastUrl = null,\n\t asciiEndPosition = 0;\n\t domain.replace(twttr.txt.regexen.validAsciiDomain, function(asciiDomain) {\n\t var asciiStartPosition = domain.indexOf(asciiDomain, asciiEndPosition);\n\t asciiEndPosition = asciiStartPosition + asciiDomain.length;\n\t lastUrl = {\n\t url: asciiDomain,\n\t indices: [startPosition + asciiStartPosition, startPosition + asciiEndPosition]\n\t };\n\t if (path\n\t || asciiDomain.match(twttr.txt.regexen.validSpecialShortDomain)\n\t || !asciiDomain.match(twttr.txt.regexen.invalidShortDomain)) {\n\t urls.push(lastUrl);\n\t }\n\t });\n\t\n\t // no ASCII-only domain found. Skip the entire URL.\n\t if (lastUrl == null) {\n\t continue;\n\t }\n\t\n\t // lastUrl only contains domain. Need to add path and query if they exist.\n\t if (path) {\n\t lastUrl.url = url.replace(domain, lastUrl.url);\n\t lastUrl.indices[1] = endPosition;\n\t }\n\t } else {\n\t // In the case of t.co URLs, don't allow additional path characters.\n\t if (url.match(twttr.txt.regexen.validTcoUrl)) {\n\t url = RegExp.lastMatch;\n\t endPosition = startPosition + url.length;\n\t }\n\t urls.push({\n\t url: url,\n\t indices: [startPosition, endPosition]\n\t });\n\t }\n\t }\n\t\n\t return urls;\n\t };\n\t\n\t twttr.txt.extractHashtags = function(text) {\n\t var hashtagsOnly = [],\n\t hashtagsWithIndices = twttr.txt.extractHashtagsWithIndices(text);\n\t\n\t for (var i = 0; i < hashtagsWithIndices.length; i++) {\n\t hashtagsOnly.push(hashtagsWithIndices[i].hashtag);\n\t }\n\t\n\t return hashtagsOnly;\n\t };\n\t\n\t twttr.txt.extractHashtagsWithIndices = function(text, options) {\n\t if (!options) {\n\t options = {checkUrlOverlap: true};\n\t }\n\t\n\t if (!text || !text.match(twttr.txt.regexen.hashSigns)) {\n\t return [];\n\t }\n\t\n\t var tags = [];\n\t\n\t text.replace(twttr.txt.regexen.validHashtag, function(match, before, hash, hashText, offset, chunk) {\n\t var after = chunk.slice(offset + match.length);\n\t if (after.match(twttr.txt.regexen.endHashtagMatch))\n\t return;\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + hashText.length + 1;\n\t tags.push({\n\t hashtag: hashText,\n\t indices: [startPosition, endPosition]\n\t });\n\t });\n\t\n\t if (options.checkUrlOverlap) {\n\t // also extract URL entities\n\t var urls = twttr.txt.extractUrlsWithIndices(text);\n\t if (urls.length > 0) {\n\t var entities = tags.concat(urls);\n\t // remove overlap\n\t twttr.txt.removeOverlappingEntities(entities);\n\t // only push back hashtags\n\t tags = [];\n\t for (var i = 0; i < entities.length; i++) {\n\t if (entities[i].hashtag) {\n\t tags.push(entities[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t return tags;\n\t };\n\t\n\t twttr.txt.extractCashtags = function(text) {\n\t var cashtagsOnly = [],\n\t cashtagsWithIndices = twttr.txt.extractCashtagsWithIndices(text);\n\t\n\t for (var i = 0; i < cashtagsWithIndices.length; i++) {\n\t cashtagsOnly.push(cashtagsWithIndices[i].cashtag);\n\t }\n\t\n\t return cashtagsOnly;\n\t };\n\t\n\t twttr.txt.extractCashtagsWithIndices = function(text) {\n\t if (!text || text.indexOf(\"$\") == -1) {\n\t return [];\n\t }\n\t\n\t var tags = [];\n\t\n\t text.replace(twttr.txt.regexen.validCashtag, function(match, before, dollar, cashtag, offset, chunk) {\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + cashtag.length + 1;\n\t tags.push({\n\t cashtag: cashtag,\n\t indices: [startPosition, endPosition]\n\t });\n\t });\n\t\n\t return tags;\n\t };\n\t\n\t twttr.txt.modifyIndicesFromUnicodeToUTF16 = function(text, entities) {\n\t twttr.txt.convertUnicodeIndices(text, entities, false);\n\t };\n\t\n\t twttr.txt.modifyIndicesFromUTF16ToUnicode = function(text, entities) {\n\t twttr.txt.convertUnicodeIndices(text, entities, true);\n\t };\n\t\n\t twttr.txt.getUnicodeTextLength = function(text) {\n\t return text.replace(twttr.txt.regexen.non_bmp_code_pairs, ' ').length;\n\t };\n\t\n\t twttr.txt.convertUnicodeIndices = function(text, entities, indicesInUTF16) {\n\t if (entities.length == 0) {\n\t return;\n\t }\n\t\n\t var charIndex = 0;\n\t var codePointIndex = 0;\n\t\n\t // sort entities by start index\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t var entityIndex = 0;\n\t var entity = entities[0];\n\t\n\t while (charIndex < text.length) {\n\t if (entity.indices[0] == (indicesInUTF16 ? charIndex : codePointIndex)) {\n\t var len = entity.indices[1] - entity.indices[0];\n\t entity.indices[0] = indicesInUTF16 ? codePointIndex : charIndex;\n\t entity.indices[1] = entity.indices[0] + len;\n\t\n\t entityIndex++;\n\t if (entityIndex == entities.length) {\n\t // no more entity\n\t break;\n\t }\n\t entity = entities[entityIndex];\n\t }\n\t\n\t var c = text.charCodeAt(charIndex);\n\t if (0xD800 <= c && c <= 0xDBFF && charIndex < text.length - 1) {\n\t // Found high surrogate char\n\t c = text.charCodeAt(charIndex + 1);\n\t if (0xDC00 <= c && c <= 0xDFFF) {\n\t // Found surrogate pair\n\t charIndex++;\n\t }\n\t }\n\t codePointIndex++;\n\t charIndex++;\n\t }\n\t };\n\t\n\t // this essentially does text.split(/<|>/)\n\t // except that won't work in IE, where empty strings are ommitted\n\t // so \"<>\".split(/<|>/) => [] in IE, but is [\"\", \"\", \"\"] in all others\n\t // but \"<<\".split(\"<\") => [\"\", \"\", \"\"]\n\t twttr.txt.splitTags = function(text) {\n\t var firstSplits = text.split(\"<\"),\n\t secondSplits,\n\t allSplits = [],\n\t split;\n\t\n\t for (var i = 0; i < firstSplits.length; i += 1) {\n\t split = firstSplits[i];\n\t if (!split) {\n\t allSplits.push(\"\");\n\t } else {\n\t secondSplits = split.split(\">\");\n\t for (var j = 0; j < secondSplits.length; j += 1) {\n\t allSplits.push(secondSplits[j]);\n\t }\n\t }\n\t }\n\t\n\t return allSplits;\n\t };\n\t\n\t twttr.txt.hitHighlight = function(text, hits, options) {\n\t var defaultHighlightTag = \"em\";\n\t\n\t hits = hits || [];\n\t options = options || {};\n\t\n\t if (hits.length === 0) {\n\t return text;\n\t }\n\t\n\t var tagName = options.tag || defaultHighlightTag,\n\t tags = [\"<\" + tagName + \">\", \"</\" + tagName + \">\"],\n\t chunks = twttr.txt.splitTags(text),\n\t i,\n\t j,\n\t result = \"\",\n\t chunkIndex = 0,\n\t chunk = chunks[0],\n\t prevChunksLen = 0,\n\t chunkCursor = 0,\n\t startInChunk = false,\n\t chunkChars = chunk,\n\t flatHits = [],\n\t index,\n\t hit,\n\t tag,\n\t placed,\n\t hitSpot;\n\t\n\t for (i = 0; i < hits.length; i += 1) {\n\t for (j = 0; j < hits[i].length; j += 1) {\n\t flatHits.push(hits[i][j]);\n\t }\n\t }\n\t\n\t for (index = 0; index < flatHits.length; index += 1) {\n\t hit = flatHits[index];\n\t tag = tags[index % 2];\n\t placed = false;\n\t\n\t while (chunk != null && hit >= prevChunksLen + chunk.length) {\n\t result += chunkChars.slice(chunkCursor);\n\t if (startInChunk && hit === prevChunksLen + chunkChars.length) {\n\t result += tag;\n\t placed = true;\n\t }\n\t\n\t if (chunks[chunkIndex + 1]) {\n\t result += \"<\" + chunks[chunkIndex + 1] + \">\";\n\t }\n\t\n\t prevChunksLen += chunkChars.length;\n\t chunkCursor = 0;\n\t chunkIndex += 2;\n\t chunk = chunks[chunkIndex];\n\t chunkChars = chunk;\n\t startInChunk = false;\n\t }\n\t\n\t if (!placed && chunk != null) {\n\t hitSpot = hit - prevChunksLen;\n\t result += chunkChars.slice(chunkCursor, hitSpot) + tag;\n\t chunkCursor = hitSpot;\n\t if (index % 2 === 0) {\n\t startInChunk = true;\n\t } else {\n\t startInChunk = false;\n\t }\n\t } else if(!placed) {\n\t placed = true;\n\t result += tag;\n\t }\n\t }\n\t\n\t if (chunk != null) {\n\t if (chunkCursor < chunkChars.length) {\n\t result += chunkChars.slice(chunkCursor);\n\t }\n\t for (index = chunkIndex + 1; index < chunks.length; index += 1) {\n\t result += (index % 2 === 0 ? chunks[index] : \"<\" + chunks[index] + \">\");\n\t }\n\t }\n\t\n\t return result;\n\t };\n\t\n\t var MAX_LENGTH = 140;\n\t\n\t // Returns the length of Tweet text with consideration to t.co URL replacement\n\t // and chars outside the basic multilingual plane that use 2 UTF16 code points\n\t twttr.txt.getTweetLength = function(text, options) {\n\t if (!options) {\n\t options = {\n\t // These come from https://api.twitter.com/1.1/help/configuration.json\n\t // described by https://dev.twitter.com/rest/reference/get/help/configuration\n\t short_url_length: 23,\n\t short_url_length_https: 23\n\t };\n\t }\n\t var textLength = twttr.txt.getUnicodeTextLength(text),\n\t urlsWithIndices = twttr.txt.extractUrlsWithIndices(text);\n\t twttr.txt.modifyIndicesFromUTF16ToUnicode(text, urlsWithIndices);\n\t\n\t for (var i = 0; i < urlsWithIndices.length; i++) {\n\t // Subtract the length of the original URL\n\t textLength += urlsWithIndices[i].indices[0] - urlsWithIndices[i].indices[1];\n\t\n\t // Add 23 characters for URL starting with https://\n\t // http:// URLs still use https://t.co so they are 23 characters as well\n\t if (urlsWithIndices[i].url.toLowerCase().match(twttr.txt.regexen.urlHasHttps)) {\n\t textLength += options.short_url_length_https;\n\t } else {\n\t textLength += options.short_url_length;\n\t }\n\t }\n\t\n\t return textLength;\n\t };\n\t\n\t // Check the text for any reason that it may not be valid as a Tweet. This is meant as a pre-validation\n\t // before posting to api.twitter.com. There are several server-side reasons for Tweets to fail but this pre-validation\n\t // will allow quicker feedback.\n\t //\n\t // Returns false if this text is valid. Otherwise one of the following strings will be returned:\n\t //\n\t // \"too_long\": if the text is too long\n\t // \"empty\": if the text is nil or empty\n\t // \"invalid_characters\": if the text contains non-Unicode or any of the disallowed Unicode characters\n\t twttr.txt.isInvalidTweet = function(text) {\n\t if (!text) {\n\t return \"empty\";\n\t }\n\t\n\t // Determine max length independent of URL length\n\t if (twttr.txt.getTweetLength(text) > MAX_LENGTH) {\n\t return \"too_long\";\n\t }\n\t\n\t if (twttr.txt.hasInvalidCharacters(text)) {\n\t return \"invalid_characters\";\n\t }\n\t\n\t return false;\n\t };\n\t\n\t twttr.txt.hasInvalidCharacters = function(text) {\n\t return twttr.txt.regexen.invalid_chars.test(text);\n\t };\n\t\n\t twttr.txt.isValidTweetText = function(text) {\n\t return !twttr.txt.isInvalidTweet(text);\n\t };\n\t\n\t twttr.txt.isValidUsername = function(username) {\n\t if (!username) {\n\t return false;\n\t }\n\t\n\t var extracted = twttr.txt.extractMentions(username);\n\t\n\t // Should extract the username minus the @ sign, hence the .slice(1)\n\t return extracted.length === 1 && extracted[0] === username.slice(1);\n\t };\n\t\n\t var VALID_LIST_RE = regexSupplant(/^#{validMentionOrList}$/);\n\t\n\t twttr.txt.isValidList = function(usernameList) {\n\t var match = usernameList.match(VALID_LIST_RE);\n\t\n\t // Must have matched and had nothing before or after\n\t return !!(match && match[1] == \"\" && match[4]);\n\t };\n\t\n\t twttr.txt.isValidHashtag = function(hashtag) {\n\t if (!hashtag) {\n\t return false;\n\t }\n\t\n\t var extracted = twttr.txt.extractHashtags(hashtag);\n\t\n\t // Should extract the hashtag minus the # sign, hence the .slice(1)\n\t return extracted.length === 1 && extracted[0] === hashtag.slice(1);\n\t };\n\t\n\t twttr.txt.isValidUrl = function(url, unicodeDomains, requireProtocol) {\n\t if (unicodeDomains == null) {\n\t unicodeDomains = true;\n\t }\n\t\n\t if (requireProtocol == null) {\n\t requireProtocol = true;\n\t }\n\t\n\t if (!url) {\n\t return false;\n\t }\n\t\n\t var urlParts = url.match(twttr.txt.regexen.validateUrlUnencoded);\n\t\n\t if (!urlParts || urlParts[0] !== url) {\n\t return false;\n\t }\n\t\n\t var scheme = urlParts[1],\n\t authority = urlParts[2],\n\t path = urlParts[3],\n\t query = urlParts[4],\n\t fragment = urlParts[5];\n\t\n\t if (!(\n\t (!requireProtocol || (isValidMatch(scheme, twttr.txt.regexen.validateUrlScheme) && scheme.match(/^https?$/i))) &&\n\t isValidMatch(path, twttr.txt.regexen.validateUrlPath) &&\n\t isValidMatch(query, twttr.txt.regexen.validateUrlQuery, true) &&\n\t isValidMatch(fragment, twttr.txt.regexen.validateUrlFragment, true)\n\t )) {\n\t return false;\n\t }\n\t\n\t return (unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlUnicodeAuthority)) ||\n\t (!unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlAuthority));\n\t };\n\t\n\t function isValidMatch(string, regex, optional) {\n\t if (!optional) {\n\t // RegExp[\"$&\"] is the text of the last match\n\t // blank strings are ok, but are falsy, so we check stringiness instead of truthiness\n\t return ((typeof string === \"string\") && string.match(regex) && RegExp[\"$&\"] === string);\n\t }\n\t\n\t // RegExp[\"$&\"] is the text of the last match\n\t return (!string || (string.match(regex) && RegExp[\"$&\"] === string));\n\t }\n\t\n\t if (typeof module != 'undefined' && module.exports) {\n\t module.exports = twttr.txt;\n\t }\n\t\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (twttr.txt), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t }\n\t\n\t if (typeof window != 'undefined') {\n\t if (window.twttr) {\n\t for (var prop in twttr) {\n\t window.twttr[prop] = twttr[prop];\n\t }\n\t } else {\n\t window.twttr = twttr;\n\t }\n\t }\n\t})();\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\texports.createEditOverlay = createEditOverlay;\n\texports.enableEdit = enableEdit;\n\texports.disableEdit = disableEdit;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tvar _enabled = false;\n\tvar isDragging = false,\n\t overlay = void 0;\n\tvar dragOffsetX = void 0,\n\t dragOffsetY = void 0,\n\t dragStartX = void 0,\n\t dragStartY = void 0;\n\tvar OVERLAY_BORDER_SIZE = 3;\n\t\n\t/**\n\t * Create an overlay for editing an annotation.\n\t *\n\t * @param {Element} target The annotation element to apply overlay for\n\t */\n\tfunction createEditOverlay(target) {\n\t destroyEditOverlay();\n\t\n\t overlay = document.createElement('div');\n\t var anchor = document.createElement('a');\n\t var parentNode = (0, _utils.findSVGContainer)(target).parentNode;\n\t var id = target.getAttribute('data-pdf-annotate-id');\n\t var rect = (0, _utils.getAnnotationRect)(target);\n\t var styleLeft = rect.left - OVERLAY_BORDER_SIZE;\n\t var styleTop = rect.top - OVERLAY_BORDER_SIZE;\n\t\n\t overlay.setAttribute('id', 'pdf-annotate-edit-overlay');\n\t overlay.setAttribute('data-target-id', id);\n\t overlay.style.boxSizing = 'content-box';\n\t overlay.style.position = 'absolute';\n\t overlay.style.top = styleTop + 'px';\n\t overlay.style.left = styleLeft + 'px';\n\t overlay.style.width = rect.width + 'px';\n\t overlay.style.height = rect.height + 'px';\n\t overlay.style.border = OVERLAY_BORDER_SIZE + 'px solid ' + _utils.BORDER_COLOR;\n\t overlay.style.borderRadius = OVERLAY_BORDER_SIZE + 'px';\n\t\n\t anchor.innerHTML = '×';\n\t anchor.setAttribute('href', 'javascript://');\n\t anchor.style.background = '#fff';\n\t anchor.style.borderRadius = '20px';\n\t anchor.style.border = '1px solid #bbb';\n\t anchor.style.color = '#bbb';\n\t anchor.style.fontSize = '16px';\n\t anchor.style.padding = '2px';\n\t anchor.style.textAlign = 'center';\n\t anchor.style.textDecoration = 'none';\n\t anchor.style.position = 'absolute';\n\t anchor.style.top = '-13px';\n\t anchor.style.right = '-13px';\n\t anchor.style.width = '25px';\n\t anchor.style.height = '25px';\n\t\n\t if (_initFile.readonly) anchor.style.display = 'none';\n\t overlay.appendChild(anchor);\n\t parentNode.appendChild(overlay);\n\t document.addEventListener('click', handleDocumentClick);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t anchor.addEventListener('click', deleteAnnotation);\n\t anchor.addEventListener('mouseover', function () {\n\t anchor.style.color = '#35A4DC';\n\t anchor.style.borderColor = '#999';\n\t anchor.style.boxShadow = '0 1px 1px #ccc';\n\t });\n\t anchor.addEventListener('mouseout', function () {\n\t anchor.style.color = '#bbb';\n\t anchor.style.borderColor = '#bbb';\n\t anchor.style.boxShadow = '';\n\t });\n\t overlay.addEventListener('mouseover', function () {\n\t if (!isDragging && !_initFile.readonly) {\n\t anchor.style.display = '';\n\t }\n\t });\n\t overlay.addEventListener('mouseout', function () {\n\t anchor.style.display = 'none';\n\t });\n\t}\n\t\n\t/**\n\t * Destroy the edit overlay if it exists.\n\t */\n\tfunction destroyEditOverlay() {\n\t if (overlay) {\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t }\n\t document.removeEventListener('click', handleDocumentClick);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\t\n\t/**\n\t * Delete currently selected annotation\n\t */\n\tfunction deleteAnnotation() {\n\t if (!overlay) {\n\t return;\n\t }\n\t\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var nodes = document.querySelectorAll('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId;\n\t\n\t [].concat(_toConsumableArray(nodes)).forEach(function (n) {\n\t n.parentNode.removeChild(n);\n\t });\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().deleteAnnotation(documentId, annotationId);\n\t\n\t destroyEditOverlay();\n\t}\n\t\n\t/**\n\t * Handle document.click event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentClick(e) {\n\t if (!(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t // Remove current overlay\n\t var overlay = document.getElementById('pdf-annotate-edit-overlay');\n\t if (overlay) {\n\t if (isDragging || e.target === overlay) {\n\t return;\n\t }\n\t destroyEditOverlay();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t if (overlay && e.keyCode === 46 && e.target.nodeName.toLowerCase() !== 'textarea' && e.target.nodeName.toLowerCase() !== 'input') {\n\t deleteAnnotation();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mousedown event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMousedown(e) {\n\t if (e.target !== overlay) {\n\t return;\n\t }\n\t\n\t // Highlight and strikeout annotations are bound to text within the document.\n\t // It doesn't make sense to allow repositioning these types of annotations.\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var target = document.querySelector('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var type = target.getAttribute('data-pdf-annotate-type');\n\t\n\t if (type === 'highlight' || type === 'strikeout') {\n\t return;\n\t }\n\t\n\t if (!_initFile.readonly) isDragging = true;\n\t dragOffsetX = e.clientX;\n\t dragOffsetY = e.clientY;\n\t dragStartX = overlay.offsetLeft;\n\t dragStartY = overlay.offsetTop;\n\t\n\t overlay.style.background = 'rgba(255, 255, 255, 0.7)';\n\t overlay.style.cursor = 'move';\n\t // if(!readonly)\n\t overlay.querySelector('a').style.display = 'none';\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t if (_initFile.readonly) return;\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var parentNode = overlay.parentNode;\n\t var rect = parentNode.getBoundingClientRect();\n\t var y = dragStartY + (e.clientY - dragOffsetY);\n\t var x = dragStartX + (e.clientX - dragOffsetX);\n\t var minY = 0;\n\t var maxY = rect.height;\n\t var minX = 0;\n\t var maxX = rect.width;\n\t\n\t if (y > minY && y + overlay.offsetHeight < maxY) {\n\t overlay.style.top = y + 'px';\n\t }\n\t\n\t if (x > minX && x + overlay.offsetWidth < maxX) {\n\t overlay.style.left = x + 'px';\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var target = document.querySelectorAll('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var type = target[0].getAttribute('data-pdf-annotate-type');\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t\n\t var _getMetadata2 = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata2.documentId;\n\t\n\t overlay.querySelector('a').style.display = '';\n\t\n\t function getDelta(propX, propY) {\n\t return calcDelta(parseInt(target[0].getAttribute(propX), 10), parseInt(target[0].getAttribute(propY), 10));\n\t }\n\t\n\t function calcDelta(x, y) {\n\t return {\n\t deltaX: OVERLAY_BORDER_SIZE + (0, _utils.scaleDown)(svg, { x: overlay.offsetLeft }).x - x,\n\t deltaY: OVERLAY_BORDER_SIZE + (0, _utils.scaleDown)(svg, { y: overlay.offsetTop }).y - y\n\t };\n\t }\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().getAnnotation(documentId, annotationId).then(function (annotation) {\n\t if (['area', 'highlight', 'point', 'textbox'].indexOf(type) > -1) {\n\t var _getDelta = getDelta('x', 'y'),\n\t deltaX = _getDelta.deltaX,\n\t deltaY = _getDelta.deltaY;\n\t\n\t [].concat(_toConsumableArray(target)).forEach(function (t, i) {\n\t if (deltaY !== 0) {\n\t var modelY = parseInt(t.getAttribute('y'), 10) + deltaY;\n\t var viewY = modelY;\n\t\n\t if (type === 'textbox') {\n\t viewY += annotation.size;\n\t }\n\t\n\t if (type === 'point' && !$.browser.mozilla) {\n\t viewY = (0, _utils.scaleUp)(svg, { viewY: viewY }).viewY;\n\t }\n\t if ($.browser.mozilla) viewY -= 8;\n\t\n\t t.setAttribute('y', viewY);\n\t if (annotation.rectangles) {\n\t annotation.rectangles[i].y = modelY;\n\t } else if (annotation.y) {\n\t annotation.y = modelY;\n\t }\n\t }\n\t if (deltaX !== 0) {\n\t var modelX = parseInt(t.getAttribute('x'), 10) + deltaX;\n\t var viewX = modelX;\n\t\n\t if (type === 'point' && !$.browser.mozilla) {\n\t viewX = (0, _utils.scaleUp)(svg, { viewX: viewX }).viewX;\n\t }\n\t if ($.browser.mozilla) viewX -= 8;\n\t\n\t t.setAttribute('x', viewX);\n\t if (annotation.rectangles) {\n\t annotation.rectangles[i].x = modelX;\n\t } else if (annotation.x) {\n\t annotation.x = modelX;\n\t }\n\t }\n\t });\n\t // } else if (type === 'strikeout') {\n\t // let { deltaX, deltaY } = getDelta('x1', 'y1');\n\t // [...target].forEach(target, (t, i) => {\n\t // if (deltaY !== 0) {\n\t // t.setAttribute('y1', parseInt(t.getAttribute('y1'), 10) + deltaY);\n\t // t.setAttribute('y2', parseInt(t.getAttribute('y2'), 10) + deltaY);\n\t // annotation.rectangles[i].y = parseInt(t.getAttribute('y1'), 10);\n\t // }\n\t // if (deltaX !== 0) {\n\t // t.setAttribute('x1', parseInt(t.getAttribute('x1'), 10) + deltaX);\n\t // t.setAttribute('x2', parseInt(t.getAttribute('x2'), 10) + deltaX);\n\t // annotation.rectangles[i].x = parseInt(t.getAttribute('x1'), 10);\n\t // }\n\t // });\n\t } else if (type === 'drawing') {\n\t var rect = (0, _utils.scaleDown)(svg, (0, _utils.getAnnotationRect)(target[0]));\n\t\n\t var _annotation$lines$ = _slicedToArray(annotation.lines[0], 2),\n\t originX = _annotation$lines$[0],\n\t originY = _annotation$lines$[1];\n\t\n\t var _calcDelta = calcDelta(originX, originY),\n\t _deltaX = _calcDelta.deltaX,\n\t _deltaY = _calcDelta.deltaY;\n\t\n\t // origin isn't necessarily at 0/0 in relation to overlay x/y\n\t // adjust the difference between overlay and drawing coords\n\t\n\t\n\t _deltaY += originY - rect.top;\n\t _deltaX += originX - rect.left;\n\t\n\t annotation.lines.forEach(function (line, i) {\n\t var _annotation$lines$i = _slicedToArray(annotation.lines[i], 2),\n\t x = _annotation$lines$i[0],\n\t y = _annotation$lines$i[1];\n\t\n\t annotation.lines[i][0] = x + _deltaX;\n\t annotation.lines[i][1] = y + _deltaY;\n\t });\n\t\n\t target[0].parentNode.removeChild(target[0]);\n\t (0, _appendChild2.default)(svg, annotation);\n\t }\n\t\n\t if (!_initFile.readonly) _PDFJSAnnotate2.default.getStoreAdapter().editAnnotation(documentId, annotationId, annotation);\n\t });\n\t\n\t setTimeout(function () {\n\t isDragging = false;\n\t }, 0);\n\t\n\t overlay.style.background = '';\n\t overlay.style.cursor = '';\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle annotation.click event\n\t *\n\t * @param {Element} e The annotation element that was clicked\n\t */\n\tfunction handleAnnotationClick(target) {\n\t var type = target.dataset['pdfAnnotateType'];\n\t if (type === 'point') (0, _comments.selectComment)(target.dataset['pdfAnnotateId']);\n\t createEditOverlay(target);\n\t}\n\t\n\t/**\n\t * Enable edit mode behavior.\n\t */\n\tfunction enableEdit() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t (0, _event.addEventListener)('annotation:click', handleAnnotationClick);\n\t};\n\t\n\t/**\n\t * Disable edit mode behavior.\n\t */\n\tfunction disableEdit() {\n\t destroyEditOverlay();\n\t\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t (0, _event.removeEventListener)('annotation:click', handleAnnotationClick);\n\t};\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = appendChild;\n\t\n\tvar _objectAssign = __webpack_require__(42);\n\t\n\tvar _objectAssign2 = _interopRequireDefault(_objectAssign);\n\t\n\tvar _renderLine = __webpack_require__(43);\n\t\n\tvar _renderLine2 = _interopRequireDefault(_renderLine);\n\t\n\tvar _renderPath = __webpack_require__(46);\n\t\n\tvar _renderPath2 = _interopRequireDefault(_renderPath);\n\t\n\tvar _renderPoint = __webpack_require__(47);\n\t\n\tvar _renderPoint2 = _interopRequireDefault(_renderPoint);\n\t\n\tvar _renderRect = __webpack_require__(48);\n\t\n\tvar _renderRect2 = _interopRequireDefault(_renderRect);\n\t\n\tvar _renderText = __webpack_require__(49);\n\t\n\tvar _renderText2 = _interopRequireDefault(_renderText);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar isFirefox = /firefox/i.test(navigator.userAgent);\n\t\n\t/**\n\t * Get the x/y translation to be used for transforming the annotations\n\t * based on the rotation of the viewport.\n\t *\n\t * @param {Object} viewport The viewport data from the page\n\t * @return {Object}\n\t */\n\tfunction getTranslation(viewport) {\n\t var x = void 0;\n\t var y = void 0;\n\t\n\t // Modulus 360 on the rotation so that we only\n\t // have to worry about four possible values.\n\t switch (viewport.rotation % 360) {\n\t case 0:\n\t x = y = 0;\n\t break;\n\t case 90:\n\t x = 0;\n\t y = viewport.width / viewport.scale * -1;\n\t break;\n\t case 180:\n\t x = viewport.width / viewport.scale * -1;\n\t y = viewport.height / viewport.scale * -1;\n\t break;\n\t case 270:\n\t x = viewport.height / viewport.scale * -1;\n\t y = 0;\n\t break;\n\t }\n\t\n\t return { x: x, y: y };\n\t}\n\t\n\t/**\n\t * Transform the rotation and scale of a node using SVG's native transform attribute.\n\t *\n\t * @param {Node} node The node to be transformed\n\t * @param {Object} viewport The page's viewport data\n\t * @return {Node}\n\t */\n\tfunction transform(node, viewport) {\n\t var trans = getTranslation(viewport);\n\t\n\t // Let SVG natively transform the element\n\t node.setAttribute('transform', 'scale(' + viewport.scale + ') rotate(' + viewport.rotation + ') translate(' + trans.x + ', ' + trans.y + ')');\n\t\n\t // Manually adjust x/y for nested SVG nodes\n\t if (!isFirefox && node.nodeName.toLowerCase() === 'svg') {\n\t node.setAttribute('x', parseInt(node.getAttribute('x'), 10) * viewport.scale);\n\t node.setAttribute('y', parseInt(node.getAttribute('y'), 10) * viewport.scale);\n\t\n\t var x = parseInt(node.getAttribute('x', 10));\n\t var y = parseInt(node.getAttribute('y', 10));\n\t var width = parseInt(node.getAttribute('width'), 10);\n\t var height = parseInt(node.getAttribute('height'), 10);\n\t var path = node.querySelector('path');\n\t var svg = path.parentNode;\n\t\n\t // Scale width/height\n\t [node, svg, path, node.querySelector('rect')].forEach(function (n) {\n\t n.setAttribute('width', parseInt(n.getAttribute('width'), 10) * viewport.scale);\n\t n.setAttribute('height', parseInt(n.getAttribute('height'), 10) * viewport.scale);\n\t });\n\t\n\t // Transform path but keep scale at 100% since it will be handled natively\n\t transform(path, (0, _objectAssign2.default)({}, viewport, { scale: 1 }));\n\t\n\t switch (viewport.rotation % 360) {\n\t case 90:\n\t node.setAttribute('x', viewport.width - y - width);\n\t node.setAttribute('y', x);\n\t svg.setAttribute('x', 1);\n\t svg.setAttribute('y', 0);\n\t break;\n\t case 180:\n\t node.setAttribute('x', viewport.width - x - width);\n\t node.setAttribute('y', viewport.height - y - height);\n\t svg.setAttribute('y', 2);\n\t break;\n\t case 270:\n\t node.setAttribute('x', y);\n\t node.setAttribute('y', viewport.height - x - height);\n\t svg.setAttribute('x', -1);\n\t svg.setAttribute('y', 0);\n\t break;\n\t }\n\t }\n\t\n\t return node;\n\t}\n\t\n\t/**\n\t * Append an annotation as a child of an SVG.\n\t *\n\t * @param {SVGElement} svg The SVG element to append the annotation to\n\t * @param {Object} annotation The annotation definition to render and append\n\t * @param {Object} viewport The page's viewport data\n\t * @return {SVGElement} A node that was created and appended by this function\n\t */\n\tfunction appendChild(svg, annotation, viewport) {\n\t if (!viewport) {\n\t viewport = JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'));\n\t }\n\t\n\t var child = void 0;\n\t switch (annotation.type) {\n\t case 'area':\n\t case 'highlight':\n\t child = (0, _renderRect2.default)(annotation);\n\t break;\n\t case 'strikeout':\n\t child = (0, _renderLine2.default)(annotation);\n\t break;\n\t case 'point':\n\t child = (0, _renderPoint2.default)(annotation);\n\t break;\n\t case 'textbox':\n\t child = (0, _renderText2.default)(annotation);\n\t break;\n\t case 'drawing':\n\t child = (0, _renderPath2.default)(annotation);\n\t break;\n\t }\n\t\n\t // If no type was provided for an annotation it will result in node being null.\n\t // Skip appending/transforming if node doesn't exist.\n\t if (child) {\n\t // Set attributes\n\t child.setAttribute('data-pdf-annotate-id', annotation.uuid);\n\t child.setAttribute('data-pdf-annotate-type', annotation.type);\n\t child.setAttribute('aria-hidden', true);\n\t\n\t svg.appendChild(transform(child, viewport));\n\t }\n\t\n\t return child;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\t/*\n\tobject-assign\n\t(c) Sindre Sorhus\n\t@license MIT\n\t*/\n\t\n\t'use strict';\n\t/* eslint-disable no-unused-vars */\n\tvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\tvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\t\n\tfunction toObject(val) {\n\t\tif (val === null || val === undefined) {\n\t\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t\t}\n\t\n\t\treturn Object(val);\n\t}\n\t\n\tfunction shouldUseNative() {\n\t\ttry {\n\t\t\tif (!Object.assign) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// Detect buggy property enumeration order in older V8 versions.\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\t\ttest1[5] = 'de';\n\t\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\t\tvar test2 = {};\n\t\t\tfor (var i = 0; i < 10; i++) {\n\t\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t\t}\n\t\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\t\treturn test2[n];\n\t\t\t});\n\t\t\tif (order2.join('') !== '0123456789') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\t\tvar test3 = {};\n\t\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\t\ttest3[letter] = letter;\n\t\t\t});\n\t\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\t\tvar from;\n\t\tvar to = toObject(target);\n\t\tvar symbols;\n\t\n\t\tfor (var s = 1; s < arguments.length; s++) {\n\t\t\tfrom = Object(arguments[s]);\n\t\n\t\t\tfor (var key in from) {\n\t\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\t\tto[key] = from[key];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif (getOwnPropertySymbols) {\n\t\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn to;\n\t};\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderLine;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGLineElements from an annotation definition.\n\t * This is used for anntations of type `strikeout`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGGElement} A group of all lines to be rendered\n\t */\n\tfunction renderLine(a) {\n\t var group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n\t (0, _setAttributes2.default)(group, {\n\t stroke: (0, _normalizeColor2.default)(a.color || '#f00'),\n\t strokeWidth: 1\n\t });\n\t\n\t a.rectangles.forEach(function (r) {\n\t var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n\t\n\t (0, _setAttributes2.default)(line, {\n\t x1: r.x,\n\t y1: r.y,\n\t x2: r.x + r.width,\n\t y2: r.y\n\t });\n\t\n\t group.appendChild(line);\n\t });\n\t\n\t return group;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = setAttributes;\n\tvar UPPER_REGEX = /[A-Z]/g;\n\t\n\t// Don't convert these attributes from camelCase to hyphenated-attributes\n\tvar BLACKLIST = ['viewBox'];\n\t\n\tvar keyCase = function keyCase(key) {\n\t if (BLACKLIST.indexOf(key) === -1) {\n\t key = key.replace(UPPER_REGEX, function (match) {\n\t return '-' + match.toLowerCase();\n\t });\n\t }\n\t return key;\n\t};\n\t\n\t/**\n\t * Set attributes for a node from a map\n\t *\n\t * @param {Node} node The node to set attributes on\n\t * @param {Object} attributes The map of key/value pairs to use for attributes\n\t */\n\tfunction setAttributes(node, attributes) {\n\t Object.keys(attributes).forEach(function (key) {\n\t node.setAttribute(keyCase(key), attributes[key]);\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = normalizeColor;\n\tvar REGEX_HASHLESS_HEX = /^([a-f0-9]{6}|[a-f0-9]{3})$/i;\n\t\n\t/**\n\t * Normalize a color value\n\t *\n\t * @param {String} color The color to normalize\n\t * @return {String}\n\t */\n\tfunction normalizeColor(color) {\n\t if (REGEX_HASHLESS_HEX.test(color)) {\n\t color = \"#\" + color;\n\t }\n\t return color;\n\t}\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderPath;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGPathElement from an annotation definition.\n\t * This is used for anntations of type `drawing`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGPathElement} The path to be rendered\n\t */\n\tfunction renderPath(a) {\n\t var d = [];\n\t var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\n\t for (var i = 0, l = a.lines.length; i < l; i++) {\n\t var p1 = a.lines[i];\n\t var p2 = a.lines[i + 1];\n\t if (p2) {\n\t d.push('M' + p1[0] + ' ' + p1[1] + ' ' + p2[0] + ' ' + p2[1]);\n\t }\n\t }\n\t\n\t (0, _setAttributes2.default)(path, {\n\t d: d.join(' ') + 'Z',\n\t stroke: (0, _normalizeColor2.default)(a.color || '#000'),\n\t strokeWidth: a.width || 1,\n\t fill: 'none'\n\t });\n\t\n\t return path;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderPoint;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar SIZE = 25;\n\tvar D = 'M499.968 214.336q-113.832 0 -212.877 38.781t-157.356 104.625 -58.311 142.29q0 62.496 39.897 119.133t112.437 97.929l48.546 27.9 -15.066 53.568q-13.392 50.778 -39.06 95.976 84.816 -35.154 153.45 -95.418l23.994 -21.204 31.806 3.348q38.502 4.464 72.54 4.464 113.832 0 212.877 -38.781t157.356 -104.625 58.311 -142.29 -58.311 -142.29 -157.356 -104.625 -212.877 -38.781z';\n\t\n\t/**\n\t * Create SVGElement from an annotation definition.\n\t * This is used for anntations of type `comment`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGElement} A svg to be rendered\n\t */\n\tfunction renderPoint(a) {\n\t var outerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t var innerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\n\t (0, _setAttributes2.default)(outerSVG, {\n\t width: SIZE,\n\t height: SIZE,\n\t x: a.x,\n\t y: a.y\n\t });\n\t\n\t (0, _setAttributes2.default)(innerSVG, {\n\t width: SIZE,\n\t height: SIZE,\n\t x: 0,\n\t y: SIZE * 0.05 * -1,\n\t viewBox: '0 0 1000 1000'\n\t });\n\t\n\t (0, _setAttributes2.default)(rect, {\n\t width: SIZE,\n\t height: SIZE,\n\t stroke: '#000',\n\t fill: '#ff0'\n\t });\n\t\n\t (0, _setAttributes2.default)(path, {\n\t d: D,\n\t strokeWidth: 50,\n\t stroke: '#000',\n\t fill: '#fff'\n\t });\n\t\n\t innerSVG.appendChild(path);\n\t outerSVG.appendChild(rect);\n\t outerSVG.appendChild(innerSVG);\n\t\n\t return outerSVG;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderRect;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGRectElements from an annotation definition.\n\t * This is used for anntations of type `area` and `highlight`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGGElement|SVGRectElement} A group of all rects to be rendered\n\t */\n\tfunction renderRect(a) {\n\t if (a.type === 'highlight') {\n\t var group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n\t (0, _setAttributes2.default)(group, {\n\t fill: (0, _normalizeColor2.default)(a.color || '#ff0'),\n\t fillOpacity: 0.2\n\t });\n\t\n\t a.rectangles.forEach(function (r) {\n\t group.appendChild(createRect(r));\n\t });\n\t\n\t return group;\n\t } else {\n\t var rect = createRect(a);\n\t (0, _setAttributes2.default)(rect, {\n\t stroke: (0, _normalizeColor2.default)(a.color || '#f00'),\n\t fill: 'none'\n\t });\n\t\n\t return rect;\n\t }\n\t}\n\t\n\tfunction createRect(r) {\n\t var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t\n\t (0, _setAttributes2.default)(rect, {\n\t x: r.x,\n\t y: r.y,\n\t width: r.width,\n\t height: r.height\n\t });\n\t\n\t return rect;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderText;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGTextElement from an annotation definition.\n\t * This is used for anntations of type `textbox`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGTextElement} A text to be rendered\n\t */\n\tfunction renderText(a) {\n\t var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n\t\n\t (0, _setAttributes2.default)(text, {\n\t x: a.x,\n\t y: a.y + parseInt(a.size, 10),\n\t fill: (0, _normalizeColor2.default)(a.color || '#000'),\n\t fontSize: a.size\n\t });\n\t text.innerHTML = a.content;\n\t\n\t return text;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = render;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Render the response from PDFJSAnnotate.getStoreAdapter().getAnnotations to SVG\n\t *\n\t * @param {SVGElement} svg The SVG element to render the annotations to\n\t * @param {Object} viewport The page viewport data\n\t * @param {Object} data The response from PDFJSAnnotate.getStoreAdapter().getAnnotations\n\t * @return {Promise} Settled once rendering has completed\n\t * A settled Promise will be either:\n\t * - fulfilled: SVGElement\n\t * - rejected: Error\n\t */\n\tfunction render(svg, viewport, data) {\n\t return new Promise(function (resolve, reject) {\n\t // Reset the content of the SVG\n\t svg.innerHTML = '';\n\t svg.setAttribute('data-pdf-annotate-container', true);\n\t svg.setAttribute('data-pdf-annotate-viewport', JSON.stringify(viewport));\n\t svg.removeAttribute('data-pdf-annotate-document');\n\t svg.removeAttribute('data-pdf-annotate-page');\n\t\n\t // If there's no data nothing can be done\n\t if (!data) {\n\t return resolve(svg);\n\t }\n\t\n\t svg.setAttribute('data-pdf-annotate-document', data.documentId);\n\t svg.setAttribute('data-pdf-annotate-page', data.pageNumber);\n\t\n\t // Make sure annotations is an array\n\t if (!Array.isArray(data.annotations) || data.annotations.length === 0) {\n\t return resolve(svg);\n\t }\n\t\n\t // Append annotation to svg\n\t data.annotations.forEach(function (a) {\n\t (0, _appendChild2.default)(svg, a, viewport);\n\t });\n\t\n\t resolve(svg);\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderScreenReaderHints;\n\t\n\tvar _insertScreenReaderHint = __webpack_require__(52);\n\t\n\tvar _insertScreenReaderHint2 = _interopRequireDefault(_insertScreenReaderHint);\n\t\n\tvar _initEventHandlers = __webpack_require__(58);\n\t\n\tvar _initEventHandlers2 = _interopRequireDefault(_initEventHandlers);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// TODO This is not the right place for this to live\n\t(0, _initEventHandlers2.default)();\n\t\n\t/**\n\t * Insert hints into the DOM for screen readers.\n\t *\n\t * @param {Array} annotations The annotations that hints are inserted for\n\t */\n\tfunction renderScreenReaderHints(annotations) {\n\t annotations = Array.isArray(annotations) ? annotations : [];\n\t\n\t // Insert hints for each type\n\t Object.keys(SORT_TYPES).forEach(function (type) {\n\t var sortBy = SORT_TYPES[type];\n\t annotations.filter(function (a) {\n\t return a.type === type;\n\t }).sort(sortBy).forEach(function (a, i) {\n\t return (0, _insertScreenReaderHint2.default)(a, i + 1);\n\t });\n\t });\n\t}\n\t\n\t// Sort annotations first by y, then by x.\n\t// This allows hints to be injected in the order they appear,\n\t// which makes numbering them easier.\n\tfunction sortByPoint(a, b) {\n\t if (a.y < b.y) {\n\t return a.x - b.x;\n\t } else {\n\t return 1;\n\t }\n\t}\n\t\n\t// Sort annotation by it's first rectangle\n\tfunction sortByRectPoint(a, b) {\n\t return sortByPoint(a.rectangles[0], b.rectangles[0]);\n\t}\n\t\n\t// Sort annotation by it's first line\n\tfunction sortByLinePoint(a, b) {\n\t var lineA = a.lines[0];\n\t var lineB = b.lines[0];\n\t return sortByPoint({ x: lineA[0], y: lineA[1] }, { x: lineB[0], y: lineB[1] });\n\t}\n\t\n\t// Arrange supported types and associated sort methods\n\tvar SORT_TYPES = {\n\t 'highlight': sortByRectPoint,\n\t 'strikeout': sortByRectPoint,\n\t 'drawing': sortByLinePoint,\n\t 'textbox': sortByPoint,\n\t 'point': sortByPoint,\n\t 'area': sortByPoint\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertScreenReaderHint;\n\t\n\tvar _createScreenReaderOnly = __webpack_require__(53);\n\t\n\tvar _createScreenReaderOnly2 = _interopRequireDefault(_createScreenReaderOnly);\n\t\n\tvar _insertElementWithinChildren = __webpack_require__(54);\n\t\n\tvar _insertElementWithinChildren2 = _interopRequireDefault(_insertElementWithinChildren);\n\t\n\tvar _insertElementWithinElement = __webpack_require__(55);\n\t\n\tvar _insertElementWithinElement2 = _interopRequireDefault(_insertElementWithinElement);\n\t\n\tvar _renderScreenReaderComments = __webpack_require__(56);\n\t\n\tvar _renderScreenReaderComments2 = _interopRequireDefault(_renderScreenReaderComments);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Annotation types that support comments\n\tvar COMMENT_TYPES = ['highlight', 'point', 'area'];\n\t\n\t/**\n\t * Insert a hint into the DOM for screen readers for a specific annotation.\n\t *\n\t * @param {Object} annotation The annotation to insert a hint for\n\t * @param {Number} num The number of the annotation out of all annotations of the same type\n\t */\n\tfunction insertScreenReaderHint(annotation) {\n\t var num = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t\n\t switch (annotation.type) {\n\t case 'highlight':\n\t case 'strikeout':\n\t var rects = annotation.rectangles;\n\t var first = rects[0];\n\t var last = rects[rects.length - 1];\n\t\n\t (0, _insertElementWithinElement2.default)((0, _createScreenReaderOnly2.default)('Begin ' + annotation.type + ' annotation ' + num, annotation.uuid), first.x, first.y, annotation.page, true);\n\t\n\t (0, _insertElementWithinElement2.default)((0, _createScreenReaderOnly2.default)('End ' + annotation.type + ' annotation ' + num, annotation.uuid + '-end'), last.x + last.width, last.y, annotation.page, false);\n\t break;\n\t\n\t case 'textbox':\n\t case 'point':\n\t var text = annotation.type === 'textbox' ? ' (content: ' + annotation.content + ')' : '';\n\t\n\t (0, _insertElementWithinChildren2.default)((0, _createScreenReaderOnly2.default)(annotation.type + ' annotation ' + num + text, annotation.uuid), annotation.x, annotation.y, annotation.page);\n\t break;\n\t\n\t case 'drawing':\n\t case 'area':\n\t var x = typeof annotation.x !== 'undefined' ? annotation.x : annotation.lines[0][0];\n\t var y = typeof annotation.y !== 'undefined' ? annotation.y : annotation.lines[0][1];\n\t\n\t (0, _insertElementWithinChildren2.default)((0, _createScreenReaderOnly2.default)('Unlabeled drawing', annotation.uuid), x, y, annotation.page);\n\t break;\n\t }\n\t\n\t // Include comments in screen reader hint\n\t if (COMMENT_TYPES.includes(annotation.type)) {\n\t (0, _renderScreenReaderComments2.default)(annotation.documentId, annotation.uuid);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 53 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = createScreenReaderOnly;\n\t/**\n\t * Create a node that is only visible to screen readers\n\t *\n\t * @param {String} content The text content that should be read by screen reader\n\t * @param {String} [annotationId] The ID of the annotation assocaited\n\t * @return {Element} An Element that is only visible to screen readers\n\t */\n\tfunction createScreenReaderOnly(content, annotationId) {\n\t var node = document.createElement('div');\n\t var text = document.createTextNode(content);\n\t node.appendChild(text);\n\t node.setAttribute('id', 'pdf-annotate-screenreader-' + annotationId);\n\t node.style.position = 'absolute';\n\t node.style.left = '-10000px';\n\t node.style.top = 'auto';\n\t node.style.width = '1px';\n\t node.style.height = '1px';\n\t node.style.overflow = 'hidden';\n\t return node;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertElementWithinChildren;\n\t\n\tvar _insertElementWithinElement = __webpack_require__(55);\n\t\n\tvar _insertElementWithinElement2 = _interopRequireDefault(_insertElementWithinElement);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t/**\n\t * Insert an element at a point within the document.\n\t * This algorithm will try to insert between elements if possible.\n\t * It will however use `insertElementWithinElement` if it is more accurate.\n\t *\n\t * @param {Element} el The element to be inserted\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page number to limit elements to\n\t * @return {Boolean} True if element was able to be inserted, otherwise false\n\t */\n\tfunction insertElementWithinChildren(el, x, y, pageNumber) {\n\t // Try and use most accurate method of inserting within an element\n\t if ((0, _insertElementWithinElement2.default)(el, x, y, pageNumber, true)) {\n\t return true;\n\t }\n\t\n\t // Fall back to inserting between elements\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var rect = svg.getBoundingClientRect();\n\t var nodes = [].concat(_toConsumableArray(svg.parentNode.querySelectorAll('.textLayer > div')));\n\t\n\t y = (0, _utils.scaleUp)(svg, { y: y }).y + rect.top;\n\t x = (0, _utils.scaleUp)(svg, { x: x }).x + rect.left;\n\t\n\t // Find the best node to insert before\n\t for (var i = 0, l = nodes.length; i < l; i++) {\n\t var n = nodes[i];\n\t var r = n.getBoundingClientRect();\n\t if (y <= r.top) {\n\t n.parentNode.insertBefore(el, n);\n\t return true;\n\t }\n\t }\n\t\n\t // If all else fails try to append to the bottom\n\t var textLayer = svg.parentNode.querySelector('.textLayer');\n\t if (textLayer) {\n\t var textRect = textLayer.getBoundingClientRect();\n\t if ((0, _utils.pointIntersectsRect)(x, y, textRect)) {\n\t textLayer.appendChild(el);\n\t return true;\n\t }\n\t }\n\t\n\t return false;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertElementWithinElement;\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t/**\n\t * Insert an element at a point within the document.\n\t * This algorithm will only insert within an element amidst it's text content.\n\t *\n\t * @param {Element} el The element to be inserted\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page number to limit elements to\n\t * @param {Boolean} insertBefore Whether the element is to be inserted before or after x\n\t * @return {Boolean} True if element was able to be inserted, otherwise false\n\t */\n\tfunction insertElementWithinElement(el, x, y, pageNumber, insertBefore) {\n\t var OFFSET_ADJUST = 2;\n\t\n\t // If inserting before adjust `x` by looking for element a few px to the right\n\t // Otherwise adjust a few px to the left\n\t // This is to allow a little tolerance by searching within the box, instead\n\t // of getting a false negative by testing right on the border.\n\t x = Math.max(x + OFFSET_ADJUST * (insertBefore ? 1 : -1), 0);\n\t\n\t var node = textLayerElementFromPoint(x, y + OFFSET_ADJUST, pageNumber);\n\t if (!node) {\n\t return false;\n\t }\n\t\n\t // Now that node has been found inverse the adjustment for `x`.\n\t // This is done to accomodate tolerance by cutting off on the outside of the\n\t // text boundary, instead of missing a character by cutting off within.\n\t x = x + OFFSET_ADJUST * (insertBefore ? -1 : 1);\n\t\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var left = (0, _utils.scaleDown)(svg, { left: node.getBoundingClientRect().left }).left - svg.getBoundingClientRect().left;\n\t var temp = node.cloneNode(true);\n\t var head = temp.innerHTML.split('');\n\t var tail = [];\n\t\n\t // Insert temp off screen\n\t temp.style.position = 'absolute';\n\t temp.style.top = '-10000px';\n\t temp.style.left = '-10000px';\n\t document.body.appendChild(temp);\n\t\n\t while (head.length) {\n\t // Don't insert within HTML tags\n\t if (head[head.length - 1] === '>') {\n\t while (head.length) {\n\t tail.unshift(head.pop());\n\t if (tail[0] === '<') {\n\t break;\n\t }\n\t }\n\t }\n\t\n\t // Check if width of temp based on current head value satisfies x\n\t temp.innerHTML = head.join('');\n\t var width = (0, _utils.scaleDown)(svg, { width: temp.getBoundingClientRect().width }).width;\n\t if (left + width <= x) {\n\t break;\n\t }\n\t tail.unshift(head.pop());\n\t }\n\t\n\t // Update original node with new markup, including element to be inserted\n\t node.innerHTML = head.join('') + el.outerHTML + tail.join('');\n\t temp.parentNode.removeChild(temp);\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Get a text layer element at a given point on a page\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page to limit elements to\n\t * @return {Element} First text layer element found at the point\n\t */\n\tfunction textLayerElementFromPoint(x, y, pageNumber) {\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var rect = svg.getBoundingClientRect();\n\t y = (0, _utils.scaleUp)(svg, { y: y }).y + rect.top;\n\t x = (0, _utils.scaleUp)(svg, { x: x }).x + rect.left;\n\t return [].concat(_toConsumableArray(svg.parentNode.querySelectorAll('.textLayer [data-canvas-width]'))).filter(function (el) {\n\t return (0, _utils.pointIntersectsRect)(x, y, el.getBoundingClientRect());\n\t })[0];\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderScreenReaderComments;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _insertScreenReaderComment = __webpack_require__(57);\n\t\n\tvar _insertScreenReaderComment2 = _interopRequireDefault(_insertScreenReaderComment);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Insert the comments into the DOM to be available by screen reader\n\t *\n\t * Example output:\n\t * <div class=\"screenReaderOnly\">\n\t * <div>Begin highlight 1</div>\n\t * <ol aria-label=\"Comments\">\n\t * <li>Foo</li>\n\t * <li>Bar</li>\n\t * <li>Baz</li>\n\t * <li>Qux</li>\n\t * </ol>\n\t * </div>\n\t * <div>Some highlighted text goes here...</div>\n\t * <div class=\"screenReaderOnly\">End highlight 1</div>\n\t *\n\t * NOTE: `screenReaderOnly` is not a real class, just used for brevity\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The ID of the annotation\n\t * @param {Array} [comments] Optionally preloaded comments to be rendered\n\t * @return {Promise}\n\t */\n\tfunction renderScreenReaderComments(documentId, annotationId, comments) {\n\t var promise = void 0;\n\t\n\t if (Array.isArray(comments)) {\n\t promise = Promise.resolve(comments);\n\t } else {\n\t promise = _PDFJSAnnotate2.default.getStoreAdapter().getComments(documentId, annotationId);\n\t }\n\t\n\t return promise.then(function (comments) {\n\t // Node needs to be found by querying DOM as it may have been inserted as innerHTML\n\t // leaving `screenReaderNode` as an invalid reference (see `insertElementWithinElement`).\n\t var node = document.getElementById('pdf-annotate-screenreader-' + annotationId);\n\t if (node) {\n\t var list = document.createElement('ol');\n\t list.setAttribute('id', 'pdf-annotate-screenreader-comment-list-' + annotationId);\n\t list.setAttribute('aria-label', 'Comments');\n\t node.appendChild(list);\n\t comments.forEach(_insertScreenReaderComment2.default);\n\t }\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 57 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertScreenReaderComment;\n\t/**\n\t * Insert a comment into the DOM to be available by screen reader\n\t *\n\t * @param {Object} comment The comment to be inserted\n\t */\n\tfunction insertScreenReaderComment(comment) {\n\t if (!comment) {\n\t return;\n\t }\n\t\n\t var list = document.querySelector('#pdf-annotate-screenreader-' + comment.annotation + ' ol');\n\t if (list) {\n\t var item = document.createElement('li');\n\t item.setAttribute('id', 'pdf-annotate-screenreader-comment-' + comment.uuid);\n\t item.appendChild(document.createTextNode('' + comment.content));\n\t list.appendChild(item);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = initEventHandlers;\n\t\n\tvar _insertScreenReaderHint = __webpack_require__(52);\n\t\n\tvar _insertScreenReaderHint2 = _interopRequireDefault(_insertScreenReaderHint);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tvar _insertScreenReaderComment = __webpack_require__(57);\n\t\n\tvar _insertScreenReaderComment2 = _interopRequireDefault(_insertScreenReaderComment);\n\t\n\tvar _renderScreenReaderComments = __webpack_require__(56);\n\t\n\tvar _renderScreenReaderComments2 = _interopRequireDefault(_renderScreenReaderComments);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Initialize the event handlers for keeping screen reader hints synced with data\n\t */\n\tfunction initEventHandlers() {\n\t (0, _event.addEventListener)('annotation:add', function (documentId, pageNumber, annotation) {\n\t reorderAnnotationsByType(documentId, pageNumber, annotation.type);\n\t });\n\t (0, _event.addEventListener)('annotation:edit', function (documentId, annotationId, annotation) {\n\t reorderAnnotationsByType(documentId, annotation.page, annotation.type);\n\t });\n\t (0, _event.addEventListener)('annotation:delete', removeAnnotation);\n\t (0, _event.addEventListener)('comment:add', insertComment);\n\t (0, _event.addEventListener)('comment:delete', removeComment);\n\t}\n\t\n\t/**\n\t * Reorder the annotation numbers by annotation type\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {Number} pageNumber The page number of the annotations\n\t * @param {Strig} type The annotation type\n\t */\n\tfunction reorderAnnotationsByType(documentId, pageNumber, type) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().getAnnotations(documentId).then(function (annotationsByPage) {\n\t var annotations = [];\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = Object.keys(annotationsByPage)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var page = _step.value;\n\t\n\t for (var annotation in annotationsByPage[page]) {\n\t if (annotation.type == type) annotations.push(annotation);\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t\n\t return annotations;\n\t // annotationsByPage(page) =\n\t // return annotationsByPage[page].filter((a) => {\n\t // return a.type === type;\n\t // });\n\t // return annotationsByPage;\n\t }).then(function (annotations) {\n\t annotations.forEach(function (a) {\n\t removeAnnotation(documentId, a.uuid);\n\t });\n\t\n\t return annotations;\n\t }).then(_renderScreenReaderHints2.default);\n\t}\n\t\n\t/**\n\t * Remove the screen reader hint for an annotation\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The Id of the annotation\n\t */\n\tfunction removeAnnotation(documentId, annotationId) {\n\t removeElementById('pdf-annotate-screenreader-' + annotationId);\n\t removeElementById('pdf-annotate-screenreader-' + annotationId + '-end');\n\t}\n\t\n\t/**\n\t * Insert a screen reader hint for a comment\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The ID of tha assocated annotation\n\t * @param {Object} comment The comment to insert a hint for\n\t */\n\tfunction insertComment(documentId, annotationId, comment) {\n\t var list = document.querySelector('pdf-annotate-screenreader-comment-list-' + annotationId);\n\t var promise = void 0;\n\t\n\t if (!list) {\n\t promise = (0, _renderScreenReaderComments2.default)(documentId, annotationId, []).then(function () {\n\t list = document.querySelector('pdf-annotate-screenreader-comment-list-' + annotationId);\n\t return true;\n\t });\n\t } else {\n\t promise = Promise.resolve(true);\n\t }\n\t\n\t promise.then(function () {\n\t (0, _insertScreenReaderComment2.default)(comment);\n\t });\n\t}\n\t\n\t/**\n\t * Remove a screen reader hint for a comment\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} commentId The ID of the comment\n\t */\n\tfunction removeComment(documentId, commentId) {\n\t removeElementById('pdf-annotate-screenreader-comment-' + commentId);\n\t}\n\t\n\t/**\n\t * Remove an element from the DOM by it's ID if it exists\n\t *\n\t * @param {String} elementID The ID of the element to be removed\n\t */\n\tfunction removeElementById(elementId) {\n\t var el = document.getElementById(elementId);\n\t if (el) {\n\t el.parentNode.removeChild(el);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _edit = __webpack_require__(40);\n\t\n\tvar _pen = __webpack_require__(60);\n\t\n\tvar _point = __webpack_require__(61);\n\t\n\tvar _rect = __webpack_require__(62);\n\t\n\tvar _text = __webpack_require__(63);\n\t\n\tvar _page = __webpack_require__(64);\n\t\n\texports.default = {\n\t addEventListener: _event.addEventListener, removeEventListener: _event.removeEventListener, fireEvent: _event.fireEvent,\n\t disableEdit: _edit.disableEdit, enableEdit: _edit.enableEdit,\n\t disablePen: _pen.disablePen, enablePen: _pen.enablePen, setPen: _pen.setPen,\n\t disablePoint: _point.disablePoint, enablePoint: _point.enablePoint,\n\t disableRect: _rect.disableRect, enableRect: _rect.enableRect,\n\t disableText: _text.disableText, enableText: _text.enableText, setText: _text.setText,\n\t createPage: _page.createPage, renderPage: _page.renderPage\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.setPen = setPen;\n\texports.enablePen = enablePen;\n\texports.disablePen = disablePen;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar _penSize = void 0;\n\tvar _penColor = void 0;\n\tvar path = void 0;\n\tvar lines = void 0;\n\t\n\t/**\n\t * Handle document.mousedown event\n\t */\n\tfunction handleDocumentMousedown() {\n\t path = null;\n\t lines = [];\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var svg = void 0;\n\t if (lines.length > 1 && (svg = (0, _utils.findSVGAtPoint)(e.clientX, e.clientY))) {\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, {\n\t type: 'drawing',\n\t width: _penSize,\n\t color: _penColor,\n\t lines: lines\n\t }).then(function (annotation) {\n\t if (path) {\n\t svg.removeChild(path);\n\t }\n\t\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t savePoint(e.clientX, e.clientY);\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t // Cancel rect if Esc is pressed\n\t if (e.keyCode === 27) {\n\t lines = null;\n\t path.parentNode.removeChild(path);\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t }\n\t}\n\t\n\t/**\n\t * Save a point to the line being drawn.\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t */\n\tfunction savePoint(x, y) {\n\t var svg = (0, _utils.findSVGAtPoint)(x, y);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t var point = (0, _utils.scaleDown)(svg, {\n\t x: x - rect.left,\n\t y: y - rect.top\n\t });\n\t\n\t lines.push([point.x, point.y]);\n\t\n\t if (lines.length <= 1) {\n\t return;\n\t }\n\t\n\t if (path) {\n\t svg.removeChild(path);\n\t }\n\t\n\t path = (0, _appendChild2.default)(svg, {\n\t type: 'drawing',\n\t color: _penColor,\n\t width: _penSize,\n\t lines: lines\n\t });\n\t}\n\t\n\t/**\n\t * Set the attributes of the pen.\n\t *\n\t * @param {Number} penSize The size of the lines drawn by the pen\n\t * @param {String} penColor The color of the lines drawn by the pen\n\t */\n\tfunction setPen() {\n\t var penSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\t var penColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '000000';\n\t\n\t _penSize = parseInt(penSize, 10);\n\t _penColor = penColor;\n\t}\n\t\n\t/**\n\t * Enable the pen behavior\n\t */\n\tfunction enablePen() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Disable the pen behavior\n\t */\n\tfunction disablePen() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.enablePoint = enablePoint;\n\texports.disablePoint = disablePoint;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar input = void 0;\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} The DOM event to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t\n\t if (input || !(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t input = document.createElement('input');\n\t input.setAttribute('id', 'pdf-annotate-point-input');\n\t input.setAttribute('placeholder', 'Enter comment');\n\t input.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t input.style.borderRadius = '3px';\n\t input.style.position = 'absolute';\n\t input.style.top = e.clientY + 'px';\n\t input.style.left = e.clientX + 'px';\n\t\n\t input.addEventListener('blur', handleInputBlur);\n\t input.addEventListener('keyup', handleInputKeyup);\n\t\n\t document.body.appendChild(input);\n\t input.focus();\n\t}\n\t\n\t/**\n\t * Handle input.blur event\n\t */\n\tfunction handleInputBlur() {\n\t savePoint();\n\t}\n\t\n\t/**\n\t * Handle input.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleInputKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closeInput();\n\t } else if (e.keyCode === 13) {\n\t savePoint();\n\t }\n\t}\n\t\n\t/**\n\t * Save a new point annotation from input\n\t */\n\tfunction savePoint() {\n\t if (input.value.trim().length > 0) {\n\t var clientX = parseInt(input.style.left, 10);\n\t var clientY = parseInt(input.style.top, 10);\n\t var content = input.value.trim();\n\t var svg = (0, _utils.findSVGAtPoint)(clientX, clientY);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t var annotation = Object.assign({\n\t type: 'point'\n\t }, (0, _utils.scaleDown)(svg, {\n\t x: clientX - rect.left,\n\t y: clientY - rect.top\n\t }));\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().addComment(documentId, annotation.uuid, content);\n\t\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t closeInput();\n\t}\n\t\n\t/**\n\t * Close the input element\n\t */\n\tfunction closeInput() {\n\t input.removeEventListener('blur', handleInputBlur);\n\t input.removeEventListener('keyup', handleInputKeyup);\n\t document.body.removeChild(input);\n\t input = null;\n\t}\n\t\n\t/**\n\t * Enable point annotation behavior\n\t */\n\tfunction enablePoint() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Disable point annotation behavior\n\t */\n\tfunction disablePoint() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.enableRect = enableRect;\n\texports.disableRect = disableRect;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tvar _enabled = false;\n\tvar _type = void 0;\n\tvar overlay = void 0;\n\tvar originY = void 0;\n\tvar originX = void 0;\n\t\n\t/**\n\t * Get the current window selection as rects\n\t *\n\t * @return {Array} An Array of rects\n\t */\n\tfunction getSelectionRects() {\n\t try {\n\t var selection = window.getSelection();\n\t var range = selection.getRangeAt(0);\n\t var rects = range.getClientRects();\n\t\n\t if (rects.length > 0 && rects[0].width > 0 && rects[0].height > 0) {\n\t return rects;\n\t }\n\t } catch (e) {}\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Handle document.mousedown event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMousedown(e) {\n\t var svg = void 0;\n\t if (_type !== 'area' || !(svg = (0, _utils.findSVGAtPoint)(e.clientX, e.clientY))) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t originY = e.clientY;\n\t originX = e.clientX;\n\t\n\t overlay = document.createElement('div');\n\t overlay.style.position = 'absolute';\n\t overlay.style.top = originY - rect.top + 'px';\n\t overlay.style.left = originX - rect.left + 'px';\n\t overlay.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t overlay.style.borderRadius = '3px';\n\t svg.parentNode.appendChild(overlay);\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t var rect = svg.getBoundingClientRect();\n\t\n\t if (originX + (e.clientX - originX) < rect.right) {\n\t overlay.style.width = e.clientX - originX + 'px';\n\t }\n\t\n\t if (originY + (e.clientY - originY) < rect.bottom) {\n\t overlay.style.height = e.clientY - originY + 'px';\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var rects = void 0;\n\t if (_type !== 'area' && (rects = getSelectionRects())) {\n\t var svg = (0, _utils.findSVGAtPoint)(rects[0].left, rects[0].top);\n\t saveRect(_type, [].concat(_toConsumableArray(rects)).map(function (r) {\n\t return {\n\t top: r.top,\n\t left: r.left,\n\t width: r.width,\n\t height: r.height\n\t };\n\t }));\n\t } else if (_type === 'area' && overlay) {\n\t var _svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t var rect = _svg.getBoundingClientRect();\n\t saveRect(_type, [{\n\t top: parseInt(overlay.style.top, 10) + rect.top,\n\t left: parseInt(overlay.style.left, 10) + rect.left,\n\t width: parseInt(overlay.style.width, 10),\n\t height: parseInt(overlay.style.height, 10)\n\t }]);\n\t\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t (0, _utils.enableUserSelect)();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t // Cancel rect if Esc is pressed\n\t if (e.keyCode === 27) {\n\t var selection = window.getSelection();\n\t selection.removeAllRanges();\n\t if (overlay && overlay.parentNode) {\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Save a rect annotation\n\t *\n\t * @param {String} type The type of rect (area, highlight, strikeout)\n\t * @param {Array} rects The rects to use for annotation\n\t * @param {String} color The color of the rects\n\t */\n\tfunction saveRect(type, rects, color) {\n\t var svg = (0, _utils.findSVGAtPoint)(rects[0].left, rects[0].top);\n\t var node = void 0;\n\t var annotation = void 0;\n\t\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var boundingRect = svg.getBoundingClientRect();\n\t\n\t if (!color) {\n\t if (type === 'highlight') {\n\t color = 'FFFF00';\n\t } else if (type === 'strikeout') {\n\t color = 'FF0000';\n\t }\n\t }\n\t\n\t // Initialize the annotation\n\t annotation = {\n\t type: type,\n\t color: color,\n\t rectangles: [].concat(_toConsumableArray(rects)).map(function (r) {\n\t var offset = 0;\n\t\n\t if (type === 'strikeout') {\n\t offset = r.height / 2;\n\t }\n\t\n\t return (0, _utils.scaleDown)(svg, {\n\t y: r.top + offset - boundingRect.top,\n\t x: r.left - boundingRect.left,\n\t width: r.width,\n\t height: r.height\n\t });\n\t }).filter(function (r) {\n\t return r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1;\n\t })\n\t };\n\t\n\t // Short circuit if no rectangles exist\n\t if (annotation.rectangles.length === 0) {\n\t return;\n\t }\n\t\n\t // Special treatment for area as it only supports a single rect\n\t if (type === 'area') {\n\t var rect = annotation.rectangles[0];\n\t delete annotation.rectangles;\n\t annotation.x = rect.x;\n\t annotation.y = rect.y;\n\t annotation.width = rect.width;\n\t annotation.height = rect.height;\n\t }\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t // Add the annotation\n\t\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t}\n\t\n\t/**\n\t * Enable rect behavior\n\t */\n\tfunction enableRect(type) {\n\t _type = type;\n\t\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t}\n\t\n\t/**\n\t * Disable rect behavior\n\t */\n\tfunction disableRect() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t}\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.setText = setText;\n\texports.enableText = enableText;\n\texports.disableText = disableText;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar input = void 0;\n\tvar _textSize = void 0;\n\tvar _textColor = void 0;\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t if (input || !(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t input = document.createElement('input');\n\t input.setAttribute('id', 'pdf-annotate-text-input');\n\t input.setAttribute('placeholder', 'Enter text');\n\t input.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t input.style.borderRadius = '3px';\n\t input.style.position = 'absolute';\n\t input.style.top = e.clientY + 'px';\n\t input.style.left = e.clientX + 'px';\n\t input.style.fontSize = _textSize + 'px';\n\t\n\t input.addEventListener('blur', handleInputBlur);\n\t input.addEventListener('keyup', handleInputKeyup);\n\t\n\t document.body.appendChild(input);\n\t input.focus();\n\t}\n\t\n\t/**\n\t * Handle input.blur event\n\t */\n\tfunction handleInputBlur() {\n\t saveText();\n\t}\n\t\n\t/**\n\t * Handle input.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleInputKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closeInput();\n\t } else if (e.keyCode === 13) {\n\t saveText();\n\t }\n\t}\n\t\n\t/**\n\t * Save a text annotation from input\n\t */\n\tfunction saveText() {\n\t if (input.value.trim().length > 0) {\n\t var clientX = parseInt(input.style.left, 10);\n\t var clientY = parseInt(input.style.top, 10);\n\t var svg = (0, _utils.findSVGAtPoint)(clientX, clientY);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t var rect = svg.getBoundingClientRect();\n\t var annotation = Object.assign({\n\t type: 'textbox',\n\t size: _textSize,\n\t color: _textColor,\n\t content: input.value.trim()\n\t }, (0, _utils.scaleDown)(svg, {\n\t x: clientX - rect.left,\n\t y: clientY - rect.top,\n\t width: input.offsetWidth,\n\t height: input.offsetHeight\n\t }));\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t closeInput();\n\t}\n\t\n\t/**\n\t * Close the input\n\t */\n\tfunction closeInput() {\n\t try {\n\t if (input) {\n\t input.removeEventListener('blur', handleInputBlur);\n\t input.removeEventListener('keyup', handleInputKeyup);\n\t document.body.removeChild(input);\n\t input = null;\n\t }\n\t } catch (e) {\n\t console.log('Try/catch is necessary because exist a error in Safari');\n\t }\n\t}\n\t\n\t/**\n\t * Set the text attributes\n\t *\n\t * @param {Number} textSize The size of the text\n\t * @param {String} textColor The color of the text\n\t */\n\tfunction setText() {\n\t var textSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 12;\n\t var textColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '000000';\n\t\n\t _textSize = parseInt(textSize, 10);\n\t _textColor = textColor;\n\t}\n\t\n\t/**\n\t * Enable text behavior\n\t */\n\tfunction enableText() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Disable text behavior\n\t */\n\tfunction disableText() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\texports.createPage = createPage;\n\texports.renderPage = renderPage;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Template for creating a new page\n\tvar PAGE_TEMPLATE = '\\n <div style=\"visibility: hidden;\" class=\"page\" data-loaded=\"false\">\\n <div class=\"canvasWrapper\">\\n <canvas></canvas>\\n </div>\\n <svg class=\"annotationLayer\"></svg>\\n <div class=\"textLayer\"></div>\\n </div>\\n';\n\t\n\t/**\n\t * Create a new page to be appended to the DOM.\n\t *\n\t * @param {Number} pageNumber The page number that is being created\n\t * @return {HTMLElement}\n\t */\n\tfunction createPage(pageNumber) {\n\t var temp = document.createElement('div');\n\t temp.innerHTML = PAGE_TEMPLATE;\n\t\n\t var page = temp.children[0];\n\t var canvas = page.querySelector('canvas');\n\t\n\t page.setAttribute('id', 'pageContainer' + pageNumber);\n\t page.setAttribute('data-page-number', pageNumber);\n\t\n\t canvas.mozOpaque = true;\n\t canvas.setAttribute('id', 'page' + pageNumber);\n\t\n\t // let svg = page.querySelector('.');\n\t // // let svg = document.body;\n\t // console.log(svg)\n\t // // let svg = document.getElementById();\n\t //\n\t // document.addEventListener('click', function handleDocumentClick(e) {\n\t // console.log(click)\n\t // if (!findSVGAtPoint(e.clientX, e.clientY)) {\n\t // return;\n\t // }\n\t //\n\t // let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\t //\n\t // // Emit annotation:blur if clickNode is no longer clicked\n\t // if (clickNode && clickNode !== target) {\n\t // emitter.emit('annotation:blur', clickNode);\n\t // }\n\t //\n\t // // Emit annotation:click if target was clicked\n\t // if (target) {\n\t // emitter.emit('annotation:click', target);\n\t // }\n\t //\n\t // clickNode = target;\n\t // });\n\t\n\t return page;\n\t}\n\t\n\t/**\n\t * Render a page that has already been created.\n\t *\n\t * @param {Number} pageNumber The page number to be rendered\n\t * @param {Object} renderOptions The options for rendering\n\t * @return {Promise} Settled once rendering has completed\n\t * A settled Promise will be either:\n\t * - fulfilled: [pdfPage, annotations]\n\t * - rejected: Error\n\t */\n\tfunction renderPage(pageNumber, annotations, renderOptions) {\n\t var documentId = renderOptions.documentId,\n\t pdfDocument = renderOptions.pdfDocument,\n\t scale = renderOptions.scale,\n\t rotate = renderOptions.rotate;\n\t\n\t // Load the page and annotations\n\t\n\t return Promise.all([pdfDocument.getPage(pageNumber)]).then(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 1),\n\t pdfPage = _ref2[0];\n\t\n\t var page = document.getElementById('pageContainer' + pageNumber);\n\t var svg = page.querySelector('.annotationLayer');\n\t var canvas = page.querySelector('.canvasWrapper canvas');\n\t var canvasContext = canvas.getContext('2d', { alpha: false });\n\t var viewport = pdfPage.getViewport(scale, rotate);\n\t var transform = scalePage(pageNumber, viewport, canvasContext);\n\t\n\t // Render the page\n\t return Promise.all([pdfPage.render({ canvasContext: canvasContext, viewport: viewport, transform: transform }), _PDFJSAnnotate2.default.render(svg, viewport, { pageNumber: pageNumber, documentId: documentId, annotations: annotations[pageNumber] })]).then(function () {\n\t // Text content is needed for a11y, but is also necessary for creating\n\t // highlight and strikeout annotations which require selecting text.\n\t return pdfPage.getTextContent({ normalizeWhitespace: true }).then(function (textContent) {\n\t return new Promise(function (resolve, reject) {\n\t // Render text layer for a11y of text content\n\t var textLayer = page.querySelector('.textLayer');\n\t var textLayerFactory = new pdfjsViewer.DefaultTextLayerFactory();\n\t var textLayerBuilder = textLayerFactory.createTextLayerBuilder(textLayer, pageNumber - 1, viewport);\n\t textLayerBuilder.setTextContent(textContent);\n\t textLayerBuilder.render();\n\t\n\t // Enable a11y for annotations\n\t // Timeout is needed to wait for `textLayerBuilder.render`\n\t setTimeout(function () {\n\t try {\n\t (0, _renderScreenReaderHints2.default)(annotations.annotations);\n\t resolve();\n\t } catch (e) {\n\t reject(e);\n\t }\n\t });\n\t });\n\t });\n\t }).then(function () {\n\t // Indicate that the page was loaded\n\t page.setAttribute('data-loaded', 'true');\n\t\n\t return [pdfPage, annotations];\n\t });\n\t });\n\t}\n\t\n\t/**\n\t * Scale the elements of a page.\n\t *\n\t * @param {Number} pageNumber The page number to be scaled\n\t * @param {Object} viewport The viewport of the PDF page (see pdfPage.getViewport(scale, rotate))\n\t * @param {Object} context The canvas context that the PDF page is rendered to\n\t * @return {Array} The transform data for rendering the PDF page\n\t */\n\tfunction scalePage(pageNumber, viewport, context) {\n\t var page = document.getElementById('pageContainer' + pageNumber);\n\t var canvas = page.querySelector('.canvasWrapper canvas');\n\t var svg = page.querySelector('.annotationLayer');\n\t var wrapper = page.querySelector('.canvasWrapper');\n\t var textLayer = page.querySelector('.textLayer');\n\t var outputScale = getOutputScale(context);\n\t var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n\t var sfx = approximateFraction(outputScale.sx);\n\t var sfy = approximateFraction(outputScale.sy);\n\t\n\t // Adjust width/height for scale\n\t page.style.visibility = '';\n\t canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n\t canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n\t canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px';\n\t canvas.style.height = roundToDivide(viewport.height, sfx[1]) + 'px';\n\t svg.setAttribute('width', viewport.width);\n\t svg.setAttribute('height', viewport.height);\n\t svg.style.width = viewport.width + 'px';\n\t svg.style.height = viewport.height + 'px';\n\t page.style.width = viewport.width + 'px';\n\t page.style.height = viewport.height + 'px';\n\t wrapper.style.width = viewport.width + 'px';\n\t wrapper.style.height = viewport.height + 'px';\n\t textLayer.style.width = viewport.width + 'px';\n\t textLayer.style.height = viewport.height + 'px';\n\t\n\t return transform;\n\t}\n\t\n\t/**\n\t * The following methods are taken from mozilla/pdf.js and as such fall under\n\t * the Apache License (http://www.apache.org/licenses/).\n\t *\n\t * Original source can be found at mozilla/pdf.js:\n\t * https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js\n\t */\n\t\n\t/**\n\t * Approximates a float number as a fraction using Farey sequence (max order\n\t * of 8).\n\t *\n\t * @param {Number} x Positive float number\n\t * @return {Array} Estimated fraction: the first array item is a numerator,\n\t * the second one is a denominator.\n\t */\n\tfunction approximateFraction(x) {\n\t // Fast path for int numbers or their inversions.\n\t if (Math.floor(x) === x) {\n\t return [x, 1];\n\t }\n\t\n\t var xinv = 1 / x;\n\t var limit = 8;\n\t if (xinv > limit) {\n\t return [1, limit];\n\t } else if (Math.floor(xinv) === xinv) {\n\t return [1, xinv];\n\t }\n\t\n\t var x_ = x > 1 ? xinv : x;\n\t\n\t // a/b and c/d are neighbours in Farey sequence.\n\t var a = 0,\n\t b = 1,\n\t c = 1,\n\t d = 1;\n\t\n\t // Limit search to order 8.\n\t while (true) {\n\t // Generating next term in sequence (order of q).\n\t var p = a + c,\n\t q = b + d;\n\t if (q > limit) {\n\t break;\n\t }\n\t if (x_ <= p / q) {\n\t c = p;d = q;\n\t } else {\n\t a = p;b = q;\n\t }\n\t }\n\t\n\t // Select closest of neighbours to x.\n\t if (x_ - a / b < c / d - x_) {\n\t return x_ === x ? [a, b] : [b, a];\n\t } else {\n\t return x_ === x ? [c, d] : [d, c];\n\t }\n\t}\n\t\n\tfunction getOutputScale(ctx) {\n\t var devicePixelRatio = window.devicePixelRatio || 1;\n\t var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n\t var pixelRatio = devicePixelRatio / backingStoreRatio;\n\t return {\n\t sx: pixelRatio,\n\t sy: pixelRatio,\n\t scaled: pixelRatio !== 1\n\t };\n\t}\n\t\n\tfunction roundToDivide(x, div) {\n\t var r = x % div;\n\t return r === 0 ? x : Math.round(x - r + div);\n\t}\n\n/***/ },\n/* 65 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = initColorPicker;\n\t// Color picker component\n\tvar COLORS = [{ hex: '#000000', name: 'Black' }, { hex: '#EF4437', name: 'Red' }, { hex: '#E71F63', name: 'Pink' }, { hex: '#8F3E97', name: 'Purple' }, { hex: '#65499D', name: 'Deep Purple' }, { hex: '#4554A4', name: 'Indigo' }, { hex: '#2083C5', name: 'Blue' }, { hex: '#35A4DC', name: 'Light Blue' }, { hex: '#09BCD3', name: 'Cyan' }, { hex: '#009688', name: 'Teal' }, { hex: '#43A047', name: 'Green' }, { hex: '#8BC34A', name: 'Light Green' }, { hex: '#FDC010', name: 'Yellow' }, { hex: '#F8971C', name: 'Orange' }, { hex: '#F0592B', name: 'Deep Orange' }, { hex: '#F06291', name: 'Light Pink' }];\n\t\n\tfunction initColorPicker(el, value, onChange) {\n\t function setColor(value) {\n\t var fireOnChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t\n\t currentValue = value;\n\t a.setAttribute('data-color', value);\n\t a.style.background = value;\n\t if (fireOnChange && typeof onChange === 'function') {\n\t onChange(value);\n\t }\n\t closePicker();\n\t }\n\t\n\t function togglePicker() {\n\t if (isPickerOpen) {\n\t closePicker();\n\t } else {\n\t openPicker();\n\t }\n\t }\n\t\n\t function closePicker() {\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t if (picker && picker.parentNode) {\n\t picker.parentNode.removeChild(picker);\n\t }\n\t isPickerOpen = false;\n\t a.focus();\n\t }\n\t\n\t function openPicker() {\n\t if (!picker) {\n\t picker = document.createElement('div');\n\t picker.style.background = '#fff';\n\t picker.style.border = '1px solid #ccc';\n\t picker.style.padding = '2px';\n\t picker.style.position = 'absolute';\n\t picker.style.width = '122px';\n\t el.style.position = 'relative';\n\t\n\t COLORS.map(createColorOption).forEach(function (c) {\n\t c.style.margin = '2px';\n\t c.onclick = function () {\n\t setColor(c.getAttribute('data-color'));\n\t };\n\t picker.appendChild(c);\n\t });\n\t }\n\t\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t el.appendChild(picker);\n\t isPickerOpen = true;\n\t }\n\t\n\t function createColorOption(color) {\n\t var e = document.createElement('a');\n\t e.className = 'color';\n\t e.setAttribute('href', 'javascript://');\n\t e.setAttribute('title', color.name);\n\t e.setAttribute('data-color', color.hex);\n\t e.style.background = color.hex;\n\t return e;\n\t }\n\t\n\t function handleDocumentKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closePicker();\n\t }\n\t }\n\t\n\t var picker = void 0;\n\t var isPickerOpen = false;\n\t var currentValue = void 0;\n\t var a = createColorOption({ hex: value });\n\t a.onclick = togglePicker;\n\t el.appendChild(a);\n\t setColor(value, false);\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** static/pdfannotator/pdf-annotate.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap eb9ae7feaedcd1f55f8b\n **/","import PDFJSAnnotate from './PDFJSAnnotate';\nimport {documentId, documentUrl, readonly} from './initFile';\nexport default PDFJSAnnotate;\n\nimport twitter from 'twitter-text';\nimport initColorPicker from './initColorPicker';\n\nconst { UI } = PDFJSAnnotate;\nimport {renderComments} from \"./UI/comments\";\n\nlet PAGE_HEIGHT;\nlet RENDER_OPTIONS = {\n documentId:documentUrl,\n pdfDocument: null,\n enhanceTextSelection:true,\n scale: parseFloat(localStorage.getItem(`${documentId}/scale`), 10) || 1.33,\n rotate: parseInt(localStorage.getItem(`${documentId}/rotate`), 10) || 0\n};\n\nPDFJSAnnotate.setStoreAdapter(new PDFJSAnnotate.CRFPAStoreAdapter());\n// pdfjsLib.workerSrc = '/static/pdfannotator/pdf.worker.js';\n\n// Render stuff\n\n// let renderedPages = {};\n// document.getElementById('content-wrapper').addEventListener('scroll', function (e) {\n// let visiblePageNum = Math.round(e.target.scrollTop / PAGE_HEIGHT) + 1;\n// let visiblePage = document.querySelector(`.page[data-page-number=\"${visiblePageNum}\"][data-loaded=\"false\"]`);\n// if (visiblePage) {\n// // Prevent invoking UI.renderPage on the same page more than once.\n// \tif ( !renderedPages[visiblePageNum] ) {\n// \t renderedPages[visiblePageNum] = true;\n// \t setTimeout(function () {\n// \t\tUI.renderPage(visiblePageNum, RENDER_OPTIONS);\n// \t });\n// \t}\n// }\n// });\n\nlet NUM_PAGES = 0;\nfunction render() {\n\n pdfjsLib.getDocument(RENDER_OPTIONS.documentId).then((pdf) => {\n RENDER_OPTIONS.pdfDocument = pdf;\n\n let viewer = document.getElementById('viewer');\n viewer.innerHTML = '';\n NUM_PAGES = pdf._pdfInfo.numPages;\n for (let i=0; i<NUM_PAGES; i++) {\n let page = UI.createPage(i+1);\n viewer.appendChild(page);\n }\n\n PDFJSAnnotate.getAnnotations(documentId).then((annotations)=>{\n for(let num = 1; num <= NUM_PAGES; num++) {\n pdf.getPage(num).then(function () {\n UI.renderPage(num, annotations, RENDER_OPTIONS).then(([pdfPage, annotations]) => {\n let viewport = pdfPage.getViewport(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate);\n PAGE_HEIGHT = viewport.height;\n if($.browser.mozilla)\n $('.textLayer>.endOfContent').remove();\n });\n\n });\n }\n });\n });\n}\nrender();\n\nif(!readonly) {\n// Text stuff\n (function () {\n let textSize;\n let textColor;\n\n function initText() {\n // let size = document.querySelector('.toolbar .text-size');\n // [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96].forEach((s) => {\n // size.appendChild(new Option(s, s));\n // });\n //\n // setText(\n // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/size`) || 12,\n // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/color`) || '#EF4437'\n // );\n setText(\n 12, '#EF4437'\n );\n\n // initColorPicker(document.querySelector('.text-color'), textColor, function (value) {\n // setText(textSize, value);\n // });\n }\n\n function setText(size, color) {\n // let modified = false;\n //\n // if (textSize !== size) {\n // modified = true;\n // textSize = size;\n // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/size`, textSize);\n // // document.querySelector('.toolbar .text-size').value = textSize;\n // }\n //\n // if (textColor !== color) {\n // modified = true;\n // textColor = color;\n // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/color`, textColor);\n //\n // let selected = document.querySelector('.toolbar .text-color.color-selected');\n // if (selected) {\n // selected.classList.remove('color-selected');\n // selected.removeAttribute('aria-selected');\n // }\n //\n // selected = document.querySelector(`.toolbar .text-color[data-color=\"${color}\"]`);\n // if (selected) {\n // selected.classList.add('color-selected');\n // selected.setAttribute('aria-selected', true);\n // }\n //\n // }\n\n // if (modified) {\n UI.setText(size, color);\n // }\n }\n\n // function handleTextSizeChange(e) {\n // setText(e.target.value, textColor);\n // }\n\n // document.querySelector('.toolbar .text-size').addEventListener('change', handleTextSizeChange);\n\n initText();\n })();\n\n// Pen stuff\n (function () {\n let penSize;\n let penColor;\n\n function initPen() {\n let size = document.querySelector('.toolbar .pen-size');\n for (let i = 0; i < 20; i++) {\n size.appendChild(new Option(i + 1, i + 1));\n }\n\n setPen(\n localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/size`) || 1,\n localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/color`) || '#000000'\n );\n\n initColorPicker(document.querySelector('.pen-color'), penColor, function (value) {\n setPen(penSize, value);\n });\n }\n\n function setPen(size, color) {\n let modified = false;\n\n if (penSize !== size) {\n modified = true;\n penSize = size;\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/size`, penSize);\n document.querySelector('.toolbar .pen-size').value = penSize;\n }\n\n if (penColor !== color) {\n modified = true;\n penColor = color;\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/color`, penColor);\n\n let selected = document.querySelector('.toolbar .pen-color.color-selected');\n if (selected) {\n selected.classList.remove('color-selected');\n selected.removeAttribute('aria-selected');\n }\n\n selected = document.querySelector(`.toolbar .pen-color[data-color=\"${color}\"]`);\n if (selected) {\n selected.classList.add('color-selected');\n selected.setAttribute('aria-selected', true);\n }\n }\n\n if (modified) {\n UI.setPen(penSize, penColor);\n }\n }\n\n function handlePenSizeChange(e) {\n setPen(e.target.value, penColor);\n }\n\n document.querySelector('.toolbar .pen-size').addEventListener('change', handlePenSizeChange);\n\n initPen();\n })();\n\n// Toolbar buttons\n (function () {\n let tooltype = localStorage.getItem(`${RENDER_OPTIONS.documentId}/tooltype`) || 'cursor';\n if (tooltype) {\n setActiveToolbarItem(tooltype, document.querySelector(`.toolbar button[data-tooltype=${tooltype}]`));\n }\n\n function setActiveToolbarItem(type, button) {\n let active = document.querySelector('.toolbar button.active');\n if (active) {\n active.classList.remove('active');\n\n switch (tooltype) {\n case 'cursor':\n UI.disableEdit();\n break;\n case 'draw':\n UI.disablePen();\n break;\n case 'text':\n UI.disableText();\n break;\n case 'point':\n UI.disablePoint();\n break;\n case 'area':\n case 'highlight':\n case 'strikeout':\n UI.disableRect();\n break;\n }\n }\n\n if (button) {\n button.classList.add('active');\n }\n if (tooltype !== type) {\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/tooltype`, type);\n }\n tooltype = type;\n\n switch (type) {\n case 'cursor':\n UI.enableEdit();\n break;\n case 'draw':\n UI.enablePen();\n break;\n case 'text':\n UI.enableText();\n break;\n case 'point':\n UI.enablePoint();\n break;\n case 'area':\n case 'highlight':\n case 'strikeout':\n UI.enableRect(type);\n break;\n }\n }\n\n function handleToolbarClick(e) {\n if (e.target.nodeName === 'BUTTON') {\n setActiveToolbarItem(e.target.getAttribute('data-tooltype'), e.target);\n }\n }\n\n document.querySelector('.toolbar').addEventListener('click', handleToolbarClick);\n })();\n}\n\nif(readonly)\n UI.enableEdit();\n\n// Scale/rotate\n(function () {\n function setScaleRotate(scale, rotate) {\n scale = parseFloat(scale, 10);\n rotate = parseInt(rotate, 10);\n\n if (RENDER_OPTIONS.scale !== scale || RENDER_OPTIONS.rotate !== rotate) {\n RENDER_OPTIONS.scale = scale;\n RENDER_OPTIONS.rotate = rotate;\n\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/scale`, RENDER_OPTIONS.scale);\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/rotate`, RENDER_OPTIONS.rotate % 360);\n\n render();\n }\n }\n\n function handleScaleChange(e) {\n setScaleRotate(e.target.value, RENDER_OPTIONS.rotate);\n }\n\n function handleRotateCWClick() {\n setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate + 90);\n }\n\n function handleRotateCCWClick() {\n setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate - 90);\n }\n\n document.querySelector('.toolbar select.scale').value = RENDER_OPTIONS.scale;\n document.querySelector('.toolbar select.scale').addEventListener('change', handleScaleChange);\n document.querySelector('.toolbar .rotate-ccw').addEventListener('click', handleRotateCCWClick);\n document.querySelector('.toolbar .rotate-cw').addEventListener('click', handleRotateCWClick);\n})();\n\n\nrenderComments(documentId);\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import StoreAdapter from './adapter/StoreAdapter';\nimport CRFPAStoreAdapter from './adapter/CRFPAStoreAdapter';\nimport render from './render';\nimport UI from './UI';\n\nexport default {\n /**\n * Abstract class that needs to be defined so PDFJSAnnotate\n * knows how to communicate with your server.\n */\n StoreAdapter,\n\n /**\n * Implementation of StoreAdapter that stores annotation data to localStorage.\n */\n CRFPAStoreAdapter,\n\n /**\n * Abstract instance of StoreAdapter\n */\n __storeAdapter: new StoreAdapter(),\n\n /**\n * Getter for the underlying StoreAdapter property\n *\n * @return {StoreAdapter}\n */\n getStoreAdapter() {\n return this.__storeAdapter;\n },\n\n /**\n * Setter for the underlying StoreAdapter property\n *\n * @param {StoreAdapter} adapter The StoreAdapter implementation to be used.\n */\n setStoreAdapter(adapter) {\n // TODO this throws an error when bundled\n // if (!(adapter instanceof StoreAdapter)) {\n // throw new Error('adapter must be an instance of StoreAdapter');\n // }\n\n this.__storeAdapter = adapter;\n },\n\n /**\n * UI is a helper for instrumenting UI interactions for creating,\n * editing, and deleting annotations in the browser.\n */\n UI,\n\n /**\n * Render the annotations for a page in the PDF Document\n *\n * @param {SVGElement} svg The SVG element that annotations should be rendered to\n * @param {PageViewport} viewport The PDFPage.getViewport data\n * @param {Object} data The StoreAdapter.getAnnotations data\n * @return {Promise}\n */\n render,\n\n /**\n * Convenience method for getting annotation data\n *\n * @alias StoreAdapter.getAnnotations\n * @param {String} documentId The ID of the document\n * @return {Promise}\n */\n getAnnotations(documentId) {\n return this.getStoreAdapter().getAnnotations(...arguments);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/PDFJSAnnotate.js\n **/","import abstractFunction from '../utils/abstractFunction';\nimport { fireEvent } from '../UI/event';\n\n// Adapter should never be invoked publicly\nexport default class StoreAdapter {\n /**\n * Create a new StoreAdapter instance\n *\n * @param {Object} [definition] The definition to use for overriding abstract methods\n */\n constructor(definition = {}) {\n // Copy each function from definition if it is a function we know about\n Object.keys(definition).forEach((key) => {\n if (typeof definition[key] === 'function' &&\n typeof this[key] === 'function') {\n this[key] = definition[key];\n }\n });\n }\n\n /**\n * Get all the annotations for a given document and page number.\n *\n * @param {String} documentId The ID for the document the annotations belong to\n * @param {Number} pageNumber The number of the page the annotations belong to\n * @return {Promise}\n */\n __getAnnotations(documentId) { abstractFunction('getAnnotations'); }\n get getAnnotations() { return this.__getAnnotations; }\n set getAnnotations(fn) {\n this.__getAnnotations = function getAnnotations(documentId) {\n return fn(...arguments).then((annotations) => {\n // TODO may be best to have this happen on the server\n // if (annotations) {\n // annotations.forEach((a) => {\n // a.documentId = documentId;\n // });\n // }\n return annotations;\n });\n };\n }\n\n /**\n * Get the definition for a specific annotation.\n *\n * @param {String} documentId The ID for the document the annotation belongs to\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n getAnnotation(documentId, annotationId) { abstractFunction('getAnnotation'); }\n\n /**\n * Add an annotation\n *\n * @param {String} documentId The ID for the document to add the annotation to\n * @param {String} pageNumber The page number to add the annotation to\n * @param {Object} annotation The definition for the new annotation\n * @return {Promise}\n */\n __addAnnotation(documentId, pageNumber, annotation) { abstractFunction('addAnnotation'); }\n get addAnnotation() { return this.__addAnnotation; }\n set addAnnotation(fn) {\n this.__addAnnotation = function addAnnotation(documentId, pageNumber, annotation) {\n return fn(...arguments).then((annotation) => {\n fireEvent('annotation:add', documentId, pageNumber, annotation);\n return annotation;\n });\n };\n }\n\n /**\n * Edit an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} pageNumber the page number of the annotation\n * @param {Object} annotation The definition of the modified annotation\n * @return {Promise}\n */\n __editAnnotation(documentId, pageNumber, annotation) { abstractFunction('editAnnotation'); }\n get editAnnotation() { return this.__editAnnotation; }\n set editAnnotation(fn) {\n this.__editAnnotation = function editAnnotation(documentId, annotationId, annotation) {\n return fn(...arguments).then((annotation) => {\n fireEvent('annotation:edit', documentId, annotationId, annotation);\n return annotation;\n });\n };\n }\n\n /**\n * Delete an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n __deleteAnnotation(documentId, annotationId) { abstractFunction('deleteAnnotation'); }\n get deleteAnnotation() { return this.__deleteAnnotation; }\n set deleteAnnotation(fn) {\n this.__deleteAnnotation = function deleteAnnotation(documentId, annotationId) {\n return fn(...arguments).then((success) => {\n if (success) {\n fireEvent('annotation:delete', documentId, annotationId);\n }\n return success;\n });\n };\n }\n\n /**\n * Get all the comments for an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n getComments(documentId, annotationId) { abstractFunction('getComments'); }\n\n /**\n * Add a new comment\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @param {Object} content The definition of the comment\n * @return {Promise}\n */\n __addComment(documentId, annotationId, content) { abstractFunction('addComment'); }\n get addComment() { return this.__addComment; }\n set addComment(fn) {\n this.__addComment = function addComment(documentId, annotationId, content) {\n return fn(...arguments).then((comment) => {\n fireEvent('comment:add', documentId, annotationId, comment);\n return comment;\n });\n };\n }\n\n /**\n * Delete a comment\n *\n * @param {String} documentId The ID for the document\n * @param {String} commentId The ID for the comment\n * @return {Promise}\n */\n __deleteComment(documentId, commentId) { abstractFunction('deleteComment'); }\n get deleteComment() { return this.__deleteComment; }\n set deleteComment(fn) {\n this.__deleteComment = function deleteComment(documentId, commentId) {\n return fn(...arguments).then((success) => {\n if (success) {\n fireEvent('comment:delete', documentId, commentId);\n }\n return success;\n });\n };\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/adapter/StoreAdapter.js\n **/","/**\n * Throw an Error for an abstract function that hasn't been implemented.\n *\n * @param {String} name The name of the abstract function\n */\nexport default function abstractFunction(name) {\n throw new Error(name + ' is not implemented');\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/abstractFunction.js\n **/","import EventEmitter from 'events';\nimport {\n findAnnotationAtPoint,\n findSVGAtPoint\n} from './utils';\n\nconst emitter = new EventEmitter;\n\nlet clickNode;\n\n/**\n * Handle document.click event\n *\n * @param {Event} e The DOM event to be handled\n */\n// document.addEventListener('mousedown', function handleDocumentClick(e) {\n\ndocument.addEventListener('click', function handleDocumentClick(e) {\n if (!findSVGAtPoint(e.clientX, e.clientY)) { return; }\n\n let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\n // Emit annotation:blur if clickNode is no longer clicked\n if (clickNode && clickNode !== target) {\n emitter.emit('annotation:blur', clickNode);\n }\n\n // Emit annotation:click if target was clicked\n if (target) {\n emitter.emit('annotation:click', target);\n }\n\n clickNode = target;\n});\n\n// let mouseOverNode;\n// document.addEventListener('mousemove', function handleDocumentMousemove(e) {\n// let target = findAnnotationAtPoint(e.clientX, e.clientY);\n//\n// // Emit annotation:mouseout if target was mouseout'd\n// if (mouseOverNode && !target) {\n// emitter.emit('annotation:mouseout', mouseOverNode);\n// }\n//\n// // Emit annotation:mouseover if target was mouseover'd\n// if (target && mouseOverNode !== target) {\n// emitter.emit('annotation:mouseover', target);\n// }\n//\n// mouseOverNode = target;\n// });\n\nexport function fireEvent() { emitter.emit(...arguments); };\nexport function addEventListener() { emitter.on(...arguments); };\nexport function removeEventListener() { emitter.removeListener(...arguments); };\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/event.js\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/events/events.js\n ** module id = 5\n ** module chunks = 0\n **/","import createStyleSheet from 'create-stylesheet';\n\nexport const BORDER_COLOR = '#00BFFF';\n\nconst userSelectStyleSheet = createStyleSheet({\n body: {\n '-webkit-user-select': 'none',\n '-moz-user-select': 'none',\n '-ms-user-select': 'none',\n 'user-select': 'none'\n }\n});\nuserSelectStyleSheet.setAttribute('data-pdf-annotate-user-select', 'true');\n\n/**\n * Find the SVGElement that contains all the annotations for a page\n *\n * @param {Element} node An annotation within that container\n * @return {SVGElement} The container SVG or null if it can't be found\n */\nexport function findSVGContainer(node) {\n let parentNode = node;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n if (parentNode.nodeName.toUpperCase() === 'SVG' &&\n parentNode.getAttribute('data-pdf-annotate-container') === 'true') {\n return parentNode;\n }\n }\n\n return null;\n}\n\n\n/**\n * Find an SVGElement container at a given point\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @return {SVGElement} The container SVG or null if one can't be found\n */\nexport function findSVGAtPoint(x, y) {\n let elements = document.querySelectorAll('svg[data-pdf-annotate-container=\"true\"]');\n for (let i=0, l=elements.length; i<l; i++) {\n let el = elements[i];\n let rect = el.getBoundingClientRect();\n\n if (pointIntersectsRect(x, y, rect)) {\n return el;\n }\n }\n\n return null;\n}\n\n/**\n * Find an Element that represents an annotation at a given point\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @return {Element} The annotation element or null if one can't be found\n */\nexport function findAnnotationAtPoint(x, y) {\n let svg = findSVGAtPoint(x, y);\n if (!svg) { return; }\n let elements = svg.querySelectorAll('[data-pdf-annotate-type]');\n\n // Find a target element within SVG\n for (let i=0, l=elements.length; i<l; i++) {\n let el = elements[i];\n if (pointIntersectsRect(x, y, getOffsetAnnotationRect(el))) {\n return el;\n }\n }\n\n return null;\n}\n\n/**\n * Determine if a point intersects a rect\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Object} rect The points of a rect (likely from getBoundingClientRect)\n * @return {Boolean} True if a collision occurs, otherwise false\n */\nexport function pointIntersectsRect(x, y, rect) {\n return y >= rect.top && y <= rect.bottom && x >= rect.left && x <= rect.right;\n}\n\n/**\n * Get the rect of an annotation element accounting for offset.\n *\n * @param {Element} el The element to get the rect of\n * @return {Object} The dimensions of the element\n */\nexport function getOffsetAnnotationRect(el) {\n let rect = getAnnotationRect(el);\n let { offsetLeft, offsetTop } = getOffset(el);\n\n return {\n top: rect.top + offsetTop,\n left: rect.left + offsetLeft,\n right: rect.right + offsetLeft,\n bottom: rect.bottom + offsetTop\n };\n}\n\n/**\n * Get the rect of an annotation element.\n *\n * @param {Element} el The element to get the rect of\n * @return {Object} The dimensions of the element\n */\nexport function getAnnotationRect(el) {\n let h = 0, w = 0, x = 0, y = 0;\n let rect = el.getBoundingClientRect();\n // TODO this should be calculated somehow\n const LINE_OFFSET = 16;\n // debugger;\n switch (el.nodeName.toLowerCase()) {\n case 'path':\n let minX, maxX, minY, maxY;\n\n el.getAttribute('d').replace(/Z/, '').split('M').splice(1).forEach((p) => {\n var s = p.split(' ').map(i => parseInt(i, 10));\n\n if (typeof minX === 'undefined' || s[0] < minX) { minX = s[0]; }\n if (typeof maxX === 'undefined' || s[2] > maxX) { maxX = s[2]; }\n if (typeof minY === 'undefined' || s[1] < minY) { minY = s[1]; }\n if (typeof maxY === 'undefined' || s[3] > maxY) { maxY = s[3]; }\n });\n\n h = maxY - minY;\n w = maxX - minX;\n x = minX;\n y = minY;\n break;\n\n case 'line':\n h = parseInt(el.getAttribute('y2'), 10) - parseInt(el.getAttribute('y1'), 10);\n w = parseInt(el.getAttribute('x2'), 10) - parseInt(el.getAttribute('x1'), 10);\n x = parseInt(el.getAttribute('x1'), 10);\n y = parseInt(el.getAttribute('y1'), 10);\n\n if (h === 0) {\n h += LINE_OFFSET;\n y -= (LINE_OFFSET / 2);\n }\n break;\n\n case 'text':\n h = rect.height;\n w = rect.width;\n x = parseInt(el.getAttribute('x'), 10);\n y = parseInt(el.getAttribute('y'), 10) - h;\n break;\n\n case 'g':\n let { offsetLeft, offsetTop } = getOffset(el);\n h = rect.height;\n w = rect.width;\n x = rect.left - offsetLeft;\n y = rect.top - offsetTop;\n\n if (el.getAttribute('data-pdf-annotate-type') === 'strikeout') {\n h += LINE_OFFSET;\n y -= (LINE_OFFSET / 2);\n }\n break;\n\n case 'rect':\n case 'svg':\n h = parseInt(el.getAttribute('height'), 10);\n w = parseInt(el.getAttribute('width'), 10);\n x = parseInt(el.getAttribute('x'), 10);\n y = parseInt(el.getAttribute('y'), 10);\n break;\n }\n\n // Result provides same properties as getBoundingClientRect\n let result = {\n top: y,\n left: x,\n width: w,\n height: h,\n right: x + w,\n bottom: y + h\n };\n\n // For the case of nested SVG (point annotations) and grouped\n // lines or rects no adjustment needs to be made for scale.\n // I assume that the scale is already being handled\n // natively by virtue of the `transform` attribute.\n if (!['svg', 'g'].includes(el.nodeName.toLowerCase())) {\n result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n }\n\n // // comment point need to be scaled on FF\n if(el.nodeName.toLowerCase() == 'svg' && $.browser.mozilla){\n result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n }\n\n return result;\n}\n\n/**\n * Adjust scale from normalized scale (100%) to rendered scale.\n *\n * @param {SVGElement} svg The SVG to gather metadata from\n * @param {Object} rect A map of numeric values to scale\n * @return {Object} A copy of `rect` with values scaled up\n */\nexport function scaleUp(svg, rect) {\n let result = {};\n let { viewport } = getMetadata(svg);\n\n Object.keys(rect).forEach((key) => {\n result[key] = rect[key] * viewport.scale;\n });\n\n return result;\n}\n\n/**\n * Adjust scale from rendered scale to a normalized scale (100%).\n *\n * @param {SVGElement} svg The SVG to gather metadata from\n * @param {Object} rect A map of numeric values to scale\n * @return {Object} A copy of `rect` with values scaled down\n */\nexport function scaleDown(svg, rect) {\n let result = {};\n let { viewport } = getMetadata(svg);\n\n Object.keys(rect).forEach((key) => {\n result[key] = rect[key] / viewport.scale;\n });\n\n return result;\n}\n\n/**\n * Get the scroll position of an element, accounting for parent elements\n *\n * @param {Element} el The element to get the scroll position for\n * @return {Object} The scrollTop and scrollLeft position\n */\nexport function getScroll(el) {\n let scrollTop = 0;\n let scrollLeft = 0;\n let parentNode = el;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n scrollTop += parentNode.scrollTop;\n scrollLeft += parentNode.scrollLeft;\n }\n\n return { scrollTop, scrollLeft };\n}\n\n/**\n * Get the offset position of an element, accounting for parent elements\n *\n * @param {Element} el The element to get the offset position for\n * @return {Object} The offsetTop and offsetLeft position\n */\nexport function getOffset(el) {\n let parentNode = el;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n if (parentNode.nodeName.toUpperCase() === 'SVG') {\n break;\n }\n }\n\n let rect = parentNode.getBoundingClientRect();\n\n return { offsetLeft: rect.left, offsetTop: rect.top };\n}\n\n/**\n * Disable user ability to select text on page\n */\nexport function disableUserSelect() {\n if (!userSelectStyleSheet.parentNode) {\n document.head.appendChild(userSelectStyleSheet);\n }\n}\n\n\n/**\n * Enable user ability to select text on page\n */\nexport function enableUserSelect() {\n if (userSelectStyleSheet.parentNode) {\n userSelectStyleSheet.parentNode.removeChild(userSelectStyleSheet);\n }\n}\n\n/**\n * Get the metadata for a SVG container\n *\n * @param {SVGElement} svg The SVG container to get metadata for\n */\nexport function getMetadata(svg) {\n return {\n documentId: svg.getAttribute('data-pdf-annotate-document'),\n pageNumber: parseInt(svg.getAttribute('data-pdf-annotate-page'), 10),\n viewport: JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'))\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/utils.js\n **/","module.exports = function createStyleSheet(blocks) {\n var style = document.createElement('style');\n var text = Object.keys(blocks).map(function (selector) {\n return processRuleSet(selector, blocks[selector]);\n }).join('\\n');\n \n style.setAttribute('type', 'text/css');\n style.appendChild(document.createTextNode(text));\n\n return style;\n}\n\nfunction processRuleSet(selector, block) {\n return selector + ' {\\n' + processDeclarationBlock(block) + '\\n}';\n}\n\nfunction processDeclarationBlock(block) {\n return Object.keys(block).map(function (prop) {\n return processDeclaration(prop, block[prop]);\n }).join('\\n');\n}\n\nfunction processDeclaration(prop, value) {\n if (!isNaN(value) && value != 0) {\n value = value + 'px';\n }\n\n return hyphenate(prop) + ': ' + value + ';';\n}\n\nfunction hyphenate(prop) {\n return prop.replace(/[A-Z]/g, function (match) {\n return '-' + match.toLowerCase();\n });\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/create-stylesheet/index.js\n ** module id = 7\n ** module chunks = 0\n **/","import axios from 'axios';\nimport uuid from '../utils/uuid';\nimport StoreAdapter from './StoreAdapter';\nimport {documentId as fileUuid} from '../initFile';\nimport {renderComments} from \"../UI/comments\";\n\naxios.defaults.xsrfCookieName = 'csrftoken';\naxios.defaults.xsrfHeaderName = 'X-CSRFToken';\n\nexport default class CRFPAStoreAdapter extends StoreAdapter {\n constructor() {\n\n const API = axios.create({\n baseURL: '/pdfannotator',\n timeout: 10000,\n withCredentials: true,\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n\n\n super({\n getAnnotations(documentId) {\n\n return API.get('/get-annotations/', {\n params: {\n fileUuid,\n }\n }).then(function (response) {\n return response.data;\n });\n\n // return new Promise((resolve, reject) => {\n // let annotations = getAnnotations(documentId).filter((i) => {\n // return i.page === pageNumber && i.class === 'Annotation';\n // });\n //\n // resolve({\n // documentId,\n // pageNumber,\n // annotations\n // });\n // });\n },\n\n getAnnotation(documentId, annotationId) {\n return API.get('/get-annotation/', {\n params: {\n fileUuid,\n annotationId\n }\n }).then(function (response) {\n return response.data;\n });\n },\n\n addAnnotation(documentId, pageNumber, annotation) {\n\n annotation.class = 'Annotation';\n annotation.page = pageNumber;\n annotation.uuid = uuid();\n\n return API.post('/add-annotation/', {\n fileUuid,\n page: pageNumber,\n annotation\n }).then(function (response) {\n return annotation;\n });\n\n // return new Promise((resolve, reject) => {\n\n // annotation.class = 'Annotation';\n // annotation.uuid = uuid();\n // annotation.page = pageNumber;\n\n // let annotations = getAnnotations(documentId);\n // annotations.push(annotation);\n // updateAnnotations(documentId, annotations);\n\n // resolve(annotation);\n // });\n },\n\n editAnnotation(documentId, annotationId, annotation) {\n return API.post('/update-annotation/', {\n fileUuid,\n annotationId,\n annotation\n }).then(function (response) {\n if(annotation.type==='point')\n renderComments();\n return response;\n }).then(function (response) {\n return annotation;\n });\n\n // return new Promise((resolve, reject) => {\n // let annotations = getAnnotations(documentId);\n // annotations[findAnnotation(documentId, annotationId)] = annotation;\n // updateAnnotations(documentId, annotations);\n //\n // resolve(annotation);\n // });\n },\n\n deleteAnnotation(documentId, annotationId) {\n return API.post('/delete-annotation/', {\n annotationId,\n fileUuid\n }).then(function (response) {\n renderComments();\n return response;\n }).then(function (response) {\n return true;\n });\n\n // return new Promise((resolve, reject) => {\n // let index = findAnnotation(documentId, annotationId);\n // if (index > -1) {\n // let annotations = getAnnotations(documentId);\n // annotations.splice(index, 1);\n // updateAnnotations(documentId, annotations);\n // }\n //\n // resolve(true);\n // });\n },\n\n getComments(documentId) {\n return API.get('/get-comments/', {\n params: {\n fileUuid\n }\n }).then(function (response) {\n return response.data;\n });\n\n // return new Promise((resolve, reject) => {\n // resolve(getAnnotations(documentId).filter((i) => {\n // return i.class === 'Comment' && i.annotation === annotationId;\n // }));\n // });\n },\n\n addComment(documentId, annotationId, content) {\n\n return API.post('/add-comment/', {\n fileUuid,\n annotationId,\n content\n }).then(function (response) {\n renderComments();\n return response;\n }).then(function (response) {\n return content;\n });\n\n // return new Promise((resolve, reject) => {\n // let comment = {\n // class: 'Comment',\n // uuid: uuid(),\n // annotation: annotationId,\n // content: content\n // };\n //\n //\n //\n // let annotations = getAnnotations(documentId);\n // annotations.push(comment);\n // updateAnnotations(documentId, annotations);\n //\n // resolve(comment);\n // });\n },\n\n // deleteComment(documentId, commentId) {\n //\n // return API.post('/delete-comment/', {\n // fileUuid,\n // commentId,\n // }).then(function (response) {\n // return true;\n // });\n // }\n });\n }\n}\n//\n// function getAnnotations(documentId) {\n// return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || [];\n// }\n//\n// function updateAnnotations(documentId, annotations) {\n// localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations));\n// }\n\n// function findAnnotation(documentId, annotationId) {\n// let index = -1;\n// let annotations = getAnnotations(documentId);\n// for (let i=0, l=annotations.length; i<l; i++) {\n// if (annotations[i].uuid === annotationId) {\n// index = i;\n// break;\n// }\n// }\n// return index;\n// }\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/adapter/CRFPAStoreAdapter.js\n **/","module.exports = require('./lib/axios');\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/index.js\n ** module id = 9\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/axios.js\n ** module id = 10\n ** module chunks = 0\n **/","'use strict';\n\nvar bind = require('./helpers/bind');\nvar isBuffer = require('is-buffer');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/utils.js\n ** module id = 11\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/bind.js\n ** module id = 12\n ** module chunks = 0\n **/","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/is-buffer/index.js\n ** module id = 13\n ** module chunks = 0\n **/","'use strict';\n\nvar defaults = require('./../defaults');\nvar utils = require('./../utils');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/Axios.js\n ** module id = 14\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/defaults.js\n ** module id = 15\n ** module chunks = 0\n **/","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 16\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/normalizeHeaderName.js\n ** module id = 17\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false;\n\n // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n if (process.env.NODE_ENV !== 'test' &&\n typeof window !== 'undefined' &&\n window.XDomainRequest && !('withCredentials' in request) &&\n !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n request.onprogress = function handleProgress() {};\n request.ontimeout = function handleTimeout() {};\n }\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request[loadEvent] = function handleLoad() {\n if (!request || (request.readyState !== 4 && !xDomain)) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/adapters/xhr.js\n ** module id = 18\n ** module chunks = 0\n **/","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/settle.js\n ** module id = 19\n ** module chunks = 0\n **/","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/createError.js\n ** module id = 20\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/enhanceError.js\n ** module id = 21\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/buildURL.js\n ** module id = 22\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/parseHeaders.js\n ** module id = 23\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/isURLSameOrigin.js\n ** module id = 24\n ** module chunks = 0\n **/","'use strict';\n\n// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\nE.prototype = new Error;\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw new E();\n }\n block = block << 8 | charCode;\n }\n return output;\n}\n\nmodule.exports = btoa;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/btoa.js\n ** module id = 25\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/cookies.js\n ** module id = 26\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/InterceptorManager.js\n ** module id = 27\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar isAbsoluteURL = require('./../helpers/isAbsoluteURL');\nvar combineURLs = require('./../helpers/combineURLs');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/dispatchRequest.js\n ** module id = 28\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/transformData.js\n ** module id = 29\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/isCancel.js\n ** module id = 30\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/isAbsoluteURL.js\n ** module id = 31\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/combineURLs.js\n ** module id = 32\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/Cancel.js\n ** module id = 33\n ** module chunks = 0\n **/","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/CancelToken.js\n ** module id = 34\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/spread.js\n ** module id = 35\n ** module chunks = 0\n **/","const REGEXP = /[xy]/g\nconst PATTERN = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n\nfunction replacement(c) {\n let r = Math.random()*16|0;\n let v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n}\n\n/**\n * Generate a univierally unique identifier\n *\n * @return {String}\n */\nexport default function uuid() {\n return PATTERN.replace(REGEXP, replacement);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/uuid.js\n **/","export const documentUrl = document.getElementById('pdf-data').dataset.filepath;\nexport const documentId = document.getElementById('pdf-data').dataset.uuid;\nexport const readonly = document.getElementById('pdf-data').dataset.readonly === 'True';\n\n\n/** WEBPACK FOOTER **\n ** ./src/initFile.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate'\nimport twitter from \"twitter-text\";\nimport {addEventListener} from \"./event\";\nimport {createEditOverlay} from \"./edit\";\n\nlet commentList = $('#comment-wrapper .comment-list-container');\nlet commentForm = $('#comment-wrapper .comment-list-form');\n\n// let commentText = commentForm.querySelector('input[type=\"text\"]');\n\nexport function renderComments(documentId) {\n PDFJSAnnotate.getStoreAdapter().getComments(documentId).then((comments) => {\n\n\n commentList.html('');\n commentForm.hide();\n // commentText.focus();\n\n // commentForm.onsubmit = function () {\n // PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n // .then(insertComment)\n // .then(() => {\n // commentText.value = '';\n // commentText.focus();\n // });\n //\n // return false;\n // };\n\n comments.forEach(insertComment);\n });\n}\n\n\nfunction supportsComments(target) {\n let type = target.getAttribute('data-pdf-annotate-type');\n return ['point', 'highlight', 'area'].indexOf(type) > -1;\n}\n\nfunction insertComment(comment) {\n let child = $('<div></div>');\n child.addClass('comment-list-item');\n child.attr('uuid', comment.annotation)\n child.html(twitter.autoLink(twitter.htmlEscape(comment.content)));\n child.bind('click', handleCommentClick);\n commentList.append(child);\n}\n\nfunction handleCommentClick(e) {\n let comment = $(e.target);\n selectComment(comment.attr('uuid'));\n}\n\n\nfunction scrollToView(element) {\n var offset = element.offset().top;\n if (!element.is(\":visible\")) {\n element.css({\"visibility\": \"hidden\"}).show();\n var offset = element.offset().top;\n element.css({\"visibility\": \"\", \"display\": \"\"});\n }\n\n var visible_area_start = $(window).scrollTop();\n var visible_area_end = visible_area_start + window.innerHeight;\n\n if (offset < visible_area_start || offset > visible_area_end) {\n // Not in view so scroll to it\n if (element.hasClass('comment-list-item')) {\n $('.comment-list-container').animate({scrollTop: offset - window.innerHeight / 3}, 300);\n }\n else {\n $('#content-wrapper').animate({scrollTop: offset - window.innerHeight / 3}, 300);\n }\n return false;\n }\n return true;\n}\n\nexport function selectComment(uuid) {\n let comment = $(`.comment-list-item[uuid=${uuid}]`);\n $('.comment-list-item').removeClass('selected');\n comment.addClass('selected');\n const annotation = $(`[data-pdf-annotate-id=${uuid}]`)[0];\n createEditOverlay(annotation);\n scrollToView($(annotation));\n scrollToView(comment);\n}\n\n// function handleAnnotationClick(target) {\n// if (supportsComments(target)) {\n// let documentId = target.parentNode.getAttribute('data-pdf-annotate-document');\n// let annotationId = target.getAttribute('data-pdf-annotate-id');\n//\n// PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId).then((comments) => {\n// commentList.innerHTML = '';\n// commentForm.style.display = '';\n// commentText.focus();\n//\n// commentForm.onsubmit = function () {\n// PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n// .then(insertComment)\n// .then(() => {\n// commentText.value = '';\n// commentText.focus();\n// });\n//\n// return false;\n// };\n//\n// comments.forEach(insertComment);\n// });\n// }\n// }\n//\n// function handleAnnotationBlur(target) {\n// if (supportsComments(target)) {\n// commentList.innerHTML = '';\n// commentForm.style.display = 'none';\n// commentForm.onsubmit = null;\n//\n// insertComment({content: 'No comments'});\n// }\n// }\n\n\n// UI.addEventListener('annotation:click', handleAnnotationClick);\n// UI.addEventListener('annotation:blur', handleAnnotationBlur);\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/comments.js\n **/","(function() {\n if (typeof twttr === \"undefined\" || twttr === null) {\n var twttr = {};\n }\n\n twttr.txt = {};\n twttr.txt.regexen = {};\n\n var HTML_ENTITIES = {\n '&': '&',\n '>': '>',\n '<': '<',\n '\"': '"',\n \"'\": '''\n };\n\n // HTML escaping\n twttr.txt.htmlEscape = function(text) {\n return text && text.replace(/[&\"'><]/g, function(character) {\n return HTML_ENTITIES[character];\n });\n };\n\n // Builds a RegExp\n function regexSupplant(regex, flags) {\n flags = flags || \"\";\n if (typeof regex !== \"string\") {\n if (regex.global && flags.indexOf(\"g\") < 0) {\n flags += \"g\";\n }\n if (regex.ignoreCase && flags.indexOf(\"i\") < 0) {\n flags += \"i\";\n }\n if (regex.multiline && flags.indexOf(\"m\") < 0) {\n flags += \"m\";\n }\n\n regex = regex.source;\n }\n\n return new RegExp(regex.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n var newRegex = twttr.txt.regexen[name] || \"\";\n if (typeof newRegex !== \"string\") {\n newRegex = newRegex.source;\n }\n return newRegex;\n }), flags);\n }\n\n twttr.txt.regexSupplant = regexSupplant;\n\n // simple string interpolation\n function stringSupplant(str, values) {\n return str.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n return values[name] || \"\";\n });\n }\n\n twttr.txt.stringSupplant = stringSupplant;\n\n twttr.txt.regexen.spaces_group = /\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000/;\n twttr.txt.regexen.spaces = regexSupplant(/[#{spaces_group}]/);\n twttr.txt.regexen.invalid_chars_group = /\\uFFFE\\uFEFF\\uFFFF\\u202A-\\u202E/;\n twttr.txt.regexen.invalid_chars = regexSupplant(/[#{invalid_chars_group}]/);\n twttr.txt.regexen.punct = /\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$/;\n twttr.txt.regexen.rtl_chars = /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg;\n twttr.txt.regexen.non_bmp_code_pairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/mg;\n\n twttr.txt.regexen.latinAccentChars = /\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF/;\n\n // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{L}\\p{M}\n twttr.txt.regexen.bmpLetterAndMarks = /A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0300-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u0483-\\u052f\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06df-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710-\\u074a\\u074d-\\u07b1\\u07ca-\\u07f5\\u07fa\\u0800-\\u082d\\u0840-\\u085b\\u08a0-\\u08b2\\u08e4-\\u0963\\u0971-\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bc-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e3\\u09f0\\u09f1\\u0a01-\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a59-\\u0a5c\\u0a5e\\u0a70-\\u0a75\\u0a81-\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abc-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ad0\\u0ae0-\\u0ae3\\u0b01-\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3c-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b63\\u0b71\\u0b82\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd0\\u0bd7\\u0c00-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c58\\u0c59\\u0c60-\\u0c63\\u0c81-\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbc-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0cde\\u0ce0-\\u0ce3\\u0cf1\\u0cf2\\u0d01-\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4e\\u0d57\\u0d60-\\u0d63\\u0d7a-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb9\\u0ebb-\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ec8-\\u0ecd\\u0edc-\\u0edf\\u0f00\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f71-\\u0f84\\u0f86-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u103f\\u1050-\\u108f\\u109a-\\u109d\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u135d-\\u135f\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16f1-\\u16f8\\u1700-\\u170c\\u170e-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176c\\u176e-\\u1770\\u1772\\u1773\\u1780-\\u17d3\\u17d7\\u17dc\\u17dd\\u180b-\\u180d\\u1820-\\u1877\\u1880-\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1920-\\u192b\\u1930-\\u193b\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a1b\\u1a20-\\u1a5e\\u1a60-\\u1a7c\\u1a7f\\u1aa7\\u1ab0-\\u1abe\\u1b00-\\u1b4b\\u1b6b-\\u1b73\\u1b80-\\u1baf\\u1bba-\\u1bf3\\u1c00-\\u1c37\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1cd0-\\u1cd2\\u1cd4-\\u1cf6\\u1cf8\\u1cf9\\u1d00-\\u1df5\\u1dfc-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u20d0-\\u20f0\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2183\\u2184\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d7f-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2de0-\\u2dff\\u2e2f\\u3005\\u3006\\u302a-\\u302f\\u3031-\\u3035\\u303b\\u303c\\u3041-\\u3096\\u3099\\u309a\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua672\\ua674-\\ua67d\\ua67f-\\ua69d\\ua69f-\\ua6e5\\ua6f0\\ua6f1\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua7ad\\ua7b0\\ua7b1\\ua7f7-\\ua827\\ua840-\\ua873\\ua880-\\ua8c4\\ua8e0-\\ua8f7\\ua8fb\\ua90a-\\ua92d\\ua930-\\ua953\\ua960-\\ua97c\\ua980-\\ua9c0\\ua9cf\\ua9e0-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa36\\uaa40-\\uaa4d\\uaa60-\\uaa76\\uaa7a-\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaef\\uaaf2-\\uaaf6\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab5f\\uab64\\uab65\\uabc0-\\uabea\\uabec\\uabed\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf870-\\uf87f\\uf882\\uf884-\\uf89f\\uf8b8\\uf8c1-\\uf8d6\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe00-\\ufe0f\\ufe20-\\ufe2d\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc/;\n twttr.txt.regexen.astralLetterAndMarks = /\\ud800[\\udc00-\\udc0b\\udc0d-\\udc26\\udc28-\\udc3a\\udc3c\\udc3d\\udc3f-\\udc4d\\udc50-\\udc5d\\udc80-\\udcfa\\uddfd\\ude80-\\ude9c\\udea0-\\uded0\\udee0\\udf00-\\udf1f\\udf30-\\udf40\\udf42-\\udf49\\udf50-\\udf7a\\udf80-\\udf9d\\udfa0-\\udfc3\\udfc8-\\udfcf]|\\ud801[\\udc00-\\udc9d\\udd00-\\udd27\\udd30-\\udd63\\ude00-\\udf36\\udf40-\\udf55\\udf60-\\udf67]|\\ud802[\\udc00-\\udc05\\udc08\\udc0a-\\udc35\\udc37\\udc38\\udc3c\\udc3f-\\udc55\\udc60-\\udc76\\udc80-\\udc9e\\udd00-\\udd15\\udd20-\\udd39\\udd80-\\uddb7\\uddbe\\uddbf\\ude00-\\ude03\\ude05\\ude06\\ude0c-\\ude13\\ude15-\\ude17\\ude19-\\ude33\\ude38-\\ude3a\\ude3f\\ude60-\\ude7c\\ude80-\\ude9c\\udec0-\\udec7\\udec9-\\udee6\\udf00-\\udf35\\udf40-\\udf55\\udf60-\\udf72\\udf80-\\udf91]|\\ud803[\\udc00-\\udc48]|\\ud804[\\udc00-\\udc46\\udc7f-\\udcba\\udcd0-\\udce8\\udd00-\\udd34\\udd50-\\udd73\\udd76\\udd80-\\uddc4\\uddda\\ude00-\\ude11\\ude13-\\ude37\\udeb0-\\udeea\\udf01-\\udf03\\udf05-\\udf0c\\udf0f\\udf10\\udf13-\\udf28\\udf2a-\\udf30\\udf32\\udf33\\udf35-\\udf39\\udf3c-\\udf44\\udf47\\udf48\\udf4b-\\udf4d\\udf57\\udf5d-\\udf63\\udf66-\\udf6c\\udf70-\\udf74]|\\ud805[\\udc80-\\udcc5\\udcc7\\udd80-\\uddb5\\uddb8-\\uddc0\\ude00-\\ude40\\ude44\\ude80-\\udeb7]|\\ud806[\\udca0-\\udcdf\\udcff\\udec0-\\udef8]|\\ud808[\\udc00-\\udf98]|\\ud80c[\\udc00-\\udfff]|\\ud80d[\\udc00-\\udc2e]|\\ud81a[\\udc00-\\ude38\\ude40-\\ude5e\\uded0-\\udeed\\udef0-\\udef4\\udf00-\\udf36\\udf40-\\udf43\\udf63-\\udf77\\udf7d-\\udf8f]|\\ud81b[\\udf00-\\udf44\\udf50-\\udf7e\\udf8f-\\udf9f]|\\ud82c[\\udc00\\udc01]|\\ud82f[\\udc00-\\udc6a\\udc70-\\udc7c\\udc80-\\udc88\\udc90-\\udc99\\udc9d\\udc9e]|\\ud834[\\udd65-\\udd69\\udd6d-\\udd72\\udd7b-\\udd82\\udd85-\\udd8b\\uddaa-\\uddad\\ude42-\\ude44]|\\ud835[\\udc00-\\udc54\\udc56-\\udc9c\\udc9e\\udc9f\\udca2\\udca5\\udca6\\udca9-\\udcac\\udcae-\\udcb9\\udcbb\\udcbd-\\udcc3\\udcc5-\\udd05\\udd07-\\udd0a\\udd0d-\\udd14\\udd16-\\udd1c\\udd1e-\\udd39\\udd3b-\\udd3e\\udd40-\\udd44\\udd46\\udd4a-\\udd50\\udd52-\\udea5\\udea8-\\udec0\\udec2-\\udeda\\udedc-\\udefa\\udefc-\\udf14\\udf16-\\udf34\\udf36-\\udf4e\\udf50-\\udf6e\\udf70-\\udf88\\udf8a-\\udfa8\\udfaa-\\udfc2\\udfc4-\\udfcb]|\\ud83a[\\udc00-\\udcc4\\udcd0-\\udcd6]|\\ud83b[\\ude00-\\ude03\\ude05-\\ude1f\\ude21\\ude22\\ude24\\ude27\\ude29-\\ude32\\ude34-\\ude37\\ude39\\ude3b\\ude42\\ude47\\ude49\\ude4b\\ude4d-\\ude4f\\ude51\\ude52\\ude54\\ude57\\ude59\\ude5b\\ude5d\\ude5f\\ude61\\ude62\\ude64\\ude67-\\ude6a\\ude6c-\\ude72\\ude74-\\ude77\\ude79-\\ude7c\\ude7e\\ude80-\\ude89\\ude8b-\\ude9b\\udea1-\\udea3\\udea5-\\udea9\\udeab-\\udebb]|\\ud840[\\udc00-\\udfff]|\\ud841[\\udc00-\\udfff]|\\ud842[\\udc00-\\udfff]|\\ud843[\\udc00-\\udfff]|\\ud844[\\udc00-\\udfff]|\\ud845[\\udc00-\\udfff]|\\ud846[\\udc00-\\udfff]|\\ud847[\\udc00-\\udfff]|\\ud848[\\udc00-\\udfff]|\\ud849[\\udc00-\\udfff]|\\ud84a[\\udc00-\\udfff]|\\ud84b[\\udc00-\\udfff]|\\ud84c[\\udc00-\\udfff]|\\ud84d[\\udc00-\\udfff]|\\ud84e[\\udc00-\\udfff]|\\ud84f[\\udc00-\\udfff]|\\ud850[\\udc00-\\udfff]|\\ud851[\\udc00-\\udfff]|\\ud852[\\udc00-\\udfff]|\\ud853[\\udc00-\\udfff]|\\ud854[\\udc00-\\udfff]|\\ud855[\\udc00-\\udfff]|\\ud856[\\udc00-\\udfff]|\\ud857[\\udc00-\\udfff]|\\ud858[\\udc00-\\udfff]|\\ud859[\\udc00-\\udfff]|\\ud85a[\\udc00-\\udfff]|\\ud85b[\\udc00-\\udfff]|\\ud85c[\\udc00-\\udfff]|\\ud85d[\\udc00-\\udfff]|\\ud85e[\\udc00-\\udfff]|\\ud85f[\\udc00-\\udfff]|\\ud860[\\udc00-\\udfff]|\\ud861[\\udc00-\\udfff]|\\ud862[\\udc00-\\udfff]|\\ud863[\\udc00-\\udfff]|\\ud864[\\udc00-\\udfff]|\\ud865[\\udc00-\\udfff]|\\ud866[\\udc00-\\udfff]|\\ud867[\\udc00-\\udfff]|\\ud868[\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86a[\\udc00-\\udfff]|\\ud86b[\\udc00-\\udfff]|\\ud86c[\\udc00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d]|\\ud87e[\\udc00-\\ude1d]|\\udb40[\\udd00-\\uddef]/;\n\n // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{Nd}\n twttr.txt.regexen.bmpNumerals = /0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u07c0-\\u07c9\\u0966-\\u096f\\u09e6-\\u09ef\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0de6-\\u0def\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\\u1040-\\u1049\\u1090-\\u1099\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1b50-\\u1b59\\u1bb0-\\u1bb9\\u1c40-\\u1c49\\u1c50-\\u1c59\\ua620-\\ua629\\ua8d0-\\ua8d9\\ua900-\\ua909\\ua9d0-\\ua9d9\\ua9f0-\\ua9f9\\uaa50-\\uaa59\\uabf0-\\uabf9\\uff10-\\uff19/;\n twttr.txt.regexen.astralNumerals = /\\ud801[\\udca0-\\udca9]|\\ud804[\\udc66-\\udc6f\\udcf0-\\udcf9\\udd36-\\udd3f\\uddd0-\\uddd9\\udef0-\\udef9]|\\ud805[\\udcd0-\\udcd9\\ude50-\\ude59\\udec0-\\udec9]|\\ud806[\\udce0-\\udce9]|\\ud81a[\\ude60-\\ude69\\udf50-\\udf59]|\\ud835[\\udfce-\\udfff]/;\n\n twttr.txt.regexen.hashtagSpecialChars = /_\\u200c\\u200d\\ua67e\\u05be\\u05f3\\u05f4\\uff5e\\u301c\\u309b\\u309c\\u30a0\\u30fb\\u3003\\u0f0b\\u0f0c\\xb7/;\n\n // A hashtag must contain at least one unicode letter or mark, as well as numbers, underscores, and select special characters.\n twttr.txt.regexen.hashSigns = /[##]/;\n twttr.txt.regexen.hashtagAlpha = regexSupplant(/(?:[#{bmpLetterAndMarks}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}))/);\n twttr.txt.regexen.hashtagAlphaNumeric = regexSupplant(/(?:[#{bmpLetterAndMarks}#{bmpNumerals}#{hashtagSpecialChars}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}|#{astralNumerals}))/);\n twttr.txt.regexen.endHashtagMatch = regexSupplant(/^(?:#{hashSigns}|:\\/\\/)/);\n twttr.txt.regexen.codePoint = /(?:[^\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/;\n twttr.txt.regexen.hashtagBoundary = regexSupplant(/(?:^|\\uFE0E|\\uFE0F|$|(?!#{hashtagAlphaNumeric}|&)#{codePoint})/);\n twttr.txt.regexen.validHashtag = regexSupplant(/(#{hashtagBoundary})(#{hashSigns})(?!\\uFE0F|\\u20E3)(#{hashtagAlphaNumeric}*#{hashtagAlpha}#{hashtagAlphaNumeric}*)/gi);\n\n // Mention related regex collection\n twttr.txt.regexen.validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@@]|(?:^|[^a-zA-Z0-9_+~.-])(?:rt|RT|rT|Rt):?)/;\n twttr.txt.regexen.atSigns = /[@@]/;\n twttr.txt.regexen.validMentionOrList = regexSupplant(\n '(#{validMentionPrecedingChars})' + // $1: Preceding character\n '(#{atSigns})' + // $2: At mark\n '([a-zA-Z0-9_]{1,20})' + // $3: Screen name\n '(\\/[a-zA-Z][a-zA-Z0-9_\\-]{0,24})?' // $4: List (optional)\n , 'g');\n twttr.txt.regexen.validReply = regexSupplant(/^(?:#{spaces})*#{atSigns}([a-zA-Z0-9_]{1,20})/);\n twttr.txt.regexen.endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\\/\\/)/);\n\n // URL related regex collection\n twttr.txt.regexen.validUrlPrecedingChars = regexSupplant(/(?:[^A-Za-z0-9@@$###{invalid_chars_group}]|^)/);\n twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars = /[-_.\\/]$/;\n twttr.txt.regexen.invalidDomainChars = stringSupplant(\"#{punct}#{spaces_group}#{invalid_chars_group}\", twttr.txt.regexen);\n twttr.txt.regexen.validDomainChars = regexSupplant(/[^#{invalidDomainChars}]/);\n twttr.txt.regexen.validSubdomain = regexSupplant(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n twttr.txt.regexen.validDomainName = regexSupplant(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n twttr.txt.regexen.validGTLD = regexSupplant(RegExp(\n'(?:(?:' +\n '삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|' +\n '政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|' +\n 'ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|' +\n 'بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|' +\n 'zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|' +\n 'yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|' +\n 'wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|' +\n 'website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|' +\n 'wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|' +\n 'vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|' +\n 'vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|' +\n 'university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|' +\n 'travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|' +\n 'toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|' +\n 'tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|' +\n 'tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|' +\n 'swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|' +\n 'stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|' +\n 'stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|' +\n 'softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|' +\n 'showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|' +\n 'sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|' +\n 'science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|' +\n 'sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|' +\n 'saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|' +\n 'rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|' +\n 'repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|' +\n 'realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|' +\n 'protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|' +\n 'pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|' +\n 'pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|' +\n 'pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|' +\n 'pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|' +\n 'onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|' +\n 'obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|' +\n 'nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|' +\n 'net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|' +\n 'msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|' +\n 'monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|' +\n 'miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|' +\n 'mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|' +\n 'makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|' +\n 'lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|' +\n 'limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|' +\n 'lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|' +\n 'lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|' +\n 'komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|' +\n 'kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|' +\n 'jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|' +\n 'investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|' +\n 'industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|' +\n 'hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|' +\n 'honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|' +\n 'hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|' +\n 'hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|' +\n 'gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|' +\n 'globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|' +\n 'garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|' +\n 'ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|' +\n 'football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|' +\n 'fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|' +\n 'ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|' +\n 'extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|' +\n 'estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|' +\n 'email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|' +\n 'download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|' +\n 'direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|' +\n 'delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|' +\n 'cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|' +\n 'coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|' +\n 'construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|' +\n 'college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|' +\n 'cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|' +\n 'chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|' +\n 'catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|' +\n 'capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|' +\n 'bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|' +\n 'bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|' +\n 'boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|' +\n 'black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|' +\n 'beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|' +\n 'barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|' +\n 'autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|' +\n 'art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|' +\n 'amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|' +\n 'alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|' +\n 'afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|' +\n 'academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion' +\n')(?=[^0-9a-zA-Z@]|$))'));\n twttr.txt.regexen.validCCTLD = regexSupplant(RegExp(\n'(?:(?:' +\n '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|' +\n 'ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|' +\n 'بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|' +\n 'zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|' +\n 'tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|' +\n 're|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|' +\n 'mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|' +\n 'ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|' +\n 'gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|' +\n 'do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|' +\n 'bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac' +\n')(?=[^0-9a-zA-Z@]|$))'));\n twttr.txt.regexen.validPunycode = /(?:xn--[0-9a-z]+)/;\n twttr.txt.regexen.validSpecialCCTLD = /(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/;\n twttr.txt.regexen.validDomain = regexSupplant(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/);\n twttr.txt.regexen.validAsciiDomain = regexSupplant(/(?:(?:[\\-a-z0-9#{latinAccentChars}]+)\\.)+(?:#{validGTLD}|#{validCCTLD}|#{validPunycode})/gi);\n twttr.txt.regexen.invalidShortDomain = regexSupplant(/^#{validDomainName}#{validCCTLD}$/i);\n twttr.txt.regexen.validSpecialShortDomain = regexSupplant(/^#{validDomainName}#{validSpecialCCTLD}$/i);\n twttr.txt.regexen.validPortNumber = /[0-9]+/;\n twttr.txt.regexen.cyrillicLettersAndMarks = /\\u0400-\\u04FF/;\n twttr.txt.regexen.validGeneralUrlPathChars = regexSupplant(/[a-z#{cyrillicLettersAndMarks}0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-_~@\\|&#{latinAccentChars}]/i);\n // Allow URL paths to contain up to two nested levels of balanced parens\n // 1. Used in Wikipedia URLs like /Primer_(film)\n // 2. Used in IIS sessions like /S(dfd346)/\n // 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/\n twttr.txt.regexen.validUrlBalancedParens = regexSupplant(\n '\\\\(' +\n '(?:' +\n '#{validGeneralUrlPathChars}+' +\n '|' +\n // allow one nested level of balanced parentheses\n '(?:' +\n '#{validGeneralUrlPathChars}*' +\n '\\\\(' +\n '#{validGeneralUrlPathChars}+' +\n '\\\\)' +\n '#{validGeneralUrlPathChars}*' +\n ')' +\n ')' +\n '\\\\)'\n , 'i');\n // Valid end-of-path chracters (so /foo. does not gobble the period).\n // 1. Allow =&# for empty URL parameters and other URL-join artifacts\n twttr.txt.regexen.validUrlPathEndingChars = regexSupplant(/[\\+\\-a-z#{cyrillicLettersAndMarks}0-9=_#\\/#{latinAccentChars}]|(?:#{validUrlBalancedParens})/i);\n // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/\n twttr.txt.regexen.validUrlPath = regexSupplant('(?:' +\n '(?:' +\n '#{validGeneralUrlPathChars}*' +\n '(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*' +\n '#{validUrlPathEndingChars}'+\n ')|(?:@#{validGeneralUrlPathChars}+\\/)'+\n ')', 'i');\n\n twttr.txt.regexen.validUrlQueryChars = /[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]/i;\n twttr.txt.regexen.validUrlQueryEndingChars = /[a-z0-9_&=#\\/]/i;\n twttr.txt.regexen.extractUrl = regexSupplant(\n '(' + // $1 total match\n '(#{validUrlPrecedingChars})' + // $2 Preceeding chracter\n '(' + // $3 URL\n '(https?:\\\\/\\\\/)?' + // $4 Protocol (optional)\n '(#{validDomain})' + // $5 Domain(s)\n '(?::(#{validPortNumber}))?' + // $6 Port number (optional)\n '(\\\\/#{validUrlPath}*)?' + // $7 URL Path\n '(\\\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?' + // $8 Query String\n ')' +\n ')'\n , 'gi');\n\n twttr.txt.regexen.validTcoUrl = /^https?:\\/\\/t\\.co\\/[a-z0-9]+/i;\n twttr.txt.regexen.urlHasProtocol = /^https?:\\/\\//i;\n twttr.txt.regexen.urlHasHttps = /^https:\\/\\//i;\n\n // cashtag related regex\n twttr.txt.regexen.cashtag = /[a-z]{1,6}(?:[._][a-z]{1,2})?/i;\n twttr.txt.regexen.validCashtag = regexSupplant('(^|#{spaces})(\\\\$)(#{cashtag})(?=$|\\\\s|[#{punct}])', 'gi');\n\n // These URL validation pattern strings are based on the ABNF from RFC 3986\n twttr.txt.regexen.validateUrlUnreserved = /[a-z\\u0400-\\u04FF0-9\\-._~]/i;\n twttr.txt.regexen.validateUrlPctEncoded = /(?:%[0-9a-f]{2})/i;\n twttr.txt.regexen.validateUrlSubDelims = /[!$&'()*+,;=]/i;\n twttr.txt.regexen.validateUrlPchar = regexSupplant('(?:' +\n '#{validateUrlUnreserved}|' +\n '#{validateUrlPctEncoded}|' +\n '#{validateUrlSubDelims}|' +\n '[:|@]' +\n ')', 'i');\n\n twttr.txt.regexen.validateUrlScheme = /(?:[a-z][a-z0-9+\\-.]*)/i;\n twttr.txt.regexen.validateUrlUserinfo = regexSupplant('(?:' +\n '#{validateUrlUnreserved}|' +\n '#{validateUrlPctEncoded}|' +\n '#{validateUrlSubDelims}|' +\n ':' +\n ')*', 'i');\n\n twttr.txt.regexen.validateUrlDecOctet = /(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9]{2})|(?:2[0-4][0-9])|(?:25[0-5]))/i;\n twttr.txt.regexen.validateUrlIpv4 = regexSupplant(/(?:#{validateUrlDecOctet}(?:\\.#{validateUrlDecOctet}){3})/i);\n\n // Punting on real IPv6 validation for now\n twttr.txt.regexen.validateUrlIpv6 = /(?:\\[[a-f0-9:\\.]+\\])/i;\n\n // Also punting on IPvFuture for now\n twttr.txt.regexen.validateUrlIp = regexSupplant('(?:' +\n '#{validateUrlIpv4}|' +\n '#{validateUrlIpv6}' +\n ')', 'i');\n\n // This is more strict than the rfc specifies\n twttr.txt.regexen.validateUrlSubDomainSegment = /(?:[a-z0-9](?:[a-z0-9_\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomainSegment = /(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomainTld = /(?:[a-z](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomain = regexSupplant(/(?:(?:#{validateUrlSubDomainSegment}\\.)*(?:#{validateUrlDomainSegment}\\.)#{validateUrlDomainTld})/i);\n\n twttr.txt.regexen.validateUrlHost = regexSupplant('(?:' +\n '#{validateUrlIp}|' +\n '#{validateUrlDomain}' +\n ')', 'i');\n\n // Unencoded internationalized domains - this doesn't check for invalid UTF-8 sequences\n twttr.txt.regexen.validateUrlUnicodeSubDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9_\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomainTld = /(?:(?:[a-z]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomain = regexSupplant(/(?:(?:#{validateUrlUnicodeSubDomainSegment}\\.)*(?:#{validateUrlUnicodeDomainSegment}\\.)#{validateUrlUnicodeDomainTld})/i);\n\n twttr.txt.regexen.validateUrlUnicodeHost = regexSupplant('(?:' +\n '#{validateUrlIp}|' +\n '#{validateUrlUnicodeDomain}' +\n ')', 'i');\n\n twttr.txt.regexen.validateUrlPort = /[0-9]{1,5}/;\n\n twttr.txt.regexen.validateUrlUnicodeAuthority = regexSupplant(\n '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n '(#{validateUrlUnicodeHost})' + // $2 host\n '(?::(#{validateUrlPort}))?' //$3 port\n , \"i\");\n\n twttr.txt.regexen.validateUrlAuthority = regexSupplant(\n '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n '(#{validateUrlHost})' + // $2 host\n '(?::(#{validateUrlPort}))?' // $3 port\n , \"i\");\n\n twttr.txt.regexen.validateUrlPath = regexSupplant(/(\\/#{validateUrlPchar}*)*/i);\n twttr.txt.regexen.validateUrlQuery = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n twttr.txt.regexen.validateUrlFragment = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\n // Modified version of RFC 3986 Appendix B\n twttr.txt.regexen.validateUrlUnencoded = regexSupplant(\n '^' + // Full URL\n '(?:' +\n '([^:/?#]+):\\\\/\\\\/' + // $1 Scheme\n ')?' +\n '([^/?#]*)' + // $2 Authority\n '([^?#]*)' + // $3 Path\n '(?:' +\n '\\\\?([^#]*)' + // $4 Query\n ')?' +\n '(?:' +\n '#(.*)' + // $5 Fragment\n ')?$'\n , \"i\");\n\n\n // Default CSS class for auto-linked lists (along with the url class)\n var DEFAULT_LIST_CLASS = \"tweet-url list-slug\";\n // Default CSS class for auto-linked usernames (along with the url class)\n var DEFAULT_USERNAME_CLASS = \"tweet-url username\";\n // Default CSS class for auto-linked hashtags (along with the url class)\n var DEFAULT_HASHTAG_CLASS = \"tweet-url hashtag\";\n // Default CSS class for auto-linked cashtags (along with the url class)\n var DEFAULT_CASHTAG_CLASS = \"tweet-url cashtag\";\n // Options which should not be passed as HTML attributes\n var OPTIONS_NOT_ATTRIBUTES = {'urlClass':true, 'listClass':true, 'usernameClass':true, 'hashtagClass':true, 'cashtagClass':true,\n 'usernameUrlBase':true, 'listUrlBase':true, 'hashtagUrlBase':true, 'cashtagUrlBase':true,\n 'usernameUrlBlock':true, 'listUrlBlock':true, 'hashtagUrlBlock':true, 'linkUrlBlock':true,\n 'usernameIncludeSymbol':true, 'suppressLists':true, 'suppressNoFollow':true, 'targetBlank':true,\n 'suppressDataScreenName':true, 'urlEntities':true, 'symbolTag':true, 'textWithSymbolTag':true, 'urlTarget':true,\n 'invisibleTagAttrs':true, 'linkAttributeBlock':true, 'linkTextBlock': true, 'htmlEscapeNonEntities': true\n };\n\n var BOOLEAN_ATTRIBUTES = {'disabled':true, 'readonly':true, 'multiple':true, 'checked':true};\n\n // Simple object cloning function for simple objects\n function clone(o) {\n var r = {};\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n r[k] = o[k];\n }\n }\n\n return r;\n }\n\n twttr.txt.tagAttrs = function(attributes) {\n var htmlAttrs = \"\";\n for (var k in attributes) {\n var v = attributes[k];\n if (BOOLEAN_ATTRIBUTES[k]) {\n v = v ? k : null;\n }\n if (v == null) continue;\n htmlAttrs += \" \" + twttr.txt.htmlEscape(k) + \"=\\\"\" + twttr.txt.htmlEscape(v.toString()) + \"\\\"\";\n }\n return htmlAttrs;\n };\n\n twttr.txt.linkToText = function(entity, text, attributes, options) {\n if (!options.suppressNoFollow) {\n attributes.rel = \"nofollow\";\n }\n // if linkAttributeBlock is specified, call it to modify the attributes\n if (options.linkAttributeBlock) {\n options.linkAttributeBlock(entity, attributes);\n }\n // if linkTextBlock is specified, call it to get a new/modified link text\n if (options.linkTextBlock) {\n text = options.linkTextBlock(entity, text);\n }\n var d = {\n text: text,\n attr: twttr.txt.tagAttrs(attributes)\n };\n return stringSupplant(\"<a#{attr}>#{text}</a>\", d);\n };\n\n twttr.txt.linkToTextWithSymbol = function(entity, symbol, text, attributes, options) {\n var taggedSymbol = options.symbolTag ? \"<\" + options.symbolTag + \">\" + symbol + \"</\"+ options.symbolTag + \">\" : symbol;\n text = twttr.txt.htmlEscape(text);\n var taggedText = options.textWithSymbolTag ? \"<\" + options.textWithSymbolTag + \">\" + text + \"</\"+ options.textWithSymbolTag + \">\" : text;\n\n if (options.usernameIncludeSymbol || !symbol.match(twttr.txt.regexen.atSigns)) {\n return twttr.txt.linkToText(entity, taggedSymbol + taggedText, attributes, options);\n } else {\n return taggedSymbol + twttr.txt.linkToText(entity, taggedText, attributes, options);\n }\n };\n\n twttr.txt.linkToHashtag = function(entity, text, options) {\n var hash = text.substring(entity.indices[0], entity.indices[0] + 1);\n var hashtag = twttr.txt.htmlEscape(entity.hashtag);\n var attrs = clone(options.htmlAttrs || {});\n attrs.href = options.hashtagUrlBase + hashtag;\n attrs.title = \"#\" + hashtag;\n attrs[\"class\"] = options.hashtagClass;\n if (hashtag.charAt(0).match(twttr.txt.regexen.rtl_chars)){\n attrs[\"class\"] += \" rtl\";\n }\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, hash, hashtag, attrs, options);\n };\n\n twttr.txt.linkToCashtag = function(entity, text, options) {\n var cashtag = twttr.txt.htmlEscape(entity.cashtag);\n var attrs = clone(options.htmlAttrs || {});\n attrs.href = options.cashtagUrlBase + cashtag;\n attrs.title = \"$\" + cashtag;\n attrs[\"class\"] = options.cashtagClass;\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, \"$\", cashtag, attrs, options);\n };\n\n twttr.txt.linkToMentionAndList = function(entity, text, options) {\n var at = text.substring(entity.indices[0], entity.indices[0] + 1);\n var user = twttr.txt.htmlEscape(entity.screenName);\n var slashListname = twttr.txt.htmlEscape(entity.listSlug);\n var isList = entity.listSlug && !options.suppressLists;\n var attrs = clone(options.htmlAttrs || {});\n attrs[\"class\"] = (isList ? options.listClass : options.usernameClass);\n attrs.href = isList ? options.listUrlBase + user + slashListname : options.usernameUrlBase + user;\n if (!isList && !options.suppressDataScreenName) {\n attrs['data-screen-name'] = user;\n }\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, at, isList ? user + slashListname : user, attrs, options);\n };\n\n twttr.txt.linkToUrl = function(entity, text, options) {\n var url = entity.url;\n var displayUrl = url;\n var linkText = twttr.txt.htmlEscape(displayUrl);\n\n // If the caller passed a urlEntities object (provided by a Twitter API\n // response with include_entities=true), we use that to render the display_url\n // for each URL instead of it's underlying t.co URL.\n var urlEntity = (options.urlEntities && options.urlEntities[url]) || entity;\n if (urlEntity.display_url) {\n linkText = twttr.txt.linkTextWithEntity(urlEntity, options);\n }\n\n var attrs = clone(options.htmlAttrs || {});\n\n if (!url.match(twttr.txt.regexen.urlHasProtocol)) {\n url = \"http://\" + url;\n }\n attrs.href = url;\n\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n // set class only if urlClass is specified.\n if (options.urlClass) {\n attrs[\"class\"] = options.urlClass;\n }\n\n // set target only if urlTarget is specified.\n if (options.urlTarget) {\n attrs.target = options.urlTarget;\n }\n\n if (!options.title && urlEntity.display_url) {\n attrs.title = urlEntity.expanded_url;\n }\n\n return twttr.txt.linkToText(entity, linkText, attrs, options);\n };\n\n twttr.txt.linkTextWithEntity = function (entity, options) {\n var displayUrl = entity.display_url;\n var expandedUrl = entity.expanded_url;\n\n // Goal: If a user copies and pastes a tweet containing t.co'ed link, the resulting paste\n // should contain the full original URL (expanded_url), not the display URL.\n //\n // Method: Whenever possible, we actually emit HTML that contains expanded_url, and use\n // font-size:0 to hide those parts that should not be displayed (because they are not part of display_url).\n // Elements with font-size:0 get copied even though they are not visible.\n // Note that display:none doesn't work here. Elements with display:none don't get copied.\n //\n // Additionally, we want to *display* ellipses, but we don't want them copied. To make this happen we\n // wrap the ellipses in a tco-ellipsis class and provide an onCopy handler that sets display:none on\n // everything with the tco-ellipsis class.\n //\n // Exception: pic.twitter.com images, for which expandedUrl = \"https://twitter.com/#!/username/status/1234/photo/1\n // For those URLs, display_url is not a substring of expanded_url, so we don't do anything special to render the elided parts.\n // For a pic.twitter.com URL, the only elided part will be the \"https://\", so this is fine.\n\n var displayUrlSansEllipses = displayUrl.replace(/…/g, \"\"); // We have to disregard ellipses for matching\n // Note: we currently only support eliding parts of the URL at the beginning or the end.\n // Eventually we may want to elide parts of the URL in the *middle*. If so, this code will\n // become more complicated. We will probably want to create a regexp out of display URL,\n // replacing every ellipsis with a \".*\".\n if (expandedUrl.indexOf(displayUrlSansEllipses) != -1) {\n var displayUrlIndex = expandedUrl.indexOf(displayUrlSansEllipses);\n var v = {\n displayUrlSansEllipses: displayUrlSansEllipses,\n // Portion of expandedUrl that precedes the displayUrl substring\n beforeDisplayUrl: expandedUrl.substr(0, displayUrlIndex),\n // Portion of expandedUrl that comes after displayUrl\n afterDisplayUrl: expandedUrl.substr(displayUrlIndex + displayUrlSansEllipses.length),\n precedingEllipsis: displayUrl.match(/^…/) ? \"…\" : \"\",\n followingEllipsis: displayUrl.match(/…$/) ? \"…\" : \"\"\n };\n for (var k in v) {\n if (v.hasOwnProperty(k)) {\n v[k] = twttr.txt.htmlEscape(v[k]);\n }\n }\n // As an example: The user tweets \"hi http://longdomainname.com/foo\"\n // This gets shortened to \"hi http://t.co/xyzabc\", with display_url = \"…nname.com/foo\"\n // This will get rendered as:\n // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n // …\n // <!-- There's a chance the onCopy event handler might not fire. In case that happens,\n // we include an here so that the … doesn't bump up against the URL and ruin it.\n // The is inside the tco-ellipsis span so that when the onCopy handler *does*\n // fire, it doesn't get copied. Otherwise the copied text would have two spaces in a row,\n // e.g. \"hi http://longdomainname.com/foo\".\n // <span style='font-size:0'> </span>\n // </span>\n // <span style='font-size:0'> <!-- This stuff should get copied but not displayed -->\n // http://longdomai\n // </span>\n // <span class='js-display-url'> <!-- This stuff should get displayed *and* copied -->\n // nname.com/foo\n // </span>\n // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n // <span style='font-size:0'> </span>\n // …\n // </span>\n v['invisible'] = options.invisibleTagAttrs;\n return stringSupplant(\"<span class='tco-ellipsis'>#{precedingEllipsis}<span #{invisible}> </span></span><span #{invisible}>#{beforeDisplayUrl}</span><span class='js-display-url'>#{displayUrlSansEllipses}</span><span #{invisible}>#{afterDisplayUrl}</span><span class='tco-ellipsis'><span #{invisible}> </span>#{followingEllipsis}</span>\", v);\n }\n return displayUrl;\n };\n\n twttr.txt.autoLinkEntities = function(text, entities, options) {\n options = clone(options || {});\n\n options.hashtagClass = options.hashtagClass || DEFAULT_HASHTAG_CLASS;\n options.hashtagUrlBase = options.hashtagUrlBase || \"https://twitter.com/#!/search?q=%23\";\n options.cashtagClass = options.cashtagClass || DEFAULT_CASHTAG_CLASS;\n options.cashtagUrlBase = options.cashtagUrlBase || \"https://twitter.com/#!/search?q=%24\";\n options.listClass = options.listClass || DEFAULT_LIST_CLASS;\n options.usernameClass = options.usernameClass || DEFAULT_USERNAME_CLASS;\n options.usernameUrlBase = options.usernameUrlBase || \"https://twitter.com/\";\n options.listUrlBase = options.listUrlBase || \"https://twitter.com/\";\n options.htmlAttrs = twttr.txt.extractHtmlAttrsFromOptions(options);\n options.invisibleTagAttrs = options.invisibleTagAttrs || \"style='position:absolute;left:-9999px;'\";\n\n // remap url entities to hash\n var urlEntities, i, len;\n if(options.urlEntities) {\n urlEntities = {};\n for(i = 0, len = options.urlEntities.length; i < len; i++) {\n urlEntities[options.urlEntities[i].url] = options.urlEntities[i];\n }\n options.urlEntities = urlEntities;\n }\n\n var result = \"\";\n var beginIndex = 0;\n\n // sort entities by start index\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\n var nonEntity = options.htmlEscapeNonEntities ? twttr.txt.htmlEscape : function(text) {\n return text;\n };\n\n for (var i = 0; i < entities.length; i++) {\n var entity = entities[i];\n result += nonEntity(text.substring(beginIndex, entity.indices[0]));\n\n if (entity.url) {\n result += twttr.txt.linkToUrl(entity, text, options);\n } else if (entity.hashtag) {\n result += twttr.txt.linkToHashtag(entity, text, options);\n } else if (entity.screenName) {\n result += twttr.txt.linkToMentionAndList(entity, text, options);\n } else if (entity.cashtag) {\n result += twttr.txt.linkToCashtag(entity, text, options);\n }\n beginIndex = entity.indices[1];\n }\n result += nonEntity(text.substring(beginIndex, text.length));\n return result;\n };\n\n twttr.txt.autoLinkWithJSON = function(text, json, options) {\n // map JSON entity to twitter-text entity\n if (json.user_mentions) {\n for (var i = 0; i < json.user_mentions.length; i++) {\n // this is a @mention\n json.user_mentions[i].screenName = json.user_mentions[i].screen_name;\n }\n }\n\n if (json.hashtags) {\n for (var i = 0; i < json.hashtags.length; i++) {\n // this is a #hashtag\n json.hashtags[i].hashtag = json.hashtags[i].text;\n }\n }\n\n if (json.symbols) {\n for (var i = 0; i < json.symbols.length; i++) {\n // this is a $CASH tag\n json.symbols[i].cashtag = json.symbols[i].text;\n }\n }\n\n // concatenate all entities\n var entities = [];\n for (var key in json) {\n entities = entities.concat(json[key]);\n }\n\n // modify indices to UTF-16\n twttr.txt.modifyIndicesFromUnicodeToUTF16(text, entities);\n\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.extractHtmlAttrsFromOptions = function(options) {\n var htmlAttrs = {};\n for (var k in options) {\n var v = options[k];\n if (OPTIONS_NOT_ATTRIBUTES[k]) continue;\n if (BOOLEAN_ATTRIBUTES[k]) {\n v = v ? k : null;\n }\n if (v == null) continue;\n htmlAttrs[k] = v;\n }\n return htmlAttrs;\n };\n\n twttr.txt.autoLink = function(text, options) {\n var entities = twttr.txt.extractEntitiesWithIndices(text, {extractUrlsWithoutProtocol: false});\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkUsernamesOrLists = function(text, options) {\n var entities = twttr.txt.extractMentionsOrListsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkHashtags = function(text, options) {\n var entities = twttr.txt.extractHashtagsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkCashtags = function(text, options) {\n var entities = twttr.txt.extractCashtagsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkUrlsCustom = function(text, options) {\n var entities = twttr.txt.extractUrlsWithIndices(text, {extractUrlsWithoutProtocol: false});\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.removeOverlappingEntities = function(entities) {\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\n var prev = entities[0];\n for (var i = 1; i < entities.length; i++) {\n if (prev.indices[1] > entities[i].indices[0]) {\n entities.splice(i, 1);\n i--;\n } else {\n prev = entities[i];\n }\n }\n };\n\n twttr.txt.extractEntitiesWithIndices = function(text, options) {\n var entities = twttr.txt.extractUrlsWithIndices(text, options)\n .concat(twttr.txt.extractMentionsOrListsWithIndices(text))\n .concat(twttr.txt.extractHashtagsWithIndices(text, {checkUrlOverlap: false}))\n .concat(twttr.txt.extractCashtagsWithIndices(text));\n\n if (entities.length == 0) {\n return [];\n }\n\n twttr.txt.removeOverlappingEntities(entities);\n return entities;\n };\n\n twttr.txt.extractMentions = function(text) {\n var screenNamesOnly = [],\n screenNamesWithIndices = twttr.txt.extractMentionsWithIndices(text);\n\n for (var i = 0; i < screenNamesWithIndices.length; i++) {\n var screenName = screenNamesWithIndices[i].screenName;\n screenNamesOnly.push(screenName);\n }\n\n return screenNamesOnly;\n };\n\n twttr.txt.extractMentionsWithIndices = function(text) {\n var mentions = [],\n mentionOrList,\n mentionsOrLists = twttr.txt.extractMentionsOrListsWithIndices(text);\n\n for (var i = 0 ; i < mentionsOrLists.length; i++) {\n mentionOrList = mentionsOrLists[i];\n if (mentionOrList.listSlug == '') {\n mentions.push({\n screenName: mentionOrList.screenName,\n indices: mentionOrList.indices\n });\n }\n }\n\n return mentions;\n };\n\n /**\n * Extract list or user mentions.\n * (Presence of listSlug indicates a list)\n */\n twttr.txt.extractMentionsOrListsWithIndices = function(text) {\n if (!text || !text.match(twttr.txt.regexen.atSigns)) {\n return [];\n }\n\n var possibleNames = [],\n slashListname;\n\n text.replace(twttr.txt.regexen.validMentionOrList, function(match, before, atSign, screenName, slashListname, offset, chunk) {\n var after = chunk.slice(offset + match.length);\n if (!after.match(twttr.txt.regexen.endMentionMatch)) {\n slashListname = slashListname || '';\n var startPosition = offset + before.length;\n var endPosition = startPosition + screenName.length + slashListname.length + 1;\n possibleNames.push({\n screenName: screenName,\n listSlug: slashListname,\n indices: [startPosition, endPosition]\n });\n }\n });\n\n return possibleNames;\n };\n\n\n twttr.txt.extractReplies = function(text) {\n if (!text) {\n return null;\n }\n\n var possibleScreenName = text.match(twttr.txt.regexen.validReply);\n if (!possibleScreenName ||\n RegExp.rightContext.match(twttr.txt.regexen.endMentionMatch)) {\n return null;\n }\n\n return possibleScreenName[1];\n };\n\n twttr.txt.extractUrls = function(text, options) {\n var urlsOnly = [],\n urlsWithIndices = twttr.txt.extractUrlsWithIndices(text, options);\n\n for (var i = 0; i < urlsWithIndices.length; i++) {\n urlsOnly.push(urlsWithIndices[i].url);\n }\n\n return urlsOnly;\n };\n\n twttr.txt.extractUrlsWithIndices = function(text, options) {\n if (!options) {\n options = {extractUrlsWithoutProtocol: true};\n }\n if (!text || (options.extractUrlsWithoutProtocol ? !text.match(/\\./) : !text.match(/:/))) {\n return [];\n }\n\n var urls = [];\n\n while (twttr.txt.regexen.extractUrl.exec(text)) {\n var before = RegExp.$2, url = RegExp.$3, protocol = RegExp.$4, domain = RegExp.$5, path = RegExp.$7;\n var endPosition = twttr.txt.regexen.extractUrl.lastIndex,\n startPosition = endPosition - url.length;\n\n // if protocol is missing and domain contains non-ASCII characters,\n // extract ASCII-only domains.\n if (!protocol) {\n if (!options.extractUrlsWithoutProtocol\n || before.match(twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars)) {\n continue;\n }\n var lastUrl = null,\n asciiEndPosition = 0;\n domain.replace(twttr.txt.regexen.validAsciiDomain, function(asciiDomain) {\n var asciiStartPosition = domain.indexOf(asciiDomain, asciiEndPosition);\n asciiEndPosition = asciiStartPosition + asciiDomain.length;\n lastUrl = {\n url: asciiDomain,\n indices: [startPosition + asciiStartPosition, startPosition + asciiEndPosition]\n };\n if (path\n || asciiDomain.match(twttr.txt.regexen.validSpecialShortDomain)\n || !asciiDomain.match(twttr.txt.regexen.invalidShortDomain)) {\n urls.push(lastUrl);\n }\n });\n\n // no ASCII-only domain found. Skip the entire URL.\n if (lastUrl == null) {\n continue;\n }\n\n // lastUrl only contains domain. Need to add path and query if they exist.\n if (path) {\n lastUrl.url = url.replace(domain, lastUrl.url);\n lastUrl.indices[1] = endPosition;\n }\n } else {\n // In the case of t.co URLs, don't allow additional path characters.\n if (url.match(twttr.txt.regexen.validTcoUrl)) {\n url = RegExp.lastMatch;\n endPosition = startPosition + url.length;\n }\n urls.push({\n url: url,\n indices: [startPosition, endPosition]\n });\n }\n }\n\n return urls;\n };\n\n twttr.txt.extractHashtags = function(text) {\n var hashtagsOnly = [],\n hashtagsWithIndices = twttr.txt.extractHashtagsWithIndices(text);\n\n for (var i = 0; i < hashtagsWithIndices.length; i++) {\n hashtagsOnly.push(hashtagsWithIndices[i].hashtag);\n }\n\n return hashtagsOnly;\n };\n\n twttr.txt.extractHashtagsWithIndices = function(text, options) {\n if (!options) {\n options = {checkUrlOverlap: true};\n }\n\n if (!text || !text.match(twttr.txt.regexen.hashSigns)) {\n return [];\n }\n\n var tags = [];\n\n text.replace(twttr.txt.regexen.validHashtag, function(match, before, hash, hashText, offset, chunk) {\n var after = chunk.slice(offset + match.length);\n if (after.match(twttr.txt.regexen.endHashtagMatch))\n return;\n var startPosition = offset + before.length;\n var endPosition = startPosition + hashText.length + 1;\n tags.push({\n hashtag: hashText,\n indices: [startPosition, endPosition]\n });\n });\n\n if (options.checkUrlOverlap) {\n // also extract URL entities\n var urls = twttr.txt.extractUrlsWithIndices(text);\n if (urls.length > 0) {\n var entities = tags.concat(urls);\n // remove overlap\n twttr.txt.removeOverlappingEntities(entities);\n // only push back hashtags\n tags = [];\n for (var i = 0; i < entities.length; i++) {\n if (entities[i].hashtag) {\n tags.push(entities[i]);\n }\n }\n }\n }\n\n return tags;\n };\n\n twttr.txt.extractCashtags = function(text) {\n var cashtagsOnly = [],\n cashtagsWithIndices = twttr.txt.extractCashtagsWithIndices(text);\n\n for (var i = 0; i < cashtagsWithIndices.length; i++) {\n cashtagsOnly.push(cashtagsWithIndices[i].cashtag);\n }\n\n return cashtagsOnly;\n };\n\n twttr.txt.extractCashtagsWithIndices = function(text) {\n if (!text || text.indexOf(\"$\") == -1) {\n return [];\n }\n\n var tags = [];\n\n text.replace(twttr.txt.regexen.validCashtag, function(match, before, dollar, cashtag, offset, chunk) {\n var startPosition = offset + before.length;\n var endPosition = startPosition + cashtag.length + 1;\n tags.push({\n cashtag: cashtag,\n indices: [startPosition, endPosition]\n });\n });\n\n return tags;\n };\n\n twttr.txt.modifyIndicesFromUnicodeToUTF16 = function(text, entities) {\n twttr.txt.convertUnicodeIndices(text, entities, false);\n };\n\n twttr.txt.modifyIndicesFromUTF16ToUnicode = function(text, entities) {\n twttr.txt.convertUnicodeIndices(text, entities, true);\n };\n\n twttr.txt.getUnicodeTextLength = function(text) {\n return text.replace(twttr.txt.regexen.non_bmp_code_pairs, ' ').length;\n };\n\n twttr.txt.convertUnicodeIndices = function(text, entities, indicesInUTF16) {\n if (entities.length == 0) {\n return;\n }\n\n var charIndex = 0;\n var codePointIndex = 0;\n\n // sort entities by start index\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n var entityIndex = 0;\n var entity = entities[0];\n\n while (charIndex < text.length) {\n if (entity.indices[0] == (indicesInUTF16 ? charIndex : codePointIndex)) {\n var len = entity.indices[1] - entity.indices[0];\n entity.indices[0] = indicesInUTF16 ? codePointIndex : charIndex;\n entity.indices[1] = entity.indices[0] + len;\n\n entityIndex++;\n if (entityIndex == entities.length) {\n // no more entity\n break;\n }\n entity = entities[entityIndex];\n }\n\n var c = text.charCodeAt(charIndex);\n if (0xD800 <= c && c <= 0xDBFF && charIndex < text.length - 1) {\n // Found high surrogate char\n c = text.charCodeAt(charIndex + 1);\n if (0xDC00 <= c && c <= 0xDFFF) {\n // Found surrogate pair\n charIndex++;\n }\n }\n codePointIndex++;\n charIndex++;\n }\n };\n\n // this essentially does text.split(/<|>/)\n // except that won't work in IE, where empty strings are ommitted\n // so \"<>\".split(/<|>/) => [] in IE, but is [\"\", \"\", \"\"] in all others\n // but \"<<\".split(\"<\") => [\"\", \"\", \"\"]\n twttr.txt.splitTags = function(text) {\n var firstSplits = text.split(\"<\"),\n secondSplits,\n allSplits = [],\n split;\n\n for (var i = 0; i < firstSplits.length; i += 1) {\n split = firstSplits[i];\n if (!split) {\n allSplits.push(\"\");\n } else {\n secondSplits = split.split(\">\");\n for (var j = 0; j < secondSplits.length; j += 1) {\n allSplits.push(secondSplits[j]);\n }\n }\n }\n\n return allSplits;\n };\n\n twttr.txt.hitHighlight = function(text, hits, options) {\n var defaultHighlightTag = \"em\";\n\n hits = hits || [];\n options = options || {};\n\n if (hits.length === 0) {\n return text;\n }\n\n var tagName = options.tag || defaultHighlightTag,\n tags = [\"<\" + tagName + \">\", \"</\" + tagName + \">\"],\n chunks = twttr.txt.splitTags(text),\n i,\n j,\n result = \"\",\n chunkIndex = 0,\n chunk = chunks[0],\n prevChunksLen = 0,\n chunkCursor = 0,\n startInChunk = false,\n chunkChars = chunk,\n flatHits = [],\n index,\n hit,\n tag,\n placed,\n hitSpot;\n\n for (i = 0; i < hits.length; i += 1) {\n for (j = 0; j < hits[i].length; j += 1) {\n flatHits.push(hits[i][j]);\n }\n }\n\n for (index = 0; index < flatHits.length; index += 1) {\n hit = flatHits[index];\n tag = tags[index % 2];\n placed = false;\n\n while (chunk != null && hit >= prevChunksLen + chunk.length) {\n result += chunkChars.slice(chunkCursor);\n if (startInChunk && hit === prevChunksLen + chunkChars.length) {\n result += tag;\n placed = true;\n }\n\n if (chunks[chunkIndex + 1]) {\n result += \"<\" + chunks[chunkIndex + 1] + \">\";\n }\n\n prevChunksLen += chunkChars.length;\n chunkCursor = 0;\n chunkIndex += 2;\n chunk = chunks[chunkIndex];\n chunkChars = chunk;\n startInChunk = false;\n }\n\n if (!placed && chunk != null) {\n hitSpot = hit - prevChunksLen;\n result += chunkChars.slice(chunkCursor, hitSpot) + tag;\n chunkCursor = hitSpot;\n if (index % 2 === 0) {\n startInChunk = true;\n } else {\n startInChunk = false;\n }\n } else if(!placed) {\n placed = true;\n result += tag;\n }\n }\n\n if (chunk != null) {\n if (chunkCursor < chunkChars.length) {\n result += chunkChars.slice(chunkCursor);\n }\n for (index = chunkIndex + 1; index < chunks.length; index += 1) {\n result += (index % 2 === 0 ? chunks[index] : \"<\" + chunks[index] + \">\");\n }\n }\n\n return result;\n };\n\n var MAX_LENGTH = 140;\n\n // Returns the length of Tweet text with consideration to t.co URL replacement\n // and chars outside the basic multilingual plane that use 2 UTF16 code points\n twttr.txt.getTweetLength = function(text, options) {\n if (!options) {\n options = {\n // These come from https://api.twitter.com/1.1/help/configuration.json\n // described by https://dev.twitter.com/rest/reference/get/help/configuration\n short_url_length: 23,\n short_url_length_https: 23\n };\n }\n var textLength = twttr.txt.getUnicodeTextLength(text),\n urlsWithIndices = twttr.txt.extractUrlsWithIndices(text);\n twttr.txt.modifyIndicesFromUTF16ToUnicode(text, urlsWithIndices);\n\n for (var i = 0; i < urlsWithIndices.length; i++) {\n // Subtract the length of the original URL\n textLength += urlsWithIndices[i].indices[0] - urlsWithIndices[i].indices[1];\n\n // Add 23 characters for URL starting with https://\n // http:// URLs still use https://t.co so they are 23 characters as well\n if (urlsWithIndices[i].url.toLowerCase().match(twttr.txt.regexen.urlHasHttps)) {\n textLength += options.short_url_length_https;\n } else {\n textLength += options.short_url_length;\n }\n }\n\n return textLength;\n };\n\n // Check the text for any reason that it may not be valid as a Tweet. This is meant as a pre-validation\n // before posting to api.twitter.com. There are several server-side reasons for Tweets to fail but this pre-validation\n // will allow quicker feedback.\n //\n // Returns false if this text is valid. Otherwise one of the following strings will be returned:\n //\n // \"too_long\": if the text is too long\n // \"empty\": if the text is nil or empty\n // \"invalid_characters\": if the text contains non-Unicode or any of the disallowed Unicode characters\n twttr.txt.isInvalidTweet = function(text) {\n if (!text) {\n return \"empty\";\n }\n\n // Determine max length independent of URL length\n if (twttr.txt.getTweetLength(text) > MAX_LENGTH) {\n return \"too_long\";\n }\n\n if (twttr.txt.hasInvalidCharacters(text)) {\n return \"invalid_characters\";\n }\n\n return false;\n };\n\n twttr.txt.hasInvalidCharacters = function(text) {\n return twttr.txt.regexen.invalid_chars.test(text);\n };\n\n twttr.txt.isValidTweetText = function(text) {\n return !twttr.txt.isInvalidTweet(text);\n };\n\n twttr.txt.isValidUsername = function(username) {\n if (!username) {\n return false;\n }\n\n var extracted = twttr.txt.extractMentions(username);\n\n // Should extract the username minus the @ sign, hence the .slice(1)\n return extracted.length === 1 && extracted[0] === username.slice(1);\n };\n\n var VALID_LIST_RE = regexSupplant(/^#{validMentionOrList}$/);\n\n twttr.txt.isValidList = function(usernameList) {\n var match = usernameList.match(VALID_LIST_RE);\n\n // Must have matched and had nothing before or after\n return !!(match && match[1] == \"\" && match[4]);\n };\n\n twttr.txt.isValidHashtag = function(hashtag) {\n if (!hashtag) {\n return false;\n }\n\n var extracted = twttr.txt.extractHashtags(hashtag);\n\n // Should extract the hashtag minus the # sign, hence the .slice(1)\n return extracted.length === 1 && extracted[0] === hashtag.slice(1);\n };\n\n twttr.txt.isValidUrl = function(url, unicodeDomains, requireProtocol) {\n if (unicodeDomains == null) {\n unicodeDomains = true;\n }\n\n if (requireProtocol == null) {\n requireProtocol = true;\n }\n\n if (!url) {\n return false;\n }\n\n var urlParts = url.match(twttr.txt.regexen.validateUrlUnencoded);\n\n if (!urlParts || urlParts[0] !== url) {\n return false;\n }\n\n var scheme = urlParts[1],\n authority = urlParts[2],\n path = urlParts[3],\n query = urlParts[4],\n fragment = urlParts[5];\n\n if (!(\n (!requireProtocol || (isValidMatch(scheme, twttr.txt.regexen.validateUrlScheme) && scheme.match(/^https?$/i))) &&\n isValidMatch(path, twttr.txt.regexen.validateUrlPath) &&\n isValidMatch(query, twttr.txt.regexen.validateUrlQuery, true) &&\n isValidMatch(fragment, twttr.txt.regexen.validateUrlFragment, true)\n )) {\n return false;\n }\n\n return (unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlUnicodeAuthority)) ||\n (!unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlAuthority));\n };\n\n function isValidMatch(string, regex, optional) {\n if (!optional) {\n // RegExp[\"$&\"] is the text of the last match\n // blank strings are ok, but are falsy, so we check stringiness instead of truthiness\n return ((typeof string === \"string\") && string.match(regex) && RegExp[\"$&\"] === string);\n }\n\n // RegExp[\"$&\"] is the text of the last match\n return (!string || (string.match(regex) && RegExp[\"$&\"] === string));\n }\n\n if (typeof module != 'undefined' && module.exports) {\n module.exports = twttr.txt;\n }\n\n if (typeof define == 'function' && define.amd) {\n define([], twttr.txt);\n }\n\n if (typeof window != 'undefined') {\n if (window.twttr) {\n for (var prop in twttr) {\n window.twttr[prop] = twttr[prop];\n }\n } else {\n window.twttr = twttr;\n }\n }\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/twitter-text/twitter-text.js\n ** module id = 39\n ** module chunks = 0\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\n\nimport appendChild from '../render/appendChild';\nimport {\n addEventListener,\n removeEventListener\n} from './event';\nimport {\n BORDER_COLOR,\n disableUserSelect,\n enableUserSelect,\n findSVGContainer,\n findSVGAtPoint,\n getAnnotationRect,\n getMetadata,\n scaleDown,\n scaleUp\n} from './utils';\nimport {selectComment} from \"./comments\";\nimport {readonly} from \"../initFile\";\n\nlet _enabled = false;\nlet isDragging = false, overlay;\nlet dragOffsetX, dragOffsetY, dragStartX, dragStartY;\nconst OVERLAY_BORDER_SIZE = 3;\n\n/**\n * Create an overlay for editing an annotation.\n *\n * @param {Element} target The annotation element to apply overlay for\n */\nexport function createEditOverlay(target) {\n destroyEditOverlay();\n\n overlay = document.createElement('div');\n let anchor = document.createElement('a');\n let parentNode = findSVGContainer(target).parentNode;\n let id = target.getAttribute('data-pdf-annotate-id');\n let rect = getAnnotationRect(target);\n let styleLeft = rect.left - OVERLAY_BORDER_SIZE;\n let styleTop = rect.top - OVERLAY_BORDER_SIZE;\n \n overlay.setAttribute('id', 'pdf-annotate-edit-overlay');\n overlay.setAttribute('data-target-id', id);\n overlay.style.boxSizing = 'content-box';\n overlay.style.position = 'absolute';\n overlay.style.top = `${styleTop}px`;\n overlay.style.left = `${styleLeft}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.border = `${OVERLAY_BORDER_SIZE}px solid ${BORDER_COLOR}`;\n overlay.style.borderRadius = `${OVERLAY_BORDER_SIZE}px`;\n\n anchor.innerHTML = '×';\n anchor.setAttribute('href', 'javascript://');\n anchor.style.background = '#fff';\n anchor.style.borderRadius = '20px';\n anchor.style.border = '1px solid #bbb';\n anchor.style.color = '#bbb';\n anchor.style.fontSize = '16px';\n anchor.style.padding = '2px';\n anchor.style.textAlign = 'center';\n anchor.style.textDecoration = 'none';\n anchor.style.position = 'absolute';\n anchor.style.top = '-13px';\n anchor.style.right = '-13px';\n anchor.style.width = '25px';\n anchor.style.height = '25px';\n\n if(readonly)\n anchor.style.display = 'none';\n overlay.appendChild(anchor);\n parentNode.appendChild(overlay);\n document.addEventListener('click', handleDocumentClick);\n document.addEventListener('keyup', handleDocumentKeyup);\n document.addEventListener('mousedown', handleDocumentMousedown);\n anchor.addEventListener('click', deleteAnnotation);\n anchor.addEventListener('mouseover', () => {\n anchor.style.color = '#35A4DC';\n anchor.style.borderColor = '#999';\n anchor.style.boxShadow = '0 1px 1px #ccc';\n });\n anchor.addEventListener('mouseout', () => {\n anchor.style.color = '#bbb';\n anchor.style.borderColor = '#bbb';\n anchor.style.boxShadow = '';\n });\n overlay.addEventListener('mouseover', () => {\n if (!isDragging&&!readonly) { anchor.style.display = ''; }\n });\n overlay.addEventListener('mouseout', () => {\n anchor.style.display = 'none';\n });\n}\n\n/**\n * Destroy the edit overlay if it exists.\n */\nfunction destroyEditOverlay() {\n if (overlay) {\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n }\n document.removeEventListener('click', handleDocumentClick);\n document.removeEventListener('keyup', handleDocumentKeyup);\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n enableUserSelect();\n}\n\n/**\n * Delete currently selected annotation\n */\nfunction deleteAnnotation() {\n if (!overlay) { return; }\n\n let annotationId = overlay.getAttribute('data-target-id');\n let nodes = document.querySelectorAll(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let { documentId } = getMetadata(svg);\n\n [...nodes].forEach((n) => {\n n.parentNode.removeChild(n);\n });\n \n PDFJSAnnotate.getStoreAdapter().deleteAnnotation(documentId, annotationId);\n\n destroyEditOverlay();\n}\n\n/**\n * Handle document.click event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentClick(e) {\n if (!findSVGAtPoint(e.clientX, e.clientY)) { return; }\n\n // Remove current overlay\n let overlay = document.getElementById('pdf-annotate-edit-overlay');\n if (overlay) {\n if (isDragging || e.target === overlay) {\n return;\n }\n destroyEditOverlay();\n }\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentKeyup(e) {\n if (overlay && e.keyCode === 46 &&\n e.target.nodeName.toLowerCase() !== 'textarea' &&\n e.target.nodeName.toLowerCase() !== 'input') {\n deleteAnnotation();\n }\n}\n\n/**\n * Handle document.mousedown event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMousedown(e) {\n if (e.target !== overlay) { return; }\n\n // Highlight and strikeout annotations are bound to text within the document.\n // It doesn't make sense to allow repositioning these types of annotations.\n let annotationId = overlay.getAttribute('data-target-id');\n let target = document.querySelector(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let type = target.getAttribute('data-pdf-annotate-type');\n\n if (type === 'highlight' || type === 'strikeout') { return; }\n\n if(!readonly)\n isDragging = true;\n dragOffsetX = e.clientX;\n dragOffsetY = e.clientY;\n dragStartX = overlay.offsetLeft;\n dragStartY = overlay.offsetTop;\n\n overlay.style.background = 'rgba(255, 255, 255, 0.7)';\n overlay.style.cursor = 'move';\n // if(!readonly)\n overlay.querySelector('a').style.display = 'none';\n\n document.addEventListener('mousemove', handleDocumentMousemove);\n document.addEventListener('mouseup', handleDocumentMouseup);\n disableUserSelect();\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMousemove(e) {\n if(readonly)\n return;\n let annotationId = overlay.getAttribute('data-target-id');\n let parentNode = overlay.parentNode;\n let rect = parentNode.getBoundingClientRect();\n let y = (dragStartY + (e.clientY - dragOffsetY));\n let x = (dragStartX + (e.clientX - dragOffsetX));\n let minY = 0;\n let maxY = rect.height;\n let minX = 0;\n let maxX = rect.width;\n\n if (y > minY && y + overlay.offsetHeight < maxY) {\n overlay.style.top = `${y}px`;\n }\n\n if (x > minX && x + overlay.offsetWidth < maxX) {\n overlay.style.left = `${x}px`;\n }\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMouseup(e) {\n let annotationId = overlay.getAttribute('data-target-id');\n let target = document.querySelectorAll(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let type = target[0].getAttribute('data-pdf-annotate-type');\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let { documentId } = getMetadata(svg);\n \n overlay.querySelector('a').style.display = '';\n\n function getDelta(propX, propY) {\n return calcDelta(parseInt(target[0].getAttribute(propX), 10), parseInt(target[0].getAttribute(propY), 10));\n }\n\n function calcDelta(x, y) {\n return {\n deltaX: OVERLAY_BORDER_SIZE + scaleDown(svg, {x: overlay.offsetLeft}).x - x,\n deltaY: OVERLAY_BORDER_SIZE + scaleDown(svg, {y: overlay.offsetTop}).y - y\n };\n }\n\n PDFJSAnnotate.getStoreAdapter().getAnnotation(documentId, annotationId).then((annotation) => {\n if (['area', 'highlight', 'point', 'textbox'].indexOf(type) > -1) {\n let { deltaX, deltaY } = getDelta('x', 'y');\n [...target].forEach((t, i) => {\n if (deltaY !== 0) {\n let modelY = parseInt(t.getAttribute('y'), 10) + deltaY;\n let viewY = modelY;\n\n if (type === 'textbox') {\n viewY += annotation.size;\n }\n\n if (type === 'point' && !$.browser.mozilla) {\n viewY = scaleUp(svg, { viewY }).viewY;\n }\n if($.browser.mozilla)\n viewY -= 8;\n\n t.setAttribute('y', viewY);\n if (annotation.rectangles) {\n annotation.rectangles[i].y = modelY;\n } else if (annotation.y) {\n annotation.y = modelY;\n }\n }\n if (deltaX !== 0) {\n let modelX = parseInt(t.getAttribute('x'), 10) + deltaX;\n let viewX = modelX;\n\n if (type === 'point' && !$.browser.mozilla) {\n viewX = scaleUp(svg, { viewX }).viewX;\n }\n if($.browser.mozilla)\n viewX -= 8;\n\n t.setAttribute('x', viewX);\n if (annotation.rectangles) {\n annotation.rectangles[i].x = modelX;\n } else if (annotation.x) {\n annotation.x = modelX;\n }\n }\n });\n // } else if (type === 'strikeout') {\n // let { deltaX, deltaY } = getDelta('x1', 'y1');\n // [...target].forEach(target, (t, i) => {\n // if (deltaY !== 0) {\n // t.setAttribute('y1', parseInt(t.getAttribute('y1'), 10) + deltaY);\n // t.setAttribute('y2', parseInt(t.getAttribute('y2'), 10) + deltaY);\n // annotation.rectangles[i].y = parseInt(t.getAttribute('y1'), 10);\n // }\n // if (deltaX !== 0) {\n // t.setAttribute('x1', parseInt(t.getAttribute('x1'), 10) + deltaX);\n // t.setAttribute('x2', parseInt(t.getAttribute('x2'), 10) + deltaX);\n // annotation.rectangles[i].x = parseInt(t.getAttribute('x1'), 10);\n // }\n // });\n } else if (type === 'drawing') {\n let rect = scaleDown(svg, getAnnotationRect(target[0]));\n let [originX, originY] = annotation.lines[0];\n let { deltaX, deltaY } = calcDelta(originX, originY);\n\n // origin isn't necessarily at 0/0 in relation to overlay x/y\n // adjust the difference between overlay and drawing coords\n deltaY += (originY - rect.top);\n deltaX += (originX - rect.left);\n\n annotation.lines.forEach((line, i) => {\n let [x, y] = annotation.lines[i];\n annotation.lines[i][0] = x + deltaX;\n annotation.lines[i][1] = y + deltaY;\n });\n\n target[0].parentNode.removeChild(target[0]);\n appendChild(svg, annotation);\n }\n\n if(!readonly)\n PDFJSAnnotate.getStoreAdapter().editAnnotation(documentId, annotationId, annotation);\n });\n\n setTimeout(() => {\n isDragging = false;\n }, 0);\n\n overlay.style.background = '';\n overlay.style.cursor = '';\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n enableUserSelect();\n}\n\n/**\n * Handle annotation.click event\n *\n * @param {Element} e The annotation element that was clicked\n */\nfunction handleAnnotationClick(target) {\n const type = target.dataset['pdfAnnotateType']\n if(type==='point')\n selectComment(target.dataset['pdfAnnotateId']);\n createEditOverlay(target);\n}\n\n/**\n * Enable edit mode behavior.\n */\nexport function enableEdit () {\n if (_enabled) { return; }\n\n _enabled = true;\n addEventListener('annotation:click', handleAnnotationClick);\n};\n\n/**\n * Disable edit mode behavior.\n */\nexport function disableEdit () {\n destroyEditOverlay();\n\n\n if (!_enabled) { return; }\n\n _enabled = false;\n removeEventListener('annotation:click', handleAnnotationClick);\n};\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/edit.js\n **/","import objectAssign from 'object-assign';\nimport renderLine from './renderLine';\nimport renderPath from './renderPath';\nimport renderPoint from './renderPoint';\nimport renderRect from './renderRect';\nimport renderText from './renderText';\n\nconst isFirefox = /firefox/i.test(navigator.userAgent);\n\n/**\n * Get the x/y translation to be used for transforming the annotations\n * based on the rotation of the viewport.\n *\n * @param {Object} viewport The viewport data from the page\n * @return {Object}\n */\nfunction getTranslation(viewport) {\n let x;\n let y;\n\n // Modulus 360 on the rotation so that we only\n // have to worry about four possible values.\n switch(viewport.rotation % 360) {\n case 0:\n x = y = 0;\n break;\n case 90:\n x = 0;\n y = (viewport.width / viewport.scale) * -1;\n break;\n case 180:\n x = (viewport.width / viewport.scale) * -1;\n y = (viewport.height / viewport.scale) * -1;\n break;\n case 270:\n x = (viewport.height / viewport.scale) * -1;\n y = 0;\n break;\n }\n\n return { x, y };\n}\n\n/**\n * Transform the rotation and scale of a node using SVG's native transform attribute.\n *\n * @param {Node} node The node to be transformed\n * @param {Object} viewport The page's viewport data\n * @return {Node}\n */\nfunction transform(node, viewport) {\n let trans = getTranslation(viewport);\n\n // Let SVG natively transform the element\n node.setAttribute('transform', `scale(${viewport.scale}) rotate(${viewport.rotation}) translate(${trans.x}, ${trans.y})`);\n \n // Manually adjust x/y for nested SVG nodes\n if (!isFirefox && node.nodeName.toLowerCase() === 'svg') {\n node.setAttribute('x', parseInt(node.getAttribute('x'), 10) * viewport.scale);\n node.setAttribute('y', parseInt(node.getAttribute('y'), 10) * viewport.scale);\n\n let x = parseInt(node.getAttribute('x', 10));\n let y = parseInt(node.getAttribute('y', 10));\n let width = parseInt(node.getAttribute('width'), 10);\n let height = parseInt(node.getAttribute('height'), 10);\n let path = node.querySelector('path');\n let svg = path.parentNode;\n \n // Scale width/height\n [node, svg, path, node.querySelector('rect')].forEach((n) => {\n n.setAttribute('width', parseInt(n.getAttribute('width'), 10) * viewport.scale);\n n.setAttribute('height', parseInt(n.getAttribute('height'), 10) * viewport.scale);\n });\n\n // Transform path but keep scale at 100% since it will be handled natively\n transform(path, objectAssign({}, viewport, { scale: 1 }));\n \n switch(viewport.rotation % 360) {\n case 90:\n node.setAttribute('x', viewport.width - y - width);\n node.setAttribute('y', x);\n svg.setAttribute('x', 1);\n svg.setAttribute('y', 0);\n break;\n case 180:\n node.setAttribute('x', viewport.width - x - width);\n node.setAttribute('y', viewport.height - y - height);\n svg.setAttribute('y', 2);\n break;\n case 270:\n node.setAttribute('x', y);\n node.setAttribute('y', viewport.height - x - height);\n svg.setAttribute('x', -1);\n svg.setAttribute('y', 0);\n break;\n }\n }\n\n return node;\n}\n\n/**\n * Append an annotation as a child of an SVG.\n *\n * @param {SVGElement} svg The SVG element to append the annotation to\n * @param {Object} annotation The annotation definition to render and append\n * @param {Object} viewport The page's viewport data\n * @return {SVGElement} A node that was created and appended by this function\n */\nexport default function appendChild(svg, annotation, viewport) {\n if (!viewport) {\n viewport = JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'));\n }\n \n let child;\n switch (annotation.type) {\n case 'area':\n case 'highlight':\n child = renderRect(annotation);\n break;\n case 'strikeout':\n child = renderLine(annotation);\n break;\n case 'point':\n child = renderPoint(annotation);\n break;\n case 'textbox':\n child = renderText(annotation);\n break;\n case 'drawing':\n child = renderPath(annotation);\n break;\n }\n\n // If no type was provided for an annotation it will result in node being null.\n // Skip appending/transforming if node doesn't exist.\n if (child) {\n // Set attributes\n child.setAttribute('data-pdf-annotate-id', annotation.uuid);\n child.setAttribute('data-pdf-annotate-type', annotation.type);\n child.setAttribute('aria-hidden', true);\n\n svg.appendChild(transform(child, viewport));\n }\n\n return child;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/appendChild.js\n **/","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/object-assign/index.js\n ** module id = 42\n ** module chunks = 0\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGLineElements from an annotation definition.\n * This is used for anntations of type `strikeout`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGGElement} A group of all lines to be rendered\n */\nexport default function renderLine(a) {\n let group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n setAttributes(group, {\n stroke: normalizeColor(a.color || '#f00'),\n strokeWidth: 1\n });\n\n a.rectangles.forEach((r) => {\n let line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n\n setAttributes(line, {\n x1: r.x,\n y1: r.y,\n x2: r.x + r.width,\n y2: r.y,\n });\n\n group.appendChild(line);\n });\n\n return group;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderLine.js\n **/","const UPPER_REGEX = /[A-Z]/g;\n\n// Don't convert these attributes from camelCase to hyphenated-attributes\nconst BLACKLIST = [\n 'viewBox'\n];\n\nlet keyCase = (key) => {\n if (BLACKLIST.indexOf(key) === -1) {\n key = key.replace(UPPER_REGEX, match => '-' + match.toLowerCase());\n }\n return key;\n}\n\n/**\n * Set attributes for a node from a map\n *\n * @param {Node} node The node to set attributes on\n * @param {Object} attributes The map of key/value pairs to use for attributes\n */\nexport default function setAttributes(node, attributes) {\n Object.keys(attributes).forEach((key) => {\n node.setAttribute(keyCase(key), attributes[key]);\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/setAttributes.js\n **/","const REGEX_HASHLESS_HEX = /^([a-f0-9]{6}|[a-f0-9]{3})$/i;\n\n/**\n * Normalize a color value\n *\n * @param {String} color The color to normalize\n * @return {String}\n */\nexport default function normalizeColor(color) {\n if (REGEX_HASHLESS_HEX.test(color)) {\n color = `#${color}`;\n }\n return color;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/normalizeColor.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGPathElement from an annotation definition.\n * This is used for anntations of type `drawing`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGPathElement} The path to be rendered\n */\nexport default function renderPath(a) {\n let d = [];\n let path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n \n for (let i=0, l=a.lines.length; i<l; i++) {\n var p1 = a.lines[i];\n var p2 = a.lines[i+1];\n if (p2) {\n d.push(`M${p1[0]} ${p1[1]} ${p2[0]} ${p2[1]}`);\n }\n }\n \n setAttributes(path, {\n d: `${d.join(' ')}Z`,\n stroke: normalizeColor(a.color || '#000'),\n strokeWidth: a.width || 1,\n fill: 'none'\n });\n\n return path;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderPath.js\n **/","import setAttributes from '../utils/setAttributes';\n\nconst SIZE = 25;\nconst D = 'M499.968 214.336q-113.832 0 -212.877 38.781t-157.356 104.625 -58.311 142.29q0 62.496 39.897 119.133t112.437 97.929l48.546 27.9 -15.066 53.568q-13.392 50.778 -39.06 95.976 84.816 -35.154 153.45 -95.418l23.994 -21.204 31.806 3.348q38.502 4.464 72.54 4.464 113.832 0 212.877 -38.781t157.356 -104.625 58.311 -142.29 -58.311 -142.29 -157.356 -104.625 -212.877 -38.781z';\n\n/**\n * Create SVGElement from an annotation definition.\n * This is used for anntations of type `comment`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGElement} A svg to be rendered\n */\nexport default function renderPoint(a) {\n let outerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n let innerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n let path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n setAttributes(outerSVG, {\n width: SIZE,\n height: SIZE,\n x: a.x,\n y: a.y\n });\n\n setAttributes(innerSVG, {\n width: SIZE,\n height: SIZE,\n x: 0,\n y: (SIZE * 0.05) * -1,\n viewBox: '0 0 1000 1000'\n });\n\n setAttributes(rect, {\n width: SIZE,\n height: SIZE,\n stroke: '#000',\n fill: '#ff0'\n });\n\n setAttributes(path, {\n d: D,\n strokeWidth: 50,\n stroke: '#000',\n fill: '#fff'\n });\n\n innerSVG.appendChild(path);\n outerSVG.appendChild(rect);\n outerSVG.appendChild(innerSVG);\n\n return outerSVG;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderPoint.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGRectElements from an annotation definition.\n * This is used for anntations of type `area` and `highlight`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGGElement|SVGRectElement} A group of all rects to be rendered\n */\nexport default function renderRect(a) {\n if (a.type === 'highlight') {\n let group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n setAttributes(group, {\n fill: normalizeColor(a.color || '#ff0'),\n fillOpacity: 0.2\n });\n \n a.rectangles.forEach((r) => {\n group.appendChild(createRect(r));\n });\n\n return group;\n } else {\n let rect = createRect(a);\n setAttributes(rect, {\n stroke: normalizeColor(a.color || '#f00'),\n fill: 'none'\n });\n\n return rect;\n }\n}\n\nfunction createRect(r) {\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\n setAttributes(rect, {\n x: r.x,\n y: r.y,\n width: r.width,\n height: r.height\n });\n\n return rect;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderRect.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGTextElement from an annotation definition.\n * This is used for anntations of type `textbox`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGTextElement} A text to be rendered\n */\nexport default function renderText(a) {\n var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n\n setAttributes(text, {\n x: a.x,\n y: a.y + parseInt(a.size, 10),\n fill: normalizeColor(a.color || '#000'),\n fontSize: a.size\n });\n text.innerHTML = a.content;\n\n return text;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderText.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from './appendChild';\nimport renderScreenReaderHints from '../a11y/renderScreenReaderHints';\n\n/**\n * Render the response from PDFJSAnnotate.getStoreAdapter().getAnnotations to SVG\n *\n * @param {SVGElement} svg The SVG element to render the annotations to\n * @param {Object} viewport The page viewport data\n * @param {Object} data The response from PDFJSAnnotate.getStoreAdapter().getAnnotations\n * @return {Promise} Settled once rendering has completed\n * A settled Promise will be either:\n * - fulfilled: SVGElement\n * - rejected: Error\n */\nexport default function render(svg, viewport, data) {\n return new Promise((resolve, reject) => {\n // Reset the content of the SVG\n svg.innerHTML = ''; \n svg.setAttribute('data-pdf-annotate-container', true);\n svg.setAttribute('data-pdf-annotate-viewport', JSON.stringify(viewport));\n svg.removeAttribute('data-pdf-annotate-document');\n svg.removeAttribute('data-pdf-annotate-page');\n\n // If there's no data nothing can be done\n if (!data) {\n return resolve(svg);\n }\n\n svg.setAttribute('data-pdf-annotate-document', data.documentId);\n svg.setAttribute('data-pdf-annotate-page', data.pageNumber);\n \n // Make sure annotations is an array\n if (!Array.isArray(data.annotations) || data.annotations.length === 0) {\n return resolve(svg);\n }\n\n // Append annotation to svg\n data.annotations.forEach((a) => {\n appendChild(svg, a, viewport);\n });\n\n resolve(svg);\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/index.js\n **/","import insertScreenReaderHint from './insertScreenReaderHint';\nimport initEventHandlers from './initEventHandlers';\n\n// TODO This is not the right place for this to live\ninitEventHandlers();\n\n/**\n * Insert hints into the DOM for screen readers.\n *\n * @param {Array} annotations The annotations that hints are inserted for\n */\nexport default function renderScreenReaderHints(annotations) {\n annotations = Array.isArray(annotations) ? annotations : [];\n\n // Insert hints for each type\n Object.keys(SORT_TYPES).forEach((type) => {\n let sortBy = SORT_TYPES[type];\n annotations\n .filter((a) => a.type === type)\n .sort(sortBy)\n .forEach((a, i) => insertScreenReaderHint(a, i + 1));\n });\n}\n\n// Sort annotations first by y, then by x.\n// This allows hints to be injected in the order they appear,\n// which makes numbering them easier.\nfunction sortByPoint(a, b) {\n if (a.y < b.y) {\n return a.x - b.x;\n } else {\n return 1;\n }\n}\n\n// Sort annotation by it's first rectangle\nfunction sortByRectPoint(a, b) {\n return sortByPoint(a.rectangles[0], b.rectangles[0]);\n}\n\n// Sort annotation by it's first line\nfunction sortByLinePoint(a, b) {\n let lineA = a.lines[0];\n let lineB = b.lines[0];\n return sortByPoint(\n {x: lineA[0], y: lineA[1]},\n {x: lineB[0], y: lineB[1]}\n );\n}\n\n// Arrange supported types and associated sort methods\nconst SORT_TYPES = {\n 'highlight': sortByRectPoint,\n 'strikeout': sortByRectPoint,\n 'drawing': sortByLinePoint,\n 'textbox': sortByPoint,\n 'point': sortByPoint,\n 'area': sortByPoint\n};\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/renderScreenReaderHints.js\n **/","import createScreenReaderOnly from './createScreenReaderOnly';\nimport insertElementWithinChildren from './insertElementWithinChildren';\nimport insertElementWithinElement from './insertElementWithinElement';\nimport renderScreenReaderComments from './renderScreenReaderComments';\n\n// Annotation types that support comments\nconst COMMENT_TYPES = ['highlight', 'point', 'area'];\n\n/**\n * Insert a hint into the DOM for screen readers for a specific annotation.\n *\n * @param {Object} annotation The annotation to insert a hint for\n * @param {Number} num The number of the annotation out of all annotations of the same type\n */\nexport default function insertScreenReaderHint(annotation, num = 0) {\n switch (annotation.type) {\n case 'highlight':\n case 'strikeout':\n let rects = annotation.rectangles;\n let first = rects[0];\n let last = rects[rects.length - 1];\n\n insertElementWithinElement(\n createScreenReaderOnly(`Begin ${annotation.type} annotation ${num}`, annotation.uuid),\n first.x, first.y, annotation.page, true\n );\n\n insertElementWithinElement(\n createScreenReaderOnly(`End ${annotation.type} annotation ${num}`, `${annotation.uuid}-end`),\n last.x + last.width, last.y, annotation.page, false\n );\n break;\n\n case 'textbox':\n case 'point':\n let text = annotation.type === 'textbox' ? ` (content: ${annotation.content})` : '';\n\n insertElementWithinChildren(\n createScreenReaderOnly(`${annotation.type} annotation ${num}${text}`, annotation.uuid),\n annotation.x, annotation.y, annotation.page\n );\n break;\n\n case 'drawing':\n case 'area':\n let x = typeof annotation.x !== 'undefined' ? annotation.x : annotation.lines[0][0];\n let y = typeof annotation.y !== 'undefined' ? annotation.y : annotation.lines[0][1];\n\n insertElementWithinChildren(\n createScreenReaderOnly(`Unlabeled drawing`, annotation.uuid),\n x, y, annotation.page\n );\n break;\n }\n\n // Include comments in screen reader hint\n if (COMMENT_TYPES.includes(annotation.type)) {\n renderScreenReaderComments(annotation.documentId, annotation.uuid);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertScreenReaderHint.js\n **/","/**\n * Create a node that is only visible to screen readers\n *\n * @param {String} content The text content that should be read by screen reader\n * @param {String} [annotationId] The ID of the annotation assocaited\n * @return {Element} An Element that is only visible to screen readers\n */\nexport default function createScreenReaderOnly(content, annotationId) {\n let node = document.createElement('div');\n let text = document.createTextNode(content);\n node.appendChild(text);\n node.setAttribute('id', `pdf-annotate-screenreader-${annotationId}`);\n node.style.position = 'absolute';\n node.style.left = '-10000px';\n node.style.top = 'auto';\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.overflow = 'hidden';\n return node;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/createScreenReaderOnly.js\n **/","import insertElementWithinElement from './insertElementWithinElement';\nimport { pointIntersectsRect } from '../UI/utils';\nimport { scaleUp } from '../UI/utils'; \n\n/**\n * Insert an element at a point within the document.\n * This algorithm will try to insert between elements if possible.\n * It will however use `insertElementWithinElement` if it is more accurate.\n *\n * @param {Element} el The element to be inserted\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page number to limit elements to\n * @return {Boolean} True if element was able to be inserted, otherwise false\n */\nexport default function insertElementWithinChildren(el, x, y, pageNumber) {\n // Try and use most accurate method of inserting within an element\n if (insertElementWithinElement(el, x, y, pageNumber, true)) {\n return true;\n }\n\n // Fall back to inserting between elements\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let rect = svg.getBoundingClientRect();\n let nodes = [...svg.parentNode.querySelectorAll('.textLayer > div')];\n\n y = scaleUp(svg, {y}).y + rect.top;\n x = scaleUp(svg, {x}).x + rect.left;\n\n // Find the best node to insert before\n for (let i=0, l=nodes.length; i<l; i++) {\n let n = nodes[i];\n let r = n.getBoundingClientRect();\n if (y <= r.top) {\n n.parentNode.insertBefore(el, n);\n return true;\n }\n }\n\n // If all else fails try to append to the bottom\n let textLayer = svg.parentNode.querySelector('.textLayer');\n if (textLayer) {\n let textRect = textLayer.getBoundingClientRect();\n if (pointIntersectsRect(x, y, textRect)) {\n textLayer.appendChild(el);\n return true;\n }\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertElementWithinChildren.js\n **/","import {\n pointIntersectsRect,\n scaleUp,\n scaleDown\n} from '../UI/utils'; \n\n/**\n * Insert an element at a point within the document.\n * This algorithm will only insert within an element amidst it's text content.\n *\n * @param {Element} el The element to be inserted\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page number to limit elements to\n * @param {Boolean} insertBefore Whether the element is to be inserted before or after x\n * @return {Boolean} True if element was able to be inserted, otherwise false\n */\nexport default function insertElementWithinElement(el, x, y, pageNumber, insertBefore) {\n const OFFSET_ADJUST = 2;\n\n // If inserting before adjust `x` by looking for element a few px to the right\n // Otherwise adjust a few px to the left\n // This is to allow a little tolerance by searching within the box, instead\n // of getting a false negative by testing right on the border.\n x = Math.max(x + (OFFSET_ADJUST * (insertBefore ? 1 : -1)), 0);\n\n let node = textLayerElementFromPoint(x, y + OFFSET_ADJUST, pageNumber);\n if (!node) {\n return false;\n }\n \n // Now that node has been found inverse the adjustment for `x`.\n // This is done to accomodate tolerance by cutting off on the outside of the\n // text boundary, instead of missing a character by cutting off within.\n x = x + (OFFSET_ADJUST * (insertBefore ? -1 : 1));\n\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let left = scaleDown(svg, {left: node.getBoundingClientRect().left}).left - svg.getBoundingClientRect().left;\n let temp = node.cloneNode(true);\n let head = temp.innerHTML.split('');\n let tail = [];\n\n // Insert temp off screen\n temp.style.position = 'absolute';\n temp.style.top = '-10000px';\n temp.style.left = '-10000px';\n document.body.appendChild(temp);\n\n while (head.length) {\n // Don't insert within HTML tags\n if (head[head.length - 1] === '>') {\n while(head.length) {\n tail.unshift(head.pop());\n if (tail[0] === '<') {\n break;\n }\n }\n }\n \n // Check if width of temp based on current head value satisfies x\n temp.innerHTML = head.join('');\n let width = scaleDown(svg, {width: temp.getBoundingClientRect().width}).width;\n if (left + width <= x) {\n break;\n }\n tail.unshift(head.pop());\n }\n \n // Update original node with new markup, including element to be inserted\n node.innerHTML = head.join('') + el.outerHTML + tail.join('');\n temp.parentNode.removeChild(temp);\n\n return true;\n}\n\n/**\n * Get a text layer element at a given point on a page\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page to limit elements to\n * @return {Element} First text layer element found at the point\n */\nfunction textLayerElementFromPoint(x, y, pageNumber) {\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let rect = svg.getBoundingClientRect();\n y = scaleUp(svg, {y}).y + rect.top;\n x = scaleUp(svg, {x}).x + rect.left;\n return [...svg.parentNode.querySelectorAll('.textLayer [data-canvas-width]')].filter((el) => {\n return pointIntersectsRect(x, y, el.getBoundingClientRect());\n })[0];\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertElementWithinElement.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport insertScreenReaderComment from './insertScreenReaderComment';\n\n/**\n * Insert the comments into the DOM to be available by screen reader\n *\n * Example output:\n * <div class=\"screenReaderOnly\">\n * <div>Begin highlight 1</div>\n * <ol aria-label=\"Comments\">\n * <li>Foo</li>\n * <li>Bar</li>\n * <li>Baz</li>\n * <li>Qux</li>\n * </ol>\n * </div>\n * <div>Some highlighted text goes here...</div>\n * <div class=\"screenReaderOnly\">End highlight 1</div>\n *\n * NOTE: `screenReaderOnly` is not a real class, just used for brevity\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The ID of the annotation\n * @param {Array} [comments] Optionally preloaded comments to be rendered\n * @return {Promise}\n */\nexport default function renderScreenReaderComments(documentId, annotationId, comments) {\n let promise;\n\n if (Array.isArray(comments)) {\n promise = Promise.resolve(comments);\n } else {\n promise = PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId);\n }\n\n return promise.then((comments) => {\n // Node needs to be found by querying DOM as it may have been inserted as innerHTML\n // leaving `screenReaderNode` as an invalid reference (see `insertElementWithinElement`).\n let node = document.getElementById(`pdf-annotate-screenreader-${annotationId}`);\n if (node) { \n let list = document.createElement('ol');\n list.setAttribute('id', `pdf-annotate-screenreader-comment-list-${annotationId}`);\n list.setAttribute('aria-label', 'Comments');\n node.appendChild(list);\n comments.forEach(insertScreenReaderComment);\n }\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/renderScreenReaderComments.js\n **/","/**\n * Insert a comment into the DOM to be available by screen reader\n *\n * @param {Object} comment The comment to be inserted\n */\nexport default function insertScreenReaderComment(comment) {\n if (!comment) {\n return;\n }\n\n let list = document.querySelector(`#pdf-annotate-screenreader-${comment.annotation} ol`);\n if (list) {\n let item = document.createElement('li');\n item.setAttribute('id', `pdf-annotate-screenreader-comment-${comment.uuid}`);\n item.appendChild(document.createTextNode(`${comment.content}`));\n list.appendChild(item);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertScreenReaderComment.js\n **/","import insertScreenReaderHint from './insertScreenReaderHint';\nimport renderScreenReaderHints from './renderScreenReaderHints';\nimport insertScreenReaderComment from './insertScreenReaderComment';\nimport renderScreenReaderComments from './renderScreenReaderComments';\nimport { addEventListener } from '../UI/event';\nimport PDFJSAnnotate from '../PDFJSAnnotate';\n\n/**\n * Initialize the event handlers for keeping screen reader hints synced with data\n */\nexport default function initEventHandlers() {\n addEventListener('annotation:add', (documentId, pageNumber, annotation) => {\n reorderAnnotationsByType(documentId, pageNumber, annotation.type);\n });\n addEventListener('annotation:edit', (documentId, annotationId, annotation) => {\n reorderAnnotationsByType(documentId, annotation.page, annotation.type);\n });\n addEventListener('annotation:delete', removeAnnotation);\n addEventListener('comment:add', insertComment);\n addEventListener('comment:delete', removeComment);\n}\n\n/**\n * Reorder the annotation numbers by annotation type\n *\n * @param {String} documentId The ID of the document\n * @param {Number} pageNumber The page number of the annotations\n * @param {Strig} type The annotation type\n */\nfunction reorderAnnotationsByType(documentId, pageNumber, type) {\n PDFJSAnnotate.getStoreAdapter().getAnnotations(documentId)\n .then((annotationsByPage) => {\n let annotations = [];\n for(const page of Object.keys(annotationsByPage))\n for(const annotation in annotationsByPage[page]){\n if(annotation.type == type)\n annotations.push(annotation)\n }\n return annotations;\n // annotationsByPage(page) =\n // return annotationsByPage[page].filter((a) => {\n // return a.type === type;\n // });\n // return annotationsByPage;\n })\n .then((annotations) => {\n annotations.forEach((a) => {\n removeAnnotation(documentId, a.uuid);\n });\n\n return annotations;\n })\n .then(renderScreenReaderHints);\n}\n\n/**\n * Remove the screen reader hint for an annotation\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The Id of the annotation\n */\nfunction removeAnnotation(documentId, annotationId) {\n removeElementById(`pdf-annotate-screenreader-${annotationId}`);\n removeElementById(`pdf-annotate-screenreader-${annotationId}-end`);\n}\n\n/**\n * Insert a screen reader hint for a comment\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The ID of tha assocated annotation\n * @param {Object} comment The comment to insert a hint for\n */\nfunction insertComment(documentId, annotationId, comment) {\n let list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`);\n let promise;\n\n if (!list) {\n promise = renderScreenReaderComments(documentId, annotationId, []).then(() => {\n list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`);\n return true;\n });\n } else {\n promise = Promise.resolve(true);\n }\n\n promise.then(() => {\n insertScreenReaderComment(comment);\n });\n}\n\n/**\n * Remove a screen reader hint for a comment\n *\n * @param {String} documentId The ID of the document\n * @param {String} commentId The ID of the comment\n */\nfunction removeComment(documentId, commentId) {\n removeElementById(`pdf-annotate-screenreader-comment-${commentId}`);\n}\n\n/**\n * Remove an element from the DOM by it's ID if it exists\n *\n * @param {String} elementID The ID of the element to be removed\n */\nfunction removeElementById(elementId) {\n let el = document.getElementById(elementId);\n if (el) {\n el.parentNode.removeChild(el);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/initEventHandlers.js\n **/","import { addEventListener, removeEventListener, fireEvent } from './event';\nimport { disableEdit, enableEdit } from './edit';\nimport { disablePen, enablePen, setPen } from './pen';\nimport { disablePoint, enablePoint } from './point';\nimport { disableRect, enableRect } from './rect';\nimport { disableText, enableText, setText } from './text';\nimport { createPage, renderPage } from './page';\n\nexport default {\n addEventListener, removeEventListener, fireEvent,\n disableEdit, enableEdit,\n disablePen, enablePen, setPen,\n disablePoint, enablePoint,\n disableRect, enableRect,\n disableText, enableText, setText,\n createPage, renderPage\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/index.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n disableUserSelect,\n enableUserSelect,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet _penSize;\nlet _penColor;\nlet path;\nlet lines;\n\n/**\n * Handle document.mousedown event\n */\nfunction handleDocumentMousedown() {\n path = null;\n lines = [];\n\n document.addEventListener('mousemove', handleDocumentMousemove);\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentMouseup(e) {\n let svg;\n if (lines.length > 1 && (svg = findSVGAtPoint(e.clientX, e.clientY))) {\n let { documentId, pageNumber } = getMetadata(svg);\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, {\n type: 'drawing',\n width: _penSize,\n color: _penColor,\n lines\n }\n ).then((annotation) => {\n if (path) {\n svg.removeChild(path);\n }\n\n appendChild(svg, annotation);\n });\n }\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentMousemove(e) {\n savePoint(e.clientX, e.clientY);\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentKeyup(e) {\n // Cancel rect if Esc is pressed\n if (e.keyCode === 27) {\n lines = null;\n path.parentNode.removeChild(path);\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n }\n}\n\n/**\n * Save a point to the line being drawn.\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n */\nfunction savePoint(x, y) {\n let svg = findSVGAtPoint(x, y);\n if (!svg) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n let point = scaleDown(svg, {\n x: x - rect.left,\n y: y - rect.top\n });\n\n lines.push([point.x, point.y]);\n\n if (lines.length <= 1) {\n return;\n }\n\n if (path) {\n svg.removeChild(path);\n }\n\n path = appendChild(svg, {\n type: 'drawing',\n color: _penColor,\n width: _penSize,\n lines\n });\n}\n\n/**\n * Set the attributes of the pen.\n *\n * @param {Number} penSize The size of the lines drawn by the pen\n * @param {String} penColor The color of the lines drawn by the pen\n */\nexport function setPen(penSize = 1, penColor = '000000') {\n _penSize = parseInt(penSize, 10);\n _penColor = penColor;\n}\n\n/**\n * Enable the pen behavior\n */\nexport function enablePen() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mousedown', handleDocumentMousedown);\n document.addEventListener('keyup', handleDocumentKeyup);\n disableUserSelect();\n}\n\n/**\n * Disable the pen behavior\n */\nexport function disablePen() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('keyup', handleDocumentKeyup);\n enableUserSelect();\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/pen.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet input;\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} The DOM event to be handled\n */\nfunction handleDocumentMouseup(e) {\n\n if (input || !findSVGAtPoint(e.clientX, e.clientY)) {\n return\n }\n \n input = document.createElement('input');\n input.setAttribute('id', 'pdf-annotate-point-input');\n input.setAttribute('placeholder', 'Enter comment');\n input.style.border = `3px solid ${BORDER_COLOR}`;\n input.style.borderRadius = '3px';\n input.style.position = 'absolute';\n input.style.top = `${e.clientY}px`;\n input.style.left = `${e.clientX}px`;\n\n input.addEventListener('blur', handleInputBlur);\n input.addEventListener('keyup', handleInputKeyup);\n\n document.body.appendChild(input);\n input.focus();\n}\n\n/**\n * Handle input.blur event\n */\nfunction handleInputBlur() {\n savePoint();\n}\n\n/**\n * Handle input.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleInputKeyup(e) {\n if (e.keyCode === 27) {\n closeInput();\n } else if (e.keyCode === 13) {\n savePoint();\n }\n}\n\n/**\n * Save a new point annotation from input\n */\nfunction savePoint() {\n if (input.value.trim().length > 0) {\n let clientX = parseInt(input.style.left, 10);\n let clientY = parseInt(input.style.top, 10);\n let content = input.value.trim();\n let svg = findSVGAtPoint(clientX, clientY);\n if (!svg) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n let { documentId, pageNumber } = getMetadata(svg);\n let annotation = Object.assign({\n type: 'point'\n }, scaleDown(svg, {\n x: clientX - rect.left,\n y: clientY - rect.top\n })\n );\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n PDFJSAnnotate.getStoreAdapter().addComment(\n documentId,\n annotation.uuid,\n content\n );\n\n appendChild(svg, annotation);\n });\n }\n\n closeInput();\n}\n\n/**\n * Close the input element\n */\nfunction closeInput() {\n input.removeEventListener('blur', handleInputBlur);\n input.removeEventListener('keyup', handleInputKeyup);\n document.body.removeChild(input);\n input = null;\n}\n\n/**\n * Enable point annotation behavior\n */\nexport function enablePoint() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Disable point annotation behavior\n */\nexport function disablePoint() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/point.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n disableUserSelect,\n enableUserSelect,\n findSVGAtPoint,\n getMetadata,\n getOffset,\n scaleDown,\n scaleUp\n} from './utils';\n\nlet _enabled = false;\nlet _type;\nlet overlay;\nlet originY;\nlet originX;\n\n/**\n * Get the current window selection as rects\n *\n * @return {Array} An Array of rects\n */\nfunction getSelectionRects() {\n try {\n let selection = window.getSelection();\n let range = selection.getRangeAt(0);\n let rects = range.getClientRects();\n\n if (rects.length > 0 &&\n rects[0].width > 0 &&\n rects[0].height > 0) {\n return rects;\n }\n } catch (e) {}\n \n return null;\n}\n\n/**\n * Handle document.mousedown event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMousedown(e) {\n let svg;\n if (_type !== 'area' || !(svg = findSVGAtPoint(e.clientX, e.clientY))) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n originY = e.clientY;\n originX = e.clientX;\n\n overlay = document.createElement('div');\n overlay.style.position = 'absolute';\n overlay.style.top = `${originY - rect.top}px`;\n overlay.style.left = `${originX - rect.left}px`;\n overlay.style.border = `3px solid ${BORDER_COLOR}`;\n overlay.style.borderRadius = '3px';\n svg.parentNode.appendChild(overlay);\n \n document.addEventListener('mousemove', handleDocumentMousemove);\n disableUserSelect();\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMousemove(e) {\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let rect = svg.getBoundingClientRect();\n\n if (originX + (e.clientX - originX) < rect.right) {\n overlay.style.width = `${e.clientX - originX}px`;\n }\n\n if (originY + (e.clientY - originY) < rect.bottom) {\n overlay.style.height = `${e.clientY - originY}px`;\n }\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMouseup(e) {\n let rects;\n if (_type !== 'area' && (rects = getSelectionRects())) {\n let svg = findSVGAtPoint(rects[0].left, rects[0].top);\n saveRect(_type, [...rects].map((r) => {\n return {\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height\n };\n }));\n } else if (_type === 'area' && overlay) {\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let rect = svg.getBoundingClientRect();\n saveRect(_type, [{\n top: parseInt(overlay.style.top, 10) + rect.top,\n left: parseInt(overlay.style.left, 10) + rect.left,\n width: parseInt(overlay.style.width, 10),\n height: parseInt(overlay.style.height, 10)\n }]);\n\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n enableUserSelect();\n }\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentKeyup(e) {\n // Cancel rect if Esc is pressed\n if (e.keyCode === 27) {\n let selection = window.getSelection();\n selection.removeAllRanges();\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n document.removeEventListener('mousemove', handleDocumentMousemove);\n }\n }\n}\n\n/**\n * Save a rect annotation\n *\n * @param {String} type The type of rect (area, highlight, strikeout)\n * @param {Array} rects The rects to use for annotation\n * @param {String} color The color of the rects\n */\nfunction saveRect(type, rects, color) {\n let svg = findSVGAtPoint(rects[0].left, rects[0].top);\n let node;\n let annotation;\n\n if (!svg) {\n return;\n }\n\n let boundingRect = svg.getBoundingClientRect();\n\n if (!color) {\n if (type === 'highlight') {\n color = 'FFFF00';\n } else if (type === 'strikeout') {\n color = 'FF0000';\n }\n }\n\n // Initialize the annotation\n annotation = {\n type,\n color,\n rectangles: [...rects].map((r) => {\n let offset = 0;\n\n if (type === 'strikeout') {\n offset = r.height / 2;\n }\n\n return scaleDown(svg, {\n y: (r.top + offset) - boundingRect.top,\n x: r.left - boundingRect.left,\n width: r.width,\n height: r.height\n });\n }).filter((r) => r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1)\n };\n \n // Short circuit if no rectangles exist\n if (annotation.rectangles.length === 0) {\n return;\n }\n\n // Special treatment for area as it only supports a single rect\n if (type === 'area') {\n let rect = annotation.rectangles[0];\n delete annotation.rectangles;\n annotation.x = rect.x;\n annotation.y = rect.y;\n annotation.width = rect.width;\n annotation.height = rect.height;\n }\n\n let { documentId, pageNumber } = getMetadata(svg);\n\n // Add the annotation\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n appendChild(svg, annotation);\n });\n}\n\n/**\n * Enable rect behavior\n */\nexport function enableRect(type) {\n _type = type;\n \n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n document.addEventListener('mousedown', handleDocumentMousedown);\n document.addEventListener('keyup', handleDocumentKeyup);\n}\n\n/**\n * Disable rect behavior\n */\nexport function disableRect() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('keyup', handleDocumentKeyup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/rect.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet input;\nlet _textSize;\nlet _textColor;\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMouseup(e) {\n if (input || !findSVGAtPoint(e.clientX, e.clientY)) {\n return;\n }\n\n input = document.createElement('input');\n input.setAttribute('id', 'pdf-annotate-text-input');\n input.setAttribute('placeholder', 'Enter text');\n input.style.border = `3px solid ${BORDER_COLOR}`;\n input.style.borderRadius = '3px';\n input.style.position = 'absolute';\n input.style.top = `${e.clientY}px`;\n input.style.left = `${e.clientX}px`;\n input.style.fontSize = `${_textSize}px`;\n\n input.addEventListener('blur', handleInputBlur);\n input.addEventListener('keyup', handleInputKeyup);\n\n document.body.appendChild(input);\n input.focus();\n}\n\n/**\n * Handle input.blur event\n */\nfunction handleInputBlur() {\n saveText();\n}\n\n/**\n * Handle input.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleInputKeyup(e) {\n if (e.keyCode === 27) {\n closeInput();\n } else if (e.keyCode === 13) {\n saveText();\n }\n}\n\n/**\n * Save a text annotation from input\n */\nfunction saveText() {\n if (input.value.trim().length > 0) {\n let clientX = parseInt(input.style.left, 10);\n let clientY = parseInt(input.style.top, 10);\n let svg = findSVGAtPoint(clientX, clientY);\n if (!svg) {\n return;\n }\n\n let { documentId, pageNumber } = getMetadata(svg);\n let rect = svg.getBoundingClientRect();\n let annotation = Object.assign({\n type: 'textbox',\n size: _textSize,\n color: _textColor,\n content: input.value.trim()\n }, scaleDown(svg, {\n x: clientX - rect.left,\n y: clientY - rect.top,\n width: input.offsetWidth,\n height: input.offsetHeight\n })\n );\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n appendChild(svg, annotation);\n });\n }\n\n closeInput();\n}\n\n/**\n * Close the input\n */\nfunction closeInput() {\n try {\n if (input) {\n input.removeEventListener('blur', handleInputBlur);\n input.removeEventListener('keyup', handleInputKeyup);\n document.body.removeChild(input);\n input = null;\n }\n } catch(e){\n console.log('Try/catch is necessary because exist a error in Safari');\n }\n}\n\n/**\n * Set the text attributes\n *\n * @param {Number} textSize The size of the text\n * @param {String} textColor The color of the text\n */\nexport function setText(textSize = 12, textColor = '000000') {\n _textSize = parseInt(textSize, 10);\n _textColor = textColor;\n}\n\n\n/**\n * Enable text behavior\n */\nexport function enableText() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n/**\n * Disable text behavior\n */\nexport function disableText() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/text.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport renderScreenReaderHints from '../a11y/renderScreenReaderHints';\n\n// Template for creating a new page\nconst PAGE_TEMPLATE = `\n <div style=\"visibility: hidden;\" class=\"page\" data-loaded=\"false\">\n <div class=\"canvasWrapper\">\n <canvas></canvas>\n </div>\n <svg class=\"annotationLayer\"></svg>\n <div class=\"textLayer\"></div>\n </div>\n`;\n\n/**\n * Create a new page to be appended to the DOM.\n *\n * @param {Number} pageNumber The page number that is being created\n * @return {HTMLElement}\n */\nexport function createPage(pageNumber) {\n let temp = document.createElement('div');\n temp.innerHTML = PAGE_TEMPLATE;\n\n let page = temp.children[0];\n let canvas = page.querySelector('canvas');\n\n page.setAttribute('id', `pageContainer${pageNumber}`);\n page.setAttribute('data-page-number', pageNumber);\n\n canvas.mozOpaque = true;\n canvas.setAttribute('id', `page${pageNumber}`);\n\n // let svg = page.querySelector('.');\n // // let svg = document.body;\n // console.log(svg)\n // // let svg = document.getElementById();\n //\n // document.addEventListener('click', function handleDocumentClick(e) {\n // console.log(click)\n // if (!findSVGAtPoint(e.clientX, e.clientY)) {\n // return;\n // }\n //\n // let target = findAnnotationAtPoint(e.clientX, e.clientY);\n //\n // // Emit annotation:blur if clickNode is no longer clicked\n // if (clickNode && clickNode !== target) {\n // emitter.emit('annotation:blur', clickNode);\n // }\n //\n // // Emit annotation:click if target was clicked\n // if (target) {\n // emitter.emit('annotation:click', target);\n // }\n //\n // clickNode = target;\n // });\n\n return page;\n}\n\n/**\n * Render a page that has already been created.\n *\n * @param {Number} pageNumber The page number to be rendered\n * @param {Object} renderOptions The options for rendering\n * @return {Promise} Settled once rendering has completed\n * A settled Promise will be either:\n * - fulfilled: [pdfPage, annotations]\n * - rejected: Error\n */\nexport function renderPage(pageNumber, annotations, renderOptions) {\n let {\n documentId,\n pdfDocument,\n scale,\n rotate\n } = renderOptions;\n\n // Load the page and annotations\n return Promise.all([\n pdfDocument.getPage(pageNumber),\n ]).then(([pdfPage]) => {\n let page = document.getElementById(`pageContainer${pageNumber}`);\n let svg = page.querySelector('.annotationLayer');\n let canvas = page.querySelector('.canvasWrapper canvas');\n let canvasContext = canvas.getContext('2d', {alpha: false});\n let viewport = pdfPage.getViewport(scale, rotate);\n let transform = scalePage(pageNumber, viewport, canvasContext);\n\n // Render the page\n return Promise.all([\n pdfPage.render({ canvasContext, viewport, transform }),\n PDFJSAnnotate.render(svg, viewport, {pageNumber, documentId, annotations:annotations[pageNumber]})\n ]).then(() => {\n // Text content is needed for a11y, but is also necessary for creating\n // highlight and strikeout annotations which require selecting text.\n return pdfPage.getTextContent({normalizeWhitespace: true}).then((textContent) => {\n return new Promise((resolve, reject) => {\n // Render text layer for a11y of text content\n let textLayer = page.querySelector(`.textLayer`);\n let textLayerFactory = new pdfjsViewer.DefaultTextLayerFactory();\n let textLayerBuilder = textLayerFactory.createTextLayerBuilder(textLayer, pageNumber -1, viewport);\n textLayerBuilder.setTextContent(textContent);\n textLayerBuilder.render();\n\n // Enable a11y for annotations\n // Timeout is needed to wait for `textLayerBuilder.render`\n setTimeout(() => {\n try {\n renderScreenReaderHints(annotations.annotations);\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n });\n }).then(() => {\n // Indicate that the page was loaded\n page.setAttribute('data-loaded', 'true');\n\n return [pdfPage, annotations];\n });\n });\n}\n\n/**\n * Scale the elements of a page.\n *\n * @param {Number} pageNumber The page number to be scaled\n * @param {Object} viewport The viewport of the PDF page (see pdfPage.getViewport(scale, rotate))\n * @param {Object} context The canvas context that the PDF page is rendered to\n * @return {Array} The transform data for rendering the PDF page\n */\nfunction scalePage(pageNumber, viewport, context) {\n let page = document.getElementById(`pageContainer${pageNumber}`);\n let canvas = page.querySelector('.canvasWrapper canvas');\n let svg = page.querySelector('.annotationLayer');\n let wrapper = page.querySelector('.canvasWrapper');\n let textLayer = page.querySelector('.textLayer');\n let outputScale = getOutputScale(context);\n let transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n let sfx = approximateFraction(outputScale.sx);\n let sfy = approximateFraction(outputScale.sy);\n\n // Adjust width/height for scale\n page.style.visibility = '';\n canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px';\n canvas.style.height = roundToDivide(viewport.height, sfx[1]) + 'px';\n svg.setAttribute('width', viewport.width);\n svg.setAttribute('height', viewport.height);\n svg.style.width = `${viewport.width}px`;\n svg.style.height = `${viewport.height}px`;\n page.style.width = `${viewport.width}px`;\n page.style.height = `${viewport.height}px`;\n wrapper.style.width = `${viewport.width}px`;\n wrapper.style.height = `${viewport.height}px`;\n textLayer.style.width = `${viewport.width}px`;\n textLayer.style.height = `${viewport.height}px`;\n\n return transform;\n}\n\n/**\n * The following methods are taken from mozilla/pdf.js and as such fall under\n * the Apache License (http://www.apache.org/licenses/).\n *\n * Original source can be found at mozilla/pdf.js:\n * https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js\n */\n\n/**\n * Approximates a float number as a fraction using Farey sequence (max order\n * of 8).\n *\n * @param {Number} x Positive float number\n * @return {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n */\nfunction approximateFraction(x) {\n // Fast path for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n \n // a/b and c/d are neighbours in Farey sequence.\n let a = 0, b = 1, c = 1, d = 1;\n \n // Limit search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n let p = a + c, q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p; d = q;\n } else {\n a = p; b = q;\n }\n }\n\n // Select closest of neighbours to x.\n if (x_ - a / b < c / d - x_) {\n return x_ === x ? [a, b] : [b, a];\n } else {\n return x_ === x ? [c, d] : [d, c];\n }\n}\n\nfunction getOutputScale(ctx) {\n let devicePixelRatio = window.devicePixelRatio || 1;\n let backingStoreRatio = ctx.webkitBackingStorePixelRatio ||\n ctx.mozBackingStorePixelRatio ||\n ctx.msBackingStorePixelRatio ||\n ctx.oBackingStorePixelRatio ||\n ctx.backingStorePixelRatio || 1;\n let pixelRatio = devicePixelRatio / backingStoreRatio;\n return {\n sx: pixelRatio,\n sy: pixelRatio,\n scaled: pixelRatio !== 1\n };\n}\n\nfunction roundToDivide(x, div) {\n let r = x % div;\n return r === 0 ? x : Math.round(x - r + div);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/page.js\n **/","// Color picker component\nconst COLORS = [\n {hex: '#000000', name: 'Black'},\n {hex: '#EF4437', name: 'Red'},\n {hex: '#E71F63', name: 'Pink'},\n {hex: '#8F3E97', name: 'Purple'},\n {hex: '#65499D', name: 'Deep Purple'},\n {hex: '#4554A4', name: 'Indigo'},\n {hex: '#2083C5', name: 'Blue'},\n {hex: '#35A4DC', name: 'Light Blue'},\n {hex: '#09BCD3', name: 'Cyan'},\n {hex: '#009688', name: 'Teal'},\n {hex: '#43A047', name: 'Green'},\n {hex: '#8BC34A', name: 'Light Green'},\n {hex: '#FDC010', name: 'Yellow'},\n {hex: '#F8971C', name: 'Orange'},\n {hex: '#F0592B', name: 'Deep Orange'},\n {hex: '#F06291', name: 'Light Pink'}\n];\n\nexport default function initColorPicker(el, value, onChange) {\n function setColor(value, fireOnChange = true) {\n currentValue = value;\n a.setAttribute('data-color', value);\n a.style.background = value;\n if (fireOnChange && typeof onChange === 'function') {\n onChange(value);\n }\n closePicker();\n }\n\n function togglePicker() {\n if (isPickerOpen) {\n closePicker();\n } else {\n openPicker();\n }\n }\n\n function closePicker() {\n document.removeEventListener('keyup', handleDocumentKeyup);\n if (picker && picker.parentNode) {\n picker.parentNode.removeChild(picker);\n }\n isPickerOpen = false;\n a.focus();\n }\n\n function openPicker() {\n if (!picker) {\n picker = document.createElement('div');\n picker.style.background = '#fff';\n picker.style.border = '1px solid #ccc';\n picker.style.padding = '2px';\n picker.style.position = 'absolute';\n picker.style.width = '122px';\n el.style.position = 'relative';\n\n COLORS.map(createColorOption).forEach((c) => {\n c.style.margin = '2px';\n c.onclick = function () { setColor(c.getAttribute('data-color')); };\n picker.appendChild(c);\n });\n }\n\n document.addEventListener('keyup', handleDocumentKeyup);\n el.appendChild(picker);\n isPickerOpen = true;\n }\n\n function createColorOption(color) {\n let e = document.createElement('a');\n e.className = 'color';\n e.setAttribute('href', 'javascript://');\n e.setAttribute('title', color.name);\n e.setAttribute('data-color', color.hex);\n e.style.background = color.hex;\n return e;\n }\n\n function handleDocumentKeyup(e) {\n if (e.keyCode === 27) {\n closePicker();\n }\n }\n\n let picker;\n let isPickerOpen = false;\n let currentValue;\n let a = createColorOption({hex: value});\n a.onclick = togglePicker;\n el.appendChild(a);\n setColor(value, false);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/initColorPicker.js\n **/"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///static/pdfannotator/pdf-annotate.min.js","webpack:///webpack/bootstrap 4a61aad53751cfea7978","webpack:///./src/index.js","webpack:///./src/PDFJSAnnotate.js","webpack:///./src/adapter/StoreAdapter.js","webpack:///./src/utils/abstractFunction.js","webpack:///./src/UI/event.js","webpack:///./~/events/events.js","webpack:///./src/UI/utils.js","webpack:///./~/create-stylesheet/index.js","webpack:///./src/adapter/CRFPAStoreAdapter.js","webpack:///./~/axios/index.js","webpack:///./~/axios/lib/axios.js","webpack:///./~/axios/lib/utils.js","webpack:///./~/axios/lib/helpers/bind.js","webpack:///./~/is-buffer/index.js","webpack:///./~/axios/lib/core/Axios.js","webpack:///./~/axios/lib/defaults.js","webpack:///./~/process/browser.js","webpack:///./~/axios/lib/helpers/normalizeHeaderName.js","webpack:///./~/axios/lib/adapters/xhr.js","webpack:///./~/axios/lib/core/settle.js","webpack:///./~/axios/lib/core/createError.js","webpack:///./~/axios/lib/core/enhanceError.js","webpack:///./~/axios/lib/helpers/buildURL.js","webpack:///./~/axios/lib/helpers/parseHeaders.js","webpack:///./~/axios/lib/helpers/isURLSameOrigin.js","webpack:///./~/axios/lib/helpers/btoa.js","webpack:///./~/axios/lib/helpers/cookies.js","webpack:///./~/axios/lib/core/InterceptorManager.js","webpack:///./~/axios/lib/core/dispatchRequest.js","webpack:///./~/axios/lib/core/transformData.js","webpack:///./~/axios/lib/cancel/isCancel.js","webpack:///./~/axios/lib/helpers/isAbsoluteURL.js","webpack:///./~/axios/lib/helpers/combineURLs.js","webpack:///./~/axios/lib/cancel/Cancel.js","webpack:///./~/axios/lib/cancel/CancelToken.js","webpack:///./~/axios/lib/helpers/spread.js","webpack:///./src/utils/uuid.js","webpack:///./src/initFile.js","webpack:///./src/UI/comments.js","webpack:///./~/twitter-text/twitter-text.js","webpack:///./src/UI/edit.js","webpack:///./src/render/appendChild.js","webpack:///./~/object-assign/index.js","webpack:///./src/render/renderLine.js","webpack:///./src/utils/setAttributes.js","webpack:///./src/utils/normalizeColor.js","webpack:///./src/render/renderPath.js","webpack:///./src/render/renderPoint.js","webpack:///./src/render/renderRect.js","webpack:///./src/render/renderText.js","webpack:///./src/render/index.js","webpack:///./src/a11y/renderScreenReaderHints.js","webpack:///./src/a11y/insertScreenReaderHint.js","webpack:///./src/a11y/createScreenReaderOnly.js","webpack:///./src/a11y/insertElementWithinChildren.js","webpack:///./src/a11y/insertElementWithinElement.js","webpack:///./src/a11y/renderScreenReaderComments.js","webpack:///./src/a11y/insertScreenReaderComment.js","webpack:///./src/a11y/initEventHandlers.js","webpack:///./src/UI/index.js","webpack:///./src/UI/pen.js","webpack:///./src/UI/point.js","webpack:///./src/UI/rect.js","webpack:///./src/UI/text.js","webpack:///./src/UI/page.js","webpack:///./src/initColorPicker.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","render","pdfjsLib","getDocument","RENDER_OPTIONS","documentId","then","pdf","pdfDocument","viewer","document","getElementById","innerHTML","NUM_PAGES","_pdfInfo","numPages","i","page","UI","createPage","appendChild","PDFJSAnnotate","getAnnotations","annotations","_loop","num","getPage","renderPage","_ref","_ref2","_slicedToArray","pdfPage","viewport","getViewport","scale","rotate","PAGE_HEIGHT","height","$","browser","mozilla","remove","Object","defineProperty","value","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","length","err","Array","isArray","TypeError","_PDFJSAnnotate","_PDFJSAnnotate2","_initFile","_twitterText","_initColorPicker","_initColorPicker2","_comments","documentUrl","enhanceTextSelection","parseFloat","localStorage","getItem","parseInt","setStoreAdapter","CRFPAStoreAdapter","setActiveToolbarItem","type","button","tooltype","active","querySelector","classList","disableEdit","disablePen","disableText","disablePoint","disableRect","add","setItem","enableEdit","enablePen","enableText","enablePoint","enableRect","readonly","initText","setText","size","color","initPen","Option","setPen","penColor","penSize","modified","selected","removeAttribute","setAttribute","handlePenSizeChange","e","target","addEventListener","handleToolbarClick","nodeName","getAttribute","setScaleRotate","handleScaleChange","handleRotateCWClick","handleRotateCCWClick","renderComments","_StoreAdapter","_StoreAdapter2","_CRFPAStoreAdapter","_CRFPAStoreAdapter2","_render","_render2","_UI","_UI2","StoreAdapter","__storeAdapter","getStoreAdapter","adapter","_getStoreAdapter","apply","arguments","_classCallCheck","instance","Constructor","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","prototype","_abstractFunction","_abstractFunction2","_event","_this","definition","keys","forEach","annotationId","pageNumber","annotation","content","commentId","get","__getAnnotations","set","fn","__addAnnotation","fireEvent","__editAnnotation","__deleteAnnotation","success","__addComment","comment","__deleteComment","abstractFunction","name","Error","emitter","emit","on","removeEventListener","removeListener","_events","_events2","_utils","EventEmitter","clickNode","findSVGAtPoint","clientX","clientY","findAnnotationAtPoint","_maxListeners","isFunction","arg","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","n","isNaN","er","handler","len","args","listeners","error","context","slice","addListener","listener","newListener","warned","console","trace","once","g","fired","list","position","splice","removeAllListeners","ret","listenerCount","evlistener","findSVGContainer","node","parentNode","toUpperCase","x","y","elements","querySelectorAll","l","el","rect","getBoundingClientRect","pointIntersectsRect","svg","getOffsetAnnotationRect","top","bottom","left","right","getAnnotationRect","_getOffset","getOffset","offsetLeft","offsetTop","h","w","LINE_OFFSET","toLowerCase","minX","maxX","minY","maxY","replace","split","s","map","width","_getOffset2","result","includes","scaleUp","_getMetadata","getMetadata","scaleDown","_getMetadata2","getScroll","scrollTop","scrollLeft","disableUserSelect","userSelectStyleSheet","head","enableUserSelect","removeChild","JSON","parse","BORDER_COLOR","_createStylesheet","_createStylesheet2","body","-webkit-user-select","-moz-user-select","-ms-user-select","user-select","processRuleSet","selector","block","processDeclarationBlock","prop","processDeclaration","join","hyphenate","match","blocks","style","createElement","text","createTextNode","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_axios","_axios2","_uuid","_uuid2","_StoreAdapter3","axios","defaults","xsrfCookieName","xsrfHeaderName","API","baseURL","timeout","withCredentials","headers","Accept","Content-Type","Access-Control-Allow-Origin","getPrototypeOf","params","fileUuid","response","data","getAnnotation","addAnnotation","uuid","post","editAnnotation","deleteAnnotation","getComments","addComment","createInstance","defaultConfig","Axios","bind","request","utils","extend","instanceConfig","merge","Cancel","CancelToken","isCancel","all","promises","Promise","spread","val","toString","isArrayBuffer","isFormData","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isString","isDate","isFile","isBlob","isStream","pipe","isURLSearchParams","URLSearchParams","trim","str","isStandardBrowserEnv","navigator","product","window","hasOwnProperty","assignValue","a","b","thisArg","isBuffer","isSlowBuffer","readFloatLE","_isBuffer","interceptors","InterceptorManager","dispatchRequest","config","url","method","chain","promise","resolve","interceptor","unshift","fulfilled","rejected","shift","process","setContentTypeIfUnset","getDefaultAdapter","XMLHttpRequest","normalizeHeaderName","DEFAULT_CONTENT_TYPE","transformRequest","stringify","transformResponse","maxContentLength","validateStatus","status","common","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","run","Item","array","noop","nextTick","title","env","argv","version","versions","off","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","normalizedName","settle","buildURL","parseHeaders","isURLSameOrigin","createError","btoa","reject","requestData","requestHeaders","loadEvent","xDomain","NODE_ENV","XDomainRequest","onprogress","ontimeout","auth","username","password","Authorization","open","paramsSerializer","readyState","responseURL","indexOf","responseHeaders","getAllResponseHeaders","responseData","responseType","responseText","statusText","onerror","cookies","xsrfValue","read","setRequestHeader","onDownloadProgress","onUploadProgress","upload","cancelToken","cancel","abort","send","enhanceError","message","code","encode","encodeURIComponent","serializedParams","parts","v","toISOString","ignoreDuplicateOf","parsed","line","substr","resolveURL","href","msie","urlParsingNode","protocol","host","search","hash","hostname","port","pathname","charAt","originURL","test","userAgent","location","requestURL","E","input","charCode","String","output","idx","chars","charCodeAt","write","expires","path","domain","secure","cookie","Date","toGMTString","RegExp","decodeURIComponent","now","handlers","use","eject","throwIfCancellationRequested","throwIfRequested","transformData","isAbsoluteURL","combineURLs","reason","fns","__CANCEL__","relativeURL","executor","resolvePromise","token","source","callback","replacement","r","Math","random","PATTERN","REGEXP","dataset","filepath","comments","commentList","html","commentForm","hide","insertComment","child","addClass","attr","twitter","autoLink","htmlEscape","handleCommentClick","append","selectComment","scrollToView","element","offset","is","css","visibility","show","display","visible_area_start","visible_area_end","innerHeight","hasClass","animate","removeClass","_edit","createEditOverlay","_twitterText2","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","regexSupplant","regex","flags","global","ignoreCase","multiline","newRegex","twttr","txt","regexen","stringSupplant","values","clone","o","k","isValidMatch","string","optional","HTML_ENTITIES","&",">","<","\"","'","character","spaces_group","spaces","invalid_chars_group","invalid_chars","punct","rtl_chars","non_bmp_code_pairs","latinAccentChars","bmpLetterAndMarks","astralLetterAndMarks","bmpNumerals","astralNumerals","hashtagSpecialChars","hashSigns","hashtagAlpha","hashtagAlphaNumeric","endHashtagMatch","codePoint","hashtagBoundary","validHashtag","validMentionPrecedingChars","atSigns","validMentionOrList","validReply","endMentionMatch","validUrlPrecedingChars","invalidUrlWithoutProtocolPrecedingChars","invalidDomainChars","validDomainChars","validSubdomain","validDomainName","validGTLD","validCCTLD","validPunycode","validSpecialCCTLD","validDomain","validAsciiDomain","invalidShortDomain","validSpecialShortDomain","validPortNumber","cyrillicLettersAndMarks","validGeneralUrlPathChars","validUrlBalancedParens","validUrlPathEndingChars","validUrlPath","validUrlQueryChars","validUrlQueryEndingChars","extractUrl","validTcoUrl","urlHasProtocol","urlHasHttps","cashtag","validCashtag","validateUrlUnreserved","validateUrlPctEncoded","validateUrlSubDelims","validateUrlPchar","validateUrlScheme","validateUrlUserinfo","validateUrlDecOctet","validateUrlIpv4","validateUrlIpv6","validateUrlIp","validateUrlSubDomainSegment","validateUrlDomainSegment","validateUrlDomainTld","validateUrlDomain","validateUrlHost","validateUrlUnicodeSubDomainSegment","validateUrlUnicodeDomainSegment","validateUrlUnicodeDomainTld","validateUrlUnicodeDomain","validateUrlUnicodeHost","validateUrlPort","validateUrlUnicodeAuthority","validateUrlAuthority","validateUrlPath","validateUrlQuery","validateUrlFragment","validateUrlUnencoded","DEFAULT_LIST_CLASS","DEFAULT_USERNAME_CLASS","DEFAULT_HASHTAG_CLASS","DEFAULT_CASHTAG_CLASS","OPTIONS_NOT_ATTRIBUTES","urlClass","listClass","usernameClass","hashtagClass","cashtagClass","usernameUrlBase","listUrlBase","hashtagUrlBase","cashtagUrlBase","usernameUrlBlock","listUrlBlock","hashtagUrlBlock","linkUrlBlock","usernameIncludeSymbol","suppressLists","suppressNoFollow","targetBlank","suppressDataScreenName","urlEntities","symbolTag","textWithSymbolTag","urlTarget","invisibleTagAttrs","linkAttributeBlock","linkTextBlock","htmlEscapeNonEntities","BOOLEAN_ATTRIBUTES","disabled","multiple","checked","tagAttrs","attributes","htmlAttrs","linkToText","entity","options","rel","d","linkToTextWithSymbol","symbol","taggedSymbol","taggedText","linkToHashtag","substring","indices","hashtag","attrs","linkToCashtag","linkToMentionAndList","at","user","screenName","slashListname","listSlug","isList","linkToUrl","displayUrl","linkText","urlEntity","display_url","linkTextWithEntity","expanded_url","expandedUrl","displayUrlSansEllipses","displayUrlIndex","beforeDisplayUrl","afterDisplayUrl","precedingEllipsis","followingEllipsis","autoLinkEntities","entities","extractHtmlAttrsFromOptions","beginIndex","sort","nonEntity","autoLinkWithJSON","json","user_mentions","screen_name","hashtags","symbols","modifyIndicesFromUnicodeToUTF16","extractEntitiesWithIndices","extractUrlsWithoutProtocol","autoLinkUsernamesOrLists","extractMentionsOrListsWithIndices","autoLinkHashtags","extractHashtagsWithIndices","autoLinkCashtags","extractCashtagsWithIndices","autoLinkUrlsCustom","extractUrlsWithIndices","removeOverlappingEntities","prev","checkUrlOverlap","extractMentions","screenNamesOnly","screenNamesWithIndices","extractMentionsWithIndices","mentionOrList","mentions","mentionsOrLists","possibleNames","before","atSign","chunk","after","startPosition","endPosition","extractReplies","possibleScreenName","rightContext","extractUrls","urlsOnly","urlsWithIndices","urls","exec","$2","$3","$4","$5","$7","lastIndex","lastMatch","lastUrl","asciiEndPosition","asciiDomain","asciiStartPosition","extractHashtags","hashtagsOnly","hashtagsWithIndices","tags","hashText","extractCashtags","cashtagsOnly","cashtagsWithIndices","dollar","convertUnicodeIndices","modifyIndicesFromUTF16ToUnicode","getUnicodeTextLength","indicesInUTF16","charIndex","codePointIndex","entityIndex","splitTags","secondSplits","firstSplits","allSplits","j","hitHighlight","hits","defaultHighlightTag","index","hit","tag","placed","hitSpot","tagName","chunks","chunkIndex","prevChunksLen","chunkCursor","startInChunk","chunkChars","flatHits","MAX_LENGTH","getTweetLength","short_url_length","short_url_length_https","textLength","isInvalidTweet","hasInvalidCharacters","isValidTweetText","isValidUsername","extracted","VALID_LIST_RE","isValidList","usernameList","isValidHashtag","isValidUrl","unicodeDomains","requireProtocol","urlParts","scheme","authority","query","fragment","_toConsumableArray","arr2","from","destroyEditOverlay","overlay","anchor","styleLeft","OVERLAY_BORDER_SIZE","styleTop","boxSizing","border","borderRadius","background","fontSize","padding","textAlign","textDecoration","handleDocumentClick","handleDocumentKeyup","handleDocumentMousedown","borderColor","boxShadow","isDragging","handleDocumentMousemove","handleDocumentMouseup","nodes","keyCode","dragOffsetX","dragOffsetY","dragStartX","dragStartY","cursor","offsetHeight","offsetWidth","getDelta","propX","propY","calcDelta","deltaX","deltaY","_getDelta","t","modelY","viewY","rectangles","modelX","viewX","_annotation$lines$","lines","originX","originY","_calcDelta","_annotation$lines$i","_appendChild2","handleAnnotationClick","_enabled","_appendChild","getTranslation","rotation","transform","trans","isFirefox","_objectAssign2","_renderRect2","_renderLine2","_renderPoint2","_renderText2","_renderPath2","_objectAssign","_renderLine","_renderPath","_renderPoint","_renderRect","_renderText","toObject","shouldUseNative","assign","test1","getOwnPropertyNames","test2","fromCharCode","order2","test3","letter","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","to","renderLine","group","createElementNS","_setAttributes2","stroke","_normalizeColor2","strokeWidth","x1","y1","x2","y2","_setAttributes","_normalizeColor","setAttributes","keyCase","UPPER_REGEX","BLACKLIST","normalizeColor","REGEX_HASHLESS_HEX","renderPath","p1","p2","fill","renderPoint","outerSVG","innerSVG","SIZE","viewBox","D","renderRect","fillOpacity","createRect","renderText","_renderScreenReaderHints","renderScreenReaderHints","SORT_TYPES","sortBy","filter","_insertScreenReaderHint2","sortByPoint","sortByRectPoint","sortByLinePoint","lineA","lineB","_insertScreenReaderHint","_initEventHandlers","_initEventHandlers2","highlight","strikeout","drawing","textbox","point","area","insertScreenReaderHint","rects","first","last","_insertElementWithinElement2","_createScreenReaderOnly2","_insertElementWithinChildren2","COMMENT_TYPES","_renderScreenReaderComments2","_createScreenReaderOnly","_insertElementWithinChildren","_insertElementWithinElement","_renderScreenReaderComments","createScreenReaderOnly","overflow","insertElementWithinChildren","insertBefore","textLayer","textRect","insertElementWithinElement","OFFSET_ADJUST","max","textLayerElementFromPoint","temp","cloneNode","tail","pop","outerHTML","renderScreenReaderComments","insertScreenReaderComment","_insertScreenReaderComment","_insertScreenReaderComment2","item","initEventHandlers","reorderAnnotationsByType","removeAnnotation","removeComment","annotationsByPage","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","removeElementById","elementId","_renderScreenReaderHints2","_pen","_point","_rect","_text","_page","_penSize","_penColor","savePoint","handleInputBlur","handleInputKeyup","focus","closeInput","getSelectionRects","selection","getSelection","range","getRangeAt","getClientRects","_type","saveRect","removeAllRanges","boundingRect","_textSize","saveText","_textColor","log","textSize","textColor","PAGE_TEMPLATE","children","canvas","mozOpaque","renderOptions","canvasContext","getContext","alpha","scalePage","getTextContent","normalizeWhitespace","textContent","textLayerFactory","pdfjsViewer","DefaultTextLayerFactory","textLayerBuilder","createTextLayerBuilder","setTextContent","wrapper","outputScale","getOutputScale","scaled","sx","sy","sfx","approximateFraction","sfy","roundToDivide","floor","xinv","limit","x_","q","ctx","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","div","round","initColorPicker","onChange","setColor","fireOnChange","currentValue","closePicker","togglePicker","isPickerOpen","openPicker","picker","COLORS","createColorOption","margin","onclick","className","hex"],"mappings":"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","file":"static/pdfannotator/pdf-annotate.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"PDFAnnotate\"] = factory();\n\telse\n\t\troot[\"PDFAnnotate\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"PDFAnnotate\"] = factory();\n\telse\n\t\troot[\"PDFAnnotate\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tvar _twitterText = __webpack_require__(39);\n\t\n\tvar _twitterText2 = _interopRequireDefault(_twitterText);\n\t\n\tvar _initColorPicker = __webpack_require__(65);\n\t\n\tvar _initColorPicker2 = _interopRequireDefault(_initColorPicker);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar UI = _PDFJSAnnotate2.default.UI;\n\t\n\t\n\tvar PAGE_HEIGHT = void 0;\n\tvar RENDER_OPTIONS = {\n\t documentId: _initFile.documentUrl,\n\t pdfDocument: null,\n\t enhanceTextSelection: true,\n\t scale: parseFloat(localStorage.getItem(_initFile.documentId + '/scale'), 10) || 1.33,\n\t rotate: parseInt(localStorage.getItem(_initFile.documentId + '/rotate'), 10) || 0\n\t};\n\t\n\t_PDFJSAnnotate2.default.setStoreAdapter(new _PDFJSAnnotate2.default.CRFPAStoreAdapter());\n\t// pdfjsLib.workerSrc = '/static/pdfannotator/pdf.worker.js';\n\t\n\t// Render stuff\n\t\n\t// let renderedPages = {};\n\t// document.getElementById('content-wrapper').addEventListener('scroll', function (e) {\n\t// let visiblePageNum = Math.round(e.target.scrollTop / PAGE_HEIGHT) + 1;\n\t// let visiblePage = document.querySelector(`.page[data-page-number=\"${visiblePageNum}\"][data-loaded=\"false\"]`);\n\t// if (visiblePage) {\n\t// // Prevent invoking UI.renderPage on the same page more than once.\n\t// \tif ( !renderedPages[visiblePageNum] ) {\n\t// \t renderedPages[visiblePageNum] = true;\n\t// \t setTimeout(function () {\n\t// \t\tUI.renderPage(visiblePageNum, RENDER_OPTIONS);\n\t// \t });\n\t// \t}\n\t// }\n\t// });\n\t\n\tvar NUM_PAGES = 0;\n\tfunction render() {\n\t\n\t pdfjsLib.getDocument(RENDER_OPTIONS.documentId).then(function (pdf) {\n\t RENDER_OPTIONS.pdfDocument = pdf;\n\t\n\t var viewer = document.getElementById('viewer');\n\t viewer.innerHTML = '';\n\t NUM_PAGES = pdf._pdfInfo.numPages;\n\t for (var i = 0; i < NUM_PAGES; i++) {\n\t var page = UI.createPage(i + 1);\n\t viewer.appendChild(page);\n\t }\n\t\n\t _PDFJSAnnotate2.default.getAnnotations(_initFile.documentId).then(function (annotations) {\n\t var _loop = function _loop(num) {\n\t pdf.getPage(num).then(function () {\n\t UI.renderPage(num, annotations, RENDER_OPTIONS).then(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t pdfPage = _ref2[0],\n\t annotations = _ref2[1];\n\t\n\t var viewport = pdfPage.getViewport(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate);\n\t PAGE_HEIGHT = viewport.height;\n\t if ($.browser.mozilla) $('.textLayer>.endOfContent').remove();\n\t });\n\t });\n\t };\n\t\n\t for (var num = 1; num <= NUM_PAGES; num++) {\n\t _loop(num);\n\t }\n\t });\n\t });\n\t}\n\trender();\n\t\n\tvar setActiveToolbarItem = function setActiveToolbarItem(type, button) {\n\t var tooltype = localStorage.getItem(RENDER_OPTIONS.documentId + '/tooltype') || 'cursor';\n\t var active = document.querySelector('.toolbar button.active');\n\t if (active) {\n\t active.classList.remove('active');\n\t\n\t switch (tooltype) {\n\t case 'cursor':\n\t UI.disableEdit();\n\t break;\n\t case 'draw':\n\t UI.disablePen();\n\t break;\n\t case 'text':\n\t UI.disableText();\n\t break;\n\t case 'point':\n\t UI.disablePoint();\n\t break;\n\t case 'area':\n\t case 'highlight':\n\t case 'strikeout':\n\t UI.disableRect();\n\t break;\n\t }\n\t }\n\t\n\t if (button) {\n\t button.classList.add('active');\n\t }\n\t if (tooltype !== type) {\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/tooltype', type);\n\t }\n\t tooltype = type;\n\t\n\t switch (type) {\n\t case 'cursor':\n\t UI.enableEdit();\n\t break;\n\t case 'draw':\n\t UI.enablePen();\n\t break;\n\t case 'text':\n\t UI.enableText();\n\t break;\n\t case 'point':\n\t UI.enablePoint();\n\t break;\n\t case 'area':\n\t case 'highlight':\n\t case 'strikeout':\n\t UI.enableRect(type);\n\t break;\n\t }\n\t};\n\t_PDFJSAnnotate2.default.setActiveToolbarItem = setActiveToolbarItem;\n\t\n\tif (!_initFile.readonly) {\n\t // Text stuff\n\t (function () {\n\t var textSize = void 0;\n\t var textColor = void 0;\n\t\n\t function initText() {\n\t // let size = document.querySelector('.toolbar .text-size');\n\t // [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96].forEach((s) => {\n\t // size.appendChild(new Option(s, s));\n\t // });\n\t //\n\t // setText(\n\t // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/size`) || 12,\n\t // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/color`) || '#EF4437'\n\t // );\n\t setText(12, '#EF4437');\n\t\n\t // initColorPicker(document.querySelector('.text-color'), textColor, function (value) {\n\t // setText(textSize, value);\n\t // });\n\t }\n\t\n\t function setText(size, color) {\n\t // let modified = false;\n\t //\n\t // if (textSize !== size) {\n\t // modified = true;\n\t // textSize = size;\n\t // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/size`, textSize);\n\t // // document.querySelector('.toolbar .text-size').value = textSize;\n\t // }\n\t //\n\t // if (textColor !== color) {\n\t // modified = true;\n\t // textColor = color;\n\t // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/color`, textColor);\n\t //\n\t // let selected = document.querySelector('.toolbar .text-color.color-selected');\n\t // if (selected) {\n\t // selected.classList.remove('color-selected');\n\t // selected.removeAttribute('aria-selected');\n\t // }\n\t //\n\t // selected = document.querySelector(`.toolbar .text-color[data-color=\"${color}\"]`);\n\t // if (selected) {\n\t // selected.classList.add('color-selected');\n\t // selected.setAttribute('aria-selected', true);\n\t // }\n\t //\n\t // }\n\t\n\t // if (modified) {\n\t UI.setText(size, color);\n\t // }\n\t }\n\t\n\t // function handleTextSizeChange(e) {\n\t // setText(e.target.value, textColor);\n\t // }\n\t\n\t // document.querySelector('.toolbar .text-size').addEventListener('change', handleTextSizeChange);\n\t\n\t initText();\n\t })();\n\t\n\t // Pen stuff\n\t (function () {\n\t var penSize = void 0;\n\t var penColor = void 0;\n\t\n\t function initPen() {\n\t var size = document.querySelector('.toolbar .pen-size');\n\t for (var i = 0; i < 20; i++) {\n\t size.appendChild(new Option(i + 1, i + 1));\n\t }\n\t\n\t setPen(localStorage.getItem(RENDER_OPTIONS.documentId + '/pen/size') || 1, localStorage.getItem(RENDER_OPTIONS.documentId + '/pen/color') || '#000000');\n\t\n\t (0, _initColorPicker2.default)(document.querySelector('.pen-color'), penColor, function (value) {\n\t setPen(penSize, value);\n\t });\n\t }\n\t\n\t function setPen(size, color) {\n\t var modified = false;\n\t\n\t if (penSize !== size) {\n\t modified = true;\n\t penSize = size;\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/pen/size', penSize);\n\t document.querySelector('.toolbar .pen-size').value = penSize;\n\t }\n\t\n\t if (penColor !== color) {\n\t modified = true;\n\t penColor = color;\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/pen/color', penColor);\n\t\n\t var selected = document.querySelector('.toolbar .pen-color.color-selected');\n\t if (selected) {\n\t selected.classList.remove('color-selected');\n\t selected.removeAttribute('aria-selected');\n\t }\n\t\n\t selected = document.querySelector('.toolbar .pen-color[data-color=\"' + color + '\"]');\n\t if (selected) {\n\t selected.classList.add('color-selected');\n\t selected.setAttribute('aria-selected', true);\n\t }\n\t }\n\t\n\t if (modified) {\n\t UI.setPen(penSize, penColor);\n\t }\n\t }\n\t\n\t function handlePenSizeChange(e) {\n\t setPen(e.target.value, penColor);\n\t }\n\t\n\t document.querySelector('.toolbar .pen-size').addEventListener('change', handlePenSizeChange);\n\t\n\t initPen();\n\t })();\n\t\n\t // Toolbar buttons\n\t (function () {\n\t var tooltype = localStorage.getItem(RENDER_OPTIONS.documentId + '/tooltype') || 'cursor';\n\t if (tooltype) {\n\t setActiveToolbarItem(tooltype, document.querySelector('.toolbar button[data-tooltype=' + tooltype + ']'));\n\t }\n\t\n\t function handleToolbarClick(e) {\n\t if (e.target.nodeName === 'BUTTON') {\n\t setActiveToolbarItem(e.target.getAttribute('data-tooltype'), e.target);\n\t }\n\t }\n\t\n\t document.querySelector('.toolbar').addEventListener('click', handleToolbarClick);\n\t })();\n\t}\n\t\n\tif (_initFile.readonly) UI.enableEdit();\n\t\n\t// Scale/rotate\n\t(function () {\n\t function setScaleRotate(scale, rotate) {\n\t scale = parseFloat(scale, 10);\n\t rotate = parseInt(rotate, 10);\n\t\n\t if (RENDER_OPTIONS.scale !== scale || RENDER_OPTIONS.rotate !== rotate) {\n\t RENDER_OPTIONS.scale = scale;\n\t RENDER_OPTIONS.rotate = rotate;\n\t\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/scale', RENDER_OPTIONS.scale);\n\t localStorage.setItem(RENDER_OPTIONS.documentId + '/rotate', RENDER_OPTIONS.rotate % 360);\n\t\n\t render();\n\t }\n\t }\n\t\n\t function handleScaleChange(e) {\n\t setScaleRotate(e.target.value, RENDER_OPTIONS.rotate);\n\t }\n\t\n\t function handleRotateCWClick() {\n\t setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate + 90);\n\t }\n\t\n\t function handleRotateCCWClick() {\n\t setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate - 90);\n\t }\n\t\n\t document.querySelector('.toolbar select.scale').value = RENDER_OPTIONS.scale;\n\t document.querySelector('.toolbar select.scale').addEventListener('change', handleScaleChange);\n\t document.querySelector('.toolbar .rotate-ccw').addEventListener('click', handleRotateCCWClick);\n\t document.querySelector('.toolbar .rotate-cw').addEventListener('click', handleRotateCWClick);\n\t})();\n\t\n\t(0, _comments.renderComments)(_initFile.documentId);\n\t\n\texports.default = _PDFJSAnnotate2.default;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _StoreAdapter = __webpack_require__(2);\n\t\n\tvar _StoreAdapter2 = _interopRequireDefault(_StoreAdapter);\n\t\n\tvar _CRFPAStoreAdapter = __webpack_require__(8);\n\t\n\tvar _CRFPAStoreAdapter2 = _interopRequireDefault(_CRFPAStoreAdapter);\n\t\n\tvar _render = __webpack_require__(50);\n\t\n\tvar _render2 = _interopRequireDefault(_render);\n\t\n\tvar _UI = __webpack_require__(59);\n\t\n\tvar _UI2 = _interopRequireDefault(_UI);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t /**\n\t * Abstract class that needs to be defined so PDFJSAnnotate\n\t * knows how to communicate with your server.\n\t */\n\t StoreAdapter: _StoreAdapter2.default,\n\t\n\t /**\n\t * Implementation of StoreAdapter that stores annotation data to localStorage.\n\t */\n\t CRFPAStoreAdapter: _CRFPAStoreAdapter2.default,\n\t\n\t /**\n\t * Abstract instance of StoreAdapter\n\t */\n\t __storeAdapter: new _StoreAdapter2.default(),\n\t\n\t /**\n\t * Getter for the underlying StoreAdapter property\n\t *\n\t * @return {StoreAdapter}\n\t */\n\t getStoreAdapter: function getStoreAdapter() {\n\t return this.__storeAdapter;\n\t },\n\t\n\t\n\t /**\n\t * Setter for the underlying StoreAdapter property\n\t *\n\t * @param {StoreAdapter} adapter The StoreAdapter implementation to be used.\n\t */\n\t setStoreAdapter: function setStoreAdapter(adapter) {\n\t // TODO this throws an error when bundled\n\t // if (!(adapter instanceof StoreAdapter)) {\n\t // throw new Error('adapter must be an instance of StoreAdapter');\n\t // }\n\t\n\t this.__storeAdapter = adapter;\n\t },\n\t\n\t\n\t /**\n\t * UI is a helper for instrumenting UI interactions for creating,\n\t * editing, and deleting annotations in the browser.\n\t */\n\t UI: _UI2.default,\n\t\n\t /**\n\t * Render the annotations for a page in the PDF Document\n\t *\n\t * @param {SVGElement} svg The SVG element that annotations should be rendered to\n\t * @param {PageViewport} viewport The PDFPage.getViewport data\n\t * @param {Object} data The StoreAdapter.getAnnotations data\n\t * @return {Promise}\n\t */\n\t render: _render2.default,\n\t\n\t /**\n\t * Convenience method for getting annotation data\n\t *\n\t * @alias StoreAdapter.getAnnotations\n\t * @param {String} documentId The ID of the document\n\t * @return {Promise}\n\t */\n\t getAnnotations: function getAnnotations(documentId) {\n\t var _getStoreAdapter;\n\t\n\t return (_getStoreAdapter = this.getStoreAdapter()).getAnnotations.apply(_getStoreAdapter, arguments);\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _abstractFunction = __webpack_require__(3);\n\t\n\tvar _abstractFunction2 = _interopRequireDefault(_abstractFunction);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// Adapter should never be invoked publicly\n\tvar StoreAdapter = function () {\n\t /**\n\t * Create a new StoreAdapter instance\n\t *\n\t * @param {Object} [definition] The definition to use for overriding abstract methods\n\t */\n\t function StoreAdapter() {\n\t var _this = this;\n\t\n\t var definition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t\n\t _classCallCheck(this, StoreAdapter);\n\t\n\t // Copy each function from definition if it is a function we know about\n\t Object.keys(definition).forEach(function (key) {\n\t if (typeof definition[key] === 'function' && typeof _this[key] === 'function') {\n\t _this[key] = definition[key];\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Get all the annotations for a given document and page number.\n\t *\n\t * @param {String} documentId The ID for the document the annotations belong to\n\t * @param {Number} pageNumber The number of the page the annotations belong to\n\t * @return {Promise}\n\t */\n\t\n\t\n\t _createClass(StoreAdapter, [{\n\t key: '__getAnnotations',\n\t value: function __getAnnotations(documentId) {\n\t (0, _abstractFunction2.default)('getAnnotations');\n\t }\n\t }, {\n\t key: 'getAnnotation',\n\t\n\t\n\t /**\n\t * Get the definition for a specific annotation.\n\t *\n\t * @param {String} documentId The ID for the document the annotation belongs to\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function getAnnotation(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('getAnnotation');\n\t }\n\t\n\t /**\n\t * Add an annotation\n\t *\n\t * @param {String} documentId The ID for the document to add the annotation to\n\t * @param {String} pageNumber The page number to add the annotation to\n\t * @param {Object} annotation The definition for the new annotation\n\t * @return {Promise}\n\t */\n\t\n\t }, {\n\t key: '__addAnnotation',\n\t value: function __addAnnotation(documentId, pageNumber, annotation) {\n\t (0, _abstractFunction2.default)('addAnnotation');\n\t }\n\t }, {\n\t key: '__editAnnotation',\n\t\n\t\n\t /**\n\t * Edit an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} pageNumber the page number of the annotation\n\t * @param {Object} annotation The definition of the modified annotation\n\t * @return {Promise}\n\t */\n\t value: function __editAnnotation(documentId, pageNumber, annotation) {\n\t (0, _abstractFunction2.default)('editAnnotation');\n\t }\n\t }, {\n\t key: '__deleteAnnotation',\n\t\n\t\n\t /**\n\t * Delete an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function __deleteAnnotation(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('deleteAnnotation');\n\t }\n\t }, {\n\t key: 'getComments',\n\t\n\t\n\t /**\n\t * Get all the comments for an annotation\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @return {Promise}\n\t */\n\t value: function getComments(documentId, annotationId) {\n\t (0, _abstractFunction2.default)('getComments');\n\t }\n\t\n\t /**\n\t * Add a new comment\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} annotationId The ID for the annotation\n\t * @param {Object} content The definition of the comment\n\t * @return {Promise}\n\t */\n\t\n\t }, {\n\t key: '__addComment',\n\t value: function __addComment(documentId, annotationId, content) {\n\t (0, _abstractFunction2.default)('addComment');\n\t }\n\t }, {\n\t key: '__deleteComment',\n\t\n\t\n\t /**\n\t * Delete a comment\n\t *\n\t * @param {String} documentId The ID for the document\n\t * @param {String} commentId The ID for the comment\n\t * @return {Promise}\n\t */\n\t value: function __deleteComment(documentId, commentId) {\n\t (0, _abstractFunction2.default)('deleteComment');\n\t }\n\t }, {\n\t key: 'getAnnotations',\n\t get: function get() {\n\t return this.__getAnnotations;\n\t },\n\t set: function set(fn) {\n\t this.__getAnnotations = function getAnnotations(documentId) {\n\t return fn.apply(undefined, arguments).then(function (annotations) {\n\t // TODO may be best to have this happen on the server\n\t // if (annotations) {\n\t // annotations.forEach((a) => {\n\t // a.documentId = documentId;\n\t // });\n\t // }\n\t return annotations;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'addAnnotation',\n\t get: function get() {\n\t return this.__addAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__addAnnotation = function addAnnotation(documentId, pageNumber, annotation) {\n\t return fn.apply(undefined, arguments).then(function (annotation) {\n\t (0, _event.fireEvent)('annotation:add', documentId, pageNumber, annotation);\n\t return annotation;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'editAnnotation',\n\t get: function get() {\n\t return this.__editAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__editAnnotation = function editAnnotation(documentId, annotationId, annotation) {\n\t return fn.apply(undefined, arguments).then(function (annotation) {\n\t (0, _event.fireEvent)('annotation:edit', documentId, annotationId, annotation);\n\t return annotation;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'deleteAnnotation',\n\t get: function get() {\n\t return this.__deleteAnnotation;\n\t },\n\t set: function set(fn) {\n\t this.__deleteAnnotation = function deleteAnnotation(documentId, annotationId) {\n\t return fn.apply(undefined, arguments).then(function (success) {\n\t if (success) {\n\t (0, _event.fireEvent)('annotation:delete', documentId, annotationId);\n\t }\n\t return success;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'addComment',\n\t get: function get() {\n\t return this.__addComment;\n\t },\n\t set: function set(fn) {\n\t this.__addComment = function addComment(documentId, annotationId, content) {\n\t return fn.apply(undefined, arguments).then(function (comment) {\n\t (0, _event.fireEvent)('comment:add', documentId, annotationId, comment);\n\t return comment;\n\t });\n\t };\n\t }\n\t }, {\n\t key: 'deleteComment',\n\t get: function get() {\n\t return this.__deleteComment;\n\t },\n\t set: function set(fn) {\n\t this.__deleteComment = function deleteComment(documentId, commentId) {\n\t return fn.apply(undefined, arguments).then(function (success) {\n\t if (success) {\n\t (0, _event.fireEvent)('comment:delete', documentId, commentId);\n\t }\n\t return success;\n\t });\n\t };\n\t }\n\t }]);\n\t\n\t return StoreAdapter;\n\t}();\n\t\n\texports.default = StoreAdapter;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = abstractFunction;\n\t/**\n\t * Throw an Error for an abstract function that hasn't been implemented.\n\t *\n\t * @param {String} name The name of the abstract function\n\t */\n\tfunction abstractFunction(name) {\n\t throw new Error(name + ' is not implemented');\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.fireEvent = fireEvent;\n\texports.addEventListener = addEventListener;\n\texports.removeEventListener = removeEventListener;\n\t\n\tvar _events = __webpack_require__(5);\n\t\n\tvar _events2 = _interopRequireDefault(_events);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar emitter = new _events2.default();\n\t\n\tvar clickNode = void 0;\n\t\n\t/**\n\t * Handle document.click event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\t// document.addEventListener('mousedown', function handleDocumentClick(e) {\n\t\n\tdocument.addEventListener('click', function handleDocumentClick(e) {\n\t if (!(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t var target = (0, _utils.findAnnotationAtPoint)(e.clientX, e.clientY);\n\t\n\t // Emit annotation:blur if clickNode is no longer clicked\n\t if (clickNode && clickNode !== target) {\n\t emitter.emit('annotation:blur', clickNode);\n\t }\n\t\n\t // Emit annotation:click if target was clicked\n\t if (target) {\n\t emitter.emit('annotation:click', target);\n\t }\n\t\n\t clickNode = target;\n\t});\n\t\n\t// let mouseOverNode;\n\t// document.addEventListener('mousemove', function handleDocumentMousemove(e) {\n\t// let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\t//\n\t// // Emit annotation:mouseout if target was mouseout'd\n\t// if (mouseOverNode && !target) {\n\t// emitter.emit('annotation:mouseout', mouseOverNode);\n\t// }\n\t//\n\t// // Emit annotation:mouseover if target was mouseover'd\n\t// if (target && mouseOverNode !== target) {\n\t// emitter.emit('annotation:mouseover', target);\n\t// }\n\t//\n\t// mouseOverNode = target;\n\t// });\n\t\n\tfunction fireEvent() {\n\t emitter.emit.apply(emitter, arguments);\n\t};\n\tfunction addEventListener() {\n\t emitter.on.apply(emitter, arguments);\n\t};\n\tfunction removeEventListener() {\n\t emitter.removeListener.apply(emitter, arguments);\n\t};\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tfunction EventEmitter() {\n\t this._events = this._events || {};\n\t this._maxListeners = this._maxListeners || undefined;\n\t}\n\tmodule.exports = EventEmitter;\n\t\n\t// Backwards-compat with node 0.10.x\n\tEventEmitter.EventEmitter = EventEmitter;\n\t\n\tEventEmitter.prototype._events = undefined;\n\tEventEmitter.prototype._maxListeners = undefined;\n\t\n\t// By default EventEmitters will print a warning if more than 10 listeners are\n\t// added to it. This is a useful default which helps finding memory leaks.\n\tEventEmitter.defaultMaxListeners = 10;\n\t\n\t// Obviously not all Emitters should be limited to 10. This function allows\n\t// that to be increased. Set to zero for unlimited.\n\tEventEmitter.prototype.setMaxListeners = function(n) {\n\t if (!isNumber(n) || n < 0 || isNaN(n))\n\t throw TypeError('n must be a positive number');\n\t this._maxListeners = n;\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.emit = function(type) {\n\t var er, handler, len, args, i, listeners;\n\t\n\t if (!this._events)\n\t this._events = {};\n\t\n\t // If there is no 'error' event listener then throw.\n\t if (type === 'error') {\n\t if (!this._events.error ||\n\t (isObject(this._events.error) && !this._events.error.length)) {\n\t er = arguments[1];\n\t if (er instanceof Error) {\n\t throw er; // Unhandled 'error' event\n\t } else {\n\t // At least give some kind of context to the user\n\t var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n\t err.context = er;\n\t throw err;\n\t }\n\t }\n\t }\n\t\n\t handler = this._events[type];\n\t\n\t if (isUndefined(handler))\n\t return false;\n\t\n\t if (isFunction(handler)) {\n\t switch (arguments.length) {\n\t // fast cases\n\t case 1:\n\t handler.call(this);\n\t break;\n\t case 2:\n\t handler.call(this, arguments[1]);\n\t break;\n\t case 3:\n\t handler.call(this, arguments[1], arguments[2]);\n\t break;\n\t // slower\n\t default:\n\t args = Array.prototype.slice.call(arguments, 1);\n\t handler.apply(this, args);\n\t }\n\t } else if (isObject(handler)) {\n\t args = Array.prototype.slice.call(arguments, 1);\n\t listeners = handler.slice();\n\t len = listeners.length;\n\t for (i = 0; i < len; i++)\n\t listeners[i].apply(this, args);\n\t }\n\t\n\t return true;\n\t};\n\t\n\tEventEmitter.prototype.addListener = function(type, listener) {\n\t var m;\n\t\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t if (!this._events)\n\t this._events = {};\n\t\n\t // To avoid recursion in the case that type === \"newListener\"! Before\n\t // adding it to the listeners, first emit \"newListener\".\n\t if (this._events.newListener)\n\t this.emit('newListener', type,\n\t isFunction(listener.listener) ?\n\t listener.listener : listener);\n\t\n\t if (!this._events[type])\n\t // Optimize the case of one listener. Don't need the extra array object.\n\t this._events[type] = listener;\n\t else if (isObject(this._events[type]))\n\t // If we've already got an array, just append.\n\t this._events[type].push(listener);\n\t else\n\t // Adding the second element, need to change to array.\n\t this._events[type] = [this._events[type], listener];\n\t\n\t // Check for listener leak\n\t if (isObject(this._events[type]) && !this._events[type].warned) {\n\t if (!isUndefined(this._maxListeners)) {\n\t m = this._maxListeners;\n\t } else {\n\t m = EventEmitter.defaultMaxListeners;\n\t }\n\t\n\t if (m && m > 0 && this._events[type].length > m) {\n\t this._events[type].warned = true;\n\t console.error('(node) warning: possible EventEmitter memory ' +\n\t 'leak detected. %d listeners added. ' +\n\t 'Use emitter.setMaxListeners() to increase limit.',\n\t this._events[type].length);\n\t if (typeof console.trace === 'function') {\n\t // not supported in IE 10\n\t console.trace();\n\t }\n\t }\n\t }\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\t\n\tEventEmitter.prototype.once = function(type, listener) {\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t var fired = false;\n\t\n\t function g() {\n\t this.removeListener(type, g);\n\t\n\t if (!fired) {\n\t fired = true;\n\t listener.apply(this, arguments);\n\t }\n\t }\n\t\n\t g.listener = listener;\n\t this.on(type, g);\n\t\n\t return this;\n\t};\n\t\n\t// emits a 'removeListener' event iff the listener was removed\n\tEventEmitter.prototype.removeListener = function(type, listener) {\n\t var list, position, length, i;\n\t\n\t if (!isFunction(listener))\n\t throw TypeError('listener must be a function');\n\t\n\t if (!this._events || !this._events[type])\n\t return this;\n\t\n\t list = this._events[type];\n\t length = list.length;\n\t position = -1;\n\t\n\t if (list === listener ||\n\t (isFunction(list.listener) && list.listener === listener)) {\n\t delete this._events[type];\n\t if (this._events.removeListener)\n\t this.emit('removeListener', type, listener);\n\t\n\t } else if (isObject(list)) {\n\t for (i = length; i-- > 0;) {\n\t if (list[i] === listener ||\n\t (list[i].listener && list[i].listener === listener)) {\n\t position = i;\n\t break;\n\t }\n\t }\n\t\n\t if (position < 0)\n\t return this;\n\t\n\t if (list.length === 1) {\n\t list.length = 0;\n\t delete this._events[type];\n\t } else {\n\t list.splice(position, 1);\n\t }\n\t\n\t if (this._events.removeListener)\n\t this.emit('removeListener', type, listener);\n\t }\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.removeAllListeners = function(type) {\n\t var key, listeners;\n\t\n\t if (!this._events)\n\t return this;\n\t\n\t // not listening for removeListener, no need to emit\n\t if (!this._events.removeListener) {\n\t if (arguments.length === 0)\n\t this._events = {};\n\t else if (this._events[type])\n\t delete this._events[type];\n\t return this;\n\t }\n\t\n\t // emit removeListener for all listeners on all events\n\t if (arguments.length === 0) {\n\t for (key in this._events) {\n\t if (key === 'removeListener') continue;\n\t this.removeAllListeners(key);\n\t }\n\t this.removeAllListeners('removeListener');\n\t this._events = {};\n\t return this;\n\t }\n\t\n\t listeners = this._events[type];\n\t\n\t if (isFunction(listeners)) {\n\t this.removeListener(type, listeners);\n\t } else if (listeners) {\n\t // LIFO order\n\t while (listeners.length)\n\t this.removeListener(type, listeners[listeners.length - 1]);\n\t }\n\t delete this._events[type];\n\t\n\t return this;\n\t};\n\t\n\tEventEmitter.prototype.listeners = function(type) {\n\t var ret;\n\t if (!this._events || !this._events[type])\n\t ret = [];\n\t else if (isFunction(this._events[type]))\n\t ret = [this._events[type]];\n\t else\n\t ret = this._events[type].slice();\n\t return ret;\n\t};\n\t\n\tEventEmitter.prototype.listenerCount = function(type) {\n\t if (this._events) {\n\t var evlistener = this._events[type];\n\t\n\t if (isFunction(evlistener))\n\t return 1;\n\t else if (evlistener)\n\t return evlistener.length;\n\t }\n\t return 0;\n\t};\n\t\n\tEventEmitter.listenerCount = function(emitter, type) {\n\t return emitter.listenerCount(type);\n\t};\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.BORDER_COLOR = undefined;\n\texports.findSVGContainer = findSVGContainer;\n\texports.findSVGAtPoint = findSVGAtPoint;\n\texports.findAnnotationAtPoint = findAnnotationAtPoint;\n\texports.pointIntersectsRect = pointIntersectsRect;\n\texports.getOffsetAnnotationRect = getOffsetAnnotationRect;\n\texports.getAnnotationRect = getAnnotationRect;\n\texports.scaleUp = scaleUp;\n\texports.scaleDown = scaleDown;\n\texports.getScroll = getScroll;\n\texports.getOffset = getOffset;\n\texports.disableUserSelect = disableUserSelect;\n\texports.enableUserSelect = enableUserSelect;\n\texports.getMetadata = getMetadata;\n\t\n\tvar _createStylesheet = __webpack_require__(7);\n\t\n\tvar _createStylesheet2 = _interopRequireDefault(_createStylesheet);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar BORDER_COLOR = exports.BORDER_COLOR = '#00BFFF';\n\t\n\tvar userSelectStyleSheet = (0, _createStylesheet2.default)({\n\t body: {\n\t '-webkit-user-select': 'none',\n\t '-moz-user-select': 'none',\n\t '-ms-user-select': 'none',\n\t 'user-select': 'none'\n\t }\n\t});\n\tuserSelectStyleSheet.setAttribute('data-pdf-annotate-user-select', 'true');\n\t\n\t/**\n\t * Find the SVGElement that contains all the annotations for a page\n\t *\n\t * @param {Element} node An annotation within that container\n\t * @return {SVGElement} The container SVG or null if it can't be found\n\t */\n\tfunction findSVGContainer(node) {\n\t var parentNode = node;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t if (parentNode.nodeName.toUpperCase() === 'SVG' && parentNode.getAttribute('data-pdf-annotate-container') === 'true') {\n\t return parentNode;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Find an SVGElement container at a given point\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @return {SVGElement} The container SVG or null if one can't be found\n\t */\n\tfunction findSVGAtPoint(x, y) {\n\t var elements = document.querySelectorAll('svg[data-pdf-annotate-container=\"true\"]');\n\t for (var i = 0, l = elements.length; i < l; i++) {\n\t var el = elements[i];\n\t var rect = el.getBoundingClientRect();\n\t\n\t if (pointIntersectsRect(x, y, rect)) {\n\t return el;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Find an Element that represents an annotation at a given point\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @return {Element} The annotation element or null if one can't be found\n\t */\n\tfunction findAnnotationAtPoint(x, y) {\n\t var svg = findSVGAtPoint(x, y);\n\t if (!svg) {\n\t return;\n\t }\n\t var elements = svg.querySelectorAll('[data-pdf-annotate-type]');\n\t\n\t // Find a target element within SVG\n\t for (var i = 0, l = elements.length; i < l; i++) {\n\t var el = elements[i];\n\t if (pointIntersectsRect(x, y, getOffsetAnnotationRect(el))) {\n\t return el;\n\t }\n\t }\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Determine if a point intersects a rect\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Object} rect The points of a rect (likely from getBoundingClientRect)\n\t * @return {Boolean} True if a collision occurs, otherwise false\n\t */\n\tfunction pointIntersectsRect(x, y, rect) {\n\t return y >= rect.top && y <= rect.bottom && x >= rect.left && x <= rect.right;\n\t}\n\t\n\t/**\n\t * Get the rect of an annotation element accounting for offset.\n\t *\n\t * @param {Element} el The element to get the rect of\n\t * @return {Object} The dimensions of the element\n\t */\n\tfunction getOffsetAnnotationRect(el) {\n\t var rect = getAnnotationRect(el);\n\t\n\t var _getOffset = getOffset(el),\n\t offsetLeft = _getOffset.offsetLeft,\n\t offsetTop = _getOffset.offsetTop;\n\t\n\t return {\n\t top: rect.top + offsetTop,\n\t left: rect.left + offsetLeft,\n\t right: rect.right + offsetLeft,\n\t bottom: rect.bottom + offsetTop\n\t };\n\t}\n\t\n\t/**\n\t * Get the rect of an annotation element.\n\t *\n\t * @param {Element} el The element to get the rect of\n\t * @return {Object} The dimensions of the element\n\t */\n\tfunction getAnnotationRect(el) {\n\t var h = 0,\n\t w = 0,\n\t x = 0,\n\t y = 0;\n\t var rect = el.getBoundingClientRect();\n\t // TODO this should be calculated somehow\n\t var LINE_OFFSET = 16;\n\t // debugger;\n\t switch (el.nodeName.toLowerCase()) {\n\t case 'path':\n\t var minX = void 0,\n\t maxX = void 0,\n\t minY = void 0,\n\t maxY = void 0;\n\t\n\t el.getAttribute('d').replace(/Z/, '').split('M').splice(1).forEach(function (p) {\n\t var s = p.split(' ').map(function (i) {\n\t return parseInt(i, 10);\n\t });\n\t\n\t if (typeof minX === 'undefined' || s[0] < minX) {\n\t minX = s[0];\n\t }\n\t if (typeof maxX === 'undefined' || s[2] > maxX) {\n\t maxX = s[2];\n\t }\n\t if (typeof minY === 'undefined' || s[1] < minY) {\n\t minY = s[1];\n\t }\n\t if (typeof maxY === 'undefined' || s[3] > maxY) {\n\t maxY = s[3];\n\t }\n\t });\n\t\n\t h = maxY - minY;\n\t w = maxX - minX;\n\t x = minX;\n\t y = minY;\n\t break;\n\t\n\t case 'line':\n\t h = parseInt(el.getAttribute('y2'), 10) - parseInt(el.getAttribute('y1'), 10);\n\t w = parseInt(el.getAttribute('x2'), 10) - parseInt(el.getAttribute('x1'), 10);\n\t x = parseInt(el.getAttribute('x1'), 10);\n\t y = parseInt(el.getAttribute('y1'), 10);\n\t\n\t if (h === 0) {\n\t h += LINE_OFFSET;\n\t y -= LINE_OFFSET / 2;\n\t }\n\t break;\n\t\n\t case 'text':\n\t h = rect.height;\n\t w = rect.width;\n\t x = parseInt(el.getAttribute('x'), 10);\n\t y = parseInt(el.getAttribute('y'), 10) - h;\n\t break;\n\t\n\t case 'g':\n\t var _getOffset2 = getOffset(el),\n\t offsetLeft = _getOffset2.offsetLeft,\n\t offsetTop = _getOffset2.offsetTop;\n\t\n\t h = rect.height;\n\t w = rect.width;\n\t x = rect.left - offsetLeft;\n\t y = rect.top - offsetTop;\n\t\n\t if (el.getAttribute('data-pdf-annotate-type') === 'strikeout') {\n\t h += LINE_OFFSET;\n\t y -= LINE_OFFSET / 2;\n\t }\n\t break;\n\t\n\t case 'rect':\n\t case 'svg':\n\t h = parseInt(el.getAttribute('height'), 10);\n\t w = parseInt(el.getAttribute('width'), 10);\n\t x = parseInt(el.getAttribute('x'), 10);\n\t y = parseInt(el.getAttribute('y'), 10);\n\t break;\n\t }\n\t\n\t // Result provides same properties as getBoundingClientRect\n\t var result = {\n\t top: y,\n\t left: x,\n\t width: w,\n\t height: h,\n\t right: x + w,\n\t bottom: y + h\n\t };\n\t\n\t // For the case of nested SVG (point annotations) and grouped\n\t // lines or rects no adjustment needs to be made for scale.\n\t // I assume that the scale is already being handled\n\t // natively by virtue of the `transform` attribute.\n\t if (!['svg', 'g'].includes(el.nodeName.toLowerCase())) {\n\t result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n\t }\n\t\n\t // // comment point need to be scaled on FF\n\t if (el.nodeName.toLowerCase() == 'svg' && $.browser.mozilla) {\n\t result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n\t }\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Adjust scale from normalized scale (100%) to rendered scale.\n\t *\n\t * @param {SVGElement} svg The SVG to gather metadata from\n\t * @param {Object} rect A map of numeric values to scale\n\t * @return {Object} A copy of `rect` with values scaled up\n\t */\n\tfunction scaleUp(svg, rect) {\n\t var result = {};\n\t\n\t var _getMetadata = getMetadata(svg),\n\t viewport = _getMetadata.viewport;\n\t\n\t Object.keys(rect).forEach(function (key) {\n\t result[key] = rect[key] * viewport.scale;\n\t });\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Adjust scale from rendered scale to a normalized scale (100%).\n\t *\n\t * @param {SVGElement} svg The SVG to gather metadata from\n\t * @param {Object} rect A map of numeric values to scale\n\t * @return {Object} A copy of `rect` with values scaled down\n\t */\n\tfunction scaleDown(svg, rect) {\n\t var result = {};\n\t\n\t var _getMetadata2 = getMetadata(svg),\n\t viewport = _getMetadata2.viewport;\n\t\n\t Object.keys(rect).forEach(function (key) {\n\t result[key] = rect[key] / viewport.scale;\n\t });\n\t\n\t return result;\n\t}\n\t\n\t/**\n\t * Get the scroll position of an element, accounting for parent elements\n\t *\n\t * @param {Element} el The element to get the scroll position for\n\t * @return {Object} The scrollTop and scrollLeft position\n\t */\n\tfunction getScroll(el) {\n\t var scrollTop = 0;\n\t var scrollLeft = 0;\n\t var parentNode = el;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t scrollTop += parentNode.scrollTop;\n\t scrollLeft += parentNode.scrollLeft;\n\t }\n\t\n\t return { scrollTop: scrollTop, scrollLeft: scrollLeft };\n\t}\n\t\n\t/**\n\t * Get the offset position of an element, accounting for parent elements\n\t *\n\t * @param {Element} el The element to get the offset position for\n\t * @return {Object} The offsetTop and offsetLeft position\n\t */\n\tfunction getOffset(el) {\n\t var parentNode = el;\n\t\n\t while ((parentNode = parentNode.parentNode) && parentNode !== document) {\n\t if (parentNode.nodeName.toUpperCase() === 'SVG') {\n\t break;\n\t }\n\t }\n\t\n\t var rect = parentNode.getBoundingClientRect();\n\t\n\t return { offsetLeft: rect.left, offsetTop: rect.top };\n\t}\n\t\n\t/**\n\t * Disable user ability to select text on page\n\t */\n\tfunction disableUserSelect() {\n\t if (!userSelectStyleSheet.parentNode) {\n\t document.head.appendChild(userSelectStyleSheet);\n\t }\n\t}\n\t\n\t/**\n\t * Enable user ability to select text on page\n\t */\n\tfunction enableUserSelect() {\n\t if (userSelectStyleSheet.parentNode) {\n\t userSelectStyleSheet.parentNode.removeChild(userSelectStyleSheet);\n\t }\n\t}\n\t\n\t/**\n\t * Get the metadata for a SVG container\n\t *\n\t * @param {SVGElement} svg The SVG container to get metadata for\n\t */\n\tfunction getMetadata(svg) {\n\t return {\n\t documentId: svg.getAttribute('data-pdf-annotate-document'),\n\t pageNumber: parseInt(svg.getAttribute('data-pdf-annotate-page'), 10),\n\t viewport: JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'))\n\t };\n\t}\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function createStyleSheet(blocks) {\n\t var style = document.createElement('style');\n\t var text = Object.keys(blocks).map(function (selector) {\n\t return processRuleSet(selector, blocks[selector]);\n\t }).join('\\n');\n\t \n\t style.setAttribute('type', 'text/css');\n\t style.appendChild(document.createTextNode(text));\n\t\n\t return style;\n\t}\n\t\n\tfunction processRuleSet(selector, block) {\n\t return selector + ' {\\n' + processDeclarationBlock(block) + '\\n}';\n\t}\n\t\n\tfunction processDeclarationBlock(block) {\n\t return Object.keys(block).map(function (prop) {\n\t return processDeclaration(prop, block[prop]);\n\t }).join('\\n');\n\t}\n\t\n\tfunction processDeclaration(prop, value) {\n\t if (!isNaN(value) && value != 0) {\n\t value = value + 'px';\n\t }\n\t\n\t return hyphenate(prop) + ': ' + value + ';';\n\t}\n\t\n\tfunction hyphenate(prop) {\n\t return prop.replace(/[A-Z]/g, function (match) {\n\t return '-' + match.toLowerCase();\n\t });\n\t}\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _axios = __webpack_require__(9);\n\t\n\tvar _axios2 = _interopRequireDefault(_axios);\n\t\n\tvar _uuid = __webpack_require__(36);\n\t\n\tvar _uuid2 = _interopRequireDefault(_uuid);\n\t\n\tvar _StoreAdapter2 = __webpack_require__(2);\n\t\n\tvar _StoreAdapter3 = _interopRequireDefault(_StoreAdapter2);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t_axios2.default.defaults.xsrfCookieName = 'csrftoken';\n\t_axios2.default.defaults.xsrfHeaderName = 'X-CSRFToken';\n\t\n\tvar CRFPAStoreAdapter = function (_StoreAdapter) {\n\t _inherits(CRFPAStoreAdapter, _StoreAdapter);\n\t\n\t function CRFPAStoreAdapter() {\n\t _classCallCheck(this, CRFPAStoreAdapter);\n\t\n\t var API = _axios2.default.create({\n\t baseURL: '/pdfannotator',\n\t timeout: 10000,\n\t withCredentials: true,\n\t headers: {\n\t 'Accept': 'application/json',\n\t 'Content-Type': 'application/json',\n\t 'Access-Control-Allow-Origin': '*'\n\t }\n\t });\n\t\n\t return _possibleConstructorReturn(this, (CRFPAStoreAdapter.__proto__ || Object.getPrototypeOf(CRFPAStoreAdapter)).call(this, {\n\t getAnnotations: function getAnnotations(documentId) {\n\t\n\t return API.get('/get-annotations/', {\n\t params: {\n\t fileUuid: _initFile.documentId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let annotations = getAnnotations(documentId).filter((i) => {\n\t // return i.page === pageNumber && i.class === 'Annotation';\n\t // });\n\t //\n\t // resolve({\n\t // documentId,\n\t // pageNumber,\n\t // annotations\n\t // });\n\t // });\n\t },\n\t getAnnotation: function getAnnotation(documentId, annotationId) {\n\t return API.get('/get-annotation/', {\n\t params: {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t },\n\t addAnnotation: function addAnnotation(documentId, pageNumber, annotation) {\n\t\n\t annotation.class = 'Annotation';\n\t annotation.page = pageNumber;\n\t annotation.uuid = (0, _uuid2.default)();\n\t\n\t return API.post('/add-annotation/', {\n\t fileUuid: _initFile.documentId,\n\t page: pageNumber,\n\t annotation: annotation\n\t }).then(function (response) {\n\t return annotation;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t\n\t // annotation.class = 'Annotation';\n\t // annotation.uuid = uuid();\n\t // annotation.page = pageNumber;\n\t\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.push(annotation);\n\t // updateAnnotations(documentId, annotations);\n\t\n\t // resolve(annotation);\n\t // });\n\t },\n\t editAnnotation: function editAnnotation(documentId, annotationId, annotation) {\n\t return API.post('/update-annotation/', {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId,\n\t annotation: annotation\n\t }).then(function (response) {\n\t if (annotation.type === 'point') (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return annotation;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let annotations = getAnnotations(documentId);\n\t // annotations[findAnnotation(documentId, annotationId)] = annotation;\n\t // updateAnnotations(documentId, annotations);\n\t //\n\t // resolve(annotation);\n\t // });\n\t },\n\t deleteAnnotation: function deleteAnnotation(documentId, annotationId) {\n\t return API.post('/delete-annotation/', {\n\t annotationId: annotationId,\n\t fileUuid: _initFile.documentId\n\t }).then(function (response) {\n\t (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return true;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let index = findAnnotation(documentId, annotationId);\n\t // if (index > -1) {\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.splice(index, 1);\n\t // updateAnnotations(documentId, annotations);\n\t // }\n\t //\n\t // resolve(true);\n\t // });\n\t },\n\t getComments: function getComments(documentId) {\n\t return API.get('/get-comments/', {\n\t params: {\n\t fileUuid: _initFile.documentId\n\t }\n\t }).then(function (response) {\n\t return response.data;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // resolve(getAnnotations(documentId).filter((i) => {\n\t // return i.class === 'Comment' && i.annotation === annotationId;\n\t // }));\n\t // });\n\t },\n\t addComment: function addComment(documentId, annotationId, content) {\n\t\n\t return API.post('/add-comment/', {\n\t fileUuid: _initFile.documentId,\n\t annotationId: annotationId,\n\t content: content\n\t }).then(function (response) {\n\t (0, _comments.renderComments)();\n\t return response;\n\t }).then(function (response) {\n\t return content;\n\t });\n\t\n\t // return new Promise((resolve, reject) => {\n\t // let comment = {\n\t // class: 'Comment',\n\t // uuid: uuid(),\n\t // annotation: annotationId,\n\t // content: content\n\t // };\n\t //\n\t //\n\t //\n\t // let annotations = getAnnotations(documentId);\n\t // annotations.push(comment);\n\t // updateAnnotations(documentId, annotations);\n\t //\n\t // resolve(comment);\n\t // });\n\t }\n\t }\n\t\n\t // deleteComment(documentId, commentId) {\n\t //\n\t // return API.post('/delete-comment/', {\n\t // fileUuid,\n\t // commentId,\n\t // }).then(function (response) {\n\t // return true;\n\t // });\n\t // }\n\t ));\n\t }\n\t\n\t return CRFPAStoreAdapter;\n\t}(_StoreAdapter3.default);\n\t//\n\t// function getAnnotations(documentId) {\n\t// return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || [];\n\t// }\n\t//\n\t// function updateAnnotations(documentId, annotations) {\n\t// localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations));\n\t// }\n\t\n\t// function findAnnotation(documentId, annotationId) {\n\t// let index = -1;\n\t// let annotations = getAnnotations(documentId);\n\t// for (let i=0, l=annotations.length; i<l; i++) {\n\t// if (annotations[i].uuid === annotationId) {\n\t// index = i;\n\t// break;\n\t// }\n\t// }\n\t// return index;\n\t// }\n\t\n\t\n\texports.default = CRFPAStoreAdapter;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(10);\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar bind = __webpack_require__(12);\n\tvar Axios = __webpack_require__(14);\n\tvar defaults = __webpack_require__(15);\n\t\n\t/**\n\t * Create an instance of Axios\n\t *\n\t * @param {Object} defaultConfig The default config for the instance\n\t * @return {Axios} A new instance of Axios\n\t */\n\tfunction createInstance(defaultConfig) {\n\t var context = new Axios(defaultConfig);\n\t var instance = bind(Axios.prototype.request, context);\n\t\n\t // Copy axios.prototype to instance\n\t utils.extend(instance, Axios.prototype, context);\n\t\n\t // Copy context to instance\n\t utils.extend(instance, context);\n\t\n\t return instance;\n\t}\n\t\n\t// Create the default instance to be exported\n\tvar axios = createInstance(defaults);\n\t\n\t// Expose Axios class to allow class inheritance\n\taxios.Axios = Axios;\n\t\n\t// Factory for creating new instances\n\taxios.create = function create(instanceConfig) {\n\t return createInstance(utils.merge(defaults, instanceConfig));\n\t};\n\t\n\t// Expose Cancel & CancelToken\n\taxios.Cancel = __webpack_require__(33);\n\taxios.CancelToken = __webpack_require__(34);\n\taxios.isCancel = __webpack_require__(30);\n\t\n\t// Expose all/spread\n\taxios.all = function all(promises) {\n\t return Promise.all(promises);\n\t};\n\taxios.spread = __webpack_require__(35);\n\t\n\tmodule.exports = axios;\n\t\n\t// Allow use of default import syntax in TypeScript\n\tmodule.exports.default = axios;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar bind = __webpack_require__(12);\n\tvar isBuffer = __webpack_require__(13);\n\t\n\t/*global toString:true*/\n\t\n\t// utils is a library of generic helper functions non-specific to axios\n\t\n\tvar toString = Object.prototype.toString;\n\t\n\t/**\n\t * Determine if a value is an Array\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Array, otherwise false\n\t */\n\tfunction isArray(val) {\n\t return toString.call(val) === '[object Array]';\n\t}\n\t\n\t/**\n\t * Determine if a value is an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBuffer(val) {\n\t return toString.call(val) === '[object ArrayBuffer]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a FormData\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an FormData, otherwise false\n\t */\n\tfunction isFormData(val) {\n\t return (typeof FormData !== 'undefined') && (val instanceof FormData);\n\t}\n\t\n\t/**\n\t * Determine if a value is a view on an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBufferView(val) {\n\t var result;\n\t if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n\t result = ArrayBuffer.isView(val);\n\t } else {\n\t result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Determine if a value is a String\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a String, otherwise false\n\t */\n\tfunction isString(val) {\n\t return typeof val === 'string';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Number\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Number, otherwise false\n\t */\n\tfunction isNumber(val) {\n\t return typeof val === 'number';\n\t}\n\t\n\t/**\n\t * Determine if a value is undefined\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if the value is undefined, otherwise false\n\t */\n\tfunction isUndefined(val) {\n\t return typeof val === 'undefined';\n\t}\n\t\n\t/**\n\t * Determine if a value is an Object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Object, otherwise false\n\t */\n\tfunction isObject(val) {\n\t return val !== null && typeof val === 'object';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Date\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Date, otherwise false\n\t */\n\tfunction isDate(val) {\n\t return toString.call(val) === '[object Date]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a File\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a File, otherwise false\n\t */\n\tfunction isFile(val) {\n\t return toString.call(val) === '[object File]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Blob\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Blob, otherwise false\n\t */\n\tfunction isBlob(val) {\n\t return toString.call(val) === '[object Blob]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Function\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Function, otherwise false\n\t */\n\tfunction isFunction(val) {\n\t return toString.call(val) === '[object Function]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Stream\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Stream, otherwise false\n\t */\n\tfunction isStream(val) {\n\t return isObject(val) && isFunction(val.pipe);\n\t}\n\t\n\t/**\n\t * Determine if a value is a URLSearchParams object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n\t */\n\tfunction isURLSearchParams(val) {\n\t return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n\t}\n\t\n\t/**\n\t * Trim excess whitespace off the beginning and end of a string\n\t *\n\t * @param {String} str The String to trim\n\t * @returns {String} The String freed of excess whitespace\n\t */\n\tfunction trim(str) {\n\t return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n\t}\n\t\n\t/**\n\t * Determine if we're running in a standard browser environment\n\t *\n\t * This allows axios to run in a web worker, and react-native.\n\t * Both environments support XMLHttpRequest, but not fully standard globals.\n\t *\n\t * web workers:\n\t * typeof window -> undefined\n\t * typeof document -> undefined\n\t *\n\t * react-native:\n\t * navigator.product -> 'ReactNative'\n\t */\n\tfunction isStandardBrowserEnv() {\n\t if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n\t return false;\n\t }\n\t return (\n\t typeof window !== 'undefined' &&\n\t typeof document !== 'undefined'\n\t );\n\t}\n\t\n\t/**\n\t * Iterate over an Array or an Object invoking a function for each item.\n\t *\n\t * If `obj` is an Array callback will be called passing\n\t * the value, index, and complete array for each item.\n\t *\n\t * If 'obj' is an Object callback will be called passing\n\t * the value, key, and complete object for each property.\n\t *\n\t * @param {Object|Array} obj The object to iterate\n\t * @param {Function} fn The callback to invoke for each item\n\t */\n\tfunction forEach(obj, fn) {\n\t // Don't bother if no value provided\n\t if (obj === null || typeof obj === 'undefined') {\n\t return;\n\t }\n\t\n\t // Force an array if not already something iterable\n\t if (typeof obj !== 'object') {\n\t /*eslint no-param-reassign:0*/\n\t obj = [obj];\n\t }\n\t\n\t if (isArray(obj)) {\n\t // Iterate over array values\n\t for (var i = 0, l = obj.length; i < l; i++) {\n\t fn.call(null, obj[i], i, obj);\n\t }\n\t } else {\n\t // Iterate over object keys\n\t for (var key in obj) {\n\t if (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t fn.call(null, obj[key], key, obj);\n\t }\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Accepts varargs expecting each argument to be an object, then\n\t * immutably merges the properties of each object and returns result.\n\t *\n\t * When multiple objects contain the same key the later object in\n\t * the arguments list will take precedence.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * var result = merge({foo: 123}, {foo: 456});\n\t * console.log(result.foo); // outputs 456\n\t * ```\n\t *\n\t * @param {Object} obj1 Object to merge\n\t * @returns {Object} Result of all merge properties\n\t */\n\tfunction merge(/* obj1, obj2, obj3, ... */) {\n\t var result = {};\n\t function assignValue(val, key) {\n\t if (typeof result[key] === 'object' && typeof val === 'object') {\n\t result[key] = merge(result[key], val);\n\t } else {\n\t result[key] = val;\n\t }\n\t }\n\t\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t forEach(arguments[i], assignValue);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Extends object a by mutably adding to it the properties of object b.\n\t *\n\t * @param {Object} a The object to be extended\n\t * @param {Object} b The object to copy properties from\n\t * @param {Object} thisArg The object to bind function to\n\t * @return {Object} The resulting value of object a\n\t */\n\tfunction extend(a, b, thisArg) {\n\t forEach(b, function assignValue(val, key) {\n\t if (thisArg && typeof val === 'function') {\n\t a[key] = bind(val, thisArg);\n\t } else {\n\t a[key] = val;\n\t }\n\t });\n\t return a;\n\t}\n\t\n\tmodule.exports = {\n\t isArray: isArray,\n\t isArrayBuffer: isArrayBuffer,\n\t isBuffer: isBuffer,\n\t isFormData: isFormData,\n\t isArrayBufferView: isArrayBufferView,\n\t isString: isString,\n\t isNumber: isNumber,\n\t isObject: isObject,\n\t isUndefined: isUndefined,\n\t isDate: isDate,\n\t isFile: isFile,\n\t isBlob: isBlob,\n\t isFunction: isFunction,\n\t isStream: isStream,\n\t isURLSearchParams: isURLSearchParams,\n\t isStandardBrowserEnv: isStandardBrowserEnv,\n\t forEach: forEach,\n\t merge: merge,\n\t extend: extend,\n\t trim: trim\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function bind(fn, thisArg) {\n\t return function wrap() {\n\t var args = new Array(arguments.length);\n\t for (var i = 0; i < args.length; i++) {\n\t args[i] = arguments[i];\n\t }\n\t return fn.apply(thisArg, args);\n\t };\n\t};\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t/*!\n\t * Determine if an object is a Buffer\n\t *\n\t * @author Feross Aboukhadijeh <https://feross.org>\n\t * @license MIT\n\t */\n\t\n\t// The _isBuffer check is for Safari 5-7 support, because it's missing\n\t// Object.prototype.constructor. Remove this eventually\n\tmodule.exports = function (obj) {\n\t return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n\t}\n\t\n\tfunction isBuffer (obj) {\n\t return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n\t}\n\t\n\t// For Node v0.10 support. Remove this eventually.\n\tfunction isSlowBuffer (obj) {\n\t return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n\t}\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar defaults = __webpack_require__(15);\n\tvar utils = __webpack_require__(11);\n\tvar InterceptorManager = __webpack_require__(27);\n\tvar dispatchRequest = __webpack_require__(28);\n\t\n\t/**\n\t * Create a new instance of Axios\n\t *\n\t * @param {Object} instanceConfig The default config for the instance\n\t */\n\tfunction Axios(instanceConfig) {\n\t this.defaults = instanceConfig;\n\t this.interceptors = {\n\t request: new InterceptorManager(),\n\t response: new InterceptorManager()\n\t };\n\t}\n\t\n\t/**\n\t * Dispatch a request\n\t *\n\t * @param {Object} config The config specific for this request (merged with this.defaults)\n\t */\n\tAxios.prototype.request = function request(config) {\n\t /*eslint no-param-reassign:0*/\n\t // Allow for axios('example/url'[, config]) a la fetch API\n\t if (typeof config === 'string') {\n\t config = utils.merge({\n\t url: arguments[0]\n\t }, arguments[1]);\n\t }\n\t\n\t config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n\t config.method = config.method.toLowerCase();\n\t\n\t // Hook up interceptors middleware\n\t var chain = [dispatchRequest, undefined];\n\t var promise = Promise.resolve(config);\n\t\n\t this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n\t chain.unshift(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n\t chain.push(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t while (chain.length) {\n\t promise = promise.then(chain.shift(), chain.shift());\n\t }\n\t\n\t return promise;\n\t};\n\t\n\t// Provide aliases for supported request methods\n\tutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url\n\t }));\n\t };\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, data, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url,\n\t data: data\n\t }));\n\t };\n\t});\n\t\n\tmodule.exports = Axios;\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar normalizeHeaderName = __webpack_require__(17);\n\t\n\tvar DEFAULT_CONTENT_TYPE = {\n\t 'Content-Type': 'application/x-www-form-urlencoded'\n\t};\n\t\n\tfunction setContentTypeIfUnset(headers, value) {\n\t if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n\t headers['Content-Type'] = value;\n\t }\n\t}\n\t\n\tfunction getDefaultAdapter() {\n\t var adapter;\n\t if (typeof XMLHttpRequest !== 'undefined') {\n\t // For browsers use XHR adapter\n\t adapter = __webpack_require__(18);\n\t } else if (typeof process !== 'undefined') {\n\t // For node use HTTP adapter\n\t adapter = __webpack_require__(18);\n\t }\n\t return adapter;\n\t}\n\t\n\tvar defaults = {\n\t adapter: getDefaultAdapter(),\n\t\n\t transformRequest: [function transformRequest(data, headers) {\n\t normalizeHeaderName(headers, 'Content-Type');\n\t if (utils.isFormData(data) ||\n\t utils.isArrayBuffer(data) ||\n\t utils.isBuffer(data) ||\n\t utils.isStream(data) ||\n\t utils.isFile(data) ||\n\t utils.isBlob(data)\n\t ) {\n\t return data;\n\t }\n\t if (utils.isArrayBufferView(data)) {\n\t return data.buffer;\n\t }\n\t if (utils.isURLSearchParams(data)) {\n\t setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n\t return data.toString();\n\t }\n\t if (utils.isObject(data)) {\n\t setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n\t return JSON.stringify(data);\n\t }\n\t return data;\n\t }],\n\t\n\t transformResponse: [function transformResponse(data) {\n\t /*eslint no-param-reassign:0*/\n\t if (typeof data === 'string') {\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) { /* Ignore */ }\n\t }\n\t return data;\n\t }],\n\t\n\t /**\n\t * A timeout in milliseconds to abort a request. If set to 0 (default) a\n\t * timeout is not created.\n\t */\n\t timeout: 0,\n\t\n\t xsrfCookieName: 'XSRF-TOKEN',\n\t xsrfHeaderName: 'X-XSRF-TOKEN',\n\t\n\t maxContentLength: -1,\n\t\n\t validateStatus: function validateStatus(status) {\n\t return status >= 200 && status < 300;\n\t }\n\t};\n\t\n\tdefaults.headers = {\n\t common: {\n\t 'Accept': 'application/json, text/plain, */*'\n\t }\n\t};\n\t\n\tutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n\t defaults.headers[method] = {};\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n\t});\n\t\n\tmodule.exports = defaults;\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\t\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things. But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals. It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\t\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\t\n\tfunction defaultSetTimout() {\n\t throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t try {\n\t if (typeof setTimeout === 'function') {\n\t cachedSetTimeout = setTimeout;\n\t } else {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t } catch (e) {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t try {\n\t if (typeof clearTimeout === 'function') {\n\t cachedClearTimeout = clearTimeout;\n\t } else {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t } catch (e) {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t} ())\n\tfunction runTimeout(fun) {\n\t if (cachedSetTimeout === setTimeout) {\n\t //normal enviroments in sane situations\n\t return setTimeout(fun, 0);\n\t }\n\t // if setTimeout wasn't available but was latter defined\n\t if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t cachedSetTimeout = setTimeout;\n\t return setTimeout(fun, 0);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedSetTimeout(fun, 0);\n\t } catch(e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedSetTimeout.call(null, fun, 0);\n\t } catch(e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t return cachedSetTimeout.call(this, fun, 0);\n\t }\n\t }\n\t\n\t\n\t}\n\tfunction runClearTimeout(marker) {\n\t if (cachedClearTimeout === clearTimeout) {\n\t //normal enviroments in sane situations\n\t return clearTimeout(marker);\n\t }\n\t // if clearTimeout wasn't available but was latter defined\n\t if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t cachedClearTimeout = clearTimeout;\n\t return clearTimeout(marker);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedClearTimeout(marker);\n\t } catch (e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedClearTimeout.call(null, marker);\n\t } catch (e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t return cachedClearTimeout.call(this, marker);\n\t }\n\t }\n\t\n\t\n\t\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t if (!draining || !currentQueue) {\n\t return;\n\t }\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = runTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t runClearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t runTimeout(drainQueue);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\tprocess.prependListener = noop;\n\tprocess.prependOnceListener = noop;\n\t\n\tprocess.listeners = function (name) { return [] }\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n\t utils.forEach(headers, function processHeader(value, name) {\n\t if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n\t headers[normalizedName] = value;\n\t delete headers[name];\n\t }\n\t });\n\t};\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar settle = __webpack_require__(19);\n\tvar buildURL = __webpack_require__(22);\n\tvar parseHeaders = __webpack_require__(23);\n\tvar isURLSameOrigin = __webpack_require__(24);\n\tvar createError = __webpack_require__(20);\n\tvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(25);\n\t\n\tmodule.exports = function xhrAdapter(config) {\n\t return new Promise(function dispatchXhrRequest(resolve, reject) {\n\t var requestData = config.data;\n\t var requestHeaders = config.headers;\n\t\n\t if (utils.isFormData(requestData)) {\n\t delete requestHeaders['Content-Type']; // Let the browser set it\n\t }\n\t\n\t var request = new XMLHttpRequest();\n\t var loadEvent = 'onreadystatechange';\n\t var xDomain = false;\n\t\n\t // For IE 8/9 CORS support\n\t // Only supports POST and GET calls and doesn't returns the response headers.\n\t // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n\t if (process.env.NODE_ENV !== 'test' &&\n\t typeof window !== 'undefined' &&\n\t window.XDomainRequest && !('withCredentials' in request) &&\n\t !isURLSameOrigin(config.url)) {\n\t request = new window.XDomainRequest();\n\t loadEvent = 'onload';\n\t xDomain = true;\n\t request.onprogress = function handleProgress() {};\n\t request.ontimeout = function handleTimeout() {};\n\t }\n\t\n\t // HTTP basic authentication\n\t if (config.auth) {\n\t var username = config.auth.username || '';\n\t var password = config.auth.password || '';\n\t requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n\t }\n\t\n\t request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\t\n\t // Set the request timeout in MS\n\t request.timeout = config.timeout;\n\t\n\t // Listen for ready state\n\t request[loadEvent] = function handleLoad() {\n\t if (!request || (request.readyState !== 4 && !xDomain)) {\n\t return;\n\t }\n\t\n\t // The request errored out and we didn't get a response, this will be\n\t // handled by onerror instead\n\t // With one exception: request that using file: protocol, most browsers\n\t // will return status as 0 even though it's a successful request\n\t if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n\t return;\n\t }\n\t\n\t // Prepare the response\n\t var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n\t var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n\t var response = {\n\t data: responseData,\n\t // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n\t status: request.status === 1223 ? 204 : request.status,\n\t statusText: request.status === 1223 ? 'No Content' : request.statusText,\n\t headers: responseHeaders,\n\t config: config,\n\t request: request\n\t };\n\t\n\t settle(resolve, reject, response);\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle low level network errors\n\t request.onerror = function handleError() {\n\t // Real errors are hidden from us by the browser\n\t // onerror should only fire if it's a network error\n\t reject(createError('Network Error', config, null, request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle timeout\n\t request.ontimeout = function handleTimeout() {\n\t reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n\t request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Add xsrf header\n\t // This is only done if running in a standard browser environment.\n\t // Specifically not if we're in a web worker, or react-native.\n\t if (utils.isStandardBrowserEnv()) {\n\t var cookies = __webpack_require__(26);\n\t\n\t // Add xsrf header\n\t var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n\t cookies.read(config.xsrfCookieName) :\n\t undefined;\n\t\n\t if (xsrfValue) {\n\t requestHeaders[config.xsrfHeaderName] = xsrfValue;\n\t }\n\t }\n\t\n\t // Add headers to the request\n\t if ('setRequestHeader' in request) {\n\t utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n\t if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n\t // Remove Content-Type if data is undefined\n\t delete requestHeaders[key];\n\t } else {\n\t // Otherwise add header to the request\n\t request.setRequestHeader(key, val);\n\t }\n\t });\n\t }\n\t\n\t // Add withCredentials to request if needed\n\t if (config.withCredentials) {\n\t request.withCredentials = true;\n\t }\n\t\n\t // Add responseType to request if needed\n\t if (config.responseType) {\n\t try {\n\t request.responseType = config.responseType;\n\t } catch (e) {\n\t // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n\t // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n\t if (config.responseType !== 'json') {\n\t throw e;\n\t }\n\t }\n\t }\n\t\n\t // Handle progress if needed\n\t if (typeof config.onDownloadProgress === 'function') {\n\t request.addEventListener('progress', config.onDownloadProgress);\n\t }\n\t\n\t // Not all browsers support upload events\n\t if (typeof config.onUploadProgress === 'function' && request.upload) {\n\t request.upload.addEventListener('progress', config.onUploadProgress);\n\t }\n\t\n\t if (config.cancelToken) {\n\t // Handle cancellation\n\t config.cancelToken.promise.then(function onCanceled(cancel) {\n\t if (!request) {\n\t return;\n\t }\n\t\n\t request.abort();\n\t reject(cancel);\n\t // Clean up request\n\t request = null;\n\t });\n\t }\n\t\n\t if (requestData === undefined) {\n\t requestData = null;\n\t }\n\t\n\t // Send the request\n\t request.send(requestData);\n\t });\n\t};\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar createError = __webpack_require__(20);\n\t\n\t/**\n\t * Resolve or reject a Promise based on response status.\n\t *\n\t * @param {Function} resolve A function that resolves the promise.\n\t * @param {Function} reject A function that rejects the promise.\n\t * @param {object} response The response.\n\t */\n\tmodule.exports = function settle(resolve, reject, response) {\n\t var validateStatus = response.config.validateStatus;\n\t // Note: status is not exposed by XDomainRequest\n\t if (!response.status || !validateStatus || validateStatus(response.status)) {\n\t resolve(response);\n\t } else {\n\t reject(createError(\n\t 'Request failed with status code ' + response.status,\n\t response.config,\n\t null,\n\t response.request,\n\t response\n\t ));\n\t }\n\t};\n\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar enhanceError = __webpack_require__(21);\n\t\n\t/**\n\t * Create an Error with the specified message, config, error code, request and response.\n\t *\n\t * @param {string} message The error message.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The created error.\n\t */\n\tmodule.exports = function createError(message, config, code, request, response) {\n\t var error = new Error(message);\n\t return enhanceError(error, config, code, request, response);\n\t};\n\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Update an Error with the specified config, error code, and response.\n\t *\n\t * @param {Error} error The error to update.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The error.\n\t */\n\tmodule.exports = function enhanceError(error, config, code, request, response) {\n\t error.config = config;\n\t if (code) {\n\t error.code = code;\n\t }\n\t error.request = request;\n\t error.response = response;\n\t return error;\n\t};\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tfunction encode(val) {\n\t return encodeURIComponent(val).\n\t replace(/%40/gi, '@').\n\t replace(/%3A/gi, ':').\n\t replace(/%24/g, '$').\n\t replace(/%2C/gi, ',').\n\t replace(/%20/g, '+').\n\t replace(/%5B/gi, '[').\n\t replace(/%5D/gi, ']');\n\t}\n\t\n\t/**\n\t * Build a URL by appending params to the end\n\t *\n\t * @param {string} url The base of the url (e.g., http://www.google.com)\n\t * @param {object} [params] The params to be appended\n\t * @returns {string} The formatted url\n\t */\n\tmodule.exports = function buildURL(url, params, paramsSerializer) {\n\t /*eslint no-param-reassign:0*/\n\t if (!params) {\n\t return url;\n\t }\n\t\n\t var serializedParams;\n\t if (paramsSerializer) {\n\t serializedParams = paramsSerializer(params);\n\t } else if (utils.isURLSearchParams(params)) {\n\t serializedParams = params.toString();\n\t } else {\n\t var parts = [];\n\t\n\t utils.forEach(params, function serialize(val, key) {\n\t if (val === null || typeof val === 'undefined') {\n\t return;\n\t }\n\t\n\t if (utils.isArray(val)) {\n\t key = key + '[]';\n\t } else {\n\t val = [val];\n\t }\n\t\n\t utils.forEach(val, function parseValue(v) {\n\t if (utils.isDate(v)) {\n\t v = v.toISOString();\n\t } else if (utils.isObject(v)) {\n\t v = JSON.stringify(v);\n\t }\n\t parts.push(encode(key) + '=' + encode(v));\n\t });\n\t });\n\t\n\t serializedParams = parts.join('&');\n\t }\n\t\n\t if (serializedParams) {\n\t url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n\t }\n\t\n\t return url;\n\t};\n\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\t// Headers whose duplicates are ignored by node\n\t// c.f. https://nodejs.org/api/http.html#http_message_headers\n\tvar ignoreDuplicateOf = [\n\t 'age', 'authorization', 'content-length', 'content-type', 'etag',\n\t 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n\t 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n\t 'referer', 'retry-after', 'user-agent'\n\t];\n\t\n\t/**\n\t * Parse headers into an object\n\t *\n\t * ```\n\t * Date: Wed, 27 Aug 2014 08:58:49 GMT\n\t * Content-Type: application/json\n\t * Connection: keep-alive\n\t * Transfer-Encoding: chunked\n\t * ```\n\t *\n\t * @param {String} headers Headers needing to be parsed\n\t * @returns {Object} Headers parsed into an object\n\t */\n\tmodule.exports = function parseHeaders(headers) {\n\t var parsed = {};\n\t var key;\n\t var val;\n\t var i;\n\t\n\t if (!headers) { return parsed; }\n\t\n\t utils.forEach(headers.split('\\n'), function parser(line) {\n\t i = line.indexOf(':');\n\t key = utils.trim(line.substr(0, i)).toLowerCase();\n\t val = utils.trim(line.substr(i + 1));\n\t\n\t if (key) {\n\t if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n\t return;\n\t }\n\t if (key === 'set-cookie') {\n\t parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n\t } else {\n\t parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n\t }\n\t }\n\t });\n\t\n\t return parsed;\n\t};\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs have full support of the APIs needed to test\n\t // whether the request URL is of the same origin as current location.\n\t (function standardBrowserEnv() {\n\t var msie = /(msie|trident)/i.test(navigator.userAgent);\n\t var urlParsingNode = document.createElement('a');\n\t var originURL;\n\t\n\t /**\n\t * Parse a URL to discover it's components\n\t *\n\t * @param {String} url The URL to be parsed\n\t * @returns {Object}\n\t */\n\t function resolveURL(url) {\n\t var href = url;\n\t\n\t if (msie) {\n\t // IE needs attribute set twice to normalize properties\n\t urlParsingNode.setAttribute('href', href);\n\t href = urlParsingNode.href;\n\t }\n\t\n\t urlParsingNode.setAttribute('href', href);\n\t\n\t // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n\t return {\n\t href: urlParsingNode.href,\n\t protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n\t host: urlParsingNode.host,\n\t search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n\t hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n\t hostname: urlParsingNode.hostname,\n\t port: urlParsingNode.port,\n\t pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n\t urlParsingNode.pathname :\n\t '/' + urlParsingNode.pathname\n\t };\n\t }\n\t\n\t originURL = resolveURL(window.location.href);\n\t\n\t /**\n\t * Determine if a URL shares the same origin as the current location\n\t *\n\t * @param {String} requestURL The URL to test\n\t * @returns {boolean} True if URL shares the same origin, otherwise false\n\t */\n\t return function isURLSameOrigin(requestURL) {\n\t var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n\t return (parsed.protocol === originURL.protocol &&\n\t parsed.host === originURL.host);\n\t };\n\t })() :\n\t\n\t // Non standard browser envs (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return function isURLSameOrigin() {\n\t return true;\n\t };\n\t })()\n\t);\n\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\t\n\tvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\t\n\tfunction E() {\n\t this.message = 'String contains an invalid character';\n\t}\n\tE.prototype = new Error;\n\tE.prototype.code = 5;\n\tE.prototype.name = 'InvalidCharacterError';\n\t\n\tfunction btoa(input) {\n\t var str = String(input);\n\t var output = '';\n\t for (\n\t // initialize result and counter\n\t var block, charCode, idx = 0, map = chars;\n\t // if the next str index does not exist:\n\t // change the mapping table to \"=\"\n\t // check if d has no fractional digits\n\t str.charAt(idx | 0) || (map = '=', idx % 1);\n\t // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n\t output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n\t ) {\n\t charCode = str.charCodeAt(idx += 3 / 4);\n\t if (charCode > 0xFF) {\n\t throw new E();\n\t }\n\t block = block << 8 | charCode;\n\t }\n\t return output;\n\t}\n\t\n\tmodule.exports = btoa;\n\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs support document.cookie\n\t (function standardBrowserEnv() {\n\t return {\n\t write: function write(name, value, expires, path, domain, secure) {\n\t var cookie = [];\n\t cookie.push(name + '=' + encodeURIComponent(value));\n\t\n\t if (utils.isNumber(expires)) {\n\t cookie.push('expires=' + new Date(expires).toGMTString());\n\t }\n\t\n\t if (utils.isString(path)) {\n\t cookie.push('path=' + path);\n\t }\n\t\n\t if (utils.isString(domain)) {\n\t cookie.push('domain=' + domain);\n\t }\n\t\n\t if (secure === true) {\n\t cookie.push('secure');\n\t }\n\t\n\t document.cookie = cookie.join('; ');\n\t },\n\t\n\t read: function read(name) {\n\t var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n\t return (match ? decodeURIComponent(match[3]) : null);\n\t },\n\t\n\t remove: function remove(name) {\n\t this.write(name, '', Date.now() - 86400000);\n\t }\n\t };\n\t })() :\n\t\n\t // Non standard browser env (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return {\n\t write: function write() {},\n\t read: function read() { return null; },\n\t remove: function remove() {}\n\t };\n\t })()\n\t);\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\tfunction InterceptorManager() {\n\t this.handlers = [];\n\t}\n\t\n\t/**\n\t * Add a new interceptor to the stack\n\t *\n\t * @param {Function} fulfilled The function to handle `then` for a `Promise`\n\t * @param {Function} rejected The function to handle `reject` for a `Promise`\n\t *\n\t * @return {Number} An ID used to remove interceptor later\n\t */\n\tInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n\t this.handlers.push({\n\t fulfilled: fulfilled,\n\t rejected: rejected\n\t });\n\t return this.handlers.length - 1;\n\t};\n\t\n\t/**\n\t * Remove an interceptor from the stack\n\t *\n\t * @param {Number} id The ID that was returned by `use`\n\t */\n\tInterceptorManager.prototype.eject = function eject(id) {\n\t if (this.handlers[id]) {\n\t this.handlers[id] = null;\n\t }\n\t};\n\t\n\t/**\n\t * Iterate over all the registered interceptors\n\t *\n\t * This method is particularly useful for skipping over any\n\t * interceptors that may have become `null` calling `eject`.\n\t *\n\t * @param {Function} fn The function to call for each interceptor\n\t */\n\tInterceptorManager.prototype.forEach = function forEach(fn) {\n\t utils.forEach(this.handlers, function forEachHandler(h) {\n\t if (h !== null) {\n\t fn(h);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = InterceptorManager;\n\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\tvar transformData = __webpack_require__(29);\n\tvar isCancel = __webpack_require__(30);\n\tvar defaults = __webpack_require__(15);\n\tvar isAbsoluteURL = __webpack_require__(31);\n\tvar combineURLs = __webpack_require__(32);\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tfunction throwIfCancellationRequested(config) {\n\t if (config.cancelToken) {\n\t config.cancelToken.throwIfRequested();\n\t }\n\t}\n\t\n\t/**\n\t * Dispatch a request to the server using the configured adapter.\n\t *\n\t * @param {object} config The config that is to be used for the request\n\t * @returns {Promise} The Promise to be fulfilled\n\t */\n\tmodule.exports = function dispatchRequest(config) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Support baseURL config\n\t if (config.baseURL && !isAbsoluteURL(config.url)) {\n\t config.url = combineURLs(config.baseURL, config.url);\n\t }\n\t\n\t // Ensure headers exist\n\t config.headers = config.headers || {};\n\t\n\t // Transform request data\n\t config.data = transformData(\n\t config.data,\n\t config.headers,\n\t config.transformRequest\n\t );\n\t\n\t // Flatten headers\n\t config.headers = utils.merge(\n\t config.headers.common || {},\n\t config.headers[config.method] || {},\n\t config.headers || {}\n\t );\n\t\n\t utils.forEach(\n\t ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n\t function cleanHeaderConfig(method) {\n\t delete config.headers[method];\n\t }\n\t );\n\t\n\t var adapter = config.adapter || defaults.adapter;\n\t\n\t return adapter(config).then(function onAdapterResolution(response) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t response.data = transformData(\n\t response.data,\n\t response.headers,\n\t config.transformResponse\n\t );\n\t\n\t return response;\n\t }, function onAdapterRejection(reason) {\n\t if (!isCancel(reason)) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t if (reason && reason.response) {\n\t reason.response.data = transformData(\n\t reason.response.data,\n\t reason.response.headers,\n\t config.transformResponse\n\t );\n\t }\n\t }\n\t\n\t return Promise.reject(reason);\n\t });\n\t};\n\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(11);\n\t\n\t/**\n\t * Transform the data for a request or a response\n\t *\n\t * @param {Object|String} data The data to be transformed\n\t * @param {Array} headers The headers for the request or response\n\t * @param {Array|Function} fns A single function or Array of functions\n\t * @returns {*} The resulting transformed data\n\t */\n\tmodule.exports = function transformData(data, headers, fns) {\n\t /*eslint no-param-reassign:0*/\n\t utils.forEach(fns, function transform(fn) {\n\t data = fn(data, headers);\n\t });\n\t\n\t return data;\n\t};\n\n\n/***/ },\n/* 30 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function isCancel(value) {\n\t return !!(value && value.__CANCEL__);\n\t};\n\n\n/***/ },\n/* 31 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Determines whether the specified URL is absolute\n\t *\n\t * @param {string} url The URL to test\n\t * @returns {boolean} True if the specified URL is absolute, otherwise false\n\t */\n\tmodule.exports = function isAbsoluteURL(url) {\n\t // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n\t // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n\t // by any combination of letters, digits, plus, period, or hyphen.\n\t return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n\t};\n\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Creates a new URL by combining the specified URLs\n\t *\n\t * @param {string} baseURL The base URL\n\t * @param {string} relativeURL The relative URL\n\t * @returns {string} The combined URL\n\t */\n\tmodule.exports = function combineURLs(baseURL, relativeURL) {\n\t return relativeURL\n\t ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n\t : baseURL;\n\t};\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * A `Cancel` is an object that is thrown when an operation is canceled.\n\t *\n\t * @class\n\t * @param {string=} message The message.\n\t */\n\tfunction Cancel(message) {\n\t this.message = message;\n\t}\n\t\n\tCancel.prototype.toString = function toString() {\n\t return 'Cancel' + (this.message ? ': ' + this.message : '');\n\t};\n\t\n\tCancel.prototype.__CANCEL__ = true;\n\t\n\tmodule.exports = Cancel;\n\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar Cancel = __webpack_require__(33);\n\t\n\t/**\n\t * A `CancelToken` is an object that can be used to request cancellation of an operation.\n\t *\n\t * @class\n\t * @param {Function} executor The executor function.\n\t */\n\tfunction CancelToken(executor) {\n\t if (typeof executor !== 'function') {\n\t throw new TypeError('executor must be a function.');\n\t }\n\t\n\t var resolvePromise;\n\t this.promise = new Promise(function promiseExecutor(resolve) {\n\t resolvePromise = resolve;\n\t });\n\t\n\t var token = this;\n\t executor(function cancel(message) {\n\t if (token.reason) {\n\t // Cancellation has already been requested\n\t return;\n\t }\n\t\n\t token.reason = new Cancel(message);\n\t resolvePromise(token.reason);\n\t });\n\t}\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n\t if (this.reason) {\n\t throw this.reason;\n\t }\n\t};\n\t\n\t/**\n\t * Returns an object that contains a new `CancelToken` and a function that, when called,\n\t * cancels the `CancelToken`.\n\t */\n\tCancelToken.source = function source() {\n\t var cancel;\n\t var token = new CancelToken(function executor(c) {\n\t cancel = c;\n\t });\n\t return {\n\t token: token,\n\t cancel: cancel\n\t };\n\t};\n\t\n\tmodule.exports = CancelToken;\n\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Syntactic sugar for invoking a function and expanding an array for arguments.\n\t *\n\t * Common use case would be to use `Function.prototype.apply`.\n\t *\n\t * ```js\n\t * function f(x, y, z) {}\n\t * var args = [1, 2, 3];\n\t * f.apply(null, args);\n\t * ```\n\t *\n\t * With `spread` this example can be re-written.\n\t *\n\t * ```js\n\t * spread(function(x, y, z) {})([1, 2, 3]);\n\t * ```\n\t *\n\t * @param {Function} callback\n\t * @returns {Function}\n\t */\n\tmodule.exports = function spread(callback) {\n\t return function wrap(arr) {\n\t return callback.apply(null, arr);\n\t };\n\t};\n\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = uuid;\n\tvar REGEXP = /[xy]/g;\n\tvar PATTERN = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n\t\n\tfunction replacement(c) {\n\t var r = Math.random() * 16 | 0;\n\t var v = c == 'x' ? r : r & 0x3 | 0x8;\n\t return v.toString(16);\n\t}\n\t\n\t/**\n\t * Generate a univierally unique identifier\n\t *\n\t * @return {String}\n\t */\n\tfunction uuid() {\n\t return PATTERN.replace(REGEXP, replacement);\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar documentUrl = exports.documentUrl = document.getElementById('pdf-data').dataset.filepath;\n\tvar documentId = exports.documentId = document.getElementById('pdf-data').dataset.uuid;\n\tvar readonly = exports.readonly = document.getElementById('pdf-data').dataset.readonly === 'True';\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.renderComments = renderComments;\n\texports.selectComment = selectComment;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _twitterText = __webpack_require__(39);\n\t\n\tvar _twitterText2 = _interopRequireDefault(_twitterText);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _edit = __webpack_require__(40);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar commentList = $('#comment-wrapper .comment-list-container');\n\tvar commentForm = $('#comment-wrapper .comment-list-form');\n\t\n\t// let commentText = commentForm.querySelector('input[type=\"text\"]');\n\t\n\tfunction renderComments(documentId) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().getComments(documentId).then(function (comments) {\n\t\n\t commentList.html('');\n\t commentForm.hide();\n\t // commentText.focus();\n\t\n\t // commentForm.onsubmit = function () {\n\t // PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n\t // .then(insertComment)\n\t // .then(() => {\n\t // commentText.value = '';\n\t // commentText.focus();\n\t // });\n\t //\n\t // return false;\n\t // };\n\t\n\t comments.forEach(insertComment);\n\t });\n\t}\n\t\n\tfunction supportsComments(target) {\n\t var type = target.getAttribute('data-pdf-annotate-type');\n\t return ['point', 'highlight', 'area'].indexOf(type) > -1;\n\t}\n\t\n\tfunction insertComment(comment) {\n\t var child = $('<div></div>');\n\t child.addClass('comment-list-item');\n\t child.attr('uuid', comment.annotation);\n\t child.html(_twitterText2.default.autoLink(_twitterText2.default.htmlEscape(comment.content)));\n\t child.bind('click', handleCommentClick);\n\t commentList.append(child);\n\t}\n\t\n\tfunction handleCommentClick(e) {\n\t var comment = $(e.target);\n\t selectComment(comment.attr('uuid'));\n\t}\n\t\n\tfunction scrollToView(element) {\n\t var offset = element.offset().top;\n\t if (!element.is(\":visible\")) {\n\t element.css({ \"visibility\": \"hidden\" }).show();\n\t var offset = element.offset().top;\n\t element.css({ \"visibility\": \"\", \"display\": \"\" });\n\t }\n\t\n\t var visible_area_start = $(window).scrollTop();\n\t var visible_area_end = visible_area_start + window.innerHeight;\n\t\n\t if (offset < visible_area_start || offset > visible_area_end) {\n\t // Not in view so scroll to it\n\t if (element.hasClass('comment-list-item')) {\n\t $('.comment-list-container').animate({ scrollTop: offset - window.innerHeight / 3 }, 300);\n\t } else {\n\t $('#content-wrapper').animate({ scrollTop: offset - window.innerHeight / 3 }, 300);\n\t }\n\t return false;\n\t }\n\t return true;\n\t}\n\t\n\tfunction selectComment(uuid) {\n\t var comment = $(\".comment-list-item[uuid=\" + uuid + \"]\");\n\t $('.comment-list-item').removeClass('selected');\n\t comment.addClass('selected');\n\t var annotation = $(\"[data-pdf-annotate-id=\" + uuid + \"]\")[0];\n\t (0, _edit.createEditOverlay)(annotation);\n\t scrollToView($(annotation));\n\t scrollToView(comment);\n\t}\n\t\n\t// function handleAnnotationClick(target) {\n\t// if (supportsComments(target)) {\n\t// let documentId = target.parentNode.getAttribute('data-pdf-annotate-document');\n\t// let annotationId = target.getAttribute('data-pdf-annotate-id');\n\t//\n\t// PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId).then((comments) => {\n\t// commentList.innerHTML = '';\n\t// commentForm.style.display = '';\n\t// commentText.focus();\n\t//\n\t// commentForm.onsubmit = function () {\n\t// PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n\t// .then(insertComment)\n\t// .then(() => {\n\t// commentText.value = '';\n\t// commentText.focus();\n\t// });\n\t//\n\t// return false;\n\t// };\n\t//\n\t// comments.forEach(insertComment);\n\t// });\n\t// }\n\t// }\n\t//\n\t// function handleAnnotationBlur(target) {\n\t// if (supportsComments(target)) {\n\t// commentList.innerHTML = '';\n\t// commentForm.style.display = 'none';\n\t// commentForm.onsubmit = null;\n\t//\n\t// insertComment({content: 'No comments'});\n\t// }\n\t// }\n\t\n\t\n\t// UI.addEventListener('annotation:click', handleAnnotationClick);\n\t// UI.addEventListener('annotation:blur', handleAnnotationBlur);\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function() {\n\t if (typeof twttr === \"undefined\" || twttr === null) {\n\t var twttr = {};\n\t }\n\t\n\t twttr.txt = {};\n\t twttr.txt.regexen = {};\n\t\n\t var HTML_ENTITIES = {\n\t '&': '&',\n\t '>': '>',\n\t '<': '<',\n\t '\"': '"',\n\t \"'\": '''\n\t };\n\t\n\t // HTML escaping\n\t twttr.txt.htmlEscape = function(text) {\n\t return text && text.replace(/[&\"'><]/g, function(character) {\n\t return HTML_ENTITIES[character];\n\t });\n\t };\n\t\n\t // Builds a RegExp\n\t function regexSupplant(regex, flags) {\n\t flags = flags || \"\";\n\t if (typeof regex !== \"string\") {\n\t if (regex.global && flags.indexOf(\"g\") < 0) {\n\t flags += \"g\";\n\t }\n\t if (regex.ignoreCase && flags.indexOf(\"i\") < 0) {\n\t flags += \"i\";\n\t }\n\t if (regex.multiline && flags.indexOf(\"m\") < 0) {\n\t flags += \"m\";\n\t }\n\t\n\t regex = regex.source;\n\t }\n\t\n\t return new RegExp(regex.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n\t var newRegex = twttr.txt.regexen[name] || \"\";\n\t if (typeof newRegex !== \"string\") {\n\t newRegex = newRegex.source;\n\t }\n\t return newRegex;\n\t }), flags);\n\t }\n\t\n\t twttr.txt.regexSupplant = regexSupplant;\n\t\n\t // simple string interpolation\n\t function stringSupplant(str, values) {\n\t return str.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n\t return values[name] || \"\";\n\t });\n\t }\n\t\n\t twttr.txt.stringSupplant = stringSupplant;\n\t\n\t twttr.txt.regexen.spaces_group = /\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000/;\n\t twttr.txt.regexen.spaces = regexSupplant(/[#{spaces_group}]/);\n\t twttr.txt.regexen.invalid_chars_group = /\\uFFFE\\uFEFF\\uFFFF\\u202A-\\u202E/;\n\t twttr.txt.regexen.invalid_chars = regexSupplant(/[#{invalid_chars_group}]/);\n\t twttr.txt.regexen.punct = /\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$/;\n\t twttr.txt.regexen.rtl_chars = /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg;\n\t twttr.txt.regexen.non_bmp_code_pairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/mg;\n\t\n\t twttr.txt.regexen.latinAccentChars = /\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF/;\n\t\n\t // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{L}\\p{M}\n\t twttr.txt.regexen.bmpLetterAndMarks = /A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0300-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u0483-\\u052f\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06df-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710-\\u074a\\u074d-\\u07b1\\u07ca-\\u07f5\\u07fa\\u0800-\\u082d\\u0840-\\u085b\\u08a0-\\u08b2\\u08e4-\\u0963\\u0971-\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bc-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e3\\u09f0\\u09f1\\u0a01-\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a59-\\u0a5c\\u0a5e\\u0a70-\\u0a75\\u0a81-\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abc-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ad0\\u0ae0-\\u0ae3\\u0b01-\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3c-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b63\\u0b71\\u0b82\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd0\\u0bd7\\u0c00-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c58\\u0c59\\u0c60-\\u0c63\\u0c81-\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbc-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0cde\\u0ce0-\\u0ce3\\u0cf1\\u0cf2\\u0d01-\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4e\\u0d57\\u0d60-\\u0d63\\u0d7a-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb9\\u0ebb-\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ec8-\\u0ecd\\u0edc-\\u0edf\\u0f00\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f71-\\u0f84\\u0f86-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u103f\\u1050-\\u108f\\u109a-\\u109d\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u135d-\\u135f\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16f1-\\u16f8\\u1700-\\u170c\\u170e-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176c\\u176e-\\u1770\\u1772\\u1773\\u1780-\\u17d3\\u17d7\\u17dc\\u17dd\\u180b-\\u180d\\u1820-\\u1877\\u1880-\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1920-\\u192b\\u1930-\\u193b\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a1b\\u1a20-\\u1a5e\\u1a60-\\u1a7c\\u1a7f\\u1aa7\\u1ab0-\\u1abe\\u1b00-\\u1b4b\\u1b6b-\\u1b73\\u1b80-\\u1baf\\u1bba-\\u1bf3\\u1c00-\\u1c37\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1cd0-\\u1cd2\\u1cd4-\\u1cf6\\u1cf8\\u1cf9\\u1d00-\\u1df5\\u1dfc-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u20d0-\\u20f0\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2183\\u2184\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d7f-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2de0-\\u2dff\\u2e2f\\u3005\\u3006\\u302a-\\u302f\\u3031-\\u3035\\u303b\\u303c\\u3041-\\u3096\\u3099\\u309a\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua672\\ua674-\\ua67d\\ua67f-\\ua69d\\ua69f-\\ua6e5\\ua6f0\\ua6f1\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua7ad\\ua7b0\\ua7b1\\ua7f7-\\ua827\\ua840-\\ua873\\ua880-\\ua8c4\\ua8e0-\\ua8f7\\ua8fb\\ua90a-\\ua92d\\ua930-\\ua953\\ua960-\\ua97c\\ua980-\\ua9c0\\ua9cf\\ua9e0-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa36\\uaa40-\\uaa4d\\uaa60-\\uaa76\\uaa7a-\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaef\\uaaf2-\\uaaf6\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab5f\\uab64\\uab65\\uabc0-\\uabea\\uabec\\uabed\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf870-\\uf87f\\uf882\\uf884-\\uf89f\\uf8b8\\uf8c1-\\uf8d6\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe00-\\ufe0f\\ufe20-\\ufe2d\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc/;\n\t twttr.txt.regexen.astralLetterAndMarks = /\\ud800[\\udc00-\\udc0b\\udc0d-\\udc26\\udc28-\\udc3a\\udc3c\\udc3d\\udc3f-\\udc4d\\udc50-\\udc5d\\udc80-\\udcfa\\uddfd\\ude80-\\ude9c\\udea0-\\uded0\\udee0\\udf00-\\udf1f\\udf30-\\udf40\\udf42-\\udf49\\udf50-\\udf7a\\udf80-\\udf9d\\udfa0-\\udfc3\\udfc8-\\udfcf]|\\ud801[\\udc00-\\udc9d\\udd00-\\udd27\\udd30-\\udd63\\ude00-\\udf36\\udf40-\\udf55\\udf60-\\udf67]|\\ud802[\\udc00-\\udc05\\udc08\\udc0a-\\udc35\\udc37\\udc38\\udc3c\\udc3f-\\udc55\\udc60-\\udc76\\udc80-\\udc9e\\udd00-\\udd15\\udd20-\\udd39\\udd80-\\uddb7\\uddbe\\uddbf\\ude00-\\ude03\\ude05\\ude06\\ude0c-\\ude13\\ude15-\\ude17\\ude19-\\ude33\\ude38-\\ude3a\\ude3f\\ude60-\\ude7c\\ude80-\\ude9c\\udec0-\\udec7\\udec9-\\udee6\\udf00-\\udf35\\udf40-\\udf55\\udf60-\\udf72\\udf80-\\udf91]|\\ud803[\\udc00-\\udc48]|\\ud804[\\udc00-\\udc46\\udc7f-\\udcba\\udcd0-\\udce8\\udd00-\\udd34\\udd50-\\udd73\\udd76\\udd80-\\uddc4\\uddda\\ude00-\\ude11\\ude13-\\ude37\\udeb0-\\udeea\\udf01-\\udf03\\udf05-\\udf0c\\udf0f\\udf10\\udf13-\\udf28\\udf2a-\\udf30\\udf32\\udf33\\udf35-\\udf39\\udf3c-\\udf44\\udf47\\udf48\\udf4b-\\udf4d\\udf57\\udf5d-\\udf63\\udf66-\\udf6c\\udf70-\\udf74]|\\ud805[\\udc80-\\udcc5\\udcc7\\udd80-\\uddb5\\uddb8-\\uddc0\\ude00-\\ude40\\ude44\\ude80-\\udeb7]|\\ud806[\\udca0-\\udcdf\\udcff\\udec0-\\udef8]|\\ud808[\\udc00-\\udf98]|\\ud80c[\\udc00-\\udfff]|\\ud80d[\\udc00-\\udc2e]|\\ud81a[\\udc00-\\ude38\\ude40-\\ude5e\\uded0-\\udeed\\udef0-\\udef4\\udf00-\\udf36\\udf40-\\udf43\\udf63-\\udf77\\udf7d-\\udf8f]|\\ud81b[\\udf00-\\udf44\\udf50-\\udf7e\\udf8f-\\udf9f]|\\ud82c[\\udc00\\udc01]|\\ud82f[\\udc00-\\udc6a\\udc70-\\udc7c\\udc80-\\udc88\\udc90-\\udc99\\udc9d\\udc9e]|\\ud834[\\udd65-\\udd69\\udd6d-\\udd72\\udd7b-\\udd82\\udd85-\\udd8b\\uddaa-\\uddad\\ude42-\\ude44]|\\ud835[\\udc00-\\udc54\\udc56-\\udc9c\\udc9e\\udc9f\\udca2\\udca5\\udca6\\udca9-\\udcac\\udcae-\\udcb9\\udcbb\\udcbd-\\udcc3\\udcc5-\\udd05\\udd07-\\udd0a\\udd0d-\\udd14\\udd16-\\udd1c\\udd1e-\\udd39\\udd3b-\\udd3e\\udd40-\\udd44\\udd46\\udd4a-\\udd50\\udd52-\\udea5\\udea8-\\udec0\\udec2-\\udeda\\udedc-\\udefa\\udefc-\\udf14\\udf16-\\udf34\\udf36-\\udf4e\\udf50-\\udf6e\\udf70-\\udf88\\udf8a-\\udfa8\\udfaa-\\udfc2\\udfc4-\\udfcb]|\\ud83a[\\udc00-\\udcc4\\udcd0-\\udcd6]|\\ud83b[\\ude00-\\ude03\\ude05-\\ude1f\\ude21\\ude22\\ude24\\ude27\\ude29-\\ude32\\ude34-\\ude37\\ude39\\ude3b\\ude42\\ude47\\ude49\\ude4b\\ude4d-\\ude4f\\ude51\\ude52\\ude54\\ude57\\ude59\\ude5b\\ude5d\\ude5f\\ude61\\ude62\\ude64\\ude67-\\ude6a\\ude6c-\\ude72\\ude74-\\ude77\\ude79-\\ude7c\\ude7e\\ude80-\\ude89\\ude8b-\\ude9b\\udea1-\\udea3\\udea5-\\udea9\\udeab-\\udebb]|\\ud840[\\udc00-\\udfff]|\\ud841[\\udc00-\\udfff]|\\ud842[\\udc00-\\udfff]|\\ud843[\\udc00-\\udfff]|\\ud844[\\udc00-\\udfff]|\\ud845[\\udc00-\\udfff]|\\ud846[\\udc00-\\udfff]|\\ud847[\\udc00-\\udfff]|\\ud848[\\udc00-\\udfff]|\\ud849[\\udc00-\\udfff]|\\ud84a[\\udc00-\\udfff]|\\ud84b[\\udc00-\\udfff]|\\ud84c[\\udc00-\\udfff]|\\ud84d[\\udc00-\\udfff]|\\ud84e[\\udc00-\\udfff]|\\ud84f[\\udc00-\\udfff]|\\ud850[\\udc00-\\udfff]|\\ud851[\\udc00-\\udfff]|\\ud852[\\udc00-\\udfff]|\\ud853[\\udc00-\\udfff]|\\ud854[\\udc00-\\udfff]|\\ud855[\\udc00-\\udfff]|\\ud856[\\udc00-\\udfff]|\\ud857[\\udc00-\\udfff]|\\ud858[\\udc00-\\udfff]|\\ud859[\\udc00-\\udfff]|\\ud85a[\\udc00-\\udfff]|\\ud85b[\\udc00-\\udfff]|\\ud85c[\\udc00-\\udfff]|\\ud85d[\\udc00-\\udfff]|\\ud85e[\\udc00-\\udfff]|\\ud85f[\\udc00-\\udfff]|\\ud860[\\udc00-\\udfff]|\\ud861[\\udc00-\\udfff]|\\ud862[\\udc00-\\udfff]|\\ud863[\\udc00-\\udfff]|\\ud864[\\udc00-\\udfff]|\\ud865[\\udc00-\\udfff]|\\ud866[\\udc00-\\udfff]|\\ud867[\\udc00-\\udfff]|\\ud868[\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86a[\\udc00-\\udfff]|\\ud86b[\\udc00-\\udfff]|\\ud86c[\\udc00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d]|\\ud87e[\\udc00-\\ude1d]|\\udb40[\\udd00-\\uddef]/;\n\t\n\t // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{Nd}\n\t twttr.txt.regexen.bmpNumerals = /0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u07c0-\\u07c9\\u0966-\\u096f\\u09e6-\\u09ef\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0de6-\\u0def\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\\u1040-\\u1049\\u1090-\\u1099\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1b50-\\u1b59\\u1bb0-\\u1bb9\\u1c40-\\u1c49\\u1c50-\\u1c59\\ua620-\\ua629\\ua8d0-\\ua8d9\\ua900-\\ua909\\ua9d0-\\ua9d9\\ua9f0-\\ua9f9\\uaa50-\\uaa59\\uabf0-\\uabf9\\uff10-\\uff19/;\n\t twttr.txt.regexen.astralNumerals = /\\ud801[\\udca0-\\udca9]|\\ud804[\\udc66-\\udc6f\\udcf0-\\udcf9\\udd36-\\udd3f\\uddd0-\\uddd9\\udef0-\\udef9]|\\ud805[\\udcd0-\\udcd9\\ude50-\\ude59\\udec0-\\udec9]|\\ud806[\\udce0-\\udce9]|\\ud81a[\\ude60-\\ude69\\udf50-\\udf59]|\\ud835[\\udfce-\\udfff]/;\n\t\n\t twttr.txt.regexen.hashtagSpecialChars = /_\\u200c\\u200d\\ua67e\\u05be\\u05f3\\u05f4\\uff5e\\u301c\\u309b\\u309c\\u30a0\\u30fb\\u3003\\u0f0b\\u0f0c\\xb7/;\n\t\n\t // A hashtag must contain at least one unicode letter or mark, as well as numbers, underscores, and select special characters.\n\t twttr.txt.regexen.hashSigns = /[##]/;\n\t twttr.txt.regexen.hashtagAlpha = regexSupplant(/(?:[#{bmpLetterAndMarks}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}))/);\n\t twttr.txt.regexen.hashtagAlphaNumeric = regexSupplant(/(?:[#{bmpLetterAndMarks}#{bmpNumerals}#{hashtagSpecialChars}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}|#{astralNumerals}))/);\n\t twttr.txt.regexen.endHashtagMatch = regexSupplant(/^(?:#{hashSigns}|:\\/\\/)/);\n\t twttr.txt.regexen.codePoint = /(?:[^\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/;\n\t twttr.txt.regexen.hashtagBoundary = regexSupplant(/(?:^|\\uFE0E|\\uFE0F|$|(?!#{hashtagAlphaNumeric}|&)#{codePoint})/);\n\t twttr.txt.regexen.validHashtag = regexSupplant(/(#{hashtagBoundary})(#{hashSigns})(?!\\uFE0F|\\u20E3)(#{hashtagAlphaNumeric}*#{hashtagAlpha}#{hashtagAlphaNumeric}*)/gi);\n\t\n\t // Mention related regex collection\n\t twttr.txt.regexen.validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@@]|(?:^|[^a-zA-Z0-9_+~.-])(?:rt|RT|rT|Rt):?)/;\n\t twttr.txt.regexen.atSigns = /[@@]/;\n\t twttr.txt.regexen.validMentionOrList = regexSupplant(\n\t '(#{validMentionPrecedingChars})' + // $1: Preceding character\n\t '(#{atSigns})' + // $2: At mark\n\t '([a-zA-Z0-9_]{1,20})' + // $3: Screen name\n\t '(\\/[a-zA-Z][a-zA-Z0-9_\\-]{0,24})?' // $4: List (optional)\n\t , 'g');\n\t twttr.txt.regexen.validReply = regexSupplant(/^(?:#{spaces})*#{atSigns}([a-zA-Z0-9_]{1,20})/);\n\t twttr.txt.regexen.endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\\/\\/)/);\n\t\n\t // URL related regex collection\n\t twttr.txt.regexen.validUrlPrecedingChars = regexSupplant(/(?:[^A-Za-z0-9@@$###{invalid_chars_group}]|^)/);\n\t twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars = /[-_.\\/]$/;\n\t twttr.txt.regexen.invalidDomainChars = stringSupplant(\"#{punct}#{spaces_group}#{invalid_chars_group}\", twttr.txt.regexen);\n\t twttr.txt.regexen.validDomainChars = regexSupplant(/[^#{invalidDomainChars}]/);\n\t twttr.txt.regexen.validSubdomain = regexSupplant(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n\t twttr.txt.regexen.validDomainName = regexSupplant(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n\t twttr.txt.regexen.validGTLD = regexSupplant(RegExp(\n\t'(?:(?:' +\n\t '삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|' +\n\t '政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|' +\n\t 'ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|' +\n\t 'بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|' +\n\t 'zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|' +\n\t 'yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|' +\n\t 'wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|' +\n\t 'website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|' +\n\t 'wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|' +\n\t 'vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|' +\n\t 'vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|' +\n\t 'university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|' +\n\t 'travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|' +\n\t 'toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|' +\n\t 'tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|' +\n\t 'tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|' +\n\t 'swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|' +\n\t 'stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|' +\n\t 'stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|' +\n\t 'softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|' +\n\t 'showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|' +\n\t 'sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|' +\n\t 'science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|' +\n\t 'sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|' +\n\t 'saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|' +\n\t 'rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|' +\n\t 'repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|' +\n\t 'realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|' +\n\t 'protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|' +\n\t 'pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|' +\n\t 'pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|' +\n\t 'pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|' +\n\t 'pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|' +\n\t 'onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|' +\n\t 'obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|' +\n\t 'nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|' +\n\t 'net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|' +\n\t 'msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|' +\n\t 'monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|' +\n\t 'miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|' +\n\t 'mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|' +\n\t 'makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|' +\n\t 'lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|' +\n\t 'limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|' +\n\t 'lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|' +\n\t 'lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|' +\n\t 'komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|' +\n\t 'kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|' +\n\t 'jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|' +\n\t 'investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|' +\n\t 'industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|' +\n\t 'hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|' +\n\t 'honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|' +\n\t 'hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|' +\n\t 'hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|' +\n\t 'gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|' +\n\t 'globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|' +\n\t 'garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|' +\n\t 'ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|' +\n\t 'football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|' +\n\t 'fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|' +\n\t 'ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|' +\n\t 'extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|' +\n\t 'estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|' +\n\t 'email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|' +\n\t 'download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|' +\n\t 'direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|' +\n\t 'delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|' +\n\t 'cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|' +\n\t 'coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|' +\n\t 'construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|' +\n\t 'college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|' +\n\t 'cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|' +\n\t 'chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|' +\n\t 'catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|' +\n\t 'capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|' +\n\t 'bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|' +\n\t 'bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|' +\n\t 'boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|' +\n\t 'black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|' +\n\t 'beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|' +\n\t 'barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|' +\n\t 'autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|' +\n\t 'art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|' +\n\t 'amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|' +\n\t 'alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|' +\n\t 'afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|' +\n\t 'academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion' +\n\t')(?=[^0-9a-zA-Z@]|$))'));\n\t twttr.txt.regexen.validCCTLD = regexSupplant(RegExp(\n\t'(?:(?:' +\n\t '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|' +\n\t 'ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|' +\n\t 'بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|' +\n\t 'zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|' +\n\t 'tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|' +\n\t 're|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|' +\n\t 'mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|' +\n\t 'ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|' +\n\t 'gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|' +\n\t 'do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|' +\n\t 'bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac' +\n\t')(?=[^0-9a-zA-Z@]|$))'));\n\t twttr.txt.regexen.validPunycode = /(?:xn--[0-9a-z]+)/;\n\t twttr.txt.regexen.validSpecialCCTLD = /(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/;\n\t twttr.txt.regexen.validDomain = regexSupplant(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/);\n\t twttr.txt.regexen.validAsciiDomain = regexSupplant(/(?:(?:[\\-a-z0-9#{latinAccentChars}]+)\\.)+(?:#{validGTLD}|#{validCCTLD}|#{validPunycode})/gi);\n\t twttr.txt.regexen.invalidShortDomain = regexSupplant(/^#{validDomainName}#{validCCTLD}$/i);\n\t twttr.txt.regexen.validSpecialShortDomain = regexSupplant(/^#{validDomainName}#{validSpecialCCTLD}$/i);\n\t twttr.txt.regexen.validPortNumber = /[0-9]+/;\n\t twttr.txt.regexen.cyrillicLettersAndMarks = /\\u0400-\\u04FF/;\n\t twttr.txt.regexen.validGeneralUrlPathChars = regexSupplant(/[a-z#{cyrillicLettersAndMarks}0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-_~@\\|&#{latinAccentChars}]/i);\n\t // Allow URL paths to contain up to two nested levels of balanced parens\n\t // 1. Used in Wikipedia URLs like /Primer_(film)\n\t // 2. Used in IIS sessions like /S(dfd346)/\n\t // 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/\n\t twttr.txt.regexen.validUrlBalancedParens = regexSupplant(\n\t '\\\\(' +\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}+' +\n\t '|' +\n\t // allow one nested level of balanced parentheses\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}*' +\n\t '\\\\(' +\n\t '#{validGeneralUrlPathChars}+' +\n\t '\\\\)' +\n\t '#{validGeneralUrlPathChars}*' +\n\t ')' +\n\t ')' +\n\t '\\\\)'\n\t , 'i');\n\t // Valid end-of-path chracters (so /foo. does not gobble the period).\n\t // 1. Allow =&# for empty URL parameters and other URL-join artifacts\n\t twttr.txt.regexen.validUrlPathEndingChars = regexSupplant(/[\\+\\-a-z#{cyrillicLettersAndMarks}0-9=_#\\/#{latinAccentChars}]|(?:#{validUrlBalancedParens})/i);\n\t // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/\n\t twttr.txt.regexen.validUrlPath = regexSupplant('(?:' +\n\t '(?:' +\n\t '#{validGeneralUrlPathChars}*' +\n\t '(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*' +\n\t '#{validUrlPathEndingChars}'+\n\t ')|(?:@#{validGeneralUrlPathChars}+\\/)'+\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validUrlQueryChars = /[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]/i;\n\t twttr.txt.regexen.validUrlQueryEndingChars = /[a-z0-9_&=#\\/]/i;\n\t twttr.txt.regexen.extractUrl = regexSupplant(\n\t '(' + // $1 total match\n\t '(#{validUrlPrecedingChars})' + // $2 Preceeding chracter\n\t '(' + // $3 URL\n\t '(https?:\\\\/\\\\/)?' + // $4 Protocol (optional)\n\t '(#{validDomain})' + // $5 Domain(s)\n\t '(?::(#{validPortNumber}))?' + // $6 Port number (optional)\n\t '(\\\\/#{validUrlPath}*)?' + // $7 URL Path\n\t '(\\\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?' + // $8 Query String\n\t ')' +\n\t ')'\n\t , 'gi');\n\t\n\t twttr.txt.regexen.validTcoUrl = /^https?:\\/\\/t\\.co\\/[a-z0-9]+/i;\n\t twttr.txt.regexen.urlHasProtocol = /^https?:\\/\\//i;\n\t twttr.txt.regexen.urlHasHttps = /^https:\\/\\//i;\n\t\n\t // cashtag related regex\n\t twttr.txt.regexen.cashtag = /[a-z]{1,6}(?:[._][a-z]{1,2})?/i;\n\t twttr.txt.regexen.validCashtag = regexSupplant('(^|#{spaces})(\\\\$)(#{cashtag})(?=$|\\\\s|[#{punct}])', 'gi');\n\t\n\t // These URL validation pattern strings are based on the ABNF from RFC 3986\n\t twttr.txt.regexen.validateUrlUnreserved = /[a-z\\u0400-\\u04FF0-9\\-._~]/i;\n\t twttr.txt.regexen.validateUrlPctEncoded = /(?:%[0-9a-f]{2})/i;\n\t twttr.txt.regexen.validateUrlSubDelims = /[!$&'()*+,;=]/i;\n\t twttr.txt.regexen.validateUrlPchar = regexSupplant('(?:' +\n\t '#{validateUrlUnreserved}|' +\n\t '#{validateUrlPctEncoded}|' +\n\t '#{validateUrlSubDelims}|' +\n\t '[:|@]' +\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validateUrlScheme = /(?:[a-z][a-z0-9+\\-.]*)/i;\n\t twttr.txt.regexen.validateUrlUserinfo = regexSupplant('(?:' +\n\t '#{validateUrlUnreserved}|' +\n\t '#{validateUrlPctEncoded}|' +\n\t '#{validateUrlSubDelims}|' +\n\t ':' +\n\t ')*', 'i');\n\t\n\t twttr.txt.regexen.validateUrlDecOctet = /(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9]{2})|(?:2[0-4][0-9])|(?:25[0-5]))/i;\n\t twttr.txt.regexen.validateUrlIpv4 = regexSupplant(/(?:#{validateUrlDecOctet}(?:\\.#{validateUrlDecOctet}){3})/i);\n\t\n\t // Punting on real IPv6 validation for now\n\t twttr.txt.regexen.validateUrlIpv6 = /(?:\\[[a-f0-9:\\.]+\\])/i;\n\t\n\t // Also punting on IPvFuture for now\n\t twttr.txt.regexen.validateUrlIp = regexSupplant('(?:' +\n\t '#{validateUrlIpv4}|' +\n\t '#{validateUrlIpv6}' +\n\t ')', 'i');\n\t\n\t // This is more strict than the rfc specifies\n\t twttr.txt.regexen.validateUrlSubDomainSegment = /(?:[a-z0-9](?:[a-z0-9_\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomainSegment = /(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomainTld = /(?:[a-z](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n\t twttr.txt.regexen.validateUrlDomain = regexSupplant(/(?:(?:#{validateUrlSubDomainSegment}\\.)*(?:#{validateUrlDomainSegment}\\.)#{validateUrlDomainTld})/i);\n\t\n\t twttr.txt.regexen.validateUrlHost = regexSupplant('(?:' +\n\t '#{validateUrlIp}|' +\n\t '#{validateUrlDomain}' +\n\t ')', 'i');\n\t\n\t // Unencoded internationalized domains - this doesn't check for invalid UTF-8 sequences\n\t twttr.txt.regexen.validateUrlUnicodeSubDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9_\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomainTld = /(?:(?:[a-z]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n\t twttr.txt.regexen.validateUrlUnicodeDomain = regexSupplant(/(?:(?:#{validateUrlUnicodeSubDomainSegment}\\.)*(?:#{validateUrlUnicodeDomainSegment}\\.)#{validateUrlUnicodeDomainTld})/i);\n\t\n\t twttr.txt.regexen.validateUrlUnicodeHost = regexSupplant('(?:' +\n\t '#{validateUrlIp}|' +\n\t '#{validateUrlUnicodeDomain}' +\n\t ')', 'i');\n\t\n\t twttr.txt.regexen.validateUrlPort = /[0-9]{1,5}/;\n\t\n\t twttr.txt.regexen.validateUrlUnicodeAuthority = regexSupplant(\n\t '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n\t '(#{validateUrlUnicodeHost})' + // $2 host\n\t '(?::(#{validateUrlPort}))?' //$3 port\n\t , \"i\");\n\t\n\t twttr.txt.regexen.validateUrlAuthority = regexSupplant(\n\t '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n\t '(#{validateUrlHost})' + // $2 host\n\t '(?::(#{validateUrlPort}))?' // $3 port\n\t , \"i\");\n\t\n\t twttr.txt.regexen.validateUrlPath = regexSupplant(/(\\/#{validateUrlPchar}*)*/i);\n\t twttr.txt.regexen.validateUrlQuery = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\t twttr.txt.regexen.validateUrlFragment = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\t\n\t // Modified version of RFC 3986 Appendix B\n\t twttr.txt.regexen.validateUrlUnencoded = regexSupplant(\n\t '^' + // Full URL\n\t '(?:' +\n\t '([^:/?#]+):\\\\/\\\\/' + // $1 Scheme\n\t ')?' +\n\t '([^/?#]*)' + // $2 Authority\n\t '([^?#]*)' + // $3 Path\n\t '(?:' +\n\t '\\\\?([^#]*)' + // $4 Query\n\t ')?' +\n\t '(?:' +\n\t '#(.*)' + // $5 Fragment\n\t ')?$'\n\t , \"i\");\n\t\n\t\n\t // Default CSS class for auto-linked lists (along with the url class)\n\t var DEFAULT_LIST_CLASS = \"tweet-url list-slug\";\n\t // Default CSS class for auto-linked usernames (along with the url class)\n\t var DEFAULT_USERNAME_CLASS = \"tweet-url username\";\n\t // Default CSS class for auto-linked hashtags (along with the url class)\n\t var DEFAULT_HASHTAG_CLASS = \"tweet-url hashtag\";\n\t // Default CSS class for auto-linked cashtags (along with the url class)\n\t var DEFAULT_CASHTAG_CLASS = \"tweet-url cashtag\";\n\t // Options which should not be passed as HTML attributes\n\t var OPTIONS_NOT_ATTRIBUTES = {'urlClass':true, 'listClass':true, 'usernameClass':true, 'hashtagClass':true, 'cashtagClass':true,\n\t 'usernameUrlBase':true, 'listUrlBase':true, 'hashtagUrlBase':true, 'cashtagUrlBase':true,\n\t 'usernameUrlBlock':true, 'listUrlBlock':true, 'hashtagUrlBlock':true, 'linkUrlBlock':true,\n\t 'usernameIncludeSymbol':true, 'suppressLists':true, 'suppressNoFollow':true, 'targetBlank':true,\n\t 'suppressDataScreenName':true, 'urlEntities':true, 'symbolTag':true, 'textWithSymbolTag':true, 'urlTarget':true,\n\t 'invisibleTagAttrs':true, 'linkAttributeBlock':true, 'linkTextBlock': true, 'htmlEscapeNonEntities': true\n\t };\n\t\n\t var BOOLEAN_ATTRIBUTES = {'disabled':true, 'readonly':true, 'multiple':true, 'checked':true};\n\t\n\t // Simple object cloning function for simple objects\n\t function clone(o) {\n\t var r = {};\n\t for (var k in o) {\n\t if (o.hasOwnProperty(k)) {\n\t r[k] = o[k];\n\t }\n\t }\n\t\n\t return r;\n\t }\n\t\n\t twttr.txt.tagAttrs = function(attributes) {\n\t var htmlAttrs = \"\";\n\t for (var k in attributes) {\n\t var v = attributes[k];\n\t if (BOOLEAN_ATTRIBUTES[k]) {\n\t v = v ? k : null;\n\t }\n\t if (v == null) continue;\n\t htmlAttrs += \" \" + twttr.txt.htmlEscape(k) + \"=\\\"\" + twttr.txt.htmlEscape(v.toString()) + \"\\\"\";\n\t }\n\t return htmlAttrs;\n\t };\n\t\n\t twttr.txt.linkToText = function(entity, text, attributes, options) {\n\t if (!options.suppressNoFollow) {\n\t attributes.rel = \"nofollow\";\n\t }\n\t // if linkAttributeBlock is specified, call it to modify the attributes\n\t if (options.linkAttributeBlock) {\n\t options.linkAttributeBlock(entity, attributes);\n\t }\n\t // if linkTextBlock is specified, call it to get a new/modified link text\n\t if (options.linkTextBlock) {\n\t text = options.linkTextBlock(entity, text);\n\t }\n\t var d = {\n\t text: text,\n\t attr: twttr.txt.tagAttrs(attributes)\n\t };\n\t return stringSupplant(\"<a#{attr}>#{text}</a>\", d);\n\t };\n\t\n\t twttr.txt.linkToTextWithSymbol = function(entity, symbol, text, attributes, options) {\n\t var taggedSymbol = options.symbolTag ? \"<\" + options.symbolTag + \">\" + symbol + \"</\"+ options.symbolTag + \">\" : symbol;\n\t text = twttr.txt.htmlEscape(text);\n\t var taggedText = options.textWithSymbolTag ? \"<\" + options.textWithSymbolTag + \">\" + text + \"</\"+ options.textWithSymbolTag + \">\" : text;\n\t\n\t if (options.usernameIncludeSymbol || !symbol.match(twttr.txt.regexen.atSigns)) {\n\t return twttr.txt.linkToText(entity, taggedSymbol + taggedText, attributes, options);\n\t } else {\n\t return taggedSymbol + twttr.txt.linkToText(entity, taggedText, attributes, options);\n\t }\n\t };\n\t\n\t twttr.txt.linkToHashtag = function(entity, text, options) {\n\t var hash = text.substring(entity.indices[0], entity.indices[0] + 1);\n\t var hashtag = twttr.txt.htmlEscape(entity.hashtag);\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs.href = options.hashtagUrlBase + hashtag;\n\t attrs.title = \"#\" + hashtag;\n\t attrs[\"class\"] = options.hashtagClass;\n\t if (hashtag.charAt(0).match(twttr.txt.regexen.rtl_chars)){\n\t attrs[\"class\"] += \" rtl\";\n\t }\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, hash, hashtag, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToCashtag = function(entity, text, options) {\n\t var cashtag = twttr.txt.htmlEscape(entity.cashtag);\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs.href = options.cashtagUrlBase + cashtag;\n\t attrs.title = \"$\" + cashtag;\n\t attrs[\"class\"] = options.cashtagClass;\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, \"$\", cashtag, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToMentionAndList = function(entity, text, options) {\n\t var at = text.substring(entity.indices[0], entity.indices[0] + 1);\n\t var user = twttr.txt.htmlEscape(entity.screenName);\n\t var slashListname = twttr.txt.htmlEscape(entity.listSlug);\n\t var isList = entity.listSlug && !options.suppressLists;\n\t var attrs = clone(options.htmlAttrs || {});\n\t attrs[\"class\"] = (isList ? options.listClass : options.usernameClass);\n\t attrs.href = isList ? options.listUrlBase + user + slashListname : options.usernameUrlBase + user;\n\t if (!isList && !options.suppressDataScreenName) {\n\t attrs['data-screen-name'] = user;\n\t }\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t return twttr.txt.linkToTextWithSymbol(entity, at, isList ? user + slashListname : user, attrs, options);\n\t };\n\t\n\t twttr.txt.linkToUrl = function(entity, text, options) {\n\t var url = entity.url;\n\t var displayUrl = url;\n\t var linkText = twttr.txt.htmlEscape(displayUrl);\n\t\n\t // If the caller passed a urlEntities object (provided by a Twitter API\n\t // response with include_entities=true), we use that to render the display_url\n\t // for each URL instead of it's underlying t.co URL.\n\t var urlEntity = (options.urlEntities && options.urlEntities[url]) || entity;\n\t if (urlEntity.display_url) {\n\t linkText = twttr.txt.linkTextWithEntity(urlEntity, options);\n\t }\n\t\n\t var attrs = clone(options.htmlAttrs || {});\n\t\n\t if (!url.match(twttr.txt.regexen.urlHasProtocol)) {\n\t url = \"http://\" + url;\n\t }\n\t attrs.href = url;\n\t\n\t if (options.targetBlank) {\n\t attrs.target = '_blank';\n\t }\n\t\n\t // set class only if urlClass is specified.\n\t if (options.urlClass) {\n\t attrs[\"class\"] = options.urlClass;\n\t }\n\t\n\t // set target only if urlTarget is specified.\n\t if (options.urlTarget) {\n\t attrs.target = options.urlTarget;\n\t }\n\t\n\t if (!options.title && urlEntity.display_url) {\n\t attrs.title = urlEntity.expanded_url;\n\t }\n\t\n\t return twttr.txt.linkToText(entity, linkText, attrs, options);\n\t };\n\t\n\t twttr.txt.linkTextWithEntity = function (entity, options) {\n\t var displayUrl = entity.display_url;\n\t var expandedUrl = entity.expanded_url;\n\t\n\t // Goal: If a user copies and pastes a tweet containing t.co'ed link, the resulting paste\n\t // should contain the full original URL (expanded_url), not the display URL.\n\t //\n\t // Method: Whenever possible, we actually emit HTML that contains expanded_url, and use\n\t // font-size:0 to hide those parts that should not be displayed (because they are not part of display_url).\n\t // Elements with font-size:0 get copied even though they are not visible.\n\t // Note that display:none doesn't work here. Elements with display:none don't get copied.\n\t //\n\t // Additionally, we want to *display* ellipses, but we don't want them copied. To make this happen we\n\t // wrap the ellipses in a tco-ellipsis class and provide an onCopy handler that sets display:none on\n\t // everything with the tco-ellipsis class.\n\t //\n\t // Exception: pic.twitter.com images, for which expandedUrl = \"https://twitter.com/#!/username/status/1234/photo/1\n\t // For those URLs, display_url is not a substring of expanded_url, so we don't do anything special to render the elided parts.\n\t // For a pic.twitter.com URL, the only elided part will be the \"https://\", so this is fine.\n\t\n\t var displayUrlSansEllipses = displayUrl.replace(/…/g, \"\"); // We have to disregard ellipses for matching\n\t // Note: we currently only support eliding parts of the URL at the beginning or the end.\n\t // Eventually we may want to elide parts of the URL in the *middle*. If so, this code will\n\t // become more complicated. We will probably want to create a regexp out of display URL,\n\t // replacing every ellipsis with a \".*\".\n\t if (expandedUrl.indexOf(displayUrlSansEllipses) != -1) {\n\t var displayUrlIndex = expandedUrl.indexOf(displayUrlSansEllipses);\n\t var v = {\n\t displayUrlSansEllipses: displayUrlSansEllipses,\n\t // Portion of expandedUrl that precedes the displayUrl substring\n\t beforeDisplayUrl: expandedUrl.substr(0, displayUrlIndex),\n\t // Portion of expandedUrl that comes after displayUrl\n\t afterDisplayUrl: expandedUrl.substr(displayUrlIndex + displayUrlSansEllipses.length),\n\t precedingEllipsis: displayUrl.match(/^…/) ? \"…\" : \"\",\n\t followingEllipsis: displayUrl.match(/…$/) ? \"…\" : \"\"\n\t };\n\t for (var k in v) {\n\t if (v.hasOwnProperty(k)) {\n\t v[k] = twttr.txt.htmlEscape(v[k]);\n\t }\n\t }\n\t // As an example: The user tweets \"hi http://longdomainname.com/foo\"\n\t // This gets shortened to \"hi http://t.co/xyzabc\", with display_url = \"…nname.com/foo\"\n\t // This will get rendered as:\n\t // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n\t // …\n\t // <!-- There's a chance the onCopy event handler might not fire. In case that happens,\n\t // we include an here so that the … doesn't bump up against the URL and ruin it.\n\t // The is inside the tco-ellipsis span so that when the onCopy handler *does*\n\t // fire, it doesn't get copied. Otherwise the copied text would have two spaces in a row,\n\t // e.g. \"hi http://longdomainname.com/foo\".\n\t // <span style='font-size:0'> </span>\n\t // </span>\n\t // <span style='font-size:0'> <!-- This stuff should get copied but not displayed -->\n\t // http://longdomai\n\t // </span>\n\t // <span class='js-display-url'> <!-- This stuff should get displayed *and* copied -->\n\t // nname.com/foo\n\t // </span>\n\t // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n\t // <span style='font-size:0'> </span>\n\t // …\n\t // </span>\n\t v['invisible'] = options.invisibleTagAttrs;\n\t return stringSupplant(\"<span class='tco-ellipsis'>#{precedingEllipsis}<span #{invisible}> </span></span><span #{invisible}>#{beforeDisplayUrl}</span><span class='js-display-url'>#{displayUrlSansEllipses}</span><span #{invisible}>#{afterDisplayUrl}</span><span class='tco-ellipsis'><span #{invisible}> </span>#{followingEllipsis}</span>\", v);\n\t }\n\t return displayUrl;\n\t };\n\t\n\t twttr.txt.autoLinkEntities = function(text, entities, options) {\n\t options = clone(options || {});\n\t\n\t options.hashtagClass = options.hashtagClass || DEFAULT_HASHTAG_CLASS;\n\t options.hashtagUrlBase = options.hashtagUrlBase || \"https://twitter.com/#!/search?q=%23\";\n\t options.cashtagClass = options.cashtagClass || DEFAULT_CASHTAG_CLASS;\n\t options.cashtagUrlBase = options.cashtagUrlBase || \"https://twitter.com/#!/search?q=%24\";\n\t options.listClass = options.listClass || DEFAULT_LIST_CLASS;\n\t options.usernameClass = options.usernameClass || DEFAULT_USERNAME_CLASS;\n\t options.usernameUrlBase = options.usernameUrlBase || \"https://twitter.com/\";\n\t options.listUrlBase = options.listUrlBase || \"https://twitter.com/\";\n\t options.htmlAttrs = twttr.txt.extractHtmlAttrsFromOptions(options);\n\t options.invisibleTagAttrs = options.invisibleTagAttrs || \"style='position:absolute;left:-9999px;'\";\n\t\n\t // remap url entities to hash\n\t var urlEntities, i, len;\n\t if(options.urlEntities) {\n\t urlEntities = {};\n\t for(i = 0, len = options.urlEntities.length; i < len; i++) {\n\t urlEntities[options.urlEntities[i].url] = options.urlEntities[i];\n\t }\n\t options.urlEntities = urlEntities;\n\t }\n\t\n\t var result = \"\";\n\t var beginIndex = 0;\n\t\n\t // sort entities by start index\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t\n\t var nonEntity = options.htmlEscapeNonEntities ? twttr.txt.htmlEscape : function(text) {\n\t return text;\n\t };\n\t\n\t for (var i = 0; i < entities.length; i++) {\n\t var entity = entities[i];\n\t result += nonEntity(text.substring(beginIndex, entity.indices[0]));\n\t\n\t if (entity.url) {\n\t result += twttr.txt.linkToUrl(entity, text, options);\n\t } else if (entity.hashtag) {\n\t result += twttr.txt.linkToHashtag(entity, text, options);\n\t } else if (entity.screenName) {\n\t result += twttr.txt.linkToMentionAndList(entity, text, options);\n\t } else if (entity.cashtag) {\n\t result += twttr.txt.linkToCashtag(entity, text, options);\n\t }\n\t beginIndex = entity.indices[1];\n\t }\n\t result += nonEntity(text.substring(beginIndex, text.length));\n\t return result;\n\t };\n\t\n\t twttr.txt.autoLinkWithJSON = function(text, json, options) {\n\t // map JSON entity to twitter-text entity\n\t if (json.user_mentions) {\n\t for (var i = 0; i < json.user_mentions.length; i++) {\n\t // this is a @mention\n\t json.user_mentions[i].screenName = json.user_mentions[i].screen_name;\n\t }\n\t }\n\t\n\t if (json.hashtags) {\n\t for (var i = 0; i < json.hashtags.length; i++) {\n\t // this is a #hashtag\n\t json.hashtags[i].hashtag = json.hashtags[i].text;\n\t }\n\t }\n\t\n\t if (json.symbols) {\n\t for (var i = 0; i < json.symbols.length; i++) {\n\t // this is a $CASH tag\n\t json.symbols[i].cashtag = json.symbols[i].text;\n\t }\n\t }\n\t\n\t // concatenate all entities\n\t var entities = [];\n\t for (var key in json) {\n\t entities = entities.concat(json[key]);\n\t }\n\t\n\t // modify indices to UTF-16\n\t twttr.txt.modifyIndicesFromUnicodeToUTF16(text, entities);\n\t\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.extractHtmlAttrsFromOptions = function(options) {\n\t var htmlAttrs = {};\n\t for (var k in options) {\n\t var v = options[k];\n\t if (OPTIONS_NOT_ATTRIBUTES[k]) continue;\n\t if (BOOLEAN_ATTRIBUTES[k]) {\n\t v = v ? k : null;\n\t }\n\t if (v == null) continue;\n\t htmlAttrs[k] = v;\n\t }\n\t return htmlAttrs;\n\t };\n\t\n\t twttr.txt.autoLink = function(text, options) {\n\t var entities = twttr.txt.extractEntitiesWithIndices(text, {extractUrlsWithoutProtocol: false});\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkUsernamesOrLists = function(text, options) {\n\t var entities = twttr.txt.extractMentionsOrListsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkHashtags = function(text, options) {\n\t var entities = twttr.txt.extractHashtagsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkCashtags = function(text, options) {\n\t var entities = twttr.txt.extractCashtagsWithIndices(text);\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.autoLinkUrlsCustom = function(text, options) {\n\t var entities = twttr.txt.extractUrlsWithIndices(text, {extractUrlsWithoutProtocol: false});\n\t return twttr.txt.autoLinkEntities(text, entities, options);\n\t };\n\t\n\t twttr.txt.removeOverlappingEntities = function(entities) {\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t\n\t var prev = entities[0];\n\t for (var i = 1; i < entities.length; i++) {\n\t if (prev.indices[1] > entities[i].indices[0]) {\n\t entities.splice(i, 1);\n\t i--;\n\t } else {\n\t prev = entities[i];\n\t }\n\t }\n\t };\n\t\n\t twttr.txt.extractEntitiesWithIndices = function(text, options) {\n\t var entities = twttr.txt.extractUrlsWithIndices(text, options)\n\t .concat(twttr.txt.extractMentionsOrListsWithIndices(text))\n\t .concat(twttr.txt.extractHashtagsWithIndices(text, {checkUrlOverlap: false}))\n\t .concat(twttr.txt.extractCashtagsWithIndices(text));\n\t\n\t if (entities.length == 0) {\n\t return [];\n\t }\n\t\n\t twttr.txt.removeOverlappingEntities(entities);\n\t return entities;\n\t };\n\t\n\t twttr.txt.extractMentions = function(text) {\n\t var screenNamesOnly = [],\n\t screenNamesWithIndices = twttr.txt.extractMentionsWithIndices(text);\n\t\n\t for (var i = 0; i < screenNamesWithIndices.length; i++) {\n\t var screenName = screenNamesWithIndices[i].screenName;\n\t screenNamesOnly.push(screenName);\n\t }\n\t\n\t return screenNamesOnly;\n\t };\n\t\n\t twttr.txt.extractMentionsWithIndices = function(text) {\n\t var mentions = [],\n\t mentionOrList,\n\t mentionsOrLists = twttr.txt.extractMentionsOrListsWithIndices(text);\n\t\n\t for (var i = 0 ; i < mentionsOrLists.length; i++) {\n\t mentionOrList = mentionsOrLists[i];\n\t if (mentionOrList.listSlug == '') {\n\t mentions.push({\n\t screenName: mentionOrList.screenName,\n\t indices: mentionOrList.indices\n\t });\n\t }\n\t }\n\t\n\t return mentions;\n\t };\n\t\n\t /**\n\t * Extract list or user mentions.\n\t * (Presence of listSlug indicates a list)\n\t */\n\t twttr.txt.extractMentionsOrListsWithIndices = function(text) {\n\t if (!text || !text.match(twttr.txt.regexen.atSigns)) {\n\t return [];\n\t }\n\t\n\t var possibleNames = [],\n\t slashListname;\n\t\n\t text.replace(twttr.txt.regexen.validMentionOrList, function(match, before, atSign, screenName, slashListname, offset, chunk) {\n\t var after = chunk.slice(offset + match.length);\n\t if (!after.match(twttr.txt.regexen.endMentionMatch)) {\n\t slashListname = slashListname || '';\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + screenName.length + slashListname.length + 1;\n\t possibleNames.push({\n\t screenName: screenName,\n\t listSlug: slashListname,\n\t indices: [startPosition, endPosition]\n\t });\n\t }\n\t });\n\t\n\t return possibleNames;\n\t };\n\t\n\t\n\t twttr.txt.extractReplies = function(text) {\n\t if (!text) {\n\t return null;\n\t }\n\t\n\t var possibleScreenName = text.match(twttr.txt.regexen.validReply);\n\t if (!possibleScreenName ||\n\t RegExp.rightContext.match(twttr.txt.regexen.endMentionMatch)) {\n\t return null;\n\t }\n\t\n\t return possibleScreenName[1];\n\t };\n\t\n\t twttr.txt.extractUrls = function(text, options) {\n\t var urlsOnly = [],\n\t urlsWithIndices = twttr.txt.extractUrlsWithIndices(text, options);\n\t\n\t for (var i = 0; i < urlsWithIndices.length; i++) {\n\t urlsOnly.push(urlsWithIndices[i].url);\n\t }\n\t\n\t return urlsOnly;\n\t };\n\t\n\t twttr.txt.extractUrlsWithIndices = function(text, options) {\n\t if (!options) {\n\t options = {extractUrlsWithoutProtocol: true};\n\t }\n\t if (!text || (options.extractUrlsWithoutProtocol ? !text.match(/\\./) : !text.match(/:/))) {\n\t return [];\n\t }\n\t\n\t var urls = [];\n\t\n\t while (twttr.txt.regexen.extractUrl.exec(text)) {\n\t var before = RegExp.$2, url = RegExp.$3, protocol = RegExp.$4, domain = RegExp.$5, path = RegExp.$7;\n\t var endPosition = twttr.txt.regexen.extractUrl.lastIndex,\n\t startPosition = endPosition - url.length;\n\t\n\t // if protocol is missing and domain contains non-ASCII characters,\n\t // extract ASCII-only domains.\n\t if (!protocol) {\n\t if (!options.extractUrlsWithoutProtocol\n\t || before.match(twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars)) {\n\t continue;\n\t }\n\t var lastUrl = null,\n\t asciiEndPosition = 0;\n\t domain.replace(twttr.txt.regexen.validAsciiDomain, function(asciiDomain) {\n\t var asciiStartPosition = domain.indexOf(asciiDomain, asciiEndPosition);\n\t asciiEndPosition = asciiStartPosition + asciiDomain.length;\n\t lastUrl = {\n\t url: asciiDomain,\n\t indices: [startPosition + asciiStartPosition, startPosition + asciiEndPosition]\n\t };\n\t if (path\n\t || asciiDomain.match(twttr.txt.regexen.validSpecialShortDomain)\n\t || !asciiDomain.match(twttr.txt.regexen.invalidShortDomain)) {\n\t urls.push(lastUrl);\n\t }\n\t });\n\t\n\t // no ASCII-only domain found. Skip the entire URL.\n\t if (lastUrl == null) {\n\t continue;\n\t }\n\t\n\t // lastUrl only contains domain. Need to add path and query if they exist.\n\t if (path) {\n\t lastUrl.url = url.replace(domain, lastUrl.url);\n\t lastUrl.indices[1] = endPosition;\n\t }\n\t } else {\n\t // In the case of t.co URLs, don't allow additional path characters.\n\t if (url.match(twttr.txt.regexen.validTcoUrl)) {\n\t url = RegExp.lastMatch;\n\t endPosition = startPosition + url.length;\n\t }\n\t urls.push({\n\t url: url,\n\t indices: [startPosition, endPosition]\n\t });\n\t }\n\t }\n\t\n\t return urls;\n\t };\n\t\n\t twttr.txt.extractHashtags = function(text) {\n\t var hashtagsOnly = [],\n\t hashtagsWithIndices = twttr.txt.extractHashtagsWithIndices(text);\n\t\n\t for (var i = 0; i < hashtagsWithIndices.length; i++) {\n\t hashtagsOnly.push(hashtagsWithIndices[i].hashtag);\n\t }\n\t\n\t return hashtagsOnly;\n\t };\n\t\n\t twttr.txt.extractHashtagsWithIndices = function(text, options) {\n\t if (!options) {\n\t options = {checkUrlOverlap: true};\n\t }\n\t\n\t if (!text || !text.match(twttr.txt.regexen.hashSigns)) {\n\t return [];\n\t }\n\t\n\t var tags = [];\n\t\n\t text.replace(twttr.txt.regexen.validHashtag, function(match, before, hash, hashText, offset, chunk) {\n\t var after = chunk.slice(offset + match.length);\n\t if (after.match(twttr.txt.regexen.endHashtagMatch))\n\t return;\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + hashText.length + 1;\n\t tags.push({\n\t hashtag: hashText,\n\t indices: [startPosition, endPosition]\n\t });\n\t });\n\t\n\t if (options.checkUrlOverlap) {\n\t // also extract URL entities\n\t var urls = twttr.txt.extractUrlsWithIndices(text);\n\t if (urls.length > 0) {\n\t var entities = tags.concat(urls);\n\t // remove overlap\n\t twttr.txt.removeOverlappingEntities(entities);\n\t // only push back hashtags\n\t tags = [];\n\t for (var i = 0; i < entities.length; i++) {\n\t if (entities[i].hashtag) {\n\t tags.push(entities[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t return tags;\n\t };\n\t\n\t twttr.txt.extractCashtags = function(text) {\n\t var cashtagsOnly = [],\n\t cashtagsWithIndices = twttr.txt.extractCashtagsWithIndices(text);\n\t\n\t for (var i = 0; i < cashtagsWithIndices.length; i++) {\n\t cashtagsOnly.push(cashtagsWithIndices[i].cashtag);\n\t }\n\t\n\t return cashtagsOnly;\n\t };\n\t\n\t twttr.txt.extractCashtagsWithIndices = function(text) {\n\t if (!text || text.indexOf(\"$\") == -1) {\n\t return [];\n\t }\n\t\n\t var tags = [];\n\t\n\t text.replace(twttr.txt.regexen.validCashtag, function(match, before, dollar, cashtag, offset, chunk) {\n\t var startPosition = offset + before.length;\n\t var endPosition = startPosition + cashtag.length + 1;\n\t tags.push({\n\t cashtag: cashtag,\n\t indices: [startPosition, endPosition]\n\t });\n\t });\n\t\n\t return tags;\n\t };\n\t\n\t twttr.txt.modifyIndicesFromUnicodeToUTF16 = function(text, entities) {\n\t twttr.txt.convertUnicodeIndices(text, entities, false);\n\t };\n\t\n\t twttr.txt.modifyIndicesFromUTF16ToUnicode = function(text, entities) {\n\t twttr.txt.convertUnicodeIndices(text, entities, true);\n\t };\n\t\n\t twttr.txt.getUnicodeTextLength = function(text) {\n\t return text.replace(twttr.txt.regexen.non_bmp_code_pairs, ' ').length;\n\t };\n\t\n\t twttr.txt.convertUnicodeIndices = function(text, entities, indicesInUTF16) {\n\t if (entities.length == 0) {\n\t return;\n\t }\n\t\n\t var charIndex = 0;\n\t var codePointIndex = 0;\n\t\n\t // sort entities by start index\n\t entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\t var entityIndex = 0;\n\t var entity = entities[0];\n\t\n\t while (charIndex < text.length) {\n\t if (entity.indices[0] == (indicesInUTF16 ? charIndex : codePointIndex)) {\n\t var len = entity.indices[1] - entity.indices[0];\n\t entity.indices[0] = indicesInUTF16 ? codePointIndex : charIndex;\n\t entity.indices[1] = entity.indices[0] + len;\n\t\n\t entityIndex++;\n\t if (entityIndex == entities.length) {\n\t // no more entity\n\t break;\n\t }\n\t entity = entities[entityIndex];\n\t }\n\t\n\t var c = text.charCodeAt(charIndex);\n\t if (0xD800 <= c && c <= 0xDBFF && charIndex < text.length - 1) {\n\t // Found high surrogate char\n\t c = text.charCodeAt(charIndex + 1);\n\t if (0xDC00 <= c && c <= 0xDFFF) {\n\t // Found surrogate pair\n\t charIndex++;\n\t }\n\t }\n\t codePointIndex++;\n\t charIndex++;\n\t }\n\t };\n\t\n\t // this essentially does text.split(/<|>/)\n\t // except that won't work in IE, where empty strings are ommitted\n\t // so \"<>\".split(/<|>/) => [] in IE, but is [\"\", \"\", \"\"] in all others\n\t // but \"<<\".split(\"<\") => [\"\", \"\", \"\"]\n\t twttr.txt.splitTags = function(text) {\n\t var firstSplits = text.split(\"<\"),\n\t secondSplits,\n\t allSplits = [],\n\t split;\n\t\n\t for (var i = 0; i < firstSplits.length; i += 1) {\n\t split = firstSplits[i];\n\t if (!split) {\n\t allSplits.push(\"\");\n\t } else {\n\t secondSplits = split.split(\">\");\n\t for (var j = 0; j < secondSplits.length; j += 1) {\n\t allSplits.push(secondSplits[j]);\n\t }\n\t }\n\t }\n\t\n\t return allSplits;\n\t };\n\t\n\t twttr.txt.hitHighlight = function(text, hits, options) {\n\t var defaultHighlightTag = \"em\";\n\t\n\t hits = hits || [];\n\t options = options || {};\n\t\n\t if (hits.length === 0) {\n\t return text;\n\t }\n\t\n\t var tagName = options.tag || defaultHighlightTag,\n\t tags = [\"<\" + tagName + \">\", \"</\" + tagName + \">\"],\n\t chunks = twttr.txt.splitTags(text),\n\t i,\n\t j,\n\t result = \"\",\n\t chunkIndex = 0,\n\t chunk = chunks[0],\n\t prevChunksLen = 0,\n\t chunkCursor = 0,\n\t startInChunk = false,\n\t chunkChars = chunk,\n\t flatHits = [],\n\t index,\n\t hit,\n\t tag,\n\t placed,\n\t hitSpot;\n\t\n\t for (i = 0; i < hits.length; i += 1) {\n\t for (j = 0; j < hits[i].length; j += 1) {\n\t flatHits.push(hits[i][j]);\n\t }\n\t }\n\t\n\t for (index = 0; index < flatHits.length; index += 1) {\n\t hit = flatHits[index];\n\t tag = tags[index % 2];\n\t placed = false;\n\t\n\t while (chunk != null && hit >= prevChunksLen + chunk.length) {\n\t result += chunkChars.slice(chunkCursor);\n\t if (startInChunk && hit === prevChunksLen + chunkChars.length) {\n\t result += tag;\n\t placed = true;\n\t }\n\t\n\t if (chunks[chunkIndex + 1]) {\n\t result += \"<\" + chunks[chunkIndex + 1] + \">\";\n\t }\n\t\n\t prevChunksLen += chunkChars.length;\n\t chunkCursor = 0;\n\t chunkIndex += 2;\n\t chunk = chunks[chunkIndex];\n\t chunkChars = chunk;\n\t startInChunk = false;\n\t }\n\t\n\t if (!placed && chunk != null) {\n\t hitSpot = hit - prevChunksLen;\n\t result += chunkChars.slice(chunkCursor, hitSpot) + tag;\n\t chunkCursor = hitSpot;\n\t if (index % 2 === 0) {\n\t startInChunk = true;\n\t } else {\n\t startInChunk = false;\n\t }\n\t } else if(!placed) {\n\t placed = true;\n\t result += tag;\n\t }\n\t }\n\t\n\t if (chunk != null) {\n\t if (chunkCursor < chunkChars.length) {\n\t result += chunkChars.slice(chunkCursor);\n\t }\n\t for (index = chunkIndex + 1; index < chunks.length; index += 1) {\n\t result += (index % 2 === 0 ? chunks[index] : \"<\" + chunks[index] + \">\");\n\t }\n\t }\n\t\n\t return result;\n\t };\n\t\n\t var MAX_LENGTH = 140;\n\t\n\t // Returns the length of Tweet text with consideration to t.co URL replacement\n\t // and chars outside the basic multilingual plane that use 2 UTF16 code points\n\t twttr.txt.getTweetLength = function(text, options) {\n\t if (!options) {\n\t options = {\n\t // These come from https://api.twitter.com/1.1/help/configuration.json\n\t // described by https://dev.twitter.com/rest/reference/get/help/configuration\n\t short_url_length: 23,\n\t short_url_length_https: 23\n\t };\n\t }\n\t var textLength = twttr.txt.getUnicodeTextLength(text),\n\t urlsWithIndices = twttr.txt.extractUrlsWithIndices(text);\n\t twttr.txt.modifyIndicesFromUTF16ToUnicode(text, urlsWithIndices);\n\t\n\t for (var i = 0; i < urlsWithIndices.length; i++) {\n\t // Subtract the length of the original URL\n\t textLength += urlsWithIndices[i].indices[0] - urlsWithIndices[i].indices[1];\n\t\n\t // Add 23 characters for URL starting with https://\n\t // http:// URLs still use https://t.co so they are 23 characters as well\n\t if (urlsWithIndices[i].url.toLowerCase().match(twttr.txt.regexen.urlHasHttps)) {\n\t textLength += options.short_url_length_https;\n\t } else {\n\t textLength += options.short_url_length;\n\t }\n\t }\n\t\n\t return textLength;\n\t };\n\t\n\t // Check the text for any reason that it may not be valid as a Tweet. This is meant as a pre-validation\n\t // before posting to api.twitter.com. There are several server-side reasons for Tweets to fail but this pre-validation\n\t // will allow quicker feedback.\n\t //\n\t // Returns false if this text is valid. Otherwise one of the following strings will be returned:\n\t //\n\t // \"too_long\": if the text is too long\n\t // \"empty\": if the text is nil or empty\n\t // \"invalid_characters\": if the text contains non-Unicode or any of the disallowed Unicode characters\n\t twttr.txt.isInvalidTweet = function(text) {\n\t if (!text) {\n\t return \"empty\";\n\t }\n\t\n\t // Determine max length independent of URL length\n\t if (twttr.txt.getTweetLength(text) > MAX_LENGTH) {\n\t return \"too_long\";\n\t }\n\t\n\t if (twttr.txt.hasInvalidCharacters(text)) {\n\t return \"invalid_characters\";\n\t }\n\t\n\t return false;\n\t };\n\t\n\t twttr.txt.hasInvalidCharacters = function(text) {\n\t return twttr.txt.regexen.invalid_chars.test(text);\n\t };\n\t\n\t twttr.txt.isValidTweetText = function(text) {\n\t return !twttr.txt.isInvalidTweet(text);\n\t };\n\t\n\t twttr.txt.isValidUsername = function(username) {\n\t if (!username) {\n\t return false;\n\t }\n\t\n\t var extracted = twttr.txt.extractMentions(username);\n\t\n\t // Should extract the username minus the @ sign, hence the .slice(1)\n\t return extracted.length === 1 && extracted[0] === username.slice(1);\n\t };\n\t\n\t var VALID_LIST_RE = regexSupplant(/^#{validMentionOrList}$/);\n\t\n\t twttr.txt.isValidList = function(usernameList) {\n\t var match = usernameList.match(VALID_LIST_RE);\n\t\n\t // Must have matched and had nothing before or after\n\t return !!(match && match[1] == \"\" && match[4]);\n\t };\n\t\n\t twttr.txt.isValidHashtag = function(hashtag) {\n\t if (!hashtag) {\n\t return false;\n\t }\n\t\n\t var extracted = twttr.txt.extractHashtags(hashtag);\n\t\n\t // Should extract the hashtag minus the # sign, hence the .slice(1)\n\t return extracted.length === 1 && extracted[0] === hashtag.slice(1);\n\t };\n\t\n\t twttr.txt.isValidUrl = function(url, unicodeDomains, requireProtocol) {\n\t if (unicodeDomains == null) {\n\t unicodeDomains = true;\n\t }\n\t\n\t if (requireProtocol == null) {\n\t requireProtocol = true;\n\t }\n\t\n\t if (!url) {\n\t return false;\n\t }\n\t\n\t var urlParts = url.match(twttr.txt.regexen.validateUrlUnencoded);\n\t\n\t if (!urlParts || urlParts[0] !== url) {\n\t return false;\n\t }\n\t\n\t var scheme = urlParts[1],\n\t authority = urlParts[2],\n\t path = urlParts[3],\n\t query = urlParts[4],\n\t fragment = urlParts[5];\n\t\n\t if (!(\n\t (!requireProtocol || (isValidMatch(scheme, twttr.txt.regexen.validateUrlScheme) && scheme.match(/^https?$/i))) &&\n\t isValidMatch(path, twttr.txt.regexen.validateUrlPath) &&\n\t isValidMatch(query, twttr.txt.regexen.validateUrlQuery, true) &&\n\t isValidMatch(fragment, twttr.txt.regexen.validateUrlFragment, true)\n\t )) {\n\t return false;\n\t }\n\t\n\t return (unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlUnicodeAuthority)) ||\n\t (!unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlAuthority));\n\t };\n\t\n\t function isValidMatch(string, regex, optional) {\n\t if (!optional) {\n\t // RegExp[\"$&\"] is the text of the last match\n\t // blank strings are ok, but are falsy, so we check stringiness instead of truthiness\n\t return ((typeof string === \"string\") && string.match(regex) && RegExp[\"$&\"] === string);\n\t }\n\t\n\t // RegExp[\"$&\"] is the text of the last match\n\t return (!string || (string.match(regex) && RegExp[\"$&\"] === string));\n\t }\n\t\n\t if (typeof module != 'undefined' && module.exports) {\n\t module.exports = twttr.txt;\n\t }\n\t\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (twttr.txt), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t }\n\t\n\t if (typeof window != 'undefined') {\n\t if (window.twttr) {\n\t for (var prop in twttr) {\n\t window.twttr[prop] = twttr[prop];\n\t }\n\t } else {\n\t window.twttr = twttr;\n\t }\n\t }\n\t})();\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\texports.createEditOverlay = createEditOverlay;\n\texports.enableEdit = enableEdit;\n\texports.disableEdit = disableEdit;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tvar _comments = __webpack_require__(38);\n\t\n\tvar _initFile = __webpack_require__(37);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tvar _enabled = false;\n\tvar isDragging = false,\n\t overlay = void 0;\n\tvar dragOffsetX = void 0,\n\t dragOffsetY = void 0,\n\t dragStartX = void 0,\n\t dragStartY = void 0;\n\tvar OVERLAY_BORDER_SIZE = 3;\n\t\n\t/**\n\t * Create an overlay for editing an annotation.\n\t *\n\t * @param {Element} target The annotation element to apply overlay for\n\t */\n\tfunction createEditOverlay(target) {\n\t destroyEditOverlay();\n\t\n\t overlay = document.createElement('div');\n\t var anchor = document.createElement('a');\n\t var parentNode = (0, _utils.findSVGContainer)(target).parentNode;\n\t var id = target.getAttribute('data-pdf-annotate-id');\n\t var rect = (0, _utils.getAnnotationRect)(target);\n\t var styleLeft = rect.left - OVERLAY_BORDER_SIZE;\n\t var styleTop = rect.top - OVERLAY_BORDER_SIZE;\n\t\n\t overlay.setAttribute('id', 'pdf-annotate-edit-overlay');\n\t overlay.setAttribute('data-target-id', id);\n\t overlay.style.boxSizing = 'content-box';\n\t overlay.style.position = 'absolute';\n\t overlay.style.top = styleTop + 'px';\n\t overlay.style.left = styleLeft + 'px';\n\t overlay.style.width = rect.width + 'px';\n\t overlay.style.height = rect.height + 'px';\n\t overlay.style.border = OVERLAY_BORDER_SIZE + 'px solid ' + _utils.BORDER_COLOR;\n\t overlay.style.borderRadius = OVERLAY_BORDER_SIZE + 'px';\n\t\n\t anchor.innerHTML = '×';\n\t anchor.setAttribute('href', 'javascript://');\n\t anchor.style.background = '#fff';\n\t anchor.style.borderRadius = '20px';\n\t anchor.style.border = '1px solid #bbb';\n\t anchor.style.color = '#bbb';\n\t anchor.style.fontSize = '16px';\n\t anchor.style.padding = '2px';\n\t anchor.style.textAlign = 'center';\n\t anchor.style.textDecoration = 'none';\n\t anchor.style.position = 'absolute';\n\t anchor.style.top = '-13px';\n\t anchor.style.right = '-13px';\n\t anchor.style.width = '25px';\n\t anchor.style.height = '25px';\n\t\n\t if (_initFile.readonly) anchor.style.display = 'none';\n\t overlay.appendChild(anchor);\n\t parentNode.appendChild(overlay);\n\t document.addEventListener('click', handleDocumentClick);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t anchor.addEventListener('click', deleteAnnotation);\n\t anchor.addEventListener('mouseover', function () {\n\t anchor.style.color = '#35A4DC';\n\t anchor.style.borderColor = '#999';\n\t anchor.style.boxShadow = '0 1px 1px #ccc';\n\t });\n\t anchor.addEventListener('mouseout', function () {\n\t anchor.style.color = '#bbb';\n\t anchor.style.borderColor = '#bbb';\n\t anchor.style.boxShadow = '';\n\t });\n\t overlay.addEventListener('mouseover', function () {\n\t if (!isDragging && !_initFile.readonly) {\n\t anchor.style.display = '';\n\t }\n\t });\n\t overlay.addEventListener('mouseout', function () {\n\t anchor.style.display = 'none';\n\t });\n\t}\n\t\n\t/**\n\t * Destroy the edit overlay if it exists.\n\t */\n\tfunction destroyEditOverlay() {\n\t if (overlay) {\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t }\n\t document.removeEventListener('click', handleDocumentClick);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\t\n\t/**\n\t * Delete currently selected annotation\n\t */\n\tfunction deleteAnnotation() {\n\t if (!overlay) {\n\t return;\n\t }\n\t\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var nodes = document.querySelectorAll('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId;\n\t\n\t [].concat(_toConsumableArray(nodes)).forEach(function (n) {\n\t n.parentNode.removeChild(n);\n\t });\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().deleteAnnotation(documentId, annotationId);\n\t\n\t destroyEditOverlay();\n\t}\n\t\n\t/**\n\t * Handle document.click event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentClick(e) {\n\t if (!(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t // Remove current overlay\n\t var overlay = document.getElementById('pdf-annotate-edit-overlay');\n\t if (overlay) {\n\t if (isDragging || e.target === overlay) {\n\t return;\n\t }\n\t destroyEditOverlay();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t if (overlay && e.keyCode === 46 && e.target.nodeName.toLowerCase() !== 'textarea' && e.target.nodeName.toLowerCase() !== 'input') {\n\t if (!_initFile.readonly) deleteAnnotation();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mousedown event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMousedown(e) {\n\t if (e.target !== overlay) {\n\t return;\n\t }\n\t\n\t // Highlight and strikeout annotations are bound to text within the document.\n\t // It doesn't make sense to allow repositioning these types of annotations.\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var target = document.querySelector('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var type = target.getAttribute('data-pdf-annotate-type');\n\t\n\t if (type === 'highlight' || type === 'strikeout') {\n\t return;\n\t }\n\t\n\t if (!_initFile.readonly) isDragging = true;\n\t dragOffsetX = e.clientX;\n\t dragOffsetY = e.clientY;\n\t dragStartX = overlay.offsetLeft;\n\t dragStartY = overlay.offsetTop;\n\t\n\t overlay.style.background = 'rgba(255, 255, 255, 0.7)';\n\t overlay.style.cursor = 'move';\n\t // if(!readonly)\n\t overlay.querySelector('a').style.display = 'none';\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t if (_initFile.readonly) return;\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var parentNode = overlay.parentNode;\n\t var rect = parentNode.getBoundingClientRect();\n\t var y = dragStartY + (e.clientY - dragOffsetY);\n\t var x = dragStartX + (e.clientX - dragOffsetX);\n\t var minY = 0;\n\t var maxY = rect.height;\n\t var minX = 0;\n\t var maxX = rect.width;\n\t\n\t if (y > minY && y + overlay.offsetHeight < maxY) {\n\t overlay.style.top = y + 'px';\n\t }\n\t\n\t if (x > minX && x + overlay.offsetWidth < maxX) {\n\t overlay.style.left = x + 'px';\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event that needs to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var annotationId = overlay.getAttribute('data-target-id');\n\t var target = document.querySelectorAll('[data-pdf-annotate-id=\"' + annotationId + '\"]');\n\t var type = target[0].getAttribute('data-pdf-annotate-type');\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t\n\t var _getMetadata2 = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata2.documentId;\n\t\n\t overlay.querySelector('a').style.display = '';\n\t\n\t function getDelta(propX, propY) {\n\t return calcDelta(parseInt(target[0].getAttribute(propX), 10), parseInt(target[0].getAttribute(propY), 10));\n\t }\n\t\n\t function calcDelta(x, y) {\n\t return {\n\t deltaX: OVERLAY_BORDER_SIZE + (0, _utils.scaleDown)(svg, { x: overlay.offsetLeft }).x - x,\n\t deltaY: OVERLAY_BORDER_SIZE + (0, _utils.scaleDown)(svg, { y: overlay.offsetTop }).y - y\n\t };\n\t }\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().getAnnotation(documentId, annotationId).then(function (annotation) {\n\t if (['area', 'highlight', 'point', 'textbox'].indexOf(type) > -1) {\n\t var _getDelta = getDelta('x', 'y'),\n\t deltaX = _getDelta.deltaX,\n\t deltaY = _getDelta.deltaY;\n\t\n\t [].concat(_toConsumableArray(target)).forEach(function (t, i) {\n\t if (deltaY !== 0) {\n\t var modelY = parseInt(t.getAttribute('y'), 10) + deltaY;\n\t var viewY = modelY;\n\t\n\t if (type === 'textbox') {\n\t viewY += annotation.size;\n\t }\n\t\n\t if (type === 'point' && !$.browser.mozilla) {\n\t viewY = (0, _utils.scaleUp)(svg, { viewY: viewY }).viewY;\n\t }\n\t if ($.browser.mozilla) viewY -= 8;\n\t\n\t t.setAttribute('y', viewY);\n\t if (annotation.rectangles) {\n\t annotation.rectangles[i].y = modelY;\n\t } else if (annotation.y) {\n\t annotation.y = modelY;\n\t }\n\t }\n\t if (deltaX !== 0) {\n\t var modelX = parseInt(t.getAttribute('x'), 10) + deltaX;\n\t var viewX = modelX;\n\t\n\t if (type === 'point' && !$.browser.mozilla) {\n\t viewX = (0, _utils.scaleUp)(svg, { viewX: viewX }).viewX;\n\t }\n\t if ($.browser.mozilla) viewX -= 8;\n\t\n\t t.setAttribute('x', viewX);\n\t if (annotation.rectangles) {\n\t annotation.rectangles[i].x = modelX;\n\t } else if (annotation.x) {\n\t annotation.x = modelX;\n\t }\n\t }\n\t });\n\t // } else if (type === 'strikeout') {\n\t // let { deltaX, deltaY } = getDelta('x1', 'y1');\n\t // [...target].forEach(target, (t, i) => {\n\t // if (deltaY !== 0) {\n\t // t.setAttribute('y1', parseInt(t.getAttribute('y1'), 10) + deltaY);\n\t // t.setAttribute('y2', parseInt(t.getAttribute('y2'), 10) + deltaY);\n\t // annotation.rectangles[i].y = parseInt(t.getAttribute('y1'), 10);\n\t // }\n\t // if (deltaX !== 0) {\n\t // t.setAttribute('x1', parseInt(t.getAttribute('x1'), 10) + deltaX);\n\t // t.setAttribute('x2', parseInt(t.getAttribute('x2'), 10) + deltaX);\n\t // annotation.rectangles[i].x = parseInt(t.getAttribute('x1'), 10);\n\t // }\n\t // });\n\t } else if (type === 'drawing') {\n\t var rect = (0, _utils.scaleDown)(svg, (0, _utils.getAnnotationRect)(target[0]));\n\t\n\t var _annotation$lines$ = _slicedToArray(annotation.lines[0], 2),\n\t originX = _annotation$lines$[0],\n\t originY = _annotation$lines$[1];\n\t\n\t var _calcDelta = calcDelta(originX, originY),\n\t _deltaX = _calcDelta.deltaX,\n\t _deltaY = _calcDelta.deltaY;\n\t\n\t // origin isn't necessarily at 0/0 in relation to overlay x/y\n\t // adjust the difference between overlay and drawing coords\n\t\n\t\n\t _deltaY += originY - rect.top;\n\t _deltaX += originX - rect.left;\n\t\n\t annotation.lines.forEach(function (line, i) {\n\t var _annotation$lines$i = _slicedToArray(annotation.lines[i], 2),\n\t x = _annotation$lines$i[0],\n\t y = _annotation$lines$i[1];\n\t\n\t annotation.lines[i][0] = x + _deltaX;\n\t annotation.lines[i][1] = y + _deltaY;\n\t });\n\t\n\t target[0].parentNode.removeChild(target[0]);\n\t (0, _appendChild2.default)(svg, annotation);\n\t }\n\t\n\t if (!_initFile.readonly) _PDFJSAnnotate2.default.getStoreAdapter().editAnnotation(documentId, annotationId, annotation);\n\t });\n\t\n\t setTimeout(function () {\n\t isDragging = false;\n\t }, 0);\n\t\n\t overlay.style.background = '';\n\t overlay.style.cursor = '';\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle annotation.click event\n\t *\n\t * @param {Element} e The annotation element that was clicked\n\t */\n\tfunction handleAnnotationClick(target) {\n\t var type = target.dataset['pdfAnnotateType'];\n\t if (type === 'point') (0, _comments.selectComment)(target.dataset['pdfAnnotateId']);\n\t createEditOverlay(target);\n\t}\n\t\n\t/**\n\t * Enable edit mode behavior.\n\t */\n\tfunction enableEdit() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t (0, _event.addEventListener)('annotation:click', handleAnnotationClick);\n\t};\n\t\n\t/**\n\t * Disable edit mode behavior.\n\t */\n\tfunction disableEdit() {\n\t destroyEditOverlay();\n\t\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t (0, _event.removeEventListener)('annotation:click', handleAnnotationClick);\n\t};\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = appendChild;\n\t\n\tvar _objectAssign = __webpack_require__(42);\n\t\n\tvar _objectAssign2 = _interopRequireDefault(_objectAssign);\n\t\n\tvar _renderLine = __webpack_require__(43);\n\t\n\tvar _renderLine2 = _interopRequireDefault(_renderLine);\n\t\n\tvar _renderPath = __webpack_require__(46);\n\t\n\tvar _renderPath2 = _interopRequireDefault(_renderPath);\n\t\n\tvar _renderPoint = __webpack_require__(47);\n\t\n\tvar _renderPoint2 = _interopRequireDefault(_renderPoint);\n\t\n\tvar _renderRect = __webpack_require__(48);\n\t\n\tvar _renderRect2 = _interopRequireDefault(_renderRect);\n\t\n\tvar _renderText = __webpack_require__(49);\n\t\n\tvar _renderText2 = _interopRequireDefault(_renderText);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar isFirefox = /firefox/i.test(navigator.userAgent);\n\t\n\t/**\n\t * Get the x/y translation to be used for transforming the annotations\n\t * based on the rotation of the viewport.\n\t *\n\t * @param {Object} viewport The viewport data from the page\n\t * @return {Object}\n\t */\n\tfunction getTranslation(viewport) {\n\t var x = void 0;\n\t var y = void 0;\n\t\n\t // Modulus 360 on the rotation so that we only\n\t // have to worry about four possible values.\n\t switch (viewport.rotation % 360) {\n\t case 0:\n\t x = y = 0;\n\t break;\n\t case 90:\n\t x = 0;\n\t y = viewport.width / viewport.scale * -1;\n\t break;\n\t case 180:\n\t x = viewport.width / viewport.scale * -1;\n\t y = viewport.height / viewport.scale * -1;\n\t break;\n\t case 270:\n\t x = viewport.height / viewport.scale * -1;\n\t y = 0;\n\t break;\n\t }\n\t\n\t return { x: x, y: y };\n\t}\n\t\n\t/**\n\t * Transform the rotation and scale of a node using SVG's native transform attribute.\n\t *\n\t * @param {Node} node The node to be transformed\n\t * @param {Object} viewport The page's viewport data\n\t * @return {Node}\n\t */\n\tfunction transform(node, viewport) {\n\t var trans = getTranslation(viewport);\n\t\n\t // Let SVG natively transform the element\n\t node.setAttribute('transform', 'scale(' + viewport.scale + ') rotate(' + viewport.rotation + ') translate(' + trans.x + ', ' + trans.y + ')');\n\t\n\t // Manually adjust x/y for nested SVG nodes\n\t if (!isFirefox && node.nodeName.toLowerCase() === 'svg') {\n\t node.setAttribute('x', parseInt(node.getAttribute('x'), 10) * viewport.scale);\n\t node.setAttribute('y', parseInt(node.getAttribute('y'), 10) * viewport.scale);\n\t\n\t var x = parseInt(node.getAttribute('x', 10));\n\t var y = parseInt(node.getAttribute('y', 10));\n\t var width = parseInt(node.getAttribute('width'), 10);\n\t var height = parseInt(node.getAttribute('height'), 10);\n\t var path = node.querySelector('path');\n\t var svg = path.parentNode;\n\t\n\t // Scale width/height\n\t [node, svg, path, node.querySelector('rect')].forEach(function (n) {\n\t n.setAttribute('width', parseInt(n.getAttribute('width'), 10) * viewport.scale);\n\t n.setAttribute('height', parseInt(n.getAttribute('height'), 10) * viewport.scale);\n\t });\n\t\n\t // Transform path but keep scale at 100% since it will be handled natively\n\t transform(path, (0, _objectAssign2.default)({}, viewport, { scale: 1 }));\n\t\n\t switch (viewport.rotation % 360) {\n\t case 90:\n\t node.setAttribute('x', viewport.width - y - width);\n\t node.setAttribute('y', x);\n\t svg.setAttribute('x', 1);\n\t svg.setAttribute('y', 0);\n\t break;\n\t case 180:\n\t node.setAttribute('x', viewport.width - x - width);\n\t node.setAttribute('y', viewport.height - y - height);\n\t svg.setAttribute('y', 2);\n\t break;\n\t case 270:\n\t node.setAttribute('x', y);\n\t node.setAttribute('y', viewport.height - x - height);\n\t svg.setAttribute('x', -1);\n\t svg.setAttribute('y', 0);\n\t break;\n\t }\n\t }\n\t\n\t return node;\n\t}\n\t\n\t/**\n\t * Append an annotation as a child of an SVG.\n\t *\n\t * @param {SVGElement} svg The SVG element to append the annotation to\n\t * @param {Object} annotation The annotation definition to render and append\n\t * @param {Object} viewport The page's viewport data\n\t * @return {SVGElement} A node that was created and appended by this function\n\t */\n\tfunction appendChild(svg, annotation, viewport) {\n\t if (!viewport) {\n\t viewport = JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'));\n\t }\n\t\n\t var child = void 0;\n\t switch (annotation.type) {\n\t case 'area':\n\t case 'highlight':\n\t child = (0, _renderRect2.default)(annotation);\n\t break;\n\t case 'strikeout':\n\t child = (0, _renderLine2.default)(annotation);\n\t break;\n\t case 'point':\n\t child = (0, _renderPoint2.default)(annotation);\n\t break;\n\t case 'textbox':\n\t child = (0, _renderText2.default)(annotation);\n\t break;\n\t case 'drawing':\n\t child = (0, _renderPath2.default)(annotation);\n\t break;\n\t }\n\t\n\t // If no type was provided for an annotation it will result in node being null.\n\t // Skip appending/transforming if node doesn't exist.\n\t if (child) {\n\t // Set attributes\n\t child.setAttribute('data-pdf-annotate-id', annotation.uuid);\n\t child.setAttribute('data-pdf-annotate-type', annotation.type);\n\t child.setAttribute('aria-hidden', true);\n\t\n\t svg.appendChild(transform(child, viewport));\n\t }\n\t\n\t return child;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\t/*\n\tobject-assign\n\t(c) Sindre Sorhus\n\t@license MIT\n\t*/\n\t\n\t'use strict';\n\t/* eslint-disable no-unused-vars */\n\tvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\tvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\t\n\tfunction toObject(val) {\n\t\tif (val === null || val === undefined) {\n\t\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t\t}\n\t\n\t\treturn Object(val);\n\t}\n\t\n\tfunction shouldUseNative() {\n\t\ttry {\n\t\t\tif (!Object.assign) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// Detect buggy property enumeration order in older V8 versions.\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\t\ttest1[5] = 'de';\n\t\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\t\tvar test2 = {};\n\t\t\tfor (var i = 0; i < 10; i++) {\n\t\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t\t}\n\t\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\t\treturn test2[n];\n\t\t\t});\n\t\t\tif (order2.join('') !== '0123456789') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\t\tvar test3 = {};\n\t\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\t\ttest3[letter] = letter;\n\t\t\t});\n\t\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\t\tvar from;\n\t\tvar to = toObject(target);\n\t\tvar symbols;\n\t\n\t\tfor (var s = 1; s < arguments.length; s++) {\n\t\t\tfrom = Object(arguments[s]);\n\t\n\t\t\tfor (var key in from) {\n\t\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\t\tto[key] = from[key];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif (getOwnPropertySymbols) {\n\t\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn to;\n\t};\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderLine;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGLineElements from an annotation definition.\n\t * This is used for anntations of type `strikeout`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGGElement} A group of all lines to be rendered\n\t */\n\tfunction renderLine(a) {\n\t var group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n\t (0, _setAttributes2.default)(group, {\n\t stroke: (0, _normalizeColor2.default)(a.color || '#f00'),\n\t strokeWidth: 1\n\t });\n\t\n\t a.rectangles.forEach(function (r) {\n\t var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n\t\n\t (0, _setAttributes2.default)(line, {\n\t x1: r.x,\n\t y1: r.y,\n\t x2: r.x + r.width,\n\t y2: r.y\n\t });\n\t\n\t group.appendChild(line);\n\t });\n\t\n\t return group;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = setAttributes;\n\tvar UPPER_REGEX = /[A-Z]/g;\n\t\n\t// Don't convert these attributes from camelCase to hyphenated-attributes\n\tvar BLACKLIST = ['viewBox'];\n\t\n\tvar keyCase = function keyCase(key) {\n\t if (BLACKLIST.indexOf(key) === -1) {\n\t key = key.replace(UPPER_REGEX, function (match) {\n\t return '-' + match.toLowerCase();\n\t });\n\t }\n\t return key;\n\t};\n\t\n\t/**\n\t * Set attributes for a node from a map\n\t *\n\t * @param {Node} node The node to set attributes on\n\t * @param {Object} attributes The map of key/value pairs to use for attributes\n\t */\n\tfunction setAttributes(node, attributes) {\n\t Object.keys(attributes).forEach(function (key) {\n\t node.setAttribute(keyCase(key), attributes[key]);\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = normalizeColor;\n\tvar REGEX_HASHLESS_HEX = /^([a-f0-9]{6}|[a-f0-9]{3})$/i;\n\t\n\t/**\n\t * Normalize a color value\n\t *\n\t * @param {String} color The color to normalize\n\t * @return {String}\n\t */\n\tfunction normalizeColor(color) {\n\t if (REGEX_HASHLESS_HEX.test(color)) {\n\t color = \"#\" + color;\n\t }\n\t return color;\n\t}\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderPath;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGPathElement from an annotation definition.\n\t * This is used for anntations of type `drawing`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGPathElement} The path to be rendered\n\t */\n\tfunction renderPath(a) {\n\t var d = [];\n\t var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\n\t for (var i = 0, l = a.lines.length; i < l; i++) {\n\t var p1 = a.lines[i];\n\t var p2 = a.lines[i + 1];\n\t if (p2) {\n\t d.push('M' + p1[0] + ' ' + p1[1] + ' ' + p2[0] + ' ' + p2[1]);\n\t }\n\t }\n\t\n\t (0, _setAttributes2.default)(path, {\n\t d: d.join(' ') + 'Z',\n\t stroke: (0, _normalizeColor2.default)(a.color || '#000'),\n\t strokeWidth: a.width || 1,\n\t fill: 'none'\n\t });\n\t\n\t return path;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderPoint;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar SIZE = 25;\n\tvar D = 'M499.968 214.336q-113.832 0 -212.877 38.781t-157.356 104.625 -58.311 142.29q0 62.496 39.897 119.133t112.437 97.929l48.546 27.9 -15.066 53.568q-13.392 50.778 -39.06 95.976 84.816 -35.154 153.45 -95.418l23.994 -21.204 31.806 3.348q38.502 4.464 72.54 4.464 113.832 0 212.877 -38.781t157.356 -104.625 58.311 -142.29 -58.311 -142.29 -157.356 -104.625 -212.877 -38.781z';\n\t\n\t/**\n\t * Create SVGElement from an annotation definition.\n\t * This is used for anntations of type `comment`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGElement} A svg to be rendered\n\t */\n\tfunction renderPoint(a) {\n\t var outerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t var innerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\n\t (0, _setAttributes2.default)(outerSVG, {\n\t width: SIZE,\n\t height: SIZE,\n\t x: a.x,\n\t y: a.y\n\t });\n\t\n\t (0, _setAttributes2.default)(innerSVG, {\n\t width: SIZE,\n\t height: SIZE,\n\t x: 0,\n\t y: SIZE * 0.05 * -1,\n\t viewBox: '0 0 1000 1000'\n\t });\n\t\n\t (0, _setAttributes2.default)(rect, {\n\t width: SIZE,\n\t height: SIZE,\n\t stroke: '#000',\n\t fill: '#ff0'\n\t });\n\t\n\t (0, _setAttributes2.default)(path, {\n\t d: D,\n\t strokeWidth: 50,\n\t stroke: '#000',\n\t fill: '#fff'\n\t });\n\t\n\t innerSVG.appendChild(path);\n\t outerSVG.appendChild(rect);\n\t outerSVG.appendChild(innerSVG);\n\t\n\t return outerSVG;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderRect;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGRectElements from an annotation definition.\n\t * This is used for anntations of type `area` and `highlight`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGGElement|SVGRectElement} A group of all rects to be rendered\n\t */\n\tfunction renderRect(a) {\n\t if (a.type === 'highlight') {\n\t var group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n\t (0, _setAttributes2.default)(group, {\n\t fill: (0, _normalizeColor2.default)(a.color || '#ff0'),\n\t fillOpacity: 0.2\n\t });\n\t\n\t a.rectangles.forEach(function (r) {\n\t group.appendChild(createRect(r));\n\t });\n\t\n\t return group;\n\t } else {\n\t var rect = createRect(a);\n\t (0, _setAttributes2.default)(rect, {\n\t stroke: (0, _normalizeColor2.default)(a.color || '#f00'),\n\t fill: 'none'\n\t });\n\t\n\t return rect;\n\t }\n\t}\n\t\n\tfunction createRect(r) {\n\t var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t\n\t (0, _setAttributes2.default)(rect, {\n\t x: r.x,\n\t y: r.y,\n\t width: r.width,\n\t height: r.height\n\t });\n\t\n\t return rect;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderText;\n\t\n\tvar _setAttributes = __webpack_require__(44);\n\t\n\tvar _setAttributes2 = _interopRequireDefault(_setAttributes);\n\t\n\tvar _normalizeColor = __webpack_require__(45);\n\t\n\tvar _normalizeColor2 = _interopRequireDefault(_normalizeColor);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Create SVGTextElement from an annotation definition.\n\t * This is used for anntations of type `textbox`.\n\t *\n\t * @param {Object} a The annotation definition\n\t * @return {SVGTextElement} A text to be rendered\n\t */\n\tfunction renderText(a) {\n\t var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n\t\n\t (0, _setAttributes2.default)(text, {\n\t x: a.x,\n\t y: a.y + parseInt(a.size, 10),\n\t fill: (0, _normalizeColor2.default)(a.color || '#000'),\n\t fontSize: a.size\n\t });\n\t text.innerHTML = a.content;\n\t\n\t return text;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = render;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Render the response from PDFJSAnnotate.getStoreAdapter().getAnnotations to SVG\n\t *\n\t * @param {SVGElement} svg The SVG element to render the annotations to\n\t * @param {Object} viewport The page viewport data\n\t * @param {Object} data The response from PDFJSAnnotate.getStoreAdapter().getAnnotations\n\t * @return {Promise} Settled once rendering has completed\n\t * A settled Promise will be either:\n\t * - fulfilled: SVGElement\n\t * - rejected: Error\n\t */\n\tfunction render(svg, viewport, data) {\n\t return new Promise(function (resolve, reject) {\n\t // Reset the content of the SVG\n\t svg.innerHTML = '';\n\t svg.setAttribute('data-pdf-annotate-container', true);\n\t svg.setAttribute('data-pdf-annotate-viewport', JSON.stringify(viewport));\n\t svg.removeAttribute('data-pdf-annotate-document');\n\t svg.removeAttribute('data-pdf-annotate-page');\n\t\n\t // If there's no data nothing can be done\n\t if (!data) {\n\t return resolve(svg);\n\t }\n\t\n\t svg.setAttribute('data-pdf-annotate-document', data.documentId);\n\t svg.setAttribute('data-pdf-annotate-page', data.pageNumber);\n\t\n\t // Make sure annotations is an array\n\t if (!Array.isArray(data.annotations) || data.annotations.length === 0) {\n\t return resolve(svg);\n\t }\n\t\n\t // Append annotation to svg\n\t data.annotations.forEach(function (a) {\n\t (0, _appendChild2.default)(svg, a, viewport);\n\t });\n\t\n\t resolve(svg);\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderScreenReaderHints;\n\t\n\tvar _insertScreenReaderHint = __webpack_require__(52);\n\t\n\tvar _insertScreenReaderHint2 = _interopRequireDefault(_insertScreenReaderHint);\n\t\n\tvar _initEventHandlers = __webpack_require__(58);\n\t\n\tvar _initEventHandlers2 = _interopRequireDefault(_initEventHandlers);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// TODO This is not the right place for this to live\n\t(0, _initEventHandlers2.default)();\n\t\n\t/**\n\t * Insert hints into the DOM for screen readers.\n\t *\n\t * @param {Array} annotations The annotations that hints are inserted for\n\t */\n\tfunction renderScreenReaderHints(annotations) {\n\t annotations = Array.isArray(annotations) ? annotations : [];\n\t\n\t // Insert hints for each type\n\t Object.keys(SORT_TYPES).forEach(function (type) {\n\t var sortBy = SORT_TYPES[type];\n\t annotations.filter(function (a) {\n\t return a.type === type;\n\t }).sort(sortBy).forEach(function (a, i) {\n\t return (0, _insertScreenReaderHint2.default)(a, i + 1);\n\t });\n\t });\n\t}\n\t\n\t// Sort annotations first by y, then by x.\n\t// This allows hints to be injected in the order they appear,\n\t// which makes numbering them easier.\n\tfunction sortByPoint(a, b) {\n\t if (a.y < b.y) {\n\t return a.x - b.x;\n\t } else {\n\t return 1;\n\t }\n\t}\n\t\n\t// Sort annotation by it's first rectangle\n\tfunction sortByRectPoint(a, b) {\n\t return sortByPoint(a.rectangles[0], b.rectangles[0]);\n\t}\n\t\n\t// Sort annotation by it's first line\n\tfunction sortByLinePoint(a, b) {\n\t var lineA = a.lines[0];\n\t var lineB = b.lines[0];\n\t return sortByPoint({ x: lineA[0], y: lineA[1] }, { x: lineB[0], y: lineB[1] });\n\t}\n\t\n\t// Arrange supported types and associated sort methods\n\tvar SORT_TYPES = {\n\t 'highlight': sortByRectPoint,\n\t 'strikeout': sortByRectPoint,\n\t 'drawing': sortByLinePoint,\n\t 'textbox': sortByPoint,\n\t 'point': sortByPoint,\n\t 'area': sortByPoint\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertScreenReaderHint;\n\t\n\tvar _createScreenReaderOnly = __webpack_require__(53);\n\t\n\tvar _createScreenReaderOnly2 = _interopRequireDefault(_createScreenReaderOnly);\n\t\n\tvar _insertElementWithinChildren = __webpack_require__(54);\n\t\n\tvar _insertElementWithinChildren2 = _interopRequireDefault(_insertElementWithinChildren);\n\t\n\tvar _insertElementWithinElement = __webpack_require__(55);\n\t\n\tvar _insertElementWithinElement2 = _interopRequireDefault(_insertElementWithinElement);\n\t\n\tvar _renderScreenReaderComments = __webpack_require__(56);\n\t\n\tvar _renderScreenReaderComments2 = _interopRequireDefault(_renderScreenReaderComments);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Annotation types that support comments\n\tvar COMMENT_TYPES = ['highlight', 'point', 'area'];\n\t\n\t/**\n\t * Insert a hint into the DOM for screen readers for a specific annotation.\n\t *\n\t * @param {Object} annotation The annotation to insert a hint for\n\t * @param {Number} num The number of the annotation out of all annotations of the same type\n\t */\n\tfunction insertScreenReaderHint(annotation) {\n\t var num = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t\n\t switch (annotation.type) {\n\t case 'highlight':\n\t case 'strikeout':\n\t var rects = annotation.rectangles;\n\t var first = rects[0];\n\t var last = rects[rects.length - 1];\n\t\n\t (0, _insertElementWithinElement2.default)((0, _createScreenReaderOnly2.default)('Begin ' + annotation.type + ' annotation ' + num, annotation.uuid), first.x, first.y, annotation.page, true);\n\t\n\t (0, _insertElementWithinElement2.default)((0, _createScreenReaderOnly2.default)('End ' + annotation.type + ' annotation ' + num, annotation.uuid + '-end'), last.x + last.width, last.y, annotation.page, false);\n\t break;\n\t\n\t case 'textbox':\n\t case 'point':\n\t var text = annotation.type === 'textbox' ? ' (content: ' + annotation.content + ')' : '';\n\t\n\t (0, _insertElementWithinChildren2.default)((0, _createScreenReaderOnly2.default)(annotation.type + ' annotation ' + num + text, annotation.uuid), annotation.x, annotation.y, annotation.page);\n\t break;\n\t\n\t case 'drawing':\n\t case 'area':\n\t var x = typeof annotation.x !== 'undefined' ? annotation.x : annotation.lines[0][0];\n\t var y = typeof annotation.y !== 'undefined' ? annotation.y : annotation.lines[0][1];\n\t\n\t (0, _insertElementWithinChildren2.default)((0, _createScreenReaderOnly2.default)('Unlabeled drawing', annotation.uuid), x, y, annotation.page);\n\t break;\n\t }\n\t\n\t // Include comments in screen reader hint\n\t if (COMMENT_TYPES.includes(annotation.type)) {\n\t (0, _renderScreenReaderComments2.default)(annotation.documentId, annotation.uuid);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 53 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = createScreenReaderOnly;\n\t/**\n\t * Create a node that is only visible to screen readers\n\t *\n\t * @param {String} content The text content that should be read by screen reader\n\t * @param {String} [annotationId] The ID of the annotation assocaited\n\t * @return {Element} An Element that is only visible to screen readers\n\t */\n\tfunction createScreenReaderOnly(content, annotationId) {\n\t var node = document.createElement('div');\n\t var text = document.createTextNode(content);\n\t node.appendChild(text);\n\t node.setAttribute('id', 'pdf-annotate-screenreader-' + annotationId);\n\t node.style.position = 'absolute';\n\t node.style.left = '-10000px';\n\t node.style.top = 'auto';\n\t node.style.width = '1px';\n\t node.style.height = '1px';\n\t node.style.overflow = 'hidden';\n\t return node;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertElementWithinChildren;\n\t\n\tvar _insertElementWithinElement = __webpack_require__(55);\n\t\n\tvar _insertElementWithinElement2 = _interopRequireDefault(_insertElementWithinElement);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t/**\n\t * Insert an element at a point within the document.\n\t * This algorithm will try to insert between elements if possible.\n\t * It will however use `insertElementWithinElement` if it is more accurate.\n\t *\n\t * @param {Element} el The element to be inserted\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page number to limit elements to\n\t * @return {Boolean} True if element was able to be inserted, otherwise false\n\t */\n\tfunction insertElementWithinChildren(el, x, y, pageNumber) {\n\t // Try and use most accurate method of inserting within an element\n\t if ((0, _insertElementWithinElement2.default)(el, x, y, pageNumber, true)) {\n\t return true;\n\t }\n\t\n\t // Fall back to inserting between elements\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var rect = svg.getBoundingClientRect();\n\t var nodes = [].concat(_toConsumableArray(svg.parentNode.querySelectorAll('.textLayer > div')));\n\t\n\t y = (0, _utils.scaleUp)(svg, { y: y }).y + rect.top;\n\t x = (0, _utils.scaleUp)(svg, { x: x }).x + rect.left;\n\t\n\t // Find the best node to insert before\n\t for (var i = 0, l = nodes.length; i < l; i++) {\n\t var n = nodes[i];\n\t var r = n.getBoundingClientRect();\n\t if (y <= r.top) {\n\t n.parentNode.insertBefore(el, n);\n\t return true;\n\t }\n\t }\n\t\n\t // If all else fails try to append to the bottom\n\t var textLayer = svg.parentNode.querySelector('.textLayer');\n\t if (textLayer) {\n\t var textRect = textLayer.getBoundingClientRect();\n\t if ((0, _utils.pointIntersectsRect)(x, y, textRect)) {\n\t textLayer.appendChild(el);\n\t return true;\n\t }\n\t }\n\t\n\t return false;\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertElementWithinElement;\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t/**\n\t * Insert an element at a point within the document.\n\t * This algorithm will only insert within an element amidst it's text content.\n\t *\n\t * @param {Element} el The element to be inserted\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page number to limit elements to\n\t * @param {Boolean} insertBefore Whether the element is to be inserted before or after x\n\t * @return {Boolean} True if element was able to be inserted, otherwise false\n\t */\n\tfunction insertElementWithinElement(el, x, y, pageNumber, insertBefore) {\n\t var OFFSET_ADJUST = 2;\n\t\n\t // If inserting before adjust `x` by looking for element a few px to the right\n\t // Otherwise adjust a few px to the left\n\t // This is to allow a little tolerance by searching within the box, instead\n\t // of getting a false negative by testing right on the border.\n\t x = Math.max(x + OFFSET_ADJUST * (insertBefore ? 1 : -1), 0);\n\t\n\t var node = textLayerElementFromPoint(x, y + OFFSET_ADJUST, pageNumber);\n\t if (!node) {\n\t return false;\n\t }\n\t\n\t // Now that node has been found inverse the adjustment for `x`.\n\t // This is done to accomodate tolerance by cutting off on the outside of the\n\t // text boundary, instead of missing a character by cutting off within.\n\t x = x + OFFSET_ADJUST * (insertBefore ? -1 : 1);\n\t\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var left = (0, _utils.scaleDown)(svg, { left: node.getBoundingClientRect().left }).left - svg.getBoundingClientRect().left;\n\t var temp = node.cloneNode(true);\n\t var head = temp.innerHTML.split('');\n\t var tail = [];\n\t\n\t // Insert temp off screen\n\t temp.style.position = 'absolute';\n\t temp.style.top = '-10000px';\n\t temp.style.left = '-10000px';\n\t document.body.appendChild(temp);\n\t\n\t while (head.length) {\n\t // Don't insert within HTML tags\n\t if (head[head.length - 1] === '>') {\n\t while (head.length) {\n\t tail.unshift(head.pop());\n\t if (tail[0] === '<') {\n\t break;\n\t }\n\t }\n\t }\n\t\n\t // Check if width of temp based on current head value satisfies x\n\t temp.innerHTML = head.join('');\n\t var width = (0, _utils.scaleDown)(svg, { width: temp.getBoundingClientRect().width }).width;\n\t if (left + width <= x) {\n\t break;\n\t }\n\t tail.unshift(head.pop());\n\t }\n\t\n\t // Update original node with new markup, including element to be inserted\n\t node.innerHTML = head.join('') + el.outerHTML + tail.join('');\n\t temp.parentNode.removeChild(temp);\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Get a text layer element at a given point on a page\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t * @param {Number} pageNumber The page to limit elements to\n\t * @return {Element} First text layer element found at the point\n\t */\n\tfunction textLayerElementFromPoint(x, y, pageNumber) {\n\t var svg = document.querySelector('svg[data-pdf-annotate-page=\"' + pageNumber + '\"]');\n\t var rect = svg.getBoundingClientRect();\n\t y = (0, _utils.scaleUp)(svg, { y: y }).y + rect.top;\n\t x = (0, _utils.scaleUp)(svg, { x: x }).x + rect.left;\n\t return [].concat(_toConsumableArray(svg.parentNode.querySelectorAll('.textLayer [data-canvas-width]'))).filter(function (el) {\n\t return (0, _utils.pointIntersectsRect)(x, y, el.getBoundingClientRect());\n\t })[0];\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = renderScreenReaderComments;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _insertScreenReaderComment = __webpack_require__(57);\n\t\n\tvar _insertScreenReaderComment2 = _interopRequireDefault(_insertScreenReaderComment);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Insert the comments into the DOM to be available by screen reader\n\t *\n\t * Example output:\n\t * <div class=\"screenReaderOnly\">\n\t * <div>Begin highlight 1</div>\n\t * <ol aria-label=\"Comments\">\n\t * <li>Foo</li>\n\t * <li>Bar</li>\n\t * <li>Baz</li>\n\t * <li>Qux</li>\n\t * </ol>\n\t * </div>\n\t * <div>Some highlighted text goes here...</div>\n\t * <div class=\"screenReaderOnly\">End highlight 1</div>\n\t *\n\t * NOTE: `screenReaderOnly` is not a real class, just used for brevity\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The ID of the annotation\n\t * @param {Array} [comments] Optionally preloaded comments to be rendered\n\t * @return {Promise}\n\t */\n\tfunction renderScreenReaderComments(documentId, annotationId, comments) {\n\t var promise = void 0;\n\t\n\t if (Array.isArray(comments)) {\n\t promise = Promise.resolve(comments);\n\t } else {\n\t promise = _PDFJSAnnotate2.default.getStoreAdapter().getComments(documentId, annotationId);\n\t }\n\t\n\t return promise.then(function (comments) {\n\t // Node needs to be found by querying DOM as it may have been inserted as innerHTML\n\t // leaving `screenReaderNode` as an invalid reference (see `insertElementWithinElement`).\n\t var node = document.getElementById('pdf-annotate-screenreader-' + annotationId);\n\t if (node) {\n\t var list = document.createElement('ol');\n\t list.setAttribute('id', 'pdf-annotate-screenreader-comment-list-' + annotationId);\n\t list.setAttribute('aria-label', 'Comments');\n\t node.appendChild(list);\n\t comments.forEach(_insertScreenReaderComment2.default);\n\t }\n\t });\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 57 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = insertScreenReaderComment;\n\t/**\n\t * Insert a comment into the DOM to be available by screen reader\n\t *\n\t * @param {Object} comment The comment to be inserted\n\t */\n\tfunction insertScreenReaderComment(comment) {\n\t if (!comment) {\n\t return;\n\t }\n\t\n\t var list = document.querySelector('#pdf-annotate-screenreader-' + comment.annotation + ' ol');\n\t if (list) {\n\t var item = document.createElement('li');\n\t item.setAttribute('id', 'pdf-annotate-screenreader-comment-' + comment.uuid);\n\t item.appendChild(document.createTextNode('' + comment.content));\n\t list.appendChild(item);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = initEventHandlers;\n\t\n\tvar _insertScreenReaderHint = __webpack_require__(52);\n\t\n\tvar _insertScreenReaderHint2 = _interopRequireDefault(_insertScreenReaderHint);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tvar _insertScreenReaderComment = __webpack_require__(57);\n\t\n\tvar _insertScreenReaderComment2 = _interopRequireDefault(_insertScreenReaderComment);\n\t\n\tvar _renderScreenReaderComments = __webpack_require__(56);\n\t\n\tvar _renderScreenReaderComments2 = _interopRequireDefault(_renderScreenReaderComments);\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Initialize the event handlers for keeping screen reader hints synced with data\n\t */\n\tfunction initEventHandlers() {\n\t (0, _event.addEventListener)('annotation:add', function (documentId, pageNumber, annotation) {\n\t reorderAnnotationsByType(documentId, pageNumber, annotation.type);\n\t });\n\t (0, _event.addEventListener)('annotation:edit', function (documentId, annotationId, annotation) {\n\t reorderAnnotationsByType(documentId, annotation.page, annotation.type);\n\t });\n\t (0, _event.addEventListener)('annotation:delete', removeAnnotation);\n\t (0, _event.addEventListener)('comment:add', insertComment);\n\t (0, _event.addEventListener)('comment:delete', removeComment);\n\t}\n\t\n\t/**\n\t * Reorder the annotation numbers by annotation type\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {Number} pageNumber The page number of the annotations\n\t * @param {Strig} type The annotation type\n\t */\n\tfunction reorderAnnotationsByType(documentId, pageNumber, type) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().getAnnotations(documentId).then(function (annotationsByPage) {\n\t var annotations = [];\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = Object.keys(annotationsByPage)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var page = _step.value;\n\t\n\t for (var annotation in annotationsByPage[page]) {\n\t if (annotation.type == type) annotations.push(annotation);\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t\n\t return annotations;\n\t // annotationsByPage(page) =\n\t // return annotationsByPage[page].filter((a) => {\n\t // return a.type === type;\n\t // });\n\t // return annotationsByPage;\n\t }).then(function (annotations) {\n\t annotations.forEach(function (a) {\n\t removeAnnotation(documentId, a.uuid);\n\t });\n\t\n\t return annotations;\n\t }).then(_renderScreenReaderHints2.default);\n\t}\n\t\n\t/**\n\t * Remove the screen reader hint for an annotation\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The Id of the annotation\n\t */\n\tfunction removeAnnotation(documentId, annotationId) {\n\t removeElementById('pdf-annotate-screenreader-' + annotationId);\n\t removeElementById('pdf-annotate-screenreader-' + annotationId + '-end');\n\t}\n\t\n\t/**\n\t * Insert a screen reader hint for a comment\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} annotationId The ID of tha assocated annotation\n\t * @param {Object} comment The comment to insert a hint for\n\t */\n\tfunction insertComment(documentId, annotationId, comment) {\n\t var list = document.querySelector('pdf-annotate-screenreader-comment-list-' + annotationId);\n\t var promise = void 0;\n\t\n\t if (!list) {\n\t promise = (0, _renderScreenReaderComments2.default)(documentId, annotationId, []).then(function () {\n\t list = document.querySelector('pdf-annotate-screenreader-comment-list-' + annotationId);\n\t return true;\n\t });\n\t } else {\n\t promise = Promise.resolve(true);\n\t }\n\t\n\t promise.then(function () {\n\t (0, _insertScreenReaderComment2.default)(comment);\n\t });\n\t}\n\t\n\t/**\n\t * Remove a screen reader hint for a comment\n\t *\n\t * @param {String} documentId The ID of the document\n\t * @param {String} commentId The ID of the comment\n\t */\n\tfunction removeComment(documentId, commentId) {\n\t removeElementById('pdf-annotate-screenreader-comment-' + commentId);\n\t}\n\t\n\t/**\n\t * Remove an element from the DOM by it's ID if it exists\n\t *\n\t * @param {String} elementID The ID of the element to be removed\n\t */\n\tfunction removeElementById(elementId) {\n\t var el = document.getElementById(elementId);\n\t if (el) {\n\t el.parentNode.removeChild(el);\n\t }\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _event = __webpack_require__(4);\n\t\n\tvar _edit = __webpack_require__(40);\n\t\n\tvar _pen = __webpack_require__(60);\n\t\n\tvar _point = __webpack_require__(61);\n\t\n\tvar _rect = __webpack_require__(62);\n\t\n\tvar _text = __webpack_require__(63);\n\t\n\tvar _page = __webpack_require__(64);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\texports.default = {\n\t addEventListener: _event.addEventListener, removeEventListener: _event.removeEventListener, fireEvent: _event.fireEvent,\n\t disableEdit: _edit.disableEdit, enableEdit: _edit.enableEdit,\n\t disablePen: _pen.disablePen, enablePen: _pen.enablePen, setPen: _pen.setPen,\n\t disablePoint: _point.disablePoint, enablePoint: _point.enablePoint,\n\t disableRect: _rect.disableRect, enableRect: _rect.enableRect,\n\t disableText: _text.disableText, enableText: _text.enableText, setText: _text.setText,\n\t createPage: _page.createPage, renderPage: _page.renderPage,\n\t setActiveToolbarItem: _utils.setActiveToolbarItem\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.setPen = setPen;\n\texports.enablePen = enablePen;\n\texports.disablePen = disablePen;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar _penSize = void 0;\n\tvar _penColor = void 0;\n\tvar path = void 0;\n\tvar lines = void 0;\n\t\n\t/**\n\t * Handle document.mousedown event\n\t */\n\tfunction handleDocumentMousedown() {\n\t path = null;\n\t lines = [];\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var svg = void 0;\n\t if (lines.length > 1 && (svg = (0, _utils.findSVGAtPoint)(e.clientX, e.clientY))) {\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, {\n\t type: 'drawing',\n\t width: _penSize,\n\t color: _penColor,\n\t lines: lines\n\t }).then(function (annotation) {\n\t if (path) {\n\t svg.removeChild(path);\n\t }\n\t\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t savePoint(e.clientX, e.clientY);\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event to be handled\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t // Cancel rect if Esc is pressed\n\t if (e.keyCode === 27) {\n\t lines = null;\n\t path.parentNode.removeChild(path);\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t }\n\t}\n\t\n\t/**\n\t * Save a point to the line being drawn.\n\t *\n\t * @param {Number} x The x coordinate of the point\n\t * @param {Number} y The y coordinate of the point\n\t */\n\tfunction savePoint(x, y) {\n\t var svg = (0, _utils.findSVGAtPoint)(x, y);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t var point = (0, _utils.scaleDown)(svg, {\n\t x: x - rect.left,\n\t y: y - rect.top\n\t });\n\t\n\t lines.push([point.x, point.y]);\n\t\n\t if (lines.length <= 1) {\n\t return;\n\t }\n\t\n\t if (path) {\n\t svg.removeChild(path);\n\t }\n\t\n\t path = (0, _appendChild2.default)(svg, {\n\t type: 'drawing',\n\t color: _penColor,\n\t width: _penSize,\n\t lines: lines\n\t });\n\t}\n\t\n\t/**\n\t * Set the attributes of the pen.\n\t *\n\t * @param {Number} penSize The size of the lines drawn by the pen\n\t * @param {String} penColor The color of the lines drawn by the pen\n\t */\n\tfunction setPen() {\n\t var penSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\t var penColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '000000';\n\t\n\t _penSize = parseInt(penSize, 10);\n\t _penColor = penColor;\n\t}\n\t\n\t/**\n\t * Enable the pen behavior\n\t */\n\tfunction enablePen() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Disable the pen behavior\n\t */\n\tfunction disablePen() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t (0, _utils.enableUserSelect)();\n\t}\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.enablePoint = enablePoint;\n\texports.disablePoint = disablePoint;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar input = void 0;\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} The DOM event to be handled\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t\n\t if (input || !(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t input = document.createElement('input');\n\t input.setAttribute('id', 'pdf-annotate-point-input');\n\t input.setAttribute('placeholder', 'Saisir un commentaire');\n\t input.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t input.style.borderRadius = '3px';\n\t input.style.position = 'absolute';\n\t input.style.top = e.clientY + 'px';\n\t input.style.left = e.clientX + 'px';\n\t\n\t input.addEventListener('blur', handleInputBlur);\n\t input.addEventListener('keyup', handleInputKeyup);\n\t\n\t document.body.appendChild(input);\n\t input.focus();\n\t}\n\t\n\t/**\n\t * Handle input.blur event\n\t */\n\tfunction handleInputBlur() {\n\t savePoint();\n\t}\n\t\n\t/**\n\t * Handle input.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleInputKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closeInput();\n\t } else if (e.keyCode === 13) {\n\t savePoint();\n\t }\n\t}\n\t\n\t/**\n\t * Save a new point annotation from input\n\t */\n\tfunction savePoint() {\n\t if (input.value.trim().length > 0) {\n\t var clientX = parseInt(input.style.left, 10);\n\t var clientY = parseInt(input.style.top, 10);\n\t var content = input.value.trim();\n\t var svg = (0, _utils.findSVGAtPoint)(clientX, clientY);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t var annotation = Object.assign({\n\t type: 'point'\n\t }, (0, _utils.scaleDown)(svg, {\n\t x: clientX - rect.left,\n\t y: clientY - rect.top\n\t }));\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t _PDFJSAnnotate2.default.getStoreAdapter().addComment(documentId, annotation.uuid, content);\n\t\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t closeInput();\n\t}\n\t\n\t/**\n\t * Close the input element\n\t */\n\tfunction closeInput() {\n\t input.removeEventListener('blur', handleInputBlur);\n\t input.removeEventListener('keyup', handleInputKeyup);\n\t document.body.removeChild(input);\n\t input = null;\n\t}\n\t\n\t/**\n\t * Enable point annotation behavior\n\t */\n\tfunction enablePoint() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Disable point annotation behavior\n\t */\n\tfunction disablePoint() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.enableRect = enableRect;\n\texports.disableRect = disableRect;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tvar _enabled = false;\n\tvar _type = void 0;\n\tvar overlay = void 0;\n\tvar originY = void 0;\n\tvar originX = void 0;\n\t\n\t/**\n\t * Get the current window selection as rects\n\t *\n\t * @return {Array} An Array of rects\n\t */\n\tfunction getSelectionRects() {\n\t try {\n\t var selection = window.getSelection();\n\t var range = selection.getRangeAt(0);\n\t var rects = range.getClientRects();\n\t\n\t if (rects.length > 0 && rects[0].width > 0 && rects[0].height > 0) {\n\t return rects;\n\t }\n\t } catch (e) {}\n\t\n\t return null;\n\t}\n\t\n\t/**\n\t * Handle document.mousedown event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMousedown(e) {\n\t var svg = void 0;\n\t if (_type !== 'area' || !(svg = (0, _utils.findSVGAtPoint)(e.clientX, e.clientY))) {\n\t return;\n\t }\n\t\n\t var rect = svg.getBoundingClientRect();\n\t originY = e.clientY;\n\t originX = e.clientX;\n\t\n\t overlay = document.createElement('div');\n\t overlay.style.position = 'absolute';\n\t overlay.style.top = originY - rect.top + 'px';\n\t overlay.style.left = originX - rect.left + 'px';\n\t overlay.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t overlay.style.borderRadius = '3px';\n\t svg.parentNode.appendChild(overlay);\n\t\n\t document.addEventListener('mousemove', handleDocumentMousemove);\n\t (0, _utils.disableUserSelect)();\n\t}\n\t\n\t/**\n\t * Handle document.mousemove event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMousemove(e) {\n\t var svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t var rect = svg.getBoundingClientRect();\n\t\n\t if (originX + (e.clientX - originX) < rect.right) {\n\t overlay.style.width = e.clientX - originX + 'px';\n\t }\n\t\n\t if (originY + (e.clientY - originY) < rect.bottom) {\n\t overlay.style.height = e.clientY - originY + 'px';\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t var rects = void 0;\n\t if (_type !== 'area' && (rects = getSelectionRects())) {\n\t var svg = (0, _utils.findSVGAtPoint)(rects[0].left, rects[0].top);\n\t saveRect(_type, [].concat(_toConsumableArray(rects)).map(function (r) {\n\t return {\n\t top: r.top,\n\t left: r.left,\n\t width: r.width,\n\t height: r.height\n\t };\n\t }));\n\t } else if (_type === 'area' && overlay) {\n\t var _svg = overlay.parentNode.querySelector('svg.annotationLayer');\n\t var rect = _svg.getBoundingClientRect();\n\t saveRect(_type, [{\n\t top: parseInt(overlay.style.top, 10) + rect.top,\n\t left: parseInt(overlay.style.left, 10) + rect.left,\n\t width: parseInt(overlay.style.width, 10),\n\t height: parseInt(overlay.style.height, 10)\n\t }]);\n\t\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t (0, _utils.enableUserSelect)();\n\t }\n\t}\n\t\n\t/**\n\t * Handle document.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentKeyup(e) {\n\t // Cancel rect if Esc is pressed\n\t if (e.keyCode === 27) {\n\t var selection = window.getSelection();\n\t selection.removeAllRanges();\n\t if (overlay && overlay.parentNode) {\n\t overlay.parentNode.removeChild(overlay);\n\t overlay = null;\n\t document.removeEventListener('mousemove', handleDocumentMousemove);\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Save a rect annotation\n\t *\n\t * @param {String} type The type of rect (area, highlight, strikeout)\n\t * @param {Array} rects The rects to use for annotation\n\t * @param {String} color The color of the rects\n\t */\n\tfunction saveRect(type, rects, color) {\n\t var svg = (0, _utils.findSVGAtPoint)(rects[0].left, rects[0].top);\n\t var node = void 0;\n\t var annotation = void 0;\n\t\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var boundingRect = svg.getBoundingClientRect();\n\t\n\t if (!color) {\n\t if (type === 'highlight') {\n\t color = 'FFFF00';\n\t } else if (type === 'strikeout') {\n\t color = 'FF0000';\n\t }\n\t }\n\t\n\t // Initialize the annotation\n\t annotation = {\n\t type: type,\n\t color: color,\n\t rectangles: [].concat(_toConsumableArray(rects)).map(function (r) {\n\t var offset = 0;\n\t\n\t if (type === 'strikeout') {\n\t offset = r.height / 2;\n\t }\n\t\n\t return (0, _utils.scaleDown)(svg, {\n\t y: r.top + offset - boundingRect.top,\n\t x: r.left - boundingRect.left,\n\t width: r.width,\n\t height: r.height\n\t });\n\t }).filter(function (r) {\n\t return r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1;\n\t })\n\t };\n\t\n\t // Short circuit if no rectangles exist\n\t if (annotation.rectangles.length === 0) {\n\t return;\n\t }\n\t\n\t // Special treatment for area as it only supports a single rect\n\t if (type === 'area') {\n\t var rect = annotation.rectangles[0];\n\t delete annotation.rectangles;\n\t annotation.x = rect.x;\n\t annotation.y = rect.y;\n\t annotation.width = rect.width;\n\t annotation.height = rect.height;\n\t }\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t // Add the annotation\n\t\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t}\n\t\n\t/**\n\t * Enable rect behavior\n\t */\n\tfunction enableRect(type) {\n\t _type = type;\n\t\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t document.addEventListener('mousedown', handleDocumentMousedown);\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t}\n\t\n\t/**\n\t * Disable rect behavior\n\t */\n\tfunction disableRect() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t document.removeEventListener('mousedown', handleDocumentMousedown);\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t}\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.setText = setText;\n\texports.enableText = enableText;\n\texports.disableText = disableText;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _appendChild = __webpack_require__(41);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _utils = __webpack_require__(6);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _enabled = false;\n\tvar input = void 0;\n\tvar _textSize = void 0;\n\tvar _textColor = void 0;\n\t\n\t/**\n\t * Handle document.mouseup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleDocumentMouseup(e) {\n\t if (input || !(0, _utils.findSVGAtPoint)(e.clientX, e.clientY)) {\n\t return;\n\t }\n\t\n\t input = document.createElement('input');\n\t input.setAttribute('id', 'pdf-annotate-text-input');\n\t input.setAttribute('placeholder', 'Enter text');\n\t input.style.border = '3px solid ' + _utils.BORDER_COLOR;\n\t input.style.borderRadius = '3px';\n\t input.style.position = 'absolute';\n\t input.style.top = e.clientY + 'px';\n\t input.style.left = e.clientX + 'px';\n\t input.style.fontSize = _textSize + 'px';\n\t\n\t input.addEventListener('blur', handleInputBlur);\n\t input.addEventListener('keyup', handleInputKeyup);\n\t\n\t document.body.appendChild(input);\n\t input.focus();\n\t}\n\t\n\t/**\n\t * Handle input.blur event\n\t */\n\tfunction handleInputBlur() {\n\t saveText();\n\t}\n\t\n\t/**\n\t * Handle input.keyup event\n\t *\n\t * @param {Event} e The DOM event to handle\n\t */\n\tfunction handleInputKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closeInput();\n\t } else if (e.keyCode === 13) {\n\t saveText();\n\t }\n\t}\n\t\n\t/**\n\t * Save a text annotation from input\n\t */\n\tfunction saveText() {\n\t if (input.value.trim().length > 0) {\n\t var clientX = parseInt(input.style.left, 10);\n\t var clientY = parseInt(input.style.top, 10);\n\t var svg = (0, _utils.findSVGAtPoint)(clientX, clientY);\n\t if (!svg) {\n\t return;\n\t }\n\t\n\t var _getMetadata = (0, _utils.getMetadata)(svg),\n\t documentId = _getMetadata.documentId,\n\t pageNumber = _getMetadata.pageNumber;\n\t\n\t var rect = svg.getBoundingClientRect();\n\t var annotation = Object.assign({\n\t type: 'textbox',\n\t size: _textSize,\n\t color: _textColor,\n\t content: input.value.trim()\n\t }, (0, _utils.scaleDown)(svg, {\n\t x: clientX - rect.left,\n\t y: clientY - rect.top,\n\t width: input.offsetWidth,\n\t height: input.offsetHeight\n\t }));\n\t\n\t _PDFJSAnnotate2.default.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation).then(function (annotation) {\n\t (0, _appendChild2.default)(svg, annotation);\n\t });\n\t }\n\t\n\t closeInput();\n\t}\n\t\n\t/**\n\t * Close the input\n\t */\n\tfunction closeInput() {\n\t try {\n\t if (input) {\n\t input.removeEventListener('blur', handleInputBlur);\n\t input.removeEventListener('keyup', handleInputKeyup);\n\t document.body.removeChild(input);\n\t input = null;\n\t }\n\t } catch (e) {\n\t console.log('Try/catch is necessary because exist a error in Safari');\n\t }\n\t}\n\t\n\t/**\n\t * Set the text attributes\n\t *\n\t * @param {Number} textSize The size of the text\n\t * @param {String} textColor The color of the text\n\t */\n\tfunction setText() {\n\t var textSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 12;\n\t var textColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '000000';\n\t\n\t _textSize = parseInt(textSize, 10);\n\t _textColor = textColor;\n\t}\n\t\n\t/**\n\t * Enable text behavior\n\t */\n\tfunction enableText() {\n\t if (_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = true;\n\t document.addEventListener('mouseup', handleDocumentMouseup);\n\t}\n\t\n\t/**\n\t * Disable text behavior\n\t */\n\tfunction disableText() {\n\t if (!_enabled) {\n\t return;\n\t }\n\t\n\t _enabled = false;\n\t document.removeEventListener('mouseup', handleDocumentMouseup);\n\t}\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\texports.createPage = createPage;\n\texports.renderPage = renderPage;\n\t\n\tvar _PDFJSAnnotate = __webpack_require__(1);\n\t\n\tvar _PDFJSAnnotate2 = _interopRequireDefault(_PDFJSAnnotate);\n\t\n\tvar _renderScreenReaderHints = __webpack_require__(51);\n\t\n\tvar _renderScreenReaderHints2 = _interopRequireDefault(_renderScreenReaderHints);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Template for creating a new page\n\tvar PAGE_TEMPLATE = '\\n <div style=\"visibility: hidden;\" class=\"page\" data-loaded=\"false\">\\n <div class=\"canvasWrapper\">\\n <canvas></canvas>\\n </div>\\n <svg class=\"annotationLayer\"></svg>\\n <div class=\"textLayer\"></div>\\n </div>\\n';\n\t\n\t/**\n\t * Create a new page to be appended to the DOM.\n\t *\n\t * @param {Number} pageNumber The page number that is being created\n\t * @return {HTMLElement}\n\t */\n\tfunction createPage(pageNumber) {\n\t var temp = document.createElement('div');\n\t temp.innerHTML = PAGE_TEMPLATE;\n\t\n\t var page = temp.children[0];\n\t var canvas = page.querySelector('canvas');\n\t\n\t page.setAttribute('id', 'pageContainer' + pageNumber);\n\t page.setAttribute('data-page-number', pageNumber);\n\t\n\t canvas.mozOpaque = true;\n\t canvas.setAttribute('id', 'page' + pageNumber);\n\t\n\t // let svg = page.querySelector('.');\n\t // // let svg = document.body;\n\t // console.log(svg)\n\t // // let svg = document.getElementById();\n\t //\n\t // document.addEventListener('click', function handleDocumentClick(e) {\n\t // console.log(click)\n\t // if (!findSVGAtPoint(e.clientX, e.clientY)) {\n\t // return;\n\t // }\n\t //\n\t // let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\t //\n\t // // Emit annotation:blur if clickNode is no longer clicked\n\t // if (clickNode && clickNode !== target) {\n\t // emitter.emit('annotation:blur', clickNode);\n\t // }\n\t //\n\t // // Emit annotation:click if target was clicked\n\t // if (target) {\n\t // emitter.emit('annotation:click', target);\n\t // }\n\t //\n\t // clickNode = target;\n\t // });\n\t\n\t return page;\n\t}\n\t\n\t/**\n\t * Render a page that has already been created.\n\t *\n\t * @param {Number} pageNumber The page number to be rendered\n\t * @param {Object} renderOptions The options for rendering\n\t * @return {Promise} Settled once rendering has completed\n\t * A settled Promise will be either:\n\t * - fulfilled: [pdfPage, annotations]\n\t * - rejected: Error\n\t */\n\tfunction renderPage(pageNumber, annotations, renderOptions) {\n\t var documentId = renderOptions.documentId,\n\t pdfDocument = renderOptions.pdfDocument,\n\t scale = renderOptions.scale,\n\t rotate = renderOptions.rotate;\n\t\n\t // Load the page and annotations\n\t\n\t return Promise.all([pdfDocument.getPage(pageNumber)]).then(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 1),\n\t pdfPage = _ref2[0];\n\t\n\t var page = document.getElementById('pageContainer' + pageNumber);\n\t var svg = page.querySelector('.annotationLayer');\n\t var canvas = page.querySelector('.canvasWrapper canvas');\n\t var canvasContext = canvas.getContext('2d', { alpha: false });\n\t var viewport = pdfPage.getViewport(scale, rotate);\n\t var transform = scalePage(pageNumber, viewport, canvasContext);\n\t\n\t // Render the page\n\t return Promise.all([pdfPage.render({ canvasContext: canvasContext, viewport: viewport, transform: transform }), _PDFJSAnnotate2.default.render(svg, viewport, { pageNumber: pageNumber, documentId: documentId, annotations: annotations[pageNumber] })]).then(function () {\n\t // Text content is needed for a11y, but is also necessary for creating\n\t // highlight and strikeout annotations which require selecting text.\n\t return pdfPage.getTextContent({ normalizeWhitespace: true }).then(function (textContent) {\n\t return new Promise(function (resolve, reject) {\n\t // Render text layer for a11y of text content\n\t var textLayer = page.querySelector('.textLayer');\n\t var textLayerFactory = new pdfjsViewer.DefaultTextLayerFactory();\n\t var textLayerBuilder = textLayerFactory.createTextLayerBuilder(textLayer, pageNumber - 1, viewport);\n\t textLayerBuilder.setTextContent(textContent);\n\t textLayerBuilder.render();\n\t\n\t // Enable a11y for annotations\n\t // Timeout is needed to wait for `textLayerBuilder.render`\n\t setTimeout(function () {\n\t try {\n\t (0, _renderScreenReaderHints2.default)(annotations.annotations);\n\t resolve();\n\t } catch (e) {\n\t reject(e);\n\t }\n\t });\n\t });\n\t });\n\t }).then(function () {\n\t // Indicate that the page was loaded\n\t page.setAttribute('data-loaded', 'true');\n\t\n\t return [pdfPage, annotations];\n\t });\n\t });\n\t}\n\t\n\t/**\n\t * Scale the elements of a page.\n\t *\n\t * @param {Number} pageNumber The page number to be scaled\n\t * @param {Object} viewport The viewport of the PDF page (see pdfPage.getViewport(scale, rotate))\n\t * @param {Object} context The canvas context that the PDF page is rendered to\n\t * @return {Array} The transform data for rendering the PDF page\n\t */\n\tfunction scalePage(pageNumber, viewport, context) {\n\t var page = document.getElementById('pageContainer' + pageNumber);\n\t var canvas = page.querySelector('.canvasWrapper canvas');\n\t var svg = page.querySelector('.annotationLayer');\n\t var wrapper = page.querySelector('.canvasWrapper');\n\t var textLayer = page.querySelector('.textLayer');\n\t var outputScale = getOutputScale(context);\n\t var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n\t var sfx = approximateFraction(outputScale.sx);\n\t var sfy = approximateFraction(outputScale.sy);\n\t\n\t // Adjust width/height for scale\n\t page.style.visibility = '';\n\t canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n\t canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n\t canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px';\n\t canvas.style.height = roundToDivide(viewport.height, sfx[1]) + 'px';\n\t svg.setAttribute('width', viewport.width);\n\t svg.setAttribute('height', viewport.height);\n\t svg.style.width = viewport.width + 'px';\n\t svg.style.height = viewport.height + 'px';\n\t page.style.width = viewport.width + 'px';\n\t page.style.height = viewport.height + 'px';\n\t wrapper.style.width = viewport.width + 'px';\n\t wrapper.style.height = viewport.height + 'px';\n\t textLayer.style.width = viewport.width + 'px';\n\t textLayer.style.height = viewport.height + 'px';\n\t\n\t return transform;\n\t}\n\t\n\t/**\n\t * The following methods are taken from mozilla/pdf.js and as such fall under\n\t * the Apache License (http://www.apache.org/licenses/).\n\t *\n\t * Original source can be found at mozilla/pdf.js:\n\t * https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js\n\t */\n\t\n\t/**\n\t * Approximates a float number as a fraction using Farey sequence (max order\n\t * of 8).\n\t *\n\t * @param {Number} x Positive float number\n\t * @return {Array} Estimated fraction: the first array item is a numerator,\n\t * the second one is a denominator.\n\t */\n\tfunction approximateFraction(x) {\n\t // Fast path for int numbers or their inversions.\n\t if (Math.floor(x) === x) {\n\t return [x, 1];\n\t }\n\t\n\t var xinv = 1 / x;\n\t var limit = 8;\n\t if (xinv > limit) {\n\t return [1, limit];\n\t } else if (Math.floor(xinv) === xinv) {\n\t return [1, xinv];\n\t }\n\t\n\t var x_ = x > 1 ? xinv : x;\n\t\n\t // a/b and c/d are neighbours in Farey sequence.\n\t var a = 0,\n\t b = 1,\n\t c = 1,\n\t d = 1;\n\t\n\t // Limit search to order 8.\n\t while (true) {\n\t // Generating next term in sequence (order of q).\n\t var p = a + c,\n\t q = b + d;\n\t if (q > limit) {\n\t break;\n\t }\n\t if (x_ <= p / q) {\n\t c = p;d = q;\n\t } else {\n\t a = p;b = q;\n\t }\n\t }\n\t\n\t // Select closest of neighbours to x.\n\t if (x_ - a / b < c / d - x_) {\n\t return x_ === x ? [a, b] : [b, a];\n\t } else {\n\t return x_ === x ? [c, d] : [d, c];\n\t }\n\t}\n\t\n\tfunction getOutputScale(ctx) {\n\t var devicePixelRatio = window.devicePixelRatio || 1;\n\t var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n\t var pixelRatio = devicePixelRatio / backingStoreRatio;\n\t return {\n\t sx: pixelRatio,\n\t sy: pixelRatio,\n\t scaled: pixelRatio !== 1\n\t };\n\t}\n\t\n\tfunction roundToDivide(x, div) {\n\t var r = x % div;\n\t return r === 0 ? x : Math.round(x - r + div);\n\t}\n\n/***/ },\n/* 65 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = initColorPicker;\n\t// Color picker component\n\tvar COLORS = [{ hex: '#000000', name: 'Black' }, { hex: '#EF4437', name: 'Red' }, { hex: '#E71F63', name: 'Pink' }, { hex: '#8F3E97', name: 'Purple' }, { hex: '#65499D', name: 'Deep Purple' }, { hex: '#4554A4', name: 'Indigo' }, { hex: '#2083C5', name: 'Blue' }, { hex: '#35A4DC', name: 'Light Blue' }, { hex: '#09BCD3', name: 'Cyan' }, { hex: '#009688', name: 'Teal' }, { hex: '#43A047', name: 'Green' }, { hex: '#8BC34A', name: 'Light Green' }, { hex: '#FDC010', name: 'Yellow' }, { hex: '#F8971C', name: 'Orange' }, { hex: '#F0592B', name: 'Deep Orange' }, { hex: '#F06291', name: 'Light Pink' }];\n\t\n\tfunction initColorPicker(el, value, onChange) {\n\t function setColor(value) {\n\t var fireOnChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t\n\t currentValue = value;\n\t a.setAttribute('data-color', value);\n\t a.style.background = value;\n\t if (fireOnChange && typeof onChange === 'function') {\n\t onChange(value);\n\t }\n\t closePicker();\n\t }\n\t\n\t function togglePicker() {\n\t if (isPickerOpen) {\n\t closePicker();\n\t } else {\n\t openPicker();\n\t }\n\t }\n\t\n\t function closePicker() {\n\t document.removeEventListener('keyup', handleDocumentKeyup);\n\t if (picker && picker.parentNode) {\n\t picker.parentNode.removeChild(picker);\n\t }\n\t isPickerOpen = false;\n\t a.focus();\n\t }\n\t\n\t function openPicker() {\n\t if (!picker) {\n\t picker = document.createElement('div');\n\t picker.style.background = '#fff';\n\t picker.style.border = '1px solid #ccc';\n\t picker.style.padding = '2px';\n\t picker.style.position = 'absolute';\n\t picker.style.width = '122px';\n\t el.style.position = 'relative';\n\t\n\t COLORS.map(createColorOption).forEach(function (c) {\n\t c.style.margin = '2px';\n\t c.onclick = function () {\n\t setColor(c.getAttribute('data-color'));\n\t };\n\t picker.appendChild(c);\n\t });\n\t }\n\t\n\t document.addEventListener('keyup', handleDocumentKeyup);\n\t el.appendChild(picker);\n\t isPickerOpen = true;\n\t }\n\t\n\t function createColorOption(color) {\n\t var e = document.createElement('a');\n\t e.className = 'color';\n\t e.setAttribute('href', 'javascript://');\n\t\n\t if (color.name) e.setAttribute('title', color.name);else e.setAttribute('title', 'Choisir une couleur');\n\t\n\t e.setAttribute('data-color', color.hex);\n\t e.style.background = color.hex;\n\t return e;\n\t }\n\t\n\t function handleDocumentKeyup(e) {\n\t if (e.keyCode === 27) {\n\t closePicker();\n\t }\n\t }\n\t\n\t var picker = void 0;\n\t var isPickerOpen = false;\n\t var currentValue = void 0;\n\t var a = createColorOption({ hex: value });\n\t a.onclick = togglePicker;\n\t el.appendChild(a);\n\t setColor(value, false);\n\t}\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** static/pdfannotator/pdf-annotate.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 4a61aad53751cfea7978\n **/","import PDFJSAnnotate from './PDFJSAnnotate';\nimport {documentId, documentUrl, readonly} from './initFile';\n\nimport twitter from 'twitter-text';\nimport initColorPicker from './initColorPicker';\n\nconst { UI } = PDFJSAnnotate;\nimport {renderComments} from \"./UI/comments\";\n\nlet PAGE_HEIGHT;\nlet RENDER_OPTIONS = {\n documentId:documentUrl,\n pdfDocument: null,\n enhanceTextSelection:true,\n scale: parseFloat(localStorage.getItem(`${documentId}/scale`), 10) || 1.33,\n rotate: parseInt(localStorage.getItem(`${documentId}/rotate`), 10) || 0\n};\n\nPDFJSAnnotate.setStoreAdapter(new PDFJSAnnotate.CRFPAStoreAdapter());\n// pdfjsLib.workerSrc = '/static/pdfannotator/pdf.worker.js';\n\n// Render stuff\n\n// let renderedPages = {};\n// document.getElementById('content-wrapper').addEventListener('scroll', function (e) {\n// let visiblePageNum = Math.round(e.target.scrollTop / PAGE_HEIGHT) + 1;\n// let visiblePage = document.querySelector(`.page[data-page-number=\"${visiblePageNum}\"][data-loaded=\"false\"]`);\n// if (visiblePage) {\n// // Prevent invoking UI.renderPage on the same page more than once.\n// \tif ( !renderedPages[visiblePageNum] ) {\n// \t renderedPages[visiblePageNum] = true;\n// \t setTimeout(function () {\n// \t\tUI.renderPage(visiblePageNum, RENDER_OPTIONS);\n// \t });\n// \t}\n// }\n// });\n\nlet NUM_PAGES = 0;\nfunction render() {\n\n pdfjsLib.getDocument(RENDER_OPTIONS.documentId).then((pdf) => {\n RENDER_OPTIONS.pdfDocument = pdf;\n\n let viewer = document.getElementById('viewer');\n viewer.innerHTML = '';\n NUM_PAGES = pdf._pdfInfo.numPages;\n for (let i=0; i<NUM_PAGES; i++) {\n let page = UI.createPage(i+1);\n viewer.appendChild(page);\n }\n\n PDFJSAnnotate.getAnnotations(documentId).then((annotations)=>{\n for(let num = 1; num <= NUM_PAGES; num++) {\n pdf.getPage(num).then(function () {\n UI.renderPage(num, annotations, RENDER_OPTIONS).then(([pdfPage, annotations]) => {\n let viewport = pdfPage.getViewport(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate);\n PAGE_HEIGHT = viewport.height;\n if($.browser.mozilla)\n $('.textLayer>.endOfContent').remove();\n });\n\n });\n }\n });\n });\n}\nrender();\n\n\nvar setActiveToolbarItem = function setActiveToolbarItem(type, button) {\n let tooltype = localStorage.getItem(`${RENDER_OPTIONS.documentId}/tooltype`) || 'cursor';\n let active = document.querySelector('.toolbar button.active');\n if (active) {\n active.classList.remove('active');\n\n switch (tooltype) {\n case 'cursor':\n UI.disableEdit();\n break;\n case 'draw':\n UI.disablePen();\n break;\n case 'text':\n UI.disableText();\n break;\n case 'point':\n UI.disablePoint();\n break;\n case 'area':\n case 'highlight':\n case 'strikeout':\n UI.disableRect();\n break;\n }\n }\n\n if (button) {\n button.classList.add('active');\n }\n if (tooltype !== type) {\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/tooltype`, type);\n }\n tooltype = type;\n\n switch (type) {\n case 'cursor':\n UI.enableEdit();\n break;\n case 'draw':\n UI.enablePen();\n break;\n case 'text':\n UI.enableText();\n break;\n case 'point':\n UI.enablePoint();\n break;\n case 'area':\n case 'highlight':\n case 'strikeout':\n UI.enableRect(type);\n break;\n }\n}\nPDFJSAnnotate.setActiveToolbarItem = setActiveToolbarItem;\n\n\n\nif(!readonly) {\n// Text stuff\n (function () {\n let textSize;\n let textColor;\n\n function initText() {\n // let size = document.querySelector('.toolbar .text-size');\n // [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96].forEach((s) => {\n // size.appendChild(new Option(s, s));\n // });\n //\n // setText(\n // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/size`) || 12,\n // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/color`) || '#EF4437'\n // );\n setText(\n 12, '#EF4437'\n );\n\n // initColorPicker(document.querySelector('.text-color'), textColor, function (value) {\n // setText(textSize, value);\n // });\n }\n\n function setText(size, color) {\n // let modified = false;\n //\n // if (textSize !== size) {\n // modified = true;\n // textSize = size;\n // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/size`, textSize);\n // // document.querySelector('.toolbar .text-size').value = textSize;\n // }\n //\n // if (textColor !== color) {\n // modified = true;\n // textColor = color;\n // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/color`, textColor);\n //\n // let selected = document.querySelector('.toolbar .text-color.color-selected');\n // if (selected) {\n // selected.classList.remove('color-selected');\n // selected.removeAttribute('aria-selected');\n // }\n //\n // selected = document.querySelector(`.toolbar .text-color[data-color=\"${color}\"]`);\n // if (selected) {\n // selected.classList.add('color-selected');\n // selected.setAttribute('aria-selected', true);\n // }\n //\n // }\n\n // if (modified) {\n UI.setText(size, color);\n // }\n }\n\n // function handleTextSizeChange(e) {\n // setText(e.target.value, textColor);\n // }\n\n // document.querySelector('.toolbar .text-size').addEventListener('change', handleTextSizeChange);\n\n initText();\n })();\n\n// Pen stuff\n (function () {\n let penSize;\n let penColor;\n\n function initPen() {\n let size = document.querySelector('.toolbar .pen-size');\n for (let i = 0; i < 20; i++) {\n size.appendChild(new Option(i + 1, i + 1));\n }\n\n setPen(\n localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/size`) || 1,\n localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/color`) || '#000000'\n );\n\n initColorPicker(document.querySelector('.pen-color'), penColor, function (value) {\n setPen(penSize, value);\n });\n }\n\n function setPen(size, color) {\n let modified = false;\n\n if (penSize !== size) {\n modified = true;\n penSize = size;\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/size`, penSize);\n document.querySelector('.toolbar .pen-size').value = penSize;\n }\n\n if (penColor !== color) {\n modified = true;\n penColor = color;\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/color`, penColor);\n\n let selected = document.querySelector('.toolbar .pen-color.color-selected');\n if (selected) {\n selected.classList.remove('color-selected');\n selected.removeAttribute('aria-selected');\n }\n\n selected = document.querySelector(`.toolbar .pen-color[data-color=\"${color}\"]`);\n if (selected) {\n selected.classList.add('color-selected');\n selected.setAttribute('aria-selected', true);\n }\n }\n\n if (modified) {\n UI.setPen(penSize, penColor);\n }\n }\n\n function handlePenSizeChange(e) {\n setPen(e.target.value, penColor);\n }\n\n document.querySelector('.toolbar .pen-size').addEventListener('change', handlePenSizeChange);\n\n initPen();\n })();\n\n// Toolbar buttons\n (function () {\n let tooltype = localStorage.getItem(`${RENDER_OPTIONS.documentId}/tooltype`) || 'cursor';\n if (tooltype) {\n setActiveToolbarItem(tooltype, document.querySelector(`.toolbar button[data-tooltype=${tooltype}]`));\n }\n\n\n\n function handleToolbarClick(e) {\n if (e.target.nodeName === 'BUTTON') {\n setActiveToolbarItem(e.target.getAttribute('data-tooltype'), e.target);\n }\n }\n\n document.querySelector('.toolbar').addEventListener('click', handleToolbarClick);\n })();\n}\n\nif(readonly)\n UI.enableEdit();\n\n// Scale/rotate\n(function () {\n function setScaleRotate(scale, rotate) {\n scale = parseFloat(scale, 10);\n rotate = parseInt(rotate, 10);\n\n if (RENDER_OPTIONS.scale !== scale || RENDER_OPTIONS.rotate !== rotate) {\n RENDER_OPTIONS.scale = scale;\n RENDER_OPTIONS.rotate = rotate;\n\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/scale`, RENDER_OPTIONS.scale);\n localStorage.setItem(`${RENDER_OPTIONS.documentId}/rotate`, RENDER_OPTIONS.rotate % 360);\n\n render();\n }\n }\n\n function handleScaleChange(e) {\n setScaleRotate(e.target.value, RENDER_OPTIONS.rotate);\n }\n\n function handleRotateCWClick() {\n setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate + 90);\n }\n\n function handleRotateCCWClick() {\n setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate - 90);\n }\n\n document.querySelector('.toolbar select.scale').value = RENDER_OPTIONS.scale;\n document.querySelector('.toolbar select.scale').addEventListener('change', handleScaleChange);\n document.querySelector('.toolbar .rotate-ccw').addEventListener('click', handleRotateCCWClick);\n document.querySelector('.toolbar .rotate-cw').addEventListener('click', handleRotateCWClick);\n})();\n\n\nrenderComments(documentId);\n\n\nexport default PDFJSAnnotate;\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","import StoreAdapter from './adapter/StoreAdapter';\nimport CRFPAStoreAdapter from './adapter/CRFPAStoreAdapter';\nimport render from './render';\nimport UI from './UI';\n\nexport default {\n /**\n * Abstract class that needs to be defined so PDFJSAnnotate\n * knows how to communicate with your server.\n */\n StoreAdapter,\n\n /**\n * Implementation of StoreAdapter that stores annotation data to localStorage.\n */\n CRFPAStoreAdapter,\n\n /**\n * Abstract instance of StoreAdapter\n */\n __storeAdapter: new StoreAdapter(),\n\n /**\n * Getter for the underlying StoreAdapter property\n *\n * @return {StoreAdapter}\n */\n getStoreAdapter() {\n return this.__storeAdapter;\n },\n\n /**\n * Setter for the underlying StoreAdapter property\n *\n * @param {StoreAdapter} adapter The StoreAdapter implementation to be used.\n */\n setStoreAdapter(adapter) {\n // TODO this throws an error when bundled\n // if (!(adapter instanceof StoreAdapter)) {\n // throw new Error('adapter must be an instance of StoreAdapter');\n // }\n\n this.__storeAdapter = adapter;\n },\n\n /**\n * UI is a helper for instrumenting UI interactions for creating,\n * editing, and deleting annotations in the browser.\n */\n UI,\n\n /**\n * Render the annotations for a page in the PDF Document\n *\n * @param {SVGElement} svg The SVG element that annotations should be rendered to\n * @param {PageViewport} viewport The PDFPage.getViewport data\n * @param {Object} data The StoreAdapter.getAnnotations data\n * @return {Promise}\n */\n render,\n\n /**\n * Convenience method for getting annotation data\n *\n * @alias StoreAdapter.getAnnotations\n * @param {String} documentId The ID of the document\n * @return {Promise}\n */\n getAnnotations(documentId) {\n return this.getStoreAdapter().getAnnotations(...arguments);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/PDFJSAnnotate.js\n **/","import abstractFunction from '../utils/abstractFunction';\nimport { fireEvent } from '../UI/event';\n\n// Adapter should never be invoked publicly\nexport default class StoreAdapter {\n /**\n * Create a new StoreAdapter instance\n *\n * @param {Object} [definition] The definition to use for overriding abstract methods\n */\n constructor(definition = {}) {\n // Copy each function from definition if it is a function we know about\n Object.keys(definition).forEach((key) => {\n if (typeof definition[key] === 'function' &&\n typeof this[key] === 'function') {\n this[key] = definition[key];\n }\n });\n }\n\n /**\n * Get all the annotations for a given document and page number.\n *\n * @param {String} documentId The ID for the document the annotations belong to\n * @param {Number} pageNumber The number of the page the annotations belong to\n * @return {Promise}\n */\n __getAnnotations(documentId) { abstractFunction('getAnnotations'); }\n get getAnnotations() { return this.__getAnnotations; }\n set getAnnotations(fn) {\n this.__getAnnotations = function getAnnotations(documentId) {\n return fn(...arguments).then((annotations) => {\n // TODO may be best to have this happen on the server\n // if (annotations) {\n // annotations.forEach((a) => {\n // a.documentId = documentId;\n // });\n // }\n return annotations;\n });\n };\n }\n\n /**\n * Get the definition for a specific annotation.\n *\n * @param {String} documentId The ID for the document the annotation belongs to\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n getAnnotation(documentId, annotationId) { abstractFunction('getAnnotation'); }\n\n /**\n * Add an annotation\n *\n * @param {String} documentId The ID for the document to add the annotation to\n * @param {String} pageNumber The page number to add the annotation to\n * @param {Object} annotation The definition for the new annotation\n * @return {Promise}\n */\n __addAnnotation(documentId, pageNumber, annotation) { abstractFunction('addAnnotation'); }\n get addAnnotation() { return this.__addAnnotation; }\n set addAnnotation(fn) {\n this.__addAnnotation = function addAnnotation(documentId, pageNumber, annotation) {\n return fn(...arguments).then((annotation) => {\n fireEvent('annotation:add', documentId, pageNumber, annotation);\n return annotation;\n });\n };\n }\n\n /**\n * Edit an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} pageNumber the page number of the annotation\n * @param {Object} annotation The definition of the modified annotation\n * @return {Promise}\n */\n __editAnnotation(documentId, pageNumber, annotation) { abstractFunction('editAnnotation'); }\n get editAnnotation() { return this.__editAnnotation; }\n set editAnnotation(fn) {\n this.__editAnnotation = function editAnnotation(documentId, annotationId, annotation) {\n return fn(...arguments).then((annotation) => {\n fireEvent('annotation:edit', documentId, annotationId, annotation);\n return annotation;\n });\n };\n }\n\n /**\n * Delete an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n __deleteAnnotation(documentId, annotationId) { abstractFunction('deleteAnnotation'); }\n get deleteAnnotation() { return this.__deleteAnnotation; }\n set deleteAnnotation(fn) {\n this.__deleteAnnotation = function deleteAnnotation(documentId, annotationId) {\n return fn(...arguments).then((success) => {\n if (success) {\n fireEvent('annotation:delete', documentId, annotationId);\n }\n return success;\n });\n };\n }\n\n /**\n * Get all the comments for an annotation\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @return {Promise}\n */\n getComments(documentId, annotationId) { abstractFunction('getComments'); }\n\n /**\n * Add a new comment\n *\n * @param {String} documentId The ID for the document\n * @param {String} annotationId The ID for the annotation\n * @param {Object} content The definition of the comment\n * @return {Promise}\n */\n __addComment(documentId, annotationId, content) { abstractFunction('addComment'); }\n get addComment() { return this.__addComment; }\n set addComment(fn) {\n this.__addComment = function addComment(documentId, annotationId, content) {\n return fn(...arguments).then((comment) => {\n fireEvent('comment:add', documentId, annotationId, comment);\n return comment;\n });\n };\n }\n\n /**\n * Delete a comment\n *\n * @param {String} documentId The ID for the document\n * @param {String} commentId The ID for the comment\n * @return {Promise}\n */\n __deleteComment(documentId, commentId) { abstractFunction('deleteComment'); }\n get deleteComment() { return this.__deleteComment; }\n set deleteComment(fn) {\n this.__deleteComment = function deleteComment(documentId, commentId) {\n return fn(...arguments).then((success) => {\n if (success) {\n fireEvent('comment:delete', documentId, commentId);\n }\n return success;\n });\n };\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/adapter/StoreAdapter.js\n **/","/**\n * Throw an Error for an abstract function that hasn't been implemented.\n *\n * @param {String} name The name of the abstract function\n */\nexport default function abstractFunction(name) {\n throw new Error(name + ' is not implemented');\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/abstractFunction.js\n **/","import EventEmitter from 'events';\nimport {\n findAnnotationAtPoint,\n findSVGAtPoint\n} from './utils';\n\nconst emitter = new EventEmitter;\n\nlet clickNode;\n\n/**\n * Handle document.click event\n *\n * @param {Event} e The DOM event to be handled\n */\n// document.addEventListener('mousedown', function handleDocumentClick(e) {\n\ndocument.addEventListener('click', function handleDocumentClick(e) {\n if (!findSVGAtPoint(e.clientX, e.clientY)) { return; }\n\n let target = findAnnotationAtPoint(e.clientX, e.clientY);\n\n // Emit annotation:blur if clickNode is no longer clicked\n if (clickNode && clickNode !== target) {\n emitter.emit('annotation:blur', clickNode);\n }\n\n // Emit annotation:click if target was clicked\n if (target) {\n emitter.emit('annotation:click', target);\n }\n\n clickNode = target;\n});\n\n// let mouseOverNode;\n// document.addEventListener('mousemove', function handleDocumentMousemove(e) {\n// let target = findAnnotationAtPoint(e.clientX, e.clientY);\n//\n// // Emit annotation:mouseout if target was mouseout'd\n// if (mouseOverNode && !target) {\n// emitter.emit('annotation:mouseout', mouseOverNode);\n// }\n//\n// // Emit annotation:mouseover if target was mouseover'd\n// if (target && mouseOverNode !== target) {\n// emitter.emit('annotation:mouseover', target);\n// }\n//\n// mouseOverNode = target;\n// });\n\nexport function fireEvent() { emitter.emit(...arguments); };\nexport function addEventListener() { emitter.on(...arguments); };\nexport function removeEventListener() { emitter.removeListener(...arguments); };\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/event.js\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/events/events.js\n ** module id = 5\n ** module chunks = 0\n **/","import createStyleSheet from 'create-stylesheet';\n\nexport const BORDER_COLOR = '#00BFFF';\n\nconst userSelectStyleSheet = createStyleSheet({\n body: {\n '-webkit-user-select': 'none',\n '-moz-user-select': 'none',\n '-ms-user-select': 'none',\n 'user-select': 'none'\n }\n});\nuserSelectStyleSheet.setAttribute('data-pdf-annotate-user-select', 'true');\n\n/**\n * Find the SVGElement that contains all the annotations for a page\n *\n * @param {Element} node An annotation within that container\n * @return {SVGElement} The container SVG or null if it can't be found\n */\nexport function findSVGContainer(node) {\n let parentNode = node;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n if (parentNode.nodeName.toUpperCase() === 'SVG' &&\n parentNode.getAttribute('data-pdf-annotate-container') === 'true') {\n return parentNode;\n }\n }\n\n return null;\n}\n\n\n/**\n * Find an SVGElement container at a given point\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @return {SVGElement} The container SVG or null if one can't be found\n */\nexport function findSVGAtPoint(x, y) {\n let elements = document.querySelectorAll('svg[data-pdf-annotate-container=\"true\"]');\n for (let i=0, l=elements.length; i<l; i++) {\n let el = elements[i];\n let rect = el.getBoundingClientRect();\n\n if (pointIntersectsRect(x, y, rect)) {\n return el;\n }\n }\n\n return null;\n}\n\n/**\n * Find an Element that represents an annotation at a given point\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @return {Element} The annotation element or null if one can't be found\n */\nexport function findAnnotationAtPoint(x, y) {\n let svg = findSVGAtPoint(x, y);\n if (!svg) { return; }\n let elements = svg.querySelectorAll('[data-pdf-annotate-type]');\n\n // Find a target element within SVG\n for (let i=0, l=elements.length; i<l; i++) {\n let el = elements[i];\n if (pointIntersectsRect(x, y, getOffsetAnnotationRect(el))) {\n return el;\n }\n }\n\n return null;\n}\n\n/**\n * Determine if a point intersects a rect\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Object} rect The points of a rect (likely from getBoundingClientRect)\n * @return {Boolean} True if a collision occurs, otherwise false\n */\nexport function pointIntersectsRect(x, y, rect) {\n return y >= rect.top && y <= rect.bottom && x >= rect.left && x <= rect.right;\n}\n\n/**\n * Get the rect of an annotation element accounting for offset.\n *\n * @param {Element} el The element to get the rect of\n * @return {Object} The dimensions of the element\n */\nexport function getOffsetAnnotationRect(el) {\n let rect = getAnnotationRect(el);\n let { offsetLeft, offsetTop } = getOffset(el);\n\n return {\n top: rect.top + offsetTop,\n left: rect.left + offsetLeft,\n right: rect.right + offsetLeft,\n bottom: rect.bottom + offsetTop\n };\n}\n\n/**\n * Get the rect of an annotation element.\n *\n * @param {Element} el The element to get the rect of\n * @return {Object} The dimensions of the element\n */\nexport function getAnnotationRect(el) {\n let h = 0, w = 0, x = 0, y = 0;\n let rect = el.getBoundingClientRect();\n // TODO this should be calculated somehow\n const LINE_OFFSET = 16;\n // debugger;\n switch (el.nodeName.toLowerCase()) {\n case 'path':\n let minX, maxX, minY, maxY;\n\n el.getAttribute('d').replace(/Z/, '').split('M').splice(1).forEach((p) => {\n var s = p.split(' ').map(i => parseInt(i, 10));\n\n if (typeof minX === 'undefined' || s[0] < minX) { minX = s[0]; }\n if (typeof maxX === 'undefined' || s[2] > maxX) { maxX = s[2]; }\n if (typeof minY === 'undefined' || s[1] < minY) { minY = s[1]; }\n if (typeof maxY === 'undefined' || s[3] > maxY) { maxY = s[3]; }\n });\n\n h = maxY - minY;\n w = maxX - minX;\n x = minX;\n y = minY;\n break;\n\n case 'line':\n h = parseInt(el.getAttribute('y2'), 10) - parseInt(el.getAttribute('y1'), 10);\n w = parseInt(el.getAttribute('x2'), 10) - parseInt(el.getAttribute('x1'), 10);\n x = parseInt(el.getAttribute('x1'), 10);\n y = parseInt(el.getAttribute('y1'), 10);\n\n if (h === 0) {\n h += LINE_OFFSET;\n y -= (LINE_OFFSET / 2);\n }\n break;\n\n case 'text':\n h = rect.height;\n w = rect.width;\n x = parseInt(el.getAttribute('x'), 10);\n y = parseInt(el.getAttribute('y'), 10) - h;\n break;\n\n case 'g':\n let { offsetLeft, offsetTop } = getOffset(el);\n h = rect.height;\n w = rect.width;\n x = rect.left - offsetLeft;\n y = rect.top - offsetTop;\n\n if (el.getAttribute('data-pdf-annotate-type') === 'strikeout') {\n h += LINE_OFFSET;\n y -= (LINE_OFFSET / 2);\n }\n break;\n\n case 'rect':\n case 'svg':\n h = parseInt(el.getAttribute('height'), 10);\n w = parseInt(el.getAttribute('width'), 10);\n x = parseInt(el.getAttribute('x'), 10);\n y = parseInt(el.getAttribute('y'), 10);\n break;\n }\n\n // Result provides same properties as getBoundingClientRect\n let result = {\n top: y,\n left: x,\n width: w,\n height: h,\n right: x + w,\n bottom: y + h\n };\n\n // For the case of nested SVG (point annotations) and grouped\n // lines or rects no adjustment needs to be made for scale.\n // I assume that the scale is already being handled\n // natively by virtue of the `transform` attribute.\n if (!['svg', 'g'].includes(el.nodeName.toLowerCase())) {\n result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n }\n\n // // comment point need to be scaled on FF\n if(el.nodeName.toLowerCase() == 'svg' && $.browser.mozilla){\n result = scaleUp(findSVGAtPoint(rect.left, rect.top), result);\n }\n\n return result;\n}\n\n/**\n * Adjust scale from normalized scale (100%) to rendered scale.\n *\n * @param {SVGElement} svg The SVG to gather metadata from\n * @param {Object} rect A map of numeric values to scale\n * @return {Object} A copy of `rect` with values scaled up\n */\nexport function scaleUp(svg, rect) {\n let result = {};\n let { viewport } = getMetadata(svg);\n\n Object.keys(rect).forEach((key) => {\n result[key] = rect[key] * viewport.scale;\n });\n\n return result;\n}\n\n/**\n * Adjust scale from rendered scale to a normalized scale (100%).\n *\n * @param {SVGElement} svg The SVG to gather metadata from\n * @param {Object} rect A map of numeric values to scale\n * @return {Object} A copy of `rect` with values scaled down\n */\nexport function scaleDown(svg, rect) {\n let result = {};\n let { viewport } = getMetadata(svg);\n\n Object.keys(rect).forEach((key) => {\n result[key] = rect[key] / viewport.scale;\n });\n\n return result;\n}\n\n/**\n * Get the scroll position of an element, accounting for parent elements\n *\n * @param {Element} el The element to get the scroll position for\n * @return {Object} The scrollTop and scrollLeft position\n */\nexport function getScroll(el) {\n let scrollTop = 0;\n let scrollLeft = 0;\n let parentNode = el;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n scrollTop += parentNode.scrollTop;\n scrollLeft += parentNode.scrollLeft;\n }\n\n return { scrollTop, scrollLeft };\n}\n\n/**\n * Get the offset position of an element, accounting for parent elements\n *\n * @param {Element} el The element to get the offset position for\n * @return {Object} The offsetTop and offsetLeft position\n */\nexport function getOffset(el) {\n let parentNode = el;\n\n while ((parentNode = parentNode.parentNode) &&\n parentNode !== document) {\n if (parentNode.nodeName.toUpperCase() === 'SVG') {\n break;\n }\n }\n\n let rect = parentNode.getBoundingClientRect();\n\n return { offsetLeft: rect.left, offsetTop: rect.top };\n}\n\n/**\n * Disable user ability to select text on page\n */\nexport function disableUserSelect() {\n if (!userSelectStyleSheet.parentNode) {\n document.head.appendChild(userSelectStyleSheet);\n }\n}\n\n\n/**\n * Enable user ability to select text on page\n */\nexport function enableUserSelect() {\n if (userSelectStyleSheet.parentNode) {\n userSelectStyleSheet.parentNode.removeChild(userSelectStyleSheet);\n }\n}\n\n/**\n * Get the metadata for a SVG container\n *\n * @param {SVGElement} svg The SVG container to get metadata for\n */\nexport function getMetadata(svg) {\n return {\n documentId: svg.getAttribute('data-pdf-annotate-document'),\n pageNumber: parseInt(svg.getAttribute('data-pdf-annotate-page'), 10),\n viewport: JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'))\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/utils.js\n **/","module.exports = function createStyleSheet(blocks) {\n var style = document.createElement('style');\n var text = Object.keys(blocks).map(function (selector) {\n return processRuleSet(selector, blocks[selector]);\n }).join('\\n');\n \n style.setAttribute('type', 'text/css');\n style.appendChild(document.createTextNode(text));\n\n return style;\n}\n\nfunction processRuleSet(selector, block) {\n return selector + ' {\\n' + processDeclarationBlock(block) + '\\n}';\n}\n\nfunction processDeclarationBlock(block) {\n return Object.keys(block).map(function (prop) {\n return processDeclaration(prop, block[prop]);\n }).join('\\n');\n}\n\nfunction processDeclaration(prop, value) {\n if (!isNaN(value) && value != 0) {\n value = value + 'px';\n }\n\n return hyphenate(prop) + ': ' + value + ';';\n}\n\nfunction hyphenate(prop) {\n return prop.replace(/[A-Z]/g, function (match) {\n return '-' + match.toLowerCase();\n });\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/create-stylesheet/index.js\n ** module id = 7\n ** module chunks = 0\n **/","import axios from 'axios';\nimport uuid from '../utils/uuid';\nimport StoreAdapter from './StoreAdapter';\nimport {documentId as fileUuid} from '../initFile';\nimport {renderComments} from \"../UI/comments\";\n\naxios.defaults.xsrfCookieName = 'csrftoken';\naxios.defaults.xsrfHeaderName = 'X-CSRFToken';\n\nexport default class CRFPAStoreAdapter extends StoreAdapter {\n constructor() {\n\n const API = axios.create({\n baseURL: '/pdfannotator',\n timeout: 10000,\n withCredentials: true,\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n\n\n super({\n getAnnotations(documentId) {\n\n return API.get('/get-annotations/', {\n params: {\n fileUuid,\n }\n }).then(function (response) {\n return response.data;\n });\n\n // return new Promise((resolve, reject) => {\n // let annotations = getAnnotations(documentId).filter((i) => {\n // return i.page === pageNumber && i.class === 'Annotation';\n // });\n //\n // resolve({\n // documentId,\n // pageNumber,\n // annotations\n // });\n // });\n },\n\n getAnnotation(documentId, annotationId) {\n return API.get('/get-annotation/', {\n params: {\n fileUuid,\n annotationId\n }\n }).then(function (response) {\n return response.data;\n });\n },\n\n addAnnotation(documentId, pageNumber, annotation) {\n\n annotation.class = 'Annotation';\n annotation.page = pageNumber;\n annotation.uuid = uuid();\n\n return API.post('/add-annotation/', {\n fileUuid,\n page: pageNumber,\n annotation\n }).then(function (response) {\n return annotation;\n });\n\n // return new Promise((resolve, reject) => {\n\n // annotation.class = 'Annotation';\n // annotation.uuid = uuid();\n // annotation.page = pageNumber;\n\n // let annotations = getAnnotations(documentId);\n // annotations.push(annotation);\n // updateAnnotations(documentId, annotations);\n\n // resolve(annotation);\n // });\n },\n\n editAnnotation(documentId, annotationId, annotation) {\n return API.post('/update-annotation/', {\n fileUuid,\n annotationId,\n annotation\n }).then(function (response) {\n if(annotation.type==='point')\n renderComments();\n return response;\n }).then(function (response) {\n return annotation;\n });\n\n // return new Promise((resolve, reject) => {\n // let annotations = getAnnotations(documentId);\n // annotations[findAnnotation(documentId, annotationId)] = annotation;\n // updateAnnotations(documentId, annotations);\n //\n // resolve(annotation);\n // });\n },\n\n deleteAnnotation(documentId, annotationId) {\n return API.post('/delete-annotation/', {\n annotationId,\n fileUuid\n }).then(function (response) {\n renderComments();\n return response;\n }).then(function (response) {\n return true;\n });\n\n // return new Promise((resolve, reject) => {\n // let index = findAnnotation(documentId, annotationId);\n // if (index > -1) {\n // let annotations = getAnnotations(documentId);\n // annotations.splice(index, 1);\n // updateAnnotations(documentId, annotations);\n // }\n //\n // resolve(true);\n // });\n },\n\n getComments(documentId) {\n return API.get('/get-comments/', {\n params: {\n fileUuid\n }\n }).then(function (response) {\n return response.data;\n });\n\n // return new Promise((resolve, reject) => {\n // resolve(getAnnotations(documentId).filter((i) => {\n // return i.class === 'Comment' && i.annotation === annotationId;\n // }));\n // });\n },\n\n addComment(documentId, annotationId, content) {\n\n return API.post('/add-comment/', {\n fileUuid,\n annotationId,\n content\n }).then(function (response) {\n renderComments();\n return response;\n }).then(function (response) {\n return content;\n });\n\n // return new Promise((resolve, reject) => {\n // let comment = {\n // class: 'Comment',\n // uuid: uuid(),\n // annotation: annotationId,\n // content: content\n // };\n //\n //\n //\n // let annotations = getAnnotations(documentId);\n // annotations.push(comment);\n // updateAnnotations(documentId, annotations);\n //\n // resolve(comment);\n // });\n },\n\n // deleteComment(documentId, commentId) {\n //\n // return API.post('/delete-comment/', {\n // fileUuid,\n // commentId,\n // }).then(function (response) {\n // return true;\n // });\n // }\n });\n }\n}\n//\n// function getAnnotations(documentId) {\n// return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || [];\n// }\n//\n// function updateAnnotations(documentId, annotations) {\n// localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations));\n// }\n\n// function findAnnotation(documentId, annotationId) {\n// let index = -1;\n// let annotations = getAnnotations(documentId);\n// for (let i=0, l=annotations.length; i<l; i++) {\n// if (annotations[i].uuid === annotationId) {\n// index = i;\n// break;\n// }\n// }\n// return index;\n// }\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/adapter/CRFPAStoreAdapter.js\n **/","module.exports = require('./lib/axios');\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/index.js\n ** module id = 9\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/axios.js\n ** module id = 10\n ** module chunks = 0\n **/","'use strict';\n\nvar bind = require('./helpers/bind');\nvar isBuffer = require('is-buffer');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/utils.js\n ** module id = 11\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/bind.js\n ** module id = 12\n ** module chunks = 0\n **/","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/is-buffer/index.js\n ** module id = 13\n ** module chunks = 0\n **/","'use strict';\n\nvar defaults = require('./../defaults');\nvar utils = require('./../utils');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/Axios.js\n ** module id = 14\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/defaults.js\n ** module id = 15\n ** module chunks = 0\n **/","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 16\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/normalizeHeaderName.js\n ** module id = 17\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false;\n\n // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n if (process.env.NODE_ENV !== 'test' &&\n typeof window !== 'undefined' &&\n window.XDomainRequest && !('withCredentials' in request) &&\n !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n request.onprogress = function handleProgress() {};\n request.ontimeout = function handleTimeout() {};\n }\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request[loadEvent] = function handleLoad() {\n if (!request || (request.readyState !== 4 && !xDomain)) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/adapters/xhr.js\n ** module id = 18\n ** module chunks = 0\n **/","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/settle.js\n ** module id = 19\n ** module chunks = 0\n **/","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/createError.js\n ** module id = 20\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/enhanceError.js\n ** module id = 21\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/buildURL.js\n ** module id = 22\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/parseHeaders.js\n ** module id = 23\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/isURLSameOrigin.js\n ** module id = 24\n ** module chunks = 0\n **/","'use strict';\n\n// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\nE.prototype = new Error;\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw new E();\n }\n block = block << 8 | charCode;\n }\n return output;\n}\n\nmodule.exports = btoa;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/btoa.js\n ** module id = 25\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/cookies.js\n ** module id = 26\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/InterceptorManager.js\n ** module id = 27\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar isAbsoluteURL = require('./../helpers/isAbsoluteURL');\nvar combineURLs = require('./../helpers/combineURLs');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/dispatchRequest.js\n ** module id = 28\n ** module chunks = 0\n **/","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/core/transformData.js\n ** module id = 29\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/isCancel.js\n ** module id = 30\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/isAbsoluteURL.js\n ** module id = 31\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/combineURLs.js\n ** module id = 32\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/Cancel.js\n ** module id = 33\n ** module chunks = 0\n **/","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/cancel/CancelToken.js\n ** module id = 34\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/axios/lib/helpers/spread.js\n ** module id = 35\n ** module chunks = 0\n **/","const REGEXP = /[xy]/g\nconst PATTERN = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n\nfunction replacement(c) {\n let r = Math.random()*16|0;\n let v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n}\n\n/**\n * Generate a univierally unique identifier\n *\n * @return {String}\n */\nexport default function uuid() {\n return PATTERN.replace(REGEXP, replacement);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/uuid.js\n **/","export const documentUrl = document.getElementById('pdf-data').dataset.filepath;\nexport const documentId = document.getElementById('pdf-data').dataset.uuid;\nexport const readonly = document.getElementById('pdf-data').dataset.readonly === 'True';\n\n\n/** WEBPACK FOOTER **\n ** ./src/initFile.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate'\nimport twitter from \"twitter-text\";\nimport {addEventListener} from \"./event\";\nimport {createEditOverlay} from \"./edit\";\n\nlet commentList = $('#comment-wrapper .comment-list-container');\nlet commentForm = $('#comment-wrapper .comment-list-form');\n\n// let commentText = commentForm.querySelector('input[type=\"text\"]');\n\nexport function renderComments(documentId) {\n PDFJSAnnotate.getStoreAdapter().getComments(documentId).then((comments) => {\n\n\n commentList.html('');\n commentForm.hide();\n // commentText.focus();\n\n // commentForm.onsubmit = function () {\n // PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n // .then(insertComment)\n // .then(() => {\n // commentText.value = '';\n // commentText.focus();\n // });\n //\n // return false;\n // };\n\n comments.forEach(insertComment);\n });\n}\n\n\nfunction supportsComments(target) {\n let type = target.getAttribute('data-pdf-annotate-type');\n return ['point', 'highlight', 'area'].indexOf(type) > -1;\n}\n\nfunction insertComment(comment) {\n let child = $('<div></div>');\n child.addClass('comment-list-item');\n child.attr('uuid', comment.annotation)\n child.html(twitter.autoLink(twitter.htmlEscape(comment.content)));\n child.bind('click', handleCommentClick);\n commentList.append(child);\n}\n\nfunction handleCommentClick(e) {\n let comment = $(e.target);\n selectComment(comment.attr('uuid'));\n}\n\n\nfunction scrollToView(element) {\n var offset = element.offset().top;\n if (!element.is(\":visible\")) {\n element.css({\"visibility\": \"hidden\"}).show();\n var offset = element.offset().top;\n element.css({\"visibility\": \"\", \"display\": \"\"});\n }\n\n var visible_area_start = $(window).scrollTop();\n var visible_area_end = visible_area_start + window.innerHeight;\n\n if (offset < visible_area_start || offset > visible_area_end) {\n // Not in view so scroll to it\n if (element.hasClass('comment-list-item')) {\n $('.comment-list-container').animate({scrollTop: offset - window.innerHeight / 3}, 300);\n }\n else {\n $('#content-wrapper').animate({scrollTop: offset - window.innerHeight / 3}, 300);\n }\n return false;\n }\n return true;\n}\n\nexport function selectComment(uuid) {\n let comment = $(`.comment-list-item[uuid=${uuid}]`);\n $('.comment-list-item').removeClass('selected');\n comment.addClass('selected');\n const annotation = $(`[data-pdf-annotate-id=${uuid}]`)[0];\n createEditOverlay(annotation);\n scrollToView($(annotation));\n scrollToView(comment);\n}\n\n// function handleAnnotationClick(target) {\n// if (supportsComments(target)) {\n// let documentId = target.parentNode.getAttribute('data-pdf-annotate-document');\n// let annotationId = target.getAttribute('data-pdf-annotate-id');\n//\n// PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId).then((comments) => {\n// commentList.innerHTML = '';\n// commentForm.style.display = '';\n// commentText.focus();\n//\n// commentForm.onsubmit = function () {\n// PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim())\n// .then(insertComment)\n// .then(() => {\n// commentText.value = '';\n// commentText.focus();\n// });\n//\n// return false;\n// };\n//\n// comments.forEach(insertComment);\n// });\n// }\n// }\n//\n// function handleAnnotationBlur(target) {\n// if (supportsComments(target)) {\n// commentList.innerHTML = '';\n// commentForm.style.display = 'none';\n// commentForm.onsubmit = null;\n//\n// insertComment({content: 'No comments'});\n// }\n// }\n\n\n// UI.addEventListener('annotation:click', handleAnnotationClick);\n// UI.addEventListener('annotation:blur', handleAnnotationBlur);\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/comments.js\n **/","(function() {\n if (typeof twttr === \"undefined\" || twttr === null) {\n var twttr = {};\n }\n\n twttr.txt = {};\n twttr.txt.regexen = {};\n\n var HTML_ENTITIES = {\n '&': '&',\n '>': '>',\n '<': '<',\n '\"': '"',\n \"'\": '''\n };\n\n // HTML escaping\n twttr.txt.htmlEscape = function(text) {\n return text && text.replace(/[&\"'><]/g, function(character) {\n return HTML_ENTITIES[character];\n });\n };\n\n // Builds a RegExp\n function regexSupplant(regex, flags) {\n flags = flags || \"\";\n if (typeof regex !== \"string\") {\n if (regex.global && flags.indexOf(\"g\") < 0) {\n flags += \"g\";\n }\n if (regex.ignoreCase && flags.indexOf(\"i\") < 0) {\n flags += \"i\";\n }\n if (regex.multiline && flags.indexOf(\"m\") < 0) {\n flags += \"m\";\n }\n\n regex = regex.source;\n }\n\n return new RegExp(regex.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n var newRegex = twttr.txt.regexen[name] || \"\";\n if (typeof newRegex !== \"string\") {\n newRegex = newRegex.source;\n }\n return newRegex;\n }), flags);\n }\n\n twttr.txt.regexSupplant = regexSupplant;\n\n // simple string interpolation\n function stringSupplant(str, values) {\n return str.replace(/#\\{(\\w+)\\}/g, function(match, name) {\n return values[name] || \"\";\n });\n }\n\n twttr.txt.stringSupplant = stringSupplant;\n\n twttr.txt.regexen.spaces_group = /\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000/;\n twttr.txt.regexen.spaces = regexSupplant(/[#{spaces_group}]/);\n twttr.txt.regexen.invalid_chars_group = /\\uFFFE\\uFEFF\\uFFFF\\u202A-\\u202E/;\n twttr.txt.regexen.invalid_chars = regexSupplant(/[#{invalid_chars_group}]/);\n twttr.txt.regexen.punct = /\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$/;\n twttr.txt.regexen.rtl_chars = /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg;\n twttr.txt.regexen.non_bmp_code_pairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/mg;\n\n twttr.txt.regexen.latinAccentChars = /\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF/;\n\n // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{L}\\p{M}\n twttr.txt.regexen.bmpLetterAndMarks = /A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0300-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u0483-\\u052f\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06df-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710-\\u074a\\u074d-\\u07b1\\u07ca-\\u07f5\\u07fa\\u0800-\\u082d\\u0840-\\u085b\\u08a0-\\u08b2\\u08e4-\\u0963\\u0971-\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bc-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e3\\u09f0\\u09f1\\u0a01-\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a59-\\u0a5c\\u0a5e\\u0a70-\\u0a75\\u0a81-\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abc-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ad0\\u0ae0-\\u0ae3\\u0b01-\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3c-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b63\\u0b71\\u0b82\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd0\\u0bd7\\u0c00-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c58\\u0c59\\u0c60-\\u0c63\\u0c81-\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbc-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0cde\\u0ce0-\\u0ce3\\u0cf1\\u0cf2\\u0d01-\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4e\\u0d57\\u0d60-\\u0d63\\u0d7a-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb9\\u0ebb-\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ec8-\\u0ecd\\u0edc-\\u0edf\\u0f00\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f71-\\u0f84\\u0f86-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u103f\\u1050-\\u108f\\u109a-\\u109d\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u135d-\\u135f\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16f1-\\u16f8\\u1700-\\u170c\\u170e-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176c\\u176e-\\u1770\\u1772\\u1773\\u1780-\\u17d3\\u17d7\\u17dc\\u17dd\\u180b-\\u180d\\u1820-\\u1877\\u1880-\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1920-\\u192b\\u1930-\\u193b\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a1b\\u1a20-\\u1a5e\\u1a60-\\u1a7c\\u1a7f\\u1aa7\\u1ab0-\\u1abe\\u1b00-\\u1b4b\\u1b6b-\\u1b73\\u1b80-\\u1baf\\u1bba-\\u1bf3\\u1c00-\\u1c37\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1cd0-\\u1cd2\\u1cd4-\\u1cf6\\u1cf8\\u1cf9\\u1d00-\\u1df5\\u1dfc-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u20d0-\\u20f0\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2183\\u2184\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d7f-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2de0-\\u2dff\\u2e2f\\u3005\\u3006\\u302a-\\u302f\\u3031-\\u3035\\u303b\\u303c\\u3041-\\u3096\\u3099\\u309a\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua672\\ua674-\\ua67d\\ua67f-\\ua69d\\ua69f-\\ua6e5\\ua6f0\\ua6f1\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua7ad\\ua7b0\\ua7b1\\ua7f7-\\ua827\\ua840-\\ua873\\ua880-\\ua8c4\\ua8e0-\\ua8f7\\ua8fb\\ua90a-\\ua92d\\ua930-\\ua953\\ua960-\\ua97c\\ua980-\\ua9c0\\ua9cf\\ua9e0-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa36\\uaa40-\\uaa4d\\uaa60-\\uaa76\\uaa7a-\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaef\\uaaf2-\\uaaf6\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab5f\\uab64\\uab65\\uabc0-\\uabea\\uabec\\uabed\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf870-\\uf87f\\uf882\\uf884-\\uf89f\\uf8b8\\uf8c1-\\uf8d6\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe00-\\ufe0f\\ufe20-\\ufe2d\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc/;\n twttr.txt.regexen.astralLetterAndMarks = /\\ud800[\\udc00-\\udc0b\\udc0d-\\udc26\\udc28-\\udc3a\\udc3c\\udc3d\\udc3f-\\udc4d\\udc50-\\udc5d\\udc80-\\udcfa\\uddfd\\ude80-\\ude9c\\udea0-\\uded0\\udee0\\udf00-\\udf1f\\udf30-\\udf40\\udf42-\\udf49\\udf50-\\udf7a\\udf80-\\udf9d\\udfa0-\\udfc3\\udfc8-\\udfcf]|\\ud801[\\udc00-\\udc9d\\udd00-\\udd27\\udd30-\\udd63\\ude00-\\udf36\\udf40-\\udf55\\udf60-\\udf67]|\\ud802[\\udc00-\\udc05\\udc08\\udc0a-\\udc35\\udc37\\udc38\\udc3c\\udc3f-\\udc55\\udc60-\\udc76\\udc80-\\udc9e\\udd00-\\udd15\\udd20-\\udd39\\udd80-\\uddb7\\uddbe\\uddbf\\ude00-\\ude03\\ude05\\ude06\\ude0c-\\ude13\\ude15-\\ude17\\ude19-\\ude33\\ude38-\\ude3a\\ude3f\\ude60-\\ude7c\\ude80-\\ude9c\\udec0-\\udec7\\udec9-\\udee6\\udf00-\\udf35\\udf40-\\udf55\\udf60-\\udf72\\udf80-\\udf91]|\\ud803[\\udc00-\\udc48]|\\ud804[\\udc00-\\udc46\\udc7f-\\udcba\\udcd0-\\udce8\\udd00-\\udd34\\udd50-\\udd73\\udd76\\udd80-\\uddc4\\uddda\\ude00-\\ude11\\ude13-\\ude37\\udeb0-\\udeea\\udf01-\\udf03\\udf05-\\udf0c\\udf0f\\udf10\\udf13-\\udf28\\udf2a-\\udf30\\udf32\\udf33\\udf35-\\udf39\\udf3c-\\udf44\\udf47\\udf48\\udf4b-\\udf4d\\udf57\\udf5d-\\udf63\\udf66-\\udf6c\\udf70-\\udf74]|\\ud805[\\udc80-\\udcc5\\udcc7\\udd80-\\uddb5\\uddb8-\\uddc0\\ude00-\\ude40\\ude44\\ude80-\\udeb7]|\\ud806[\\udca0-\\udcdf\\udcff\\udec0-\\udef8]|\\ud808[\\udc00-\\udf98]|\\ud80c[\\udc00-\\udfff]|\\ud80d[\\udc00-\\udc2e]|\\ud81a[\\udc00-\\ude38\\ude40-\\ude5e\\uded0-\\udeed\\udef0-\\udef4\\udf00-\\udf36\\udf40-\\udf43\\udf63-\\udf77\\udf7d-\\udf8f]|\\ud81b[\\udf00-\\udf44\\udf50-\\udf7e\\udf8f-\\udf9f]|\\ud82c[\\udc00\\udc01]|\\ud82f[\\udc00-\\udc6a\\udc70-\\udc7c\\udc80-\\udc88\\udc90-\\udc99\\udc9d\\udc9e]|\\ud834[\\udd65-\\udd69\\udd6d-\\udd72\\udd7b-\\udd82\\udd85-\\udd8b\\uddaa-\\uddad\\ude42-\\ude44]|\\ud835[\\udc00-\\udc54\\udc56-\\udc9c\\udc9e\\udc9f\\udca2\\udca5\\udca6\\udca9-\\udcac\\udcae-\\udcb9\\udcbb\\udcbd-\\udcc3\\udcc5-\\udd05\\udd07-\\udd0a\\udd0d-\\udd14\\udd16-\\udd1c\\udd1e-\\udd39\\udd3b-\\udd3e\\udd40-\\udd44\\udd46\\udd4a-\\udd50\\udd52-\\udea5\\udea8-\\udec0\\udec2-\\udeda\\udedc-\\udefa\\udefc-\\udf14\\udf16-\\udf34\\udf36-\\udf4e\\udf50-\\udf6e\\udf70-\\udf88\\udf8a-\\udfa8\\udfaa-\\udfc2\\udfc4-\\udfcb]|\\ud83a[\\udc00-\\udcc4\\udcd0-\\udcd6]|\\ud83b[\\ude00-\\ude03\\ude05-\\ude1f\\ude21\\ude22\\ude24\\ude27\\ude29-\\ude32\\ude34-\\ude37\\ude39\\ude3b\\ude42\\ude47\\ude49\\ude4b\\ude4d-\\ude4f\\ude51\\ude52\\ude54\\ude57\\ude59\\ude5b\\ude5d\\ude5f\\ude61\\ude62\\ude64\\ude67-\\ude6a\\ude6c-\\ude72\\ude74-\\ude77\\ude79-\\ude7c\\ude7e\\ude80-\\ude89\\ude8b-\\ude9b\\udea1-\\udea3\\udea5-\\udea9\\udeab-\\udebb]|\\ud840[\\udc00-\\udfff]|\\ud841[\\udc00-\\udfff]|\\ud842[\\udc00-\\udfff]|\\ud843[\\udc00-\\udfff]|\\ud844[\\udc00-\\udfff]|\\ud845[\\udc00-\\udfff]|\\ud846[\\udc00-\\udfff]|\\ud847[\\udc00-\\udfff]|\\ud848[\\udc00-\\udfff]|\\ud849[\\udc00-\\udfff]|\\ud84a[\\udc00-\\udfff]|\\ud84b[\\udc00-\\udfff]|\\ud84c[\\udc00-\\udfff]|\\ud84d[\\udc00-\\udfff]|\\ud84e[\\udc00-\\udfff]|\\ud84f[\\udc00-\\udfff]|\\ud850[\\udc00-\\udfff]|\\ud851[\\udc00-\\udfff]|\\ud852[\\udc00-\\udfff]|\\ud853[\\udc00-\\udfff]|\\ud854[\\udc00-\\udfff]|\\ud855[\\udc00-\\udfff]|\\ud856[\\udc00-\\udfff]|\\ud857[\\udc00-\\udfff]|\\ud858[\\udc00-\\udfff]|\\ud859[\\udc00-\\udfff]|\\ud85a[\\udc00-\\udfff]|\\ud85b[\\udc00-\\udfff]|\\ud85c[\\udc00-\\udfff]|\\ud85d[\\udc00-\\udfff]|\\ud85e[\\udc00-\\udfff]|\\ud85f[\\udc00-\\udfff]|\\ud860[\\udc00-\\udfff]|\\ud861[\\udc00-\\udfff]|\\ud862[\\udc00-\\udfff]|\\ud863[\\udc00-\\udfff]|\\ud864[\\udc00-\\udfff]|\\ud865[\\udc00-\\udfff]|\\ud866[\\udc00-\\udfff]|\\ud867[\\udc00-\\udfff]|\\ud868[\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86a[\\udc00-\\udfff]|\\ud86b[\\udc00-\\udfff]|\\ud86c[\\udc00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d]|\\ud87e[\\udc00-\\ude1d]|\\udb40[\\udd00-\\uddef]/;\n\n // Generated from unicode_regex/unicode_regex_groups.scala, same as objective c's \\p{Nd}\n twttr.txt.regexen.bmpNumerals = /0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u07c0-\\u07c9\\u0966-\\u096f\\u09e6-\\u09ef\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0de6-\\u0def\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\\u1040-\\u1049\\u1090-\\u1099\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1b50-\\u1b59\\u1bb0-\\u1bb9\\u1c40-\\u1c49\\u1c50-\\u1c59\\ua620-\\ua629\\ua8d0-\\ua8d9\\ua900-\\ua909\\ua9d0-\\ua9d9\\ua9f0-\\ua9f9\\uaa50-\\uaa59\\uabf0-\\uabf9\\uff10-\\uff19/;\n twttr.txt.regexen.astralNumerals = /\\ud801[\\udca0-\\udca9]|\\ud804[\\udc66-\\udc6f\\udcf0-\\udcf9\\udd36-\\udd3f\\uddd0-\\uddd9\\udef0-\\udef9]|\\ud805[\\udcd0-\\udcd9\\ude50-\\ude59\\udec0-\\udec9]|\\ud806[\\udce0-\\udce9]|\\ud81a[\\ude60-\\ude69\\udf50-\\udf59]|\\ud835[\\udfce-\\udfff]/;\n\n twttr.txt.regexen.hashtagSpecialChars = /_\\u200c\\u200d\\ua67e\\u05be\\u05f3\\u05f4\\uff5e\\u301c\\u309b\\u309c\\u30a0\\u30fb\\u3003\\u0f0b\\u0f0c\\xb7/;\n\n // A hashtag must contain at least one unicode letter or mark, as well as numbers, underscores, and select special characters.\n twttr.txt.regexen.hashSigns = /[##]/;\n twttr.txt.regexen.hashtagAlpha = regexSupplant(/(?:[#{bmpLetterAndMarks}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}))/);\n twttr.txt.regexen.hashtagAlphaNumeric = regexSupplant(/(?:[#{bmpLetterAndMarks}#{bmpNumerals}#{hashtagSpecialChars}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}|#{astralNumerals}))/);\n twttr.txt.regexen.endHashtagMatch = regexSupplant(/^(?:#{hashSigns}|:\\/\\/)/);\n twttr.txt.regexen.codePoint = /(?:[^\\uD800-\\uDFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/;\n twttr.txt.regexen.hashtagBoundary = regexSupplant(/(?:^|\\uFE0E|\\uFE0F|$|(?!#{hashtagAlphaNumeric}|&)#{codePoint})/);\n twttr.txt.regexen.validHashtag = regexSupplant(/(#{hashtagBoundary})(#{hashSigns})(?!\\uFE0F|\\u20E3)(#{hashtagAlphaNumeric}*#{hashtagAlpha}#{hashtagAlphaNumeric}*)/gi);\n\n // Mention related regex collection\n twttr.txt.regexen.validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@@]|(?:^|[^a-zA-Z0-9_+~.-])(?:rt|RT|rT|Rt):?)/;\n twttr.txt.regexen.atSigns = /[@@]/;\n twttr.txt.regexen.validMentionOrList = regexSupplant(\n '(#{validMentionPrecedingChars})' + // $1: Preceding character\n '(#{atSigns})' + // $2: At mark\n '([a-zA-Z0-9_]{1,20})' + // $3: Screen name\n '(\\/[a-zA-Z][a-zA-Z0-9_\\-]{0,24})?' // $4: List (optional)\n , 'g');\n twttr.txt.regexen.validReply = regexSupplant(/^(?:#{spaces})*#{atSigns}([a-zA-Z0-9_]{1,20})/);\n twttr.txt.regexen.endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\\/\\/)/);\n\n // URL related regex collection\n twttr.txt.regexen.validUrlPrecedingChars = regexSupplant(/(?:[^A-Za-z0-9@@$###{invalid_chars_group}]|^)/);\n twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars = /[-_.\\/]$/;\n twttr.txt.regexen.invalidDomainChars = stringSupplant(\"#{punct}#{spaces_group}#{invalid_chars_group}\", twttr.txt.regexen);\n twttr.txt.regexen.validDomainChars = regexSupplant(/[^#{invalidDomainChars}]/);\n twttr.txt.regexen.validSubdomain = regexSupplant(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n twttr.txt.regexen.validDomainName = regexSupplant(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\\.)/);\n twttr.txt.regexen.validGTLD = regexSupplant(RegExp(\n'(?:(?:' +\n '삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|' +\n '政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|' +\n 'ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|' +\n 'بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|' +\n 'zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|' +\n 'yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|' +\n 'wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|' +\n 'website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|' +\n 'wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|' +\n 'vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|' +\n 'vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|' +\n 'university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|' +\n 'travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|' +\n 'toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|' +\n 'tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|' +\n 'tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|' +\n 'swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|' +\n 'stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|' +\n 'stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|' +\n 'softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|' +\n 'showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|' +\n 'sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|' +\n 'science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|' +\n 'sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|' +\n 'saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|' +\n 'rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|' +\n 'repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|' +\n 'realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|' +\n 'protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|' +\n 'pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|' +\n 'pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|' +\n 'pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|' +\n 'pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|' +\n 'onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|' +\n 'obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|' +\n 'nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|' +\n 'net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|' +\n 'msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|' +\n 'monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|' +\n 'miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|' +\n 'mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|' +\n 'makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|' +\n 'lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|' +\n 'limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|' +\n 'lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|' +\n 'lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|' +\n 'komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|' +\n 'kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|' +\n 'jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|' +\n 'investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|' +\n 'industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|' +\n 'hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|' +\n 'honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|' +\n 'hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|' +\n 'hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|' +\n 'gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|' +\n 'globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|' +\n 'garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|' +\n 'ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|' +\n 'football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|' +\n 'fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|' +\n 'ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|' +\n 'extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|' +\n 'estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|' +\n 'email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|' +\n 'download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|' +\n 'direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|' +\n 'delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|' +\n 'cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|' +\n 'coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|' +\n 'construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|' +\n 'college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|' +\n 'cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|' +\n 'chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|' +\n 'catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|' +\n 'capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|' +\n 'bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|' +\n 'bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|' +\n 'boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|' +\n 'black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|' +\n 'beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|' +\n 'barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|' +\n 'autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|' +\n 'art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|' +\n 'amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|' +\n 'alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|' +\n 'afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|' +\n 'academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion' +\n')(?=[^0-9a-zA-Z@]|$))'));\n twttr.txt.regexen.validCCTLD = regexSupplant(RegExp(\n'(?:(?:' +\n '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|' +\n 'ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|' +\n 'بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|' +\n 'zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|' +\n 'tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|' +\n 're|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|' +\n 'mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|' +\n 'ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|' +\n 'gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|' +\n 'do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|' +\n 'bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac' +\n')(?=[^0-9a-zA-Z@]|$))'));\n twttr.txt.regexen.validPunycode = /(?:xn--[0-9a-z]+)/;\n twttr.txt.regexen.validSpecialCCTLD = /(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/;\n twttr.txt.regexen.validDomain = regexSupplant(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/);\n twttr.txt.regexen.validAsciiDomain = regexSupplant(/(?:(?:[\\-a-z0-9#{latinAccentChars}]+)\\.)+(?:#{validGTLD}|#{validCCTLD}|#{validPunycode})/gi);\n twttr.txt.regexen.invalidShortDomain = regexSupplant(/^#{validDomainName}#{validCCTLD}$/i);\n twttr.txt.regexen.validSpecialShortDomain = regexSupplant(/^#{validDomainName}#{validSpecialCCTLD}$/i);\n twttr.txt.regexen.validPortNumber = /[0-9]+/;\n twttr.txt.regexen.cyrillicLettersAndMarks = /\\u0400-\\u04FF/;\n twttr.txt.regexen.validGeneralUrlPathChars = regexSupplant(/[a-z#{cyrillicLettersAndMarks}0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-_~@\\|&#{latinAccentChars}]/i);\n // Allow URL paths to contain up to two nested levels of balanced parens\n // 1. Used in Wikipedia URLs like /Primer_(film)\n // 2. Used in IIS sessions like /S(dfd346)/\n // 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/\n twttr.txt.regexen.validUrlBalancedParens = regexSupplant(\n '\\\\(' +\n '(?:' +\n '#{validGeneralUrlPathChars}+' +\n '|' +\n // allow one nested level of balanced parentheses\n '(?:' +\n '#{validGeneralUrlPathChars}*' +\n '\\\\(' +\n '#{validGeneralUrlPathChars}+' +\n '\\\\)' +\n '#{validGeneralUrlPathChars}*' +\n ')' +\n ')' +\n '\\\\)'\n , 'i');\n // Valid end-of-path chracters (so /foo. does not gobble the period).\n // 1. Allow =&# for empty URL parameters and other URL-join artifacts\n twttr.txt.regexen.validUrlPathEndingChars = regexSupplant(/[\\+\\-a-z#{cyrillicLettersAndMarks}0-9=_#\\/#{latinAccentChars}]|(?:#{validUrlBalancedParens})/i);\n // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/\n twttr.txt.regexen.validUrlPath = regexSupplant('(?:' +\n '(?:' +\n '#{validGeneralUrlPathChars}*' +\n '(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*' +\n '#{validUrlPathEndingChars}'+\n ')|(?:@#{validGeneralUrlPathChars}+\\/)'+\n ')', 'i');\n\n twttr.txt.regexen.validUrlQueryChars = /[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]/i;\n twttr.txt.regexen.validUrlQueryEndingChars = /[a-z0-9_&=#\\/]/i;\n twttr.txt.regexen.extractUrl = regexSupplant(\n '(' + // $1 total match\n '(#{validUrlPrecedingChars})' + // $2 Preceeding chracter\n '(' + // $3 URL\n '(https?:\\\\/\\\\/)?' + // $4 Protocol (optional)\n '(#{validDomain})' + // $5 Domain(s)\n '(?::(#{validPortNumber}))?' + // $6 Port number (optional)\n '(\\\\/#{validUrlPath}*)?' + // $7 URL Path\n '(\\\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?' + // $8 Query String\n ')' +\n ')'\n , 'gi');\n\n twttr.txt.regexen.validTcoUrl = /^https?:\\/\\/t\\.co\\/[a-z0-9]+/i;\n twttr.txt.regexen.urlHasProtocol = /^https?:\\/\\//i;\n twttr.txt.regexen.urlHasHttps = /^https:\\/\\//i;\n\n // cashtag related regex\n twttr.txt.regexen.cashtag = /[a-z]{1,6}(?:[._][a-z]{1,2})?/i;\n twttr.txt.regexen.validCashtag = regexSupplant('(^|#{spaces})(\\\\$)(#{cashtag})(?=$|\\\\s|[#{punct}])', 'gi');\n\n // These URL validation pattern strings are based on the ABNF from RFC 3986\n twttr.txt.regexen.validateUrlUnreserved = /[a-z\\u0400-\\u04FF0-9\\-._~]/i;\n twttr.txt.regexen.validateUrlPctEncoded = /(?:%[0-9a-f]{2})/i;\n twttr.txt.regexen.validateUrlSubDelims = /[!$&'()*+,;=]/i;\n twttr.txt.regexen.validateUrlPchar = regexSupplant('(?:' +\n '#{validateUrlUnreserved}|' +\n '#{validateUrlPctEncoded}|' +\n '#{validateUrlSubDelims}|' +\n '[:|@]' +\n ')', 'i');\n\n twttr.txt.regexen.validateUrlScheme = /(?:[a-z][a-z0-9+\\-.]*)/i;\n twttr.txt.regexen.validateUrlUserinfo = regexSupplant('(?:' +\n '#{validateUrlUnreserved}|' +\n '#{validateUrlPctEncoded}|' +\n '#{validateUrlSubDelims}|' +\n ':' +\n ')*', 'i');\n\n twttr.txt.regexen.validateUrlDecOctet = /(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9]{2})|(?:2[0-4][0-9])|(?:25[0-5]))/i;\n twttr.txt.regexen.validateUrlIpv4 = regexSupplant(/(?:#{validateUrlDecOctet}(?:\\.#{validateUrlDecOctet}){3})/i);\n\n // Punting on real IPv6 validation for now\n twttr.txt.regexen.validateUrlIpv6 = /(?:\\[[a-f0-9:\\.]+\\])/i;\n\n // Also punting on IPvFuture for now\n twttr.txt.regexen.validateUrlIp = regexSupplant('(?:' +\n '#{validateUrlIpv4}|' +\n '#{validateUrlIpv6}' +\n ')', 'i');\n\n // This is more strict than the rfc specifies\n twttr.txt.regexen.validateUrlSubDomainSegment = /(?:[a-z0-9](?:[a-z0-9_\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomainSegment = /(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomainTld = /(?:[a-z](?:[a-z0-9\\-]*[a-z0-9])?)/i;\n twttr.txt.regexen.validateUrlDomain = regexSupplant(/(?:(?:#{validateUrlSubDomainSegment}\\.)*(?:#{validateUrlDomainSegment}\\.)#{validateUrlDomainTld})/i);\n\n twttr.txt.regexen.validateUrlHost = regexSupplant('(?:' +\n '#{validateUrlIp}|' +\n '#{validateUrlDomain}' +\n ')', 'i');\n\n // Unencoded internationalized domains - this doesn't check for invalid UTF-8 sequences\n twttr.txt.regexen.validateUrlUnicodeSubDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9_\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomainSegment = /(?:(?:[a-z0-9]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomainTld = /(?:(?:[a-z]|[^\\u0000-\\u007f])(?:(?:[a-z0-9\\-]|[^\\u0000-\\u007f])*(?:[a-z0-9]|[^\\u0000-\\u007f]))?)/i;\n twttr.txt.regexen.validateUrlUnicodeDomain = regexSupplant(/(?:(?:#{validateUrlUnicodeSubDomainSegment}\\.)*(?:#{validateUrlUnicodeDomainSegment}\\.)#{validateUrlUnicodeDomainTld})/i);\n\n twttr.txt.regexen.validateUrlUnicodeHost = regexSupplant('(?:' +\n '#{validateUrlIp}|' +\n '#{validateUrlUnicodeDomain}' +\n ')', 'i');\n\n twttr.txt.regexen.validateUrlPort = /[0-9]{1,5}/;\n\n twttr.txt.regexen.validateUrlUnicodeAuthority = regexSupplant(\n '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n '(#{validateUrlUnicodeHost})' + // $2 host\n '(?::(#{validateUrlPort}))?' //$3 port\n , \"i\");\n\n twttr.txt.regexen.validateUrlAuthority = regexSupplant(\n '(?:(#{validateUrlUserinfo})@)?' + // $1 userinfo\n '(#{validateUrlHost})' + // $2 host\n '(?::(#{validateUrlPort}))?' // $3 port\n , \"i\");\n\n twttr.txt.regexen.validateUrlPath = regexSupplant(/(\\/#{validateUrlPchar}*)*/i);\n twttr.txt.regexen.validateUrlQuery = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n twttr.txt.regexen.validateUrlFragment = regexSupplant(/(#{validateUrlPchar}|\\/|\\?)*/i);\n\n // Modified version of RFC 3986 Appendix B\n twttr.txt.regexen.validateUrlUnencoded = regexSupplant(\n '^' + // Full URL\n '(?:' +\n '([^:/?#]+):\\\\/\\\\/' + // $1 Scheme\n ')?' +\n '([^/?#]*)' + // $2 Authority\n '([^?#]*)' + // $3 Path\n '(?:' +\n '\\\\?([^#]*)' + // $4 Query\n ')?' +\n '(?:' +\n '#(.*)' + // $5 Fragment\n ')?$'\n , \"i\");\n\n\n // Default CSS class for auto-linked lists (along with the url class)\n var DEFAULT_LIST_CLASS = \"tweet-url list-slug\";\n // Default CSS class for auto-linked usernames (along with the url class)\n var DEFAULT_USERNAME_CLASS = \"tweet-url username\";\n // Default CSS class for auto-linked hashtags (along with the url class)\n var DEFAULT_HASHTAG_CLASS = \"tweet-url hashtag\";\n // Default CSS class for auto-linked cashtags (along with the url class)\n var DEFAULT_CASHTAG_CLASS = \"tweet-url cashtag\";\n // Options which should not be passed as HTML attributes\n var OPTIONS_NOT_ATTRIBUTES = {'urlClass':true, 'listClass':true, 'usernameClass':true, 'hashtagClass':true, 'cashtagClass':true,\n 'usernameUrlBase':true, 'listUrlBase':true, 'hashtagUrlBase':true, 'cashtagUrlBase':true,\n 'usernameUrlBlock':true, 'listUrlBlock':true, 'hashtagUrlBlock':true, 'linkUrlBlock':true,\n 'usernameIncludeSymbol':true, 'suppressLists':true, 'suppressNoFollow':true, 'targetBlank':true,\n 'suppressDataScreenName':true, 'urlEntities':true, 'symbolTag':true, 'textWithSymbolTag':true, 'urlTarget':true,\n 'invisibleTagAttrs':true, 'linkAttributeBlock':true, 'linkTextBlock': true, 'htmlEscapeNonEntities': true\n };\n\n var BOOLEAN_ATTRIBUTES = {'disabled':true, 'readonly':true, 'multiple':true, 'checked':true};\n\n // Simple object cloning function for simple objects\n function clone(o) {\n var r = {};\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n r[k] = o[k];\n }\n }\n\n return r;\n }\n\n twttr.txt.tagAttrs = function(attributes) {\n var htmlAttrs = \"\";\n for (var k in attributes) {\n var v = attributes[k];\n if (BOOLEAN_ATTRIBUTES[k]) {\n v = v ? k : null;\n }\n if (v == null) continue;\n htmlAttrs += \" \" + twttr.txt.htmlEscape(k) + \"=\\\"\" + twttr.txt.htmlEscape(v.toString()) + \"\\\"\";\n }\n return htmlAttrs;\n };\n\n twttr.txt.linkToText = function(entity, text, attributes, options) {\n if (!options.suppressNoFollow) {\n attributes.rel = \"nofollow\";\n }\n // if linkAttributeBlock is specified, call it to modify the attributes\n if (options.linkAttributeBlock) {\n options.linkAttributeBlock(entity, attributes);\n }\n // if linkTextBlock is specified, call it to get a new/modified link text\n if (options.linkTextBlock) {\n text = options.linkTextBlock(entity, text);\n }\n var d = {\n text: text,\n attr: twttr.txt.tagAttrs(attributes)\n };\n return stringSupplant(\"<a#{attr}>#{text}</a>\", d);\n };\n\n twttr.txt.linkToTextWithSymbol = function(entity, symbol, text, attributes, options) {\n var taggedSymbol = options.symbolTag ? \"<\" + options.symbolTag + \">\" + symbol + \"</\"+ options.symbolTag + \">\" : symbol;\n text = twttr.txt.htmlEscape(text);\n var taggedText = options.textWithSymbolTag ? \"<\" + options.textWithSymbolTag + \">\" + text + \"</\"+ options.textWithSymbolTag + \">\" : text;\n\n if (options.usernameIncludeSymbol || !symbol.match(twttr.txt.regexen.atSigns)) {\n return twttr.txt.linkToText(entity, taggedSymbol + taggedText, attributes, options);\n } else {\n return taggedSymbol + twttr.txt.linkToText(entity, taggedText, attributes, options);\n }\n };\n\n twttr.txt.linkToHashtag = function(entity, text, options) {\n var hash = text.substring(entity.indices[0], entity.indices[0] + 1);\n var hashtag = twttr.txt.htmlEscape(entity.hashtag);\n var attrs = clone(options.htmlAttrs || {});\n attrs.href = options.hashtagUrlBase + hashtag;\n attrs.title = \"#\" + hashtag;\n attrs[\"class\"] = options.hashtagClass;\n if (hashtag.charAt(0).match(twttr.txt.regexen.rtl_chars)){\n attrs[\"class\"] += \" rtl\";\n }\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, hash, hashtag, attrs, options);\n };\n\n twttr.txt.linkToCashtag = function(entity, text, options) {\n var cashtag = twttr.txt.htmlEscape(entity.cashtag);\n var attrs = clone(options.htmlAttrs || {});\n attrs.href = options.cashtagUrlBase + cashtag;\n attrs.title = \"$\" + cashtag;\n attrs[\"class\"] = options.cashtagClass;\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, \"$\", cashtag, attrs, options);\n };\n\n twttr.txt.linkToMentionAndList = function(entity, text, options) {\n var at = text.substring(entity.indices[0], entity.indices[0] + 1);\n var user = twttr.txt.htmlEscape(entity.screenName);\n var slashListname = twttr.txt.htmlEscape(entity.listSlug);\n var isList = entity.listSlug && !options.suppressLists;\n var attrs = clone(options.htmlAttrs || {});\n attrs[\"class\"] = (isList ? options.listClass : options.usernameClass);\n attrs.href = isList ? options.listUrlBase + user + slashListname : options.usernameUrlBase + user;\n if (!isList && !options.suppressDataScreenName) {\n attrs['data-screen-name'] = user;\n }\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n return twttr.txt.linkToTextWithSymbol(entity, at, isList ? user + slashListname : user, attrs, options);\n };\n\n twttr.txt.linkToUrl = function(entity, text, options) {\n var url = entity.url;\n var displayUrl = url;\n var linkText = twttr.txt.htmlEscape(displayUrl);\n\n // If the caller passed a urlEntities object (provided by a Twitter API\n // response with include_entities=true), we use that to render the display_url\n // for each URL instead of it's underlying t.co URL.\n var urlEntity = (options.urlEntities && options.urlEntities[url]) || entity;\n if (urlEntity.display_url) {\n linkText = twttr.txt.linkTextWithEntity(urlEntity, options);\n }\n\n var attrs = clone(options.htmlAttrs || {});\n\n if (!url.match(twttr.txt.regexen.urlHasProtocol)) {\n url = \"http://\" + url;\n }\n attrs.href = url;\n\n if (options.targetBlank) {\n attrs.target = '_blank';\n }\n\n // set class only if urlClass is specified.\n if (options.urlClass) {\n attrs[\"class\"] = options.urlClass;\n }\n\n // set target only if urlTarget is specified.\n if (options.urlTarget) {\n attrs.target = options.urlTarget;\n }\n\n if (!options.title && urlEntity.display_url) {\n attrs.title = urlEntity.expanded_url;\n }\n\n return twttr.txt.linkToText(entity, linkText, attrs, options);\n };\n\n twttr.txt.linkTextWithEntity = function (entity, options) {\n var displayUrl = entity.display_url;\n var expandedUrl = entity.expanded_url;\n\n // Goal: If a user copies and pastes a tweet containing t.co'ed link, the resulting paste\n // should contain the full original URL (expanded_url), not the display URL.\n //\n // Method: Whenever possible, we actually emit HTML that contains expanded_url, and use\n // font-size:0 to hide those parts that should not be displayed (because they are not part of display_url).\n // Elements with font-size:0 get copied even though they are not visible.\n // Note that display:none doesn't work here. Elements with display:none don't get copied.\n //\n // Additionally, we want to *display* ellipses, but we don't want them copied. To make this happen we\n // wrap the ellipses in a tco-ellipsis class and provide an onCopy handler that sets display:none on\n // everything with the tco-ellipsis class.\n //\n // Exception: pic.twitter.com images, for which expandedUrl = \"https://twitter.com/#!/username/status/1234/photo/1\n // For those URLs, display_url is not a substring of expanded_url, so we don't do anything special to render the elided parts.\n // For a pic.twitter.com URL, the only elided part will be the \"https://\", so this is fine.\n\n var displayUrlSansEllipses = displayUrl.replace(/…/g, \"\"); // We have to disregard ellipses for matching\n // Note: we currently only support eliding parts of the URL at the beginning or the end.\n // Eventually we may want to elide parts of the URL in the *middle*. If so, this code will\n // become more complicated. We will probably want to create a regexp out of display URL,\n // replacing every ellipsis with a \".*\".\n if (expandedUrl.indexOf(displayUrlSansEllipses) != -1) {\n var displayUrlIndex = expandedUrl.indexOf(displayUrlSansEllipses);\n var v = {\n displayUrlSansEllipses: displayUrlSansEllipses,\n // Portion of expandedUrl that precedes the displayUrl substring\n beforeDisplayUrl: expandedUrl.substr(0, displayUrlIndex),\n // Portion of expandedUrl that comes after displayUrl\n afterDisplayUrl: expandedUrl.substr(displayUrlIndex + displayUrlSansEllipses.length),\n precedingEllipsis: displayUrl.match(/^…/) ? \"…\" : \"\",\n followingEllipsis: displayUrl.match(/…$/) ? \"…\" : \"\"\n };\n for (var k in v) {\n if (v.hasOwnProperty(k)) {\n v[k] = twttr.txt.htmlEscape(v[k]);\n }\n }\n // As an example: The user tweets \"hi http://longdomainname.com/foo\"\n // This gets shortened to \"hi http://t.co/xyzabc\", with display_url = \"…nname.com/foo\"\n // This will get rendered as:\n // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n // …\n // <!-- There's a chance the onCopy event handler might not fire. In case that happens,\n // we include an here so that the … doesn't bump up against the URL and ruin it.\n // The is inside the tco-ellipsis span so that when the onCopy handler *does*\n // fire, it doesn't get copied. Otherwise the copied text would have two spaces in a row,\n // e.g. \"hi http://longdomainname.com/foo\".\n // <span style='font-size:0'> </span>\n // </span>\n // <span style='font-size:0'> <!-- This stuff should get copied but not displayed -->\n // http://longdomai\n // </span>\n // <span class='js-display-url'> <!-- This stuff should get displayed *and* copied -->\n // nname.com/foo\n // </span>\n // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->\n // <span style='font-size:0'> </span>\n // …\n // </span>\n v['invisible'] = options.invisibleTagAttrs;\n return stringSupplant(\"<span class='tco-ellipsis'>#{precedingEllipsis}<span #{invisible}> </span></span><span #{invisible}>#{beforeDisplayUrl}</span><span class='js-display-url'>#{displayUrlSansEllipses}</span><span #{invisible}>#{afterDisplayUrl}</span><span class='tco-ellipsis'><span #{invisible}> </span>#{followingEllipsis}</span>\", v);\n }\n return displayUrl;\n };\n\n twttr.txt.autoLinkEntities = function(text, entities, options) {\n options = clone(options || {});\n\n options.hashtagClass = options.hashtagClass || DEFAULT_HASHTAG_CLASS;\n options.hashtagUrlBase = options.hashtagUrlBase || \"https://twitter.com/#!/search?q=%23\";\n options.cashtagClass = options.cashtagClass || DEFAULT_CASHTAG_CLASS;\n options.cashtagUrlBase = options.cashtagUrlBase || \"https://twitter.com/#!/search?q=%24\";\n options.listClass = options.listClass || DEFAULT_LIST_CLASS;\n options.usernameClass = options.usernameClass || DEFAULT_USERNAME_CLASS;\n options.usernameUrlBase = options.usernameUrlBase || \"https://twitter.com/\";\n options.listUrlBase = options.listUrlBase || \"https://twitter.com/\";\n options.htmlAttrs = twttr.txt.extractHtmlAttrsFromOptions(options);\n options.invisibleTagAttrs = options.invisibleTagAttrs || \"style='position:absolute;left:-9999px;'\";\n\n // remap url entities to hash\n var urlEntities, i, len;\n if(options.urlEntities) {\n urlEntities = {};\n for(i = 0, len = options.urlEntities.length; i < len; i++) {\n urlEntities[options.urlEntities[i].url] = options.urlEntities[i];\n }\n options.urlEntities = urlEntities;\n }\n\n var result = \"\";\n var beginIndex = 0;\n\n // sort entities by start index\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\n var nonEntity = options.htmlEscapeNonEntities ? twttr.txt.htmlEscape : function(text) {\n return text;\n };\n\n for (var i = 0; i < entities.length; i++) {\n var entity = entities[i];\n result += nonEntity(text.substring(beginIndex, entity.indices[0]));\n\n if (entity.url) {\n result += twttr.txt.linkToUrl(entity, text, options);\n } else if (entity.hashtag) {\n result += twttr.txt.linkToHashtag(entity, text, options);\n } else if (entity.screenName) {\n result += twttr.txt.linkToMentionAndList(entity, text, options);\n } else if (entity.cashtag) {\n result += twttr.txt.linkToCashtag(entity, text, options);\n }\n beginIndex = entity.indices[1];\n }\n result += nonEntity(text.substring(beginIndex, text.length));\n return result;\n };\n\n twttr.txt.autoLinkWithJSON = function(text, json, options) {\n // map JSON entity to twitter-text entity\n if (json.user_mentions) {\n for (var i = 0; i < json.user_mentions.length; i++) {\n // this is a @mention\n json.user_mentions[i].screenName = json.user_mentions[i].screen_name;\n }\n }\n\n if (json.hashtags) {\n for (var i = 0; i < json.hashtags.length; i++) {\n // this is a #hashtag\n json.hashtags[i].hashtag = json.hashtags[i].text;\n }\n }\n\n if (json.symbols) {\n for (var i = 0; i < json.symbols.length; i++) {\n // this is a $CASH tag\n json.symbols[i].cashtag = json.symbols[i].text;\n }\n }\n\n // concatenate all entities\n var entities = [];\n for (var key in json) {\n entities = entities.concat(json[key]);\n }\n\n // modify indices to UTF-16\n twttr.txt.modifyIndicesFromUnicodeToUTF16(text, entities);\n\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.extractHtmlAttrsFromOptions = function(options) {\n var htmlAttrs = {};\n for (var k in options) {\n var v = options[k];\n if (OPTIONS_NOT_ATTRIBUTES[k]) continue;\n if (BOOLEAN_ATTRIBUTES[k]) {\n v = v ? k : null;\n }\n if (v == null) continue;\n htmlAttrs[k] = v;\n }\n return htmlAttrs;\n };\n\n twttr.txt.autoLink = function(text, options) {\n var entities = twttr.txt.extractEntitiesWithIndices(text, {extractUrlsWithoutProtocol: false});\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkUsernamesOrLists = function(text, options) {\n var entities = twttr.txt.extractMentionsOrListsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkHashtags = function(text, options) {\n var entities = twttr.txt.extractHashtagsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkCashtags = function(text, options) {\n var entities = twttr.txt.extractCashtagsWithIndices(text);\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.autoLinkUrlsCustom = function(text, options) {\n var entities = twttr.txt.extractUrlsWithIndices(text, {extractUrlsWithoutProtocol: false});\n return twttr.txt.autoLinkEntities(text, entities, options);\n };\n\n twttr.txt.removeOverlappingEntities = function(entities) {\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n\n var prev = entities[0];\n for (var i = 1; i < entities.length; i++) {\n if (prev.indices[1] > entities[i].indices[0]) {\n entities.splice(i, 1);\n i--;\n } else {\n prev = entities[i];\n }\n }\n };\n\n twttr.txt.extractEntitiesWithIndices = function(text, options) {\n var entities = twttr.txt.extractUrlsWithIndices(text, options)\n .concat(twttr.txt.extractMentionsOrListsWithIndices(text))\n .concat(twttr.txt.extractHashtagsWithIndices(text, {checkUrlOverlap: false}))\n .concat(twttr.txt.extractCashtagsWithIndices(text));\n\n if (entities.length == 0) {\n return [];\n }\n\n twttr.txt.removeOverlappingEntities(entities);\n return entities;\n };\n\n twttr.txt.extractMentions = function(text) {\n var screenNamesOnly = [],\n screenNamesWithIndices = twttr.txt.extractMentionsWithIndices(text);\n\n for (var i = 0; i < screenNamesWithIndices.length; i++) {\n var screenName = screenNamesWithIndices[i].screenName;\n screenNamesOnly.push(screenName);\n }\n\n return screenNamesOnly;\n };\n\n twttr.txt.extractMentionsWithIndices = function(text) {\n var mentions = [],\n mentionOrList,\n mentionsOrLists = twttr.txt.extractMentionsOrListsWithIndices(text);\n\n for (var i = 0 ; i < mentionsOrLists.length; i++) {\n mentionOrList = mentionsOrLists[i];\n if (mentionOrList.listSlug == '') {\n mentions.push({\n screenName: mentionOrList.screenName,\n indices: mentionOrList.indices\n });\n }\n }\n\n return mentions;\n };\n\n /**\n * Extract list or user mentions.\n * (Presence of listSlug indicates a list)\n */\n twttr.txt.extractMentionsOrListsWithIndices = function(text) {\n if (!text || !text.match(twttr.txt.regexen.atSigns)) {\n return [];\n }\n\n var possibleNames = [],\n slashListname;\n\n text.replace(twttr.txt.regexen.validMentionOrList, function(match, before, atSign, screenName, slashListname, offset, chunk) {\n var after = chunk.slice(offset + match.length);\n if (!after.match(twttr.txt.regexen.endMentionMatch)) {\n slashListname = slashListname || '';\n var startPosition = offset + before.length;\n var endPosition = startPosition + screenName.length + slashListname.length + 1;\n possibleNames.push({\n screenName: screenName,\n listSlug: slashListname,\n indices: [startPosition, endPosition]\n });\n }\n });\n\n return possibleNames;\n };\n\n\n twttr.txt.extractReplies = function(text) {\n if (!text) {\n return null;\n }\n\n var possibleScreenName = text.match(twttr.txt.regexen.validReply);\n if (!possibleScreenName ||\n RegExp.rightContext.match(twttr.txt.regexen.endMentionMatch)) {\n return null;\n }\n\n return possibleScreenName[1];\n };\n\n twttr.txt.extractUrls = function(text, options) {\n var urlsOnly = [],\n urlsWithIndices = twttr.txt.extractUrlsWithIndices(text, options);\n\n for (var i = 0; i < urlsWithIndices.length; i++) {\n urlsOnly.push(urlsWithIndices[i].url);\n }\n\n return urlsOnly;\n };\n\n twttr.txt.extractUrlsWithIndices = function(text, options) {\n if (!options) {\n options = {extractUrlsWithoutProtocol: true};\n }\n if (!text || (options.extractUrlsWithoutProtocol ? !text.match(/\\./) : !text.match(/:/))) {\n return [];\n }\n\n var urls = [];\n\n while (twttr.txt.regexen.extractUrl.exec(text)) {\n var before = RegExp.$2, url = RegExp.$3, protocol = RegExp.$4, domain = RegExp.$5, path = RegExp.$7;\n var endPosition = twttr.txt.regexen.extractUrl.lastIndex,\n startPosition = endPosition - url.length;\n\n // if protocol is missing and domain contains non-ASCII characters,\n // extract ASCII-only domains.\n if (!protocol) {\n if (!options.extractUrlsWithoutProtocol\n || before.match(twttr.txt.regexen.invalidUrlWithoutProtocolPrecedingChars)) {\n continue;\n }\n var lastUrl = null,\n asciiEndPosition = 0;\n domain.replace(twttr.txt.regexen.validAsciiDomain, function(asciiDomain) {\n var asciiStartPosition = domain.indexOf(asciiDomain, asciiEndPosition);\n asciiEndPosition = asciiStartPosition + asciiDomain.length;\n lastUrl = {\n url: asciiDomain,\n indices: [startPosition + asciiStartPosition, startPosition + asciiEndPosition]\n };\n if (path\n || asciiDomain.match(twttr.txt.regexen.validSpecialShortDomain)\n || !asciiDomain.match(twttr.txt.regexen.invalidShortDomain)) {\n urls.push(lastUrl);\n }\n });\n\n // no ASCII-only domain found. Skip the entire URL.\n if (lastUrl == null) {\n continue;\n }\n\n // lastUrl only contains domain. Need to add path and query if they exist.\n if (path) {\n lastUrl.url = url.replace(domain, lastUrl.url);\n lastUrl.indices[1] = endPosition;\n }\n } else {\n // In the case of t.co URLs, don't allow additional path characters.\n if (url.match(twttr.txt.regexen.validTcoUrl)) {\n url = RegExp.lastMatch;\n endPosition = startPosition + url.length;\n }\n urls.push({\n url: url,\n indices: [startPosition, endPosition]\n });\n }\n }\n\n return urls;\n };\n\n twttr.txt.extractHashtags = function(text) {\n var hashtagsOnly = [],\n hashtagsWithIndices = twttr.txt.extractHashtagsWithIndices(text);\n\n for (var i = 0; i < hashtagsWithIndices.length; i++) {\n hashtagsOnly.push(hashtagsWithIndices[i].hashtag);\n }\n\n return hashtagsOnly;\n };\n\n twttr.txt.extractHashtagsWithIndices = function(text, options) {\n if (!options) {\n options = {checkUrlOverlap: true};\n }\n\n if (!text || !text.match(twttr.txt.regexen.hashSigns)) {\n return [];\n }\n\n var tags = [];\n\n text.replace(twttr.txt.regexen.validHashtag, function(match, before, hash, hashText, offset, chunk) {\n var after = chunk.slice(offset + match.length);\n if (after.match(twttr.txt.regexen.endHashtagMatch))\n return;\n var startPosition = offset + before.length;\n var endPosition = startPosition + hashText.length + 1;\n tags.push({\n hashtag: hashText,\n indices: [startPosition, endPosition]\n });\n });\n\n if (options.checkUrlOverlap) {\n // also extract URL entities\n var urls = twttr.txt.extractUrlsWithIndices(text);\n if (urls.length > 0) {\n var entities = tags.concat(urls);\n // remove overlap\n twttr.txt.removeOverlappingEntities(entities);\n // only push back hashtags\n tags = [];\n for (var i = 0; i < entities.length; i++) {\n if (entities[i].hashtag) {\n tags.push(entities[i]);\n }\n }\n }\n }\n\n return tags;\n };\n\n twttr.txt.extractCashtags = function(text) {\n var cashtagsOnly = [],\n cashtagsWithIndices = twttr.txt.extractCashtagsWithIndices(text);\n\n for (var i = 0; i < cashtagsWithIndices.length; i++) {\n cashtagsOnly.push(cashtagsWithIndices[i].cashtag);\n }\n\n return cashtagsOnly;\n };\n\n twttr.txt.extractCashtagsWithIndices = function(text) {\n if (!text || text.indexOf(\"$\") == -1) {\n return [];\n }\n\n var tags = [];\n\n text.replace(twttr.txt.regexen.validCashtag, function(match, before, dollar, cashtag, offset, chunk) {\n var startPosition = offset + before.length;\n var endPosition = startPosition + cashtag.length + 1;\n tags.push({\n cashtag: cashtag,\n indices: [startPosition, endPosition]\n });\n });\n\n return tags;\n };\n\n twttr.txt.modifyIndicesFromUnicodeToUTF16 = function(text, entities) {\n twttr.txt.convertUnicodeIndices(text, entities, false);\n };\n\n twttr.txt.modifyIndicesFromUTF16ToUnicode = function(text, entities) {\n twttr.txt.convertUnicodeIndices(text, entities, true);\n };\n\n twttr.txt.getUnicodeTextLength = function(text) {\n return text.replace(twttr.txt.regexen.non_bmp_code_pairs, ' ').length;\n };\n\n twttr.txt.convertUnicodeIndices = function(text, entities, indicesInUTF16) {\n if (entities.length == 0) {\n return;\n }\n\n var charIndex = 0;\n var codePointIndex = 0;\n\n // sort entities by start index\n entities.sort(function(a,b){ return a.indices[0] - b.indices[0]; });\n var entityIndex = 0;\n var entity = entities[0];\n\n while (charIndex < text.length) {\n if (entity.indices[0] == (indicesInUTF16 ? charIndex : codePointIndex)) {\n var len = entity.indices[1] - entity.indices[0];\n entity.indices[0] = indicesInUTF16 ? codePointIndex : charIndex;\n entity.indices[1] = entity.indices[0] + len;\n\n entityIndex++;\n if (entityIndex == entities.length) {\n // no more entity\n break;\n }\n entity = entities[entityIndex];\n }\n\n var c = text.charCodeAt(charIndex);\n if (0xD800 <= c && c <= 0xDBFF && charIndex < text.length - 1) {\n // Found high surrogate char\n c = text.charCodeAt(charIndex + 1);\n if (0xDC00 <= c && c <= 0xDFFF) {\n // Found surrogate pair\n charIndex++;\n }\n }\n codePointIndex++;\n charIndex++;\n }\n };\n\n // this essentially does text.split(/<|>/)\n // except that won't work in IE, where empty strings are ommitted\n // so \"<>\".split(/<|>/) => [] in IE, but is [\"\", \"\", \"\"] in all others\n // but \"<<\".split(\"<\") => [\"\", \"\", \"\"]\n twttr.txt.splitTags = function(text) {\n var firstSplits = text.split(\"<\"),\n secondSplits,\n allSplits = [],\n split;\n\n for (var i = 0; i < firstSplits.length; i += 1) {\n split = firstSplits[i];\n if (!split) {\n allSplits.push(\"\");\n } else {\n secondSplits = split.split(\">\");\n for (var j = 0; j < secondSplits.length; j += 1) {\n allSplits.push(secondSplits[j]);\n }\n }\n }\n\n return allSplits;\n };\n\n twttr.txt.hitHighlight = function(text, hits, options) {\n var defaultHighlightTag = \"em\";\n\n hits = hits || [];\n options = options || {};\n\n if (hits.length === 0) {\n return text;\n }\n\n var tagName = options.tag || defaultHighlightTag,\n tags = [\"<\" + tagName + \">\", \"</\" + tagName + \">\"],\n chunks = twttr.txt.splitTags(text),\n i,\n j,\n result = \"\",\n chunkIndex = 0,\n chunk = chunks[0],\n prevChunksLen = 0,\n chunkCursor = 0,\n startInChunk = false,\n chunkChars = chunk,\n flatHits = [],\n index,\n hit,\n tag,\n placed,\n hitSpot;\n\n for (i = 0; i < hits.length; i += 1) {\n for (j = 0; j < hits[i].length; j += 1) {\n flatHits.push(hits[i][j]);\n }\n }\n\n for (index = 0; index < flatHits.length; index += 1) {\n hit = flatHits[index];\n tag = tags[index % 2];\n placed = false;\n\n while (chunk != null && hit >= prevChunksLen + chunk.length) {\n result += chunkChars.slice(chunkCursor);\n if (startInChunk && hit === prevChunksLen + chunkChars.length) {\n result += tag;\n placed = true;\n }\n\n if (chunks[chunkIndex + 1]) {\n result += \"<\" + chunks[chunkIndex + 1] + \">\";\n }\n\n prevChunksLen += chunkChars.length;\n chunkCursor = 0;\n chunkIndex += 2;\n chunk = chunks[chunkIndex];\n chunkChars = chunk;\n startInChunk = false;\n }\n\n if (!placed && chunk != null) {\n hitSpot = hit - prevChunksLen;\n result += chunkChars.slice(chunkCursor, hitSpot) + tag;\n chunkCursor = hitSpot;\n if (index % 2 === 0) {\n startInChunk = true;\n } else {\n startInChunk = false;\n }\n } else if(!placed) {\n placed = true;\n result += tag;\n }\n }\n\n if (chunk != null) {\n if (chunkCursor < chunkChars.length) {\n result += chunkChars.slice(chunkCursor);\n }\n for (index = chunkIndex + 1; index < chunks.length; index += 1) {\n result += (index % 2 === 0 ? chunks[index] : \"<\" + chunks[index] + \">\");\n }\n }\n\n return result;\n };\n\n var MAX_LENGTH = 140;\n\n // Returns the length of Tweet text with consideration to t.co URL replacement\n // and chars outside the basic multilingual plane that use 2 UTF16 code points\n twttr.txt.getTweetLength = function(text, options) {\n if (!options) {\n options = {\n // These come from https://api.twitter.com/1.1/help/configuration.json\n // described by https://dev.twitter.com/rest/reference/get/help/configuration\n short_url_length: 23,\n short_url_length_https: 23\n };\n }\n var textLength = twttr.txt.getUnicodeTextLength(text),\n urlsWithIndices = twttr.txt.extractUrlsWithIndices(text);\n twttr.txt.modifyIndicesFromUTF16ToUnicode(text, urlsWithIndices);\n\n for (var i = 0; i < urlsWithIndices.length; i++) {\n // Subtract the length of the original URL\n textLength += urlsWithIndices[i].indices[0] - urlsWithIndices[i].indices[1];\n\n // Add 23 characters for URL starting with https://\n // http:// URLs still use https://t.co so they are 23 characters as well\n if (urlsWithIndices[i].url.toLowerCase().match(twttr.txt.regexen.urlHasHttps)) {\n textLength += options.short_url_length_https;\n } else {\n textLength += options.short_url_length;\n }\n }\n\n return textLength;\n };\n\n // Check the text for any reason that it may not be valid as a Tweet. This is meant as a pre-validation\n // before posting to api.twitter.com. There are several server-side reasons for Tweets to fail but this pre-validation\n // will allow quicker feedback.\n //\n // Returns false if this text is valid. Otherwise one of the following strings will be returned:\n //\n // \"too_long\": if the text is too long\n // \"empty\": if the text is nil or empty\n // \"invalid_characters\": if the text contains non-Unicode or any of the disallowed Unicode characters\n twttr.txt.isInvalidTweet = function(text) {\n if (!text) {\n return \"empty\";\n }\n\n // Determine max length independent of URL length\n if (twttr.txt.getTweetLength(text) > MAX_LENGTH) {\n return \"too_long\";\n }\n\n if (twttr.txt.hasInvalidCharacters(text)) {\n return \"invalid_characters\";\n }\n\n return false;\n };\n\n twttr.txt.hasInvalidCharacters = function(text) {\n return twttr.txt.regexen.invalid_chars.test(text);\n };\n\n twttr.txt.isValidTweetText = function(text) {\n return !twttr.txt.isInvalidTweet(text);\n };\n\n twttr.txt.isValidUsername = function(username) {\n if (!username) {\n return false;\n }\n\n var extracted = twttr.txt.extractMentions(username);\n\n // Should extract the username minus the @ sign, hence the .slice(1)\n return extracted.length === 1 && extracted[0] === username.slice(1);\n };\n\n var VALID_LIST_RE = regexSupplant(/^#{validMentionOrList}$/);\n\n twttr.txt.isValidList = function(usernameList) {\n var match = usernameList.match(VALID_LIST_RE);\n\n // Must have matched and had nothing before or after\n return !!(match && match[1] == \"\" && match[4]);\n };\n\n twttr.txt.isValidHashtag = function(hashtag) {\n if (!hashtag) {\n return false;\n }\n\n var extracted = twttr.txt.extractHashtags(hashtag);\n\n // Should extract the hashtag minus the # sign, hence the .slice(1)\n return extracted.length === 1 && extracted[0] === hashtag.slice(1);\n };\n\n twttr.txt.isValidUrl = function(url, unicodeDomains, requireProtocol) {\n if (unicodeDomains == null) {\n unicodeDomains = true;\n }\n\n if (requireProtocol == null) {\n requireProtocol = true;\n }\n\n if (!url) {\n return false;\n }\n\n var urlParts = url.match(twttr.txt.regexen.validateUrlUnencoded);\n\n if (!urlParts || urlParts[0] !== url) {\n return false;\n }\n\n var scheme = urlParts[1],\n authority = urlParts[2],\n path = urlParts[3],\n query = urlParts[4],\n fragment = urlParts[5];\n\n if (!(\n (!requireProtocol || (isValidMatch(scheme, twttr.txt.regexen.validateUrlScheme) && scheme.match(/^https?$/i))) &&\n isValidMatch(path, twttr.txt.regexen.validateUrlPath) &&\n isValidMatch(query, twttr.txt.regexen.validateUrlQuery, true) &&\n isValidMatch(fragment, twttr.txt.regexen.validateUrlFragment, true)\n )) {\n return false;\n }\n\n return (unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlUnicodeAuthority)) ||\n (!unicodeDomains && isValidMatch(authority, twttr.txt.regexen.validateUrlAuthority));\n };\n\n function isValidMatch(string, regex, optional) {\n if (!optional) {\n // RegExp[\"$&\"] is the text of the last match\n // blank strings are ok, but are falsy, so we check stringiness instead of truthiness\n return ((typeof string === \"string\") && string.match(regex) && RegExp[\"$&\"] === string);\n }\n\n // RegExp[\"$&\"] is the text of the last match\n return (!string || (string.match(regex) && RegExp[\"$&\"] === string));\n }\n\n if (typeof module != 'undefined' && module.exports) {\n module.exports = twttr.txt;\n }\n\n if (typeof define == 'function' && define.amd) {\n define([], twttr.txt);\n }\n\n if (typeof window != 'undefined') {\n if (window.twttr) {\n for (var prop in twttr) {\n window.twttr[prop] = twttr[prop];\n }\n } else {\n window.twttr = twttr;\n }\n }\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/twitter-text/twitter-text.js\n ** module id = 39\n ** module chunks = 0\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\n\nimport appendChild from '../render/appendChild';\nimport {\n addEventListener,\n removeEventListener\n} from './event';\nimport {\n BORDER_COLOR,\n disableUserSelect,\n enableUserSelect,\n findSVGContainer,\n findSVGAtPoint,\n getAnnotationRect,\n getMetadata,\n scaleDown,\n scaleUp\n} from './utils';\nimport {selectComment} from \"./comments\";\nimport {readonly} from \"../initFile\";\n\nlet _enabled = false;\nlet isDragging = false, overlay;\nlet dragOffsetX, dragOffsetY, dragStartX, dragStartY;\nconst OVERLAY_BORDER_SIZE = 3;\n\n/**\n * Create an overlay for editing an annotation.\n *\n * @param {Element} target The annotation element to apply overlay for\n */\nexport function createEditOverlay(target) {\n destroyEditOverlay();\n\n overlay = document.createElement('div');\n let anchor = document.createElement('a');\n let parentNode = findSVGContainer(target).parentNode;\n let id = target.getAttribute('data-pdf-annotate-id');\n let rect = getAnnotationRect(target);\n let styleLeft = rect.left - OVERLAY_BORDER_SIZE;\n let styleTop = rect.top - OVERLAY_BORDER_SIZE;\n \n overlay.setAttribute('id', 'pdf-annotate-edit-overlay');\n overlay.setAttribute('data-target-id', id);\n overlay.style.boxSizing = 'content-box';\n overlay.style.position = 'absolute';\n overlay.style.top = `${styleTop}px`;\n overlay.style.left = `${styleLeft}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.border = `${OVERLAY_BORDER_SIZE}px solid ${BORDER_COLOR}`;\n overlay.style.borderRadius = `${OVERLAY_BORDER_SIZE}px`;\n\n anchor.innerHTML = '×';\n anchor.setAttribute('href', 'javascript://');\n anchor.style.background = '#fff';\n anchor.style.borderRadius = '20px';\n anchor.style.border = '1px solid #bbb';\n anchor.style.color = '#bbb';\n anchor.style.fontSize = '16px';\n anchor.style.padding = '2px';\n anchor.style.textAlign = 'center';\n anchor.style.textDecoration = 'none';\n anchor.style.position = 'absolute';\n anchor.style.top = '-13px';\n anchor.style.right = '-13px';\n anchor.style.width = '25px';\n anchor.style.height = '25px';\n\n if(readonly)\n anchor.style.display = 'none';\n overlay.appendChild(anchor);\n parentNode.appendChild(overlay);\n document.addEventListener('click', handleDocumentClick);\n document.addEventListener('keyup', handleDocumentKeyup);\n document.addEventListener('mousedown', handleDocumentMousedown);\n anchor.addEventListener('click', deleteAnnotation);\n anchor.addEventListener('mouseover', () => {\n anchor.style.color = '#35A4DC';\n anchor.style.borderColor = '#999';\n anchor.style.boxShadow = '0 1px 1px #ccc';\n });\n anchor.addEventListener('mouseout', () => {\n anchor.style.color = '#bbb';\n anchor.style.borderColor = '#bbb';\n anchor.style.boxShadow = '';\n });\n overlay.addEventListener('mouseover', () => {\n if (!isDragging&&!readonly) { anchor.style.display = ''; }\n });\n overlay.addEventListener('mouseout', () => {\n anchor.style.display = 'none';\n });\n}\n\n/**\n * Destroy the edit overlay if it exists.\n */\nfunction destroyEditOverlay() {\n if (overlay) {\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n }\n document.removeEventListener('click', handleDocumentClick);\n document.removeEventListener('keyup', handleDocumentKeyup);\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n enableUserSelect();\n}\n\n/**\n * Delete currently selected annotation\n */\nfunction deleteAnnotation() {\n if (!overlay) { return; }\n\n let annotationId = overlay.getAttribute('data-target-id');\n let nodes = document.querySelectorAll(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let { documentId } = getMetadata(svg);\n\n [...nodes].forEach((n) => {\n n.parentNode.removeChild(n);\n });\n \n PDFJSAnnotate.getStoreAdapter().deleteAnnotation(documentId, annotationId);\n\n destroyEditOverlay();\n}\n\n/**\n * Handle document.click event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentClick(e) {\n if (!findSVGAtPoint(e.clientX, e.clientY)) { return; }\n\n // Remove current overlay\n let overlay = document.getElementById('pdf-annotate-edit-overlay');\n if (overlay) {\n if (isDragging || e.target === overlay) {\n return;\n }\n destroyEditOverlay();\n }\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentKeyup(e) {\n if (overlay && e.keyCode === 46 &&\n e.target.nodeName.toLowerCase() !== 'textarea' &&\n e.target.nodeName.toLowerCase() !== 'input') {\n if(!readonly)\n deleteAnnotation();\n }\n}\n\n/**\n * Handle document.mousedown event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMousedown(e) {\n if (e.target !== overlay) { return; }\n\n // Highlight and strikeout annotations are bound to text within the document.\n // It doesn't make sense to allow repositioning these types of annotations.\n let annotationId = overlay.getAttribute('data-target-id');\n let target = document.querySelector(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let type = target.getAttribute('data-pdf-annotate-type');\n\n if (type === 'highlight' || type === 'strikeout') { return; }\n\n if(!readonly)\n isDragging = true;\n dragOffsetX = e.clientX;\n dragOffsetY = e.clientY;\n dragStartX = overlay.offsetLeft;\n dragStartY = overlay.offsetTop;\n\n overlay.style.background = 'rgba(255, 255, 255, 0.7)';\n overlay.style.cursor = 'move';\n // if(!readonly)\n overlay.querySelector('a').style.display = 'none';\n\n document.addEventListener('mousemove', handleDocumentMousemove);\n document.addEventListener('mouseup', handleDocumentMouseup);\n disableUserSelect();\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMousemove(e) {\n if(readonly)\n return;\n let annotationId = overlay.getAttribute('data-target-id');\n let parentNode = overlay.parentNode;\n let rect = parentNode.getBoundingClientRect();\n let y = (dragStartY + (e.clientY - dragOffsetY));\n let x = (dragStartX + (e.clientX - dragOffsetX));\n let minY = 0;\n let maxY = rect.height;\n let minX = 0;\n let maxX = rect.width;\n\n if (y > minY && y + overlay.offsetHeight < maxY) {\n overlay.style.top = `${y}px`;\n }\n\n if (x > minX && x + overlay.offsetWidth < maxX) {\n overlay.style.left = `${x}px`;\n }\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event that needs to be handled\n */\nfunction handleDocumentMouseup(e) {\n let annotationId = overlay.getAttribute('data-target-id');\n let target = document.querySelectorAll(`[data-pdf-annotate-id=\"${annotationId}\"]`);\n let type = target[0].getAttribute('data-pdf-annotate-type');\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let { documentId } = getMetadata(svg);\n \n overlay.querySelector('a').style.display = '';\n\n function getDelta(propX, propY) {\n return calcDelta(parseInt(target[0].getAttribute(propX), 10), parseInt(target[0].getAttribute(propY), 10));\n }\n\n function calcDelta(x, y) {\n return {\n deltaX: OVERLAY_BORDER_SIZE + scaleDown(svg, {x: overlay.offsetLeft}).x - x,\n deltaY: OVERLAY_BORDER_SIZE + scaleDown(svg, {y: overlay.offsetTop}).y - y\n };\n }\n\n PDFJSAnnotate.getStoreAdapter().getAnnotation(documentId, annotationId).then((annotation) => {\n if (['area', 'highlight', 'point', 'textbox'].indexOf(type) > -1) {\n let { deltaX, deltaY } = getDelta('x', 'y');\n [...target].forEach((t, i) => {\n if (deltaY !== 0) {\n let modelY = parseInt(t.getAttribute('y'), 10) + deltaY;\n let viewY = modelY;\n\n if (type === 'textbox') {\n viewY += annotation.size;\n }\n\n if (type === 'point' && !$.browser.mozilla) {\n viewY = scaleUp(svg, { viewY }).viewY;\n }\n if($.browser.mozilla)\n viewY -= 8;\n\n t.setAttribute('y', viewY);\n if (annotation.rectangles) {\n annotation.rectangles[i].y = modelY;\n } else if (annotation.y) {\n annotation.y = modelY;\n }\n }\n if (deltaX !== 0) {\n let modelX = parseInt(t.getAttribute('x'), 10) + deltaX;\n let viewX = modelX;\n\n if (type === 'point' && !$.browser.mozilla) {\n viewX = scaleUp(svg, { viewX }).viewX;\n }\n if($.browser.mozilla)\n viewX -= 8;\n\n t.setAttribute('x', viewX);\n if (annotation.rectangles) {\n annotation.rectangles[i].x = modelX;\n } else if (annotation.x) {\n annotation.x = modelX;\n }\n }\n });\n // } else if (type === 'strikeout') {\n // let { deltaX, deltaY } = getDelta('x1', 'y1');\n // [...target].forEach(target, (t, i) => {\n // if (deltaY !== 0) {\n // t.setAttribute('y1', parseInt(t.getAttribute('y1'), 10) + deltaY);\n // t.setAttribute('y2', parseInt(t.getAttribute('y2'), 10) + deltaY);\n // annotation.rectangles[i].y = parseInt(t.getAttribute('y1'), 10);\n // }\n // if (deltaX !== 0) {\n // t.setAttribute('x1', parseInt(t.getAttribute('x1'), 10) + deltaX);\n // t.setAttribute('x2', parseInt(t.getAttribute('x2'), 10) + deltaX);\n // annotation.rectangles[i].x = parseInt(t.getAttribute('x1'), 10);\n // }\n // });\n } else if (type === 'drawing') {\n let rect = scaleDown(svg, getAnnotationRect(target[0]));\n let [originX, originY] = annotation.lines[0];\n let { deltaX, deltaY } = calcDelta(originX, originY);\n\n // origin isn't necessarily at 0/0 in relation to overlay x/y\n // adjust the difference between overlay and drawing coords\n deltaY += (originY - rect.top);\n deltaX += (originX - rect.left);\n\n annotation.lines.forEach((line, i) => {\n let [x, y] = annotation.lines[i];\n annotation.lines[i][0] = x + deltaX;\n annotation.lines[i][1] = y + deltaY;\n });\n\n target[0].parentNode.removeChild(target[0]);\n appendChild(svg, annotation);\n }\n\n if(!readonly)\n PDFJSAnnotate.getStoreAdapter().editAnnotation(documentId, annotationId, annotation);\n });\n\n setTimeout(() => {\n isDragging = false;\n }, 0);\n\n overlay.style.background = '';\n overlay.style.cursor = '';\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n enableUserSelect();\n}\n\n/**\n * Handle annotation.click event\n *\n * @param {Element} e The annotation element that was clicked\n */\nfunction handleAnnotationClick(target) {\n const type = target.dataset['pdfAnnotateType']\n if(type==='point')\n selectComment(target.dataset['pdfAnnotateId']);\n createEditOverlay(target);\n}\n\n/**\n * Enable edit mode behavior.\n */\nexport function enableEdit () {\n if (_enabled) { return; }\n\n _enabled = true;\n addEventListener('annotation:click', handleAnnotationClick);\n};\n\n/**\n * Disable edit mode behavior.\n */\nexport function disableEdit () {\n destroyEditOverlay();\n\n\n if (!_enabled) { return; }\n\n _enabled = false;\n removeEventListener('annotation:click', handleAnnotationClick);\n};\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/edit.js\n **/","import objectAssign from 'object-assign';\nimport renderLine from './renderLine';\nimport renderPath from './renderPath';\nimport renderPoint from './renderPoint';\nimport renderRect from './renderRect';\nimport renderText from './renderText';\n\nconst isFirefox = /firefox/i.test(navigator.userAgent);\n\n/**\n * Get the x/y translation to be used for transforming the annotations\n * based on the rotation of the viewport.\n *\n * @param {Object} viewport The viewport data from the page\n * @return {Object}\n */\nfunction getTranslation(viewport) {\n let x;\n let y;\n\n // Modulus 360 on the rotation so that we only\n // have to worry about four possible values.\n switch(viewport.rotation % 360) {\n case 0:\n x = y = 0;\n break;\n case 90:\n x = 0;\n y = (viewport.width / viewport.scale) * -1;\n break;\n case 180:\n x = (viewport.width / viewport.scale) * -1;\n y = (viewport.height / viewport.scale) * -1;\n break;\n case 270:\n x = (viewport.height / viewport.scale) * -1;\n y = 0;\n break;\n }\n\n return { x, y };\n}\n\n/**\n * Transform the rotation and scale of a node using SVG's native transform attribute.\n *\n * @param {Node} node The node to be transformed\n * @param {Object} viewport The page's viewport data\n * @return {Node}\n */\nfunction transform(node, viewport) {\n let trans = getTranslation(viewport);\n\n // Let SVG natively transform the element\n node.setAttribute('transform', `scale(${viewport.scale}) rotate(${viewport.rotation}) translate(${trans.x}, ${trans.y})`);\n \n // Manually adjust x/y for nested SVG nodes\n if (!isFirefox && node.nodeName.toLowerCase() === 'svg') {\n node.setAttribute('x', parseInt(node.getAttribute('x'), 10) * viewport.scale);\n node.setAttribute('y', parseInt(node.getAttribute('y'), 10) * viewport.scale);\n\n let x = parseInt(node.getAttribute('x', 10));\n let y = parseInt(node.getAttribute('y', 10));\n let width = parseInt(node.getAttribute('width'), 10);\n let height = parseInt(node.getAttribute('height'), 10);\n let path = node.querySelector('path');\n let svg = path.parentNode;\n \n // Scale width/height\n [node, svg, path, node.querySelector('rect')].forEach((n) => {\n n.setAttribute('width', parseInt(n.getAttribute('width'), 10) * viewport.scale);\n n.setAttribute('height', parseInt(n.getAttribute('height'), 10) * viewport.scale);\n });\n\n // Transform path but keep scale at 100% since it will be handled natively\n transform(path, objectAssign({}, viewport, { scale: 1 }));\n \n switch(viewport.rotation % 360) {\n case 90:\n node.setAttribute('x', viewport.width - y - width);\n node.setAttribute('y', x);\n svg.setAttribute('x', 1);\n svg.setAttribute('y', 0);\n break;\n case 180:\n node.setAttribute('x', viewport.width - x - width);\n node.setAttribute('y', viewport.height - y - height);\n svg.setAttribute('y', 2);\n break;\n case 270:\n node.setAttribute('x', y);\n node.setAttribute('y', viewport.height - x - height);\n svg.setAttribute('x', -1);\n svg.setAttribute('y', 0);\n break;\n }\n }\n\n return node;\n}\n\n/**\n * Append an annotation as a child of an SVG.\n *\n * @param {SVGElement} svg The SVG element to append the annotation to\n * @param {Object} annotation The annotation definition to render and append\n * @param {Object} viewport The page's viewport data\n * @return {SVGElement} A node that was created and appended by this function\n */\nexport default function appendChild(svg, annotation, viewport) {\n if (!viewport) {\n viewport = JSON.parse(svg.getAttribute('data-pdf-annotate-viewport'));\n }\n \n let child;\n switch (annotation.type) {\n case 'area':\n case 'highlight':\n child = renderRect(annotation);\n break;\n case 'strikeout':\n child = renderLine(annotation);\n break;\n case 'point':\n child = renderPoint(annotation);\n break;\n case 'textbox':\n child = renderText(annotation);\n break;\n case 'drawing':\n child = renderPath(annotation);\n break;\n }\n\n // If no type was provided for an annotation it will result in node being null.\n // Skip appending/transforming if node doesn't exist.\n if (child) {\n // Set attributes\n child.setAttribute('data-pdf-annotate-id', annotation.uuid);\n child.setAttribute('data-pdf-annotate-type', annotation.type);\n child.setAttribute('aria-hidden', true);\n\n svg.appendChild(transform(child, viewport));\n }\n\n return child;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/appendChild.js\n **/","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/object-assign/index.js\n ** module id = 42\n ** module chunks = 0\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGLineElements from an annotation definition.\n * This is used for anntations of type `strikeout`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGGElement} A group of all lines to be rendered\n */\nexport default function renderLine(a) {\n let group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n setAttributes(group, {\n stroke: normalizeColor(a.color || '#f00'),\n strokeWidth: 1\n });\n\n a.rectangles.forEach((r) => {\n let line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n\n setAttributes(line, {\n x1: r.x,\n y1: r.y,\n x2: r.x + r.width,\n y2: r.y,\n });\n\n group.appendChild(line);\n });\n\n return group;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderLine.js\n **/","const UPPER_REGEX = /[A-Z]/g;\n\n// Don't convert these attributes from camelCase to hyphenated-attributes\nconst BLACKLIST = [\n 'viewBox'\n];\n\nlet keyCase = (key) => {\n if (BLACKLIST.indexOf(key) === -1) {\n key = key.replace(UPPER_REGEX, match => '-' + match.toLowerCase());\n }\n return key;\n}\n\n/**\n * Set attributes for a node from a map\n *\n * @param {Node} node The node to set attributes on\n * @param {Object} attributes The map of key/value pairs to use for attributes\n */\nexport default function setAttributes(node, attributes) {\n Object.keys(attributes).forEach((key) => {\n node.setAttribute(keyCase(key), attributes[key]);\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/setAttributes.js\n **/","const REGEX_HASHLESS_HEX = /^([a-f0-9]{6}|[a-f0-9]{3})$/i;\n\n/**\n * Normalize a color value\n *\n * @param {String} color The color to normalize\n * @return {String}\n */\nexport default function normalizeColor(color) {\n if (REGEX_HASHLESS_HEX.test(color)) {\n color = `#${color}`;\n }\n return color;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/utils/normalizeColor.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGPathElement from an annotation definition.\n * This is used for anntations of type `drawing`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGPathElement} The path to be rendered\n */\nexport default function renderPath(a) {\n let d = [];\n let path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n \n for (let i=0, l=a.lines.length; i<l; i++) {\n var p1 = a.lines[i];\n var p2 = a.lines[i+1];\n if (p2) {\n d.push(`M${p1[0]} ${p1[1]} ${p2[0]} ${p2[1]}`);\n }\n }\n \n setAttributes(path, {\n d: `${d.join(' ')}Z`,\n stroke: normalizeColor(a.color || '#000'),\n strokeWidth: a.width || 1,\n fill: 'none'\n });\n\n return path;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderPath.js\n **/","import setAttributes from '../utils/setAttributes';\n\nconst SIZE = 25;\nconst D = 'M499.968 214.336q-113.832 0 -212.877 38.781t-157.356 104.625 -58.311 142.29q0 62.496 39.897 119.133t112.437 97.929l48.546 27.9 -15.066 53.568q-13.392 50.778 -39.06 95.976 84.816 -35.154 153.45 -95.418l23.994 -21.204 31.806 3.348q38.502 4.464 72.54 4.464 113.832 0 212.877 -38.781t157.356 -104.625 58.311 -142.29 -58.311 -142.29 -157.356 -104.625 -212.877 -38.781z';\n\n/**\n * Create SVGElement from an annotation definition.\n * This is used for anntations of type `comment`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGElement} A svg to be rendered\n */\nexport default function renderPoint(a) {\n let outerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n let innerSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n let path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n setAttributes(outerSVG, {\n width: SIZE,\n height: SIZE,\n x: a.x,\n y: a.y\n });\n\n setAttributes(innerSVG, {\n width: SIZE,\n height: SIZE,\n x: 0,\n y: (SIZE * 0.05) * -1,\n viewBox: '0 0 1000 1000'\n });\n\n setAttributes(rect, {\n width: SIZE,\n height: SIZE,\n stroke: '#000',\n fill: '#ff0'\n });\n\n setAttributes(path, {\n d: D,\n strokeWidth: 50,\n stroke: '#000',\n fill: '#fff'\n });\n\n innerSVG.appendChild(path);\n outerSVG.appendChild(rect);\n outerSVG.appendChild(innerSVG);\n\n return outerSVG;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderPoint.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGRectElements from an annotation definition.\n * This is used for anntations of type `area` and `highlight`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGGElement|SVGRectElement} A group of all rects to be rendered\n */\nexport default function renderRect(a) {\n if (a.type === 'highlight') {\n let group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n setAttributes(group, {\n fill: normalizeColor(a.color || '#ff0'),\n fillOpacity: 0.2\n });\n \n a.rectangles.forEach((r) => {\n group.appendChild(createRect(r));\n });\n\n return group;\n } else {\n let rect = createRect(a);\n setAttributes(rect, {\n stroke: normalizeColor(a.color || '#f00'),\n fill: 'none'\n });\n\n return rect;\n }\n}\n\nfunction createRect(r) {\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\n setAttributes(rect, {\n x: r.x,\n y: r.y,\n width: r.width,\n height: r.height\n });\n\n return rect;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderRect.js\n **/","import setAttributes from '../utils/setAttributes';\nimport normalizeColor from '../utils/normalizeColor';\n\n/**\n * Create SVGTextElement from an annotation definition.\n * This is used for anntations of type `textbox`.\n *\n * @param {Object} a The annotation definition\n * @return {SVGTextElement} A text to be rendered\n */\nexport default function renderText(a) {\n var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n\n setAttributes(text, {\n x: a.x,\n y: a.y + parseInt(a.size, 10),\n fill: normalizeColor(a.color || '#000'),\n fontSize: a.size\n });\n text.innerHTML = a.content;\n\n return text;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/renderText.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from './appendChild';\nimport renderScreenReaderHints from '../a11y/renderScreenReaderHints';\n\n/**\n * Render the response from PDFJSAnnotate.getStoreAdapter().getAnnotations to SVG\n *\n * @param {SVGElement} svg The SVG element to render the annotations to\n * @param {Object} viewport The page viewport data\n * @param {Object} data The response from PDFJSAnnotate.getStoreAdapter().getAnnotations\n * @return {Promise} Settled once rendering has completed\n * A settled Promise will be either:\n * - fulfilled: SVGElement\n * - rejected: Error\n */\nexport default function render(svg, viewport, data) {\n return new Promise((resolve, reject) => {\n // Reset the content of the SVG\n svg.innerHTML = ''; \n svg.setAttribute('data-pdf-annotate-container', true);\n svg.setAttribute('data-pdf-annotate-viewport', JSON.stringify(viewport));\n svg.removeAttribute('data-pdf-annotate-document');\n svg.removeAttribute('data-pdf-annotate-page');\n\n // If there's no data nothing can be done\n if (!data) {\n return resolve(svg);\n }\n\n svg.setAttribute('data-pdf-annotate-document', data.documentId);\n svg.setAttribute('data-pdf-annotate-page', data.pageNumber);\n \n // Make sure annotations is an array\n if (!Array.isArray(data.annotations) || data.annotations.length === 0) {\n return resolve(svg);\n }\n\n // Append annotation to svg\n data.annotations.forEach((a) => {\n appendChild(svg, a, viewport);\n });\n\n resolve(svg);\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/render/index.js\n **/","import insertScreenReaderHint from './insertScreenReaderHint';\nimport initEventHandlers from './initEventHandlers';\n\n// TODO This is not the right place for this to live\ninitEventHandlers();\n\n/**\n * Insert hints into the DOM for screen readers.\n *\n * @param {Array} annotations The annotations that hints are inserted for\n */\nexport default function renderScreenReaderHints(annotations) {\n annotations = Array.isArray(annotations) ? annotations : [];\n\n // Insert hints for each type\n Object.keys(SORT_TYPES).forEach((type) => {\n let sortBy = SORT_TYPES[type];\n annotations\n .filter((a) => a.type === type)\n .sort(sortBy)\n .forEach((a, i) => insertScreenReaderHint(a, i + 1));\n });\n}\n\n// Sort annotations first by y, then by x.\n// This allows hints to be injected in the order they appear,\n// which makes numbering them easier.\nfunction sortByPoint(a, b) {\n if (a.y < b.y) {\n return a.x - b.x;\n } else {\n return 1;\n }\n}\n\n// Sort annotation by it's first rectangle\nfunction sortByRectPoint(a, b) {\n return sortByPoint(a.rectangles[0], b.rectangles[0]);\n}\n\n// Sort annotation by it's first line\nfunction sortByLinePoint(a, b) {\n let lineA = a.lines[0];\n let lineB = b.lines[0];\n return sortByPoint(\n {x: lineA[0], y: lineA[1]},\n {x: lineB[0], y: lineB[1]}\n );\n}\n\n// Arrange supported types and associated sort methods\nconst SORT_TYPES = {\n 'highlight': sortByRectPoint,\n 'strikeout': sortByRectPoint,\n 'drawing': sortByLinePoint,\n 'textbox': sortByPoint,\n 'point': sortByPoint,\n 'area': sortByPoint\n};\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/renderScreenReaderHints.js\n **/","import createScreenReaderOnly from './createScreenReaderOnly';\nimport insertElementWithinChildren from './insertElementWithinChildren';\nimport insertElementWithinElement from './insertElementWithinElement';\nimport renderScreenReaderComments from './renderScreenReaderComments';\n\n// Annotation types that support comments\nconst COMMENT_TYPES = ['highlight', 'point', 'area'];\n\n/**\n * Insert a hint into the DOM for screen readers for a specific annotation.\n *\n * @param {Object} annotation The annotation to insert a hint for\n * @param {Number} num The number of the annotation out of all annotations of the same type\n */\nexport default function insertScreenReaderHint(annotation, num = 0) {\n switch (annotation.type) {\n case 'highlight':\n case 'strikeout':\n let rects = annotation.rectangles;\n let first = rects[0];\n let last = rects[rects.length - 1];\n\n insertElementWithinElement(\n createScreenReaderOnly(`Begin ${annotation.type} annotation ${num}`, annotation.uuid),\n first.x, first.y, annotation.page, true\n );\n\n insertElementWithinElement(\n createScreenReaderOnly(`End ${annotation.type} annotation ${num}`, `${annotation.uuid}-end`),\n last.x + last.width, last.y, annotation.page, false\n );\n break;\n\n case 'textbox':\n case 'point':\n let text = annotation.type === 'textbox' ? ` (content: ${annotation.content})` : '';\n\n insertElementWithinChildren(\n createScreenReaderOnly(`${annotation.type} annotation ${num}${text}`, annotation.uuid),\n annotation.x, annotation.y, annotation.page\n );\n break;\n\n case 'drawing':\n case 'area':\n let x = typeof annotation.x !== 'undefined' ? annotation.x : annotation.lines[0][0];\n let y = typeof annotation.y !== 'undefined' ? annotation.y : annotation.lines[0][1];\n\n insertElementWithinChildren(\n createScreenReaderOnly(`Unlabeled drawing`, annotation.uuid),\n x, y, annotation.page\n );\n break;\n }\n\n // Include comments in screen reader hint\n if (COMMENT_TYPES.includes(annotation.type)) {\n renderScreenReaderComments(annotation.documentId, annotation.uuid);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertScreenReaderHint.js\n **/","/**\n * Create a node that is only visible to screen readers\n *\n * @param {String} content The text content that should be read by screen reader\n * @param {String} [annotationId] The ID of the annotation assocaited\n * @return {Element} An Element that is only visible to screen readers\n */\nexport default function createScreenReaderOnly(content, annotationId) {\n let node = document.createElement('div');\n let text = document.createTextNode(content);\n node.appendChild(text);\n node.setAttribute('id', `pdf-annotate-screenreader-${annotationId}`);\n node.style.position = 'absolute';\n node.style.left = '-10000px';\n node.style.top = 'auto';\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.overflow = 'hidden';\n return node;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/createScreenReaderOnly.js\n **/","import insertElementWithinElement from './insertElementWithinElement';\nimport { pointIntersectsRect } from '../UI/utils';\nimport { scaleUp } from '../UI/utils'; \n\n/**\n * Insert an element at a point within the document.\n * This algorithm will try to insert between elements if possible.\n * It will however use `insertElementWithinElement` if it is more accurate.\n *\n * @param {Element} el The element to be inserted\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page number to limit elements to\n * @return {Boolean} True if element was able to be inserted, otherwise false\n */\nexport default function insertElementWithinChildren(el, x, y, pageNumber) {\n // Try and use most accurate method of inserting within an element\n if (insertElementWithinElement(el, x, y, pageNumber, true)) {\n return true;\n }\n\n // Fall back to inserting between elements\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let rect = svg.getBoundingClientRect();\n let nodes = [...svg.parentNode.querySelectorAll('.textLayer > div')];\n\n y = scaleUp(svg, {y}).y + rect.top;\n x = scaleUp(svg, {x}).x + rect.left;\n\n // Find the best node to insert before\n for (let i=0, l=nodes.length; i<l; i++) {\n let n = nodes[i];\n let r = n.getBoundingClientRect();\n if (y <= r.top) {\n n.parentNode.insertBefore(el, n);\n return true;\n }\n }\n\n // If all else fails try to append to the bottom\n let textLayer = svg.parentNode.querySelector('.textLayer');\n if (textLayer) {\n let textRect = textLayer.getBoundingClientRect();\n if (pointIntersectsRect(x, y, textRect)) {\n textLayer.appendChild(el);\n return true;\n }\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertElementWithinChildren.js\n **/","import {\n pointIntersectsRect,\n scaleUp,\n scaleDown\n} from '../UI/utils'; \n\n/**\n * Insert an element at a point within the document.\n * This algorithm will only insert within an element amidst it's text content.\n *\n * @param {Element} el The element to be inserted\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page number to limit elements to\n * @param {Boolean} insertBefore Whether the element is to be inserted before or after x\n * @return {Boolean} True if element was able to be inserted, otherwise false\n */\nexport default function insertElementWithinElement(el, x, y, pageNumber, insertBefore) {\n const OFFSET_ADJUST = 2;\n\n // If inserting before adjust `x` by looking for element a few px to the right\n // Otherwise adjust a few px to the left\n // This is to allow a little tolerance by searching within the box, instead\n // of getting a false negative by testing right on the border.\n x = Math.max(x + (OFFSET_ADJUST * (insertBefore ? 1 : -1)), 0);\n\n let node = textLayerElementFromPoint(x, y + OFFSET_ADJUST, pageNumber);\n if (!node) {\n return false;\n }\n \n // Now that node has been found inverse the adjustment for `x`.\n // This is done to accomodate tolerance by cutting off on the outside of the\n // text boundary, instead of missing a character by cutting off within.\n x = x + (OFFSET_ADJUST * (insertBefore ? -1 : 1));\n\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let left = scaleDown(svg, {left: node.getBoundingClientRect().left}).left - svg.getBoundingClientRect().left;\n let temp = node.cloneNode(true);\n let head = temp.innerHTML.split('');\n let tail = [];\n\n // Insert temp off screen\n temp.style.position = 'absolute';\n temp.style.top = '-10000px';\n temp.style.left = '-10000px';\n document.body.appendChild(temp);\n\n while (head.length) {\n // Don't insert within HTML tags\n if (head[head.length - 1] === '>') {\n while(head.length) {\n tail.unshift(head.pop());\n if (tail[0] === '<') {\n break;\n }\n }\n }\n \n // Check if width of temp based on current head value satisfies x\n temp.innerHTML = head.join('');\n let width = scaleDown(svg, {width: temp.getBoundingClientRect().width}).width;\n if (left + width <= x) {\n break;\n }\n tail.unshift(head.pop());\n }\n \n // Update original node with new markup, including element to be inserted\n node.innerHTML = head.join('') + el.outerHTML + tail.join('');\n temp.parentNode.removeChild(temp);\n\n return true;\n}\n\n/**\n * Get a text layer element at a given point on a page\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n * @param {Number} pageNumber The page to limit elements to\n * @return {Element} First text layer element found at the point\n */\nfunction textLayerElementFromPoint(x, y, pageNumber) {\n let svg = document.querySelector(`svg[data-pdf-annotate-page=\"${pageNumber}\"]`);\n let rect = svg.getBoundingClientRect();\n y = scaleUp(svg, {y}).y + rect.top;\n x = scaleUp(svg, {x}).x + rect.left;\n return [...svg.parentNode.querySelectorAll('.textLayer [data-canvas-width]')].filter((el) => {\n return pointIntersectsRect(x, y, el.getBoundingClientRect());\n })[0];\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertElementWithinElement.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport insertScreenReaderComment from './insertScreenReaderComment';\n\n/**\n * Insert the comments into the DOM to be available by screen reader\n *\n * Example output:\n * <div class=\"screenReaderOnly\">\n * <div>Begin highlight 1</div>\n * <ol aria-label=\"Comments\">\n * <li>Foo</li>\n * <li>Bar</li>\n * <li>Baz</li>\n * <li>Qux</li>\n * </ol>\n * </div>\n * <div>Some highlighted text goes here...</div>\n * <div class=\"screenReaderOnly\">End highlight 1</div>\n *\n * NOTE: `screenReaderOnly` is not a real class, just used for brevity\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The ID of the annotation\n * @param {Array} [comments] Optionally preloaded comments to be rendered\n * @return {Promise}\n */\nexport default function renderScreenReaderComments(documentId, annotationId, comments) {\n let promise;\n\n if (Array.isArray(comments)) {\n promise = Promise.resolve(comments);\n } else {\n promise = PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId);\n }\n\n return promise.then((comments) => {\n // Node needs to be found by querying DOM as it may have been inserted as innerHTML\n // leaving `screenReaderNode` as an invalid reference (see `insertElementWithinElement`).\n let node = document.getElementById(`pdf-annotate-screenreader-${annotationId}`);\n if (node) { \n let list = document.createElement('ol');\n list.setAttribute('id', `pdf-annotate-screenreader-comment-list-${annotationId}`);\n list.setAttribute('aria-label', 'Comments');\n node.appendChild(list);\n comments.forEach(insertScreenReaderComment);\n }\n });\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/renderScreenReaderComments.js\n **/","/**\n * Insert a comment into the DOM to be available by screen reader\n *\n * @param {Object} comment The comment to be inserted\n */\nexport default function insertScreenReaderComment(comment) {\n if (!comment) {\n return;\n }\n\n let list = document.querySelector(`#pdf-annotate-screenreader-${comment.annotation} ol`);\n if (list) {\n let item = document.createElement('li');\n item.setAttribute('id', `pdf-annotate-screenreader-comment-${comment.uuid}`);\n item.appendChild(document.createTextNode(`${comment.content}`));\n list.appendChild(item);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/insertScreenReaderComment.js\n **/","import insertScreenReaderHint from './insertScreenReaderHint';\nimport renderScreenReaderHints from './renderScreenReaderHints';\nimport insertScreenReaderComment from './insertScreenReaderComment';\nimport renderScreenReaderComments from './renderScreenReaderComments';\nimport { addEventListener } from '../UI/event';\nimport PDFJSAnnotate from '../PDFJSAnnotate';\n\n/**\n * Initialize the event handlers for keeping screen reader hints synced with data\n */\nexport default function initEventHandlers() {\n addEventListener('annotation:add', (documentId, pageNumber, annotation) => {\n reorderAnnotationsByType(documentId, pageNumber, annotation.type);\n });\n addEventListener('annotation:edit', (documentId, annotationId, annotation) => {\n reorderAnnotationsByType(documentId, annotation.page, annotation.type);\n });\n addEventListener('annotation:delete', removeAnnotation);\n addEventListener('comment:add', insertComment);\n addEventListener('comment:delete', removeComment);\n}\n\n/**\n * Reorder the annotation numbers by annotation type\n *\n * @param {String} documentId The ID of the document\n * @param {Number} pageNumber The page number of the annotations\n * @param {Strig} type The annotation type\n */\nfunction reorderAnnotationsByType(documentId, pageNumber, type) {\n PDFJSAnnotate.getStoreAdapter().getAnnotations(documentId)\n .then((annotationsByPage) => {\n let annotations = [];\n for(const page of Object.keys(annotationsByPage))\n for(const annotation in annotationsByPage[page]){\n if(annotation.type == type)\n annotations.push(annotation)\n }\n return annotations;\n // annotationsByPage(page) =\n // return annotationsByPage[page].filter((a) => {\n // return a.type === type;\n // });\n // return annotationsByPage;\n })\n .then((annotations) => {\n annotations.forEach((a) => {\n removeAnnotation(documentId, a.uuid);\n });\n\n return annotations;\n })\n .then(renderScreenReaderHints);\n}\n\n/**\n * Remove the screen reader hint for an annotation\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The Id of the annotation\n */\nfunction removeAnnotation(documentId, annotationId) {\n removeElementById(`pdf-annotate-screenreader-${annotationId}`);\n removeElementById(`pdf-annotate-screenreader-${annotationId}-end`);\n}\n\n/**\n * Insert a screen reader hint for a comment\n *\n * @param {String} documentId The ID of the document\n * @param {String} annotationId The ID of tha assocated annotation\n * @param {Object} comment The comment to insert a hint for\n */\nfunction insertComment(documentId, annotationId, comment) {\n let list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`);\n let promise;\n\n if (!list) {\n promise = renderScreenReaderComments(documentId, annotationId, []).then(() => {\n list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`);\n return true;\n });\n } else {\n promise = Promise.resolve(true);\n }\n\n promise.then(() => {\n insertScreenReaderComment(comment);\n });\n}\n\n/**\n * Remove a screen reader hint for a comment\n *\n * @param {String} documentId The ID of the document\n * @param {String} commentId The ID of the comment\n */\nfunction removeComment(documentId, commentId) {\n removeElementById(`pdf-annotate-screenreader-comment-${commentId}`);\n}\n\n/**\n * Remove an element from the DOM by it's ID if it exists\n *\n * @param {String} elementID The ID of the element to be removed\n */\nfunction removeElementById(elementId) {\n let el = document.getElementById(elementId);\n if (el) {\n el.parentNode.removeChild(el);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/a11y/initEventHandlers.js\n **/","import { addEventListener, removeEventListener, fireEvent } from './event';\nimport { disableEdit, enableEdit } from './edit';\nimport { disablePen, enablePen, setPen } from './pen';\nimport { disablePoint, enablePoint } from './point';\nimport { disableRect, enableRect } from './rect';\nimport { disableText, enableText, setText } from './text';\nimport { createPage, renderPage } from './page';\nimport { setActiveToolbarItem } from './utils';\n\n\nexport default {\n addEventListener, removeEventListener, fireEvent,\n disableEdit, enableEdit,\n disablePen, enablePen, setPen,\n disablePoint, enablePoint,\n disableRect, enableRect,\n disableText, enableText, setText,\n createPage, renderPage,\n setActiveToolbarItem\n};\n\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/index.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n disableUserSelect,\n enableUserSelect,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet _penSize;\nlet _penColor;\nlet path;\nlet lines;\n\n/**\n * Handle document.mousedown event\n */\nfunction handleDocumentMousedown() {\n path = null;\n lines = [];\n\n document.addEventListener('mousemove', handleDocumentMousemove);\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentMouseup(e) {\n let svg;\n if (lines.length > 1 && (svg = findSVGAtPoint(e.clientX, e.clientY))) {\n let { documentId, pageNumber } = getMetadata(svg);\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, {\n type: 'drawing',\n width: _penSize,\n color: _penColor,\n lines\n }\n ).then((annotation) => {\n if (path) {\n svg.removeChild(path);\n }\n\n appendChild(svg, annotation);\n });\n }\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentMousemove(e) {\n savePoint(e.clientX, e.clientY);\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event to be handled\n */\nfunction handleDocumentKeyup(e) {\n // Cancel rect if Esc is pressed\n if (e.keyCode === 27) {\n lines = null;\n path.parentNode.removeChild(path);\n document.removeEventListener('mousemove', handleDocumentMousemove);\n document.removeEventListener('mouseup', handleDocumentMouseup);\n }\n}\n\n/**\n * Save a point to the line being drawn.\n *\n * @param {Number} x The x coordinate of the point\n * @param {Number} y The y coordinate of the point\n */\nfunction savePoint(x, y) {\n let svg = findSVGAtPoint(x, y);\n if (!svg) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n let point = scaleDown(svg, {\n x: x - rect.left,\n y: y - rect.top\n });\n\n lines.push([point.x, point.y]);\n\n if (lines.length <= 1) {\n return;\n }\n\n if (path) {\n svg.removeChild(path);\n }\n\n path = appendChild(svg, {\n type: 'drawing',\n color: _penColor,\n width: _penSize,\n lines\n });\n}\n\n/**\n * Set the attributes of the pen.\n *\n * @param {Number} penSize The size of the lines drawn by the pen\n * @param {String} penColor The color of the lines drawn by the pen\n */\nexport function setPen(penSize = 1, penColor = '000000') {\n _penSize = parseInt(penSize, 10);\n _penColor = penColor;\n}\n\n/**\n * Enable the pen behavior\n */\nexport function enablePen() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mousedown', handleDocumentMousedown);\n document.addEventListener('keyup', handleDocumentKeyup);\n disableUserSelect();\n}\n\n/**\n * Disable the pen behavior\n */\nexport function disablePen() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('keyup', handleDocumentKeyup);\n enableUserSelect();\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/pen.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet input;\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} The DOM event to be handled\n */\nfunction handleDocumentMouseup(e) {\n\n if (input || !findSVGAtPoint(e.clientX, e.clientY)) {\n return\n }\n \n input = document.createElement('input');\n input.setAttribute('id', 'pdf-annotate-point-input');\n input.setAttribute('placeholder', 'Saisir un commentaire');\n input.style.border = `3px solid ${BORDER_COLOR}`;\n input.style.borderRadius = '3px';\n input.style.position = 'absolute';\n input.style.top = `${e.clientY}px`;\n input.style.left = `${e.clientX}px`;\n\n input.addEventListener('blur', handleInputBlur);\n input.addEventListener('keyup', handleInputKeyup);\n\n document.body.appendChild(input);\n input.focus();\n}\n\n/**\n * Handle input.blur event\n */\nfunction handleInputBlur() {\n savePoint();\n}\n\n/**\n * Handle input.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleInputKeyup(e) {\n if (e.keyCode === 27) {\n closeInput();\n } else if (e.keyCode === 13) {\n savePoint();\n }\n}\n\n/**\n * Save a new point annotation from input\n */\nfunction savePoint() {\n if (input.value.trim().length > 0) {\n let clientX = parseInt(input.style.left, 10);\n let clientY = parseInt(input.style.top, 10);\n let content = input.value.trim();\n let svg = findSVGAtPoint(clientX, clientY);\n if (!svg) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n let { documentId, pageNumber } = getMetadata(svg);\n let annotation = Object.assign({\n type: 'point'\n }, scaleDown(svg, {\n x: clientX - rect.left,\n y: clientY - rect.top\n })\n );\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n PDFJSAnnotate.getStoreAdapter().addComment(\n documentId,\n annotation.uuid,\n content\n );\n\n appendChild(svg, annotation);\n });\n }\n\n closeInput();\n}\n\n/**\n * Close the input element\n */\nfunction closeInput() {\n input.removeEventListener('blur', handleInputBlur);\n input.removeEventListener('keyup', handleInputKeyup);\n document.body.removeChild(input);\n input = null;\n}\n\n/**\n * Enable point annotation behavior\n */\nexport function enablePoint() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n/**\n * Disable point annotation behavior\n */\nexport function disablePoint() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/point.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n disableUserSelect,\n enableUserSelect,\n findSVGAtPoint,\n getMetadata,\n getOffset,\n scaleDown,\n scaleUp\n} from './utils';\n\nlet _enabled = false;\nlet _type;\nlet overlay;\nlet originY;\nlet originX;\n\n/**\n * Get the current window selection as rects\n *\n * @return {Array} An Array of rects\n */\nfunction getSelectionRects() {\n try {\n let selection = window.getSelection();\n let range = selection.getRangeAt(0);\n let rects = range.getClientRects();\n\n if (rects.length > 0 &&\n rects[0].width > 0 &&\n rects[0].height > 0) {\n return rects;\n }\n } catch (e) {}\n \n return null;\n}\n\n/**\n * Handle document.mousedown event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMousedown(e) {\n let svg;\n if (_type !== 'area' || !(svg = findSVGAtPoint(e.clientX, e.clientY))) {\n return;\n }\n\n let rect = svg.getBoundingClientRect();\n originY = e.clientY;\n originX = e.clientX;\n\n overlay = document.createElement('div');\n overlay.style.position = 'absolute';\n overlay.style.top = `${originY - rect.top}px`;\n overlay.style.left = `${originX - rect.left}px`;\n overlay.style.border = `3px solid ${BORDER_COLOR}`;\n overlay.style.borderRadius = '3px';\n svg.parentNode.appendChild(overlay);\n \n document.addEventListener('mousemove', handleDocumentMousemove);\n disableUserSelect();\n}\n\n/**\n * Handle document.mousemove event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMousemove(e) {\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let rect = svg.getBoundingClientRect();\n\n if (originX + (e.clientX - originX) < rect.right) {\n overlay.style.width = `${e.clientX - originX}px`;\n }\n\n if (originY + (e.clientY - originY) < rect.bottom) {\n overlay.style.height = `${e.clientY - originY}px`;\n }\n}\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMouseup(e) {\n let rects;\n if (_type !== 'area' && (rects = getSelectionRects())) {\n let svg = findSVGAtPoint(rects[0].left, rects[0].top);\n saveRect(_type, [...rects].map((r) => {\n return {\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height\n };\n }));\n } else if (_type === 'area' && overlay) {\n let svg = overlay.parentNode.querySelector('svg.annotationLayer');\n let rect = svg.getBoundingClientRect();\n saveRect(_type, [{\n top: parseInt(overlay.style.top, 10) + rect.top,\n left: parseInt(overlay.style.left, 10) + rect.left,\n width: parseInt(overlay.style.width, 10),\n height: parseInt(overlay.style.height, 10)\n }]);\n\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n\n document.removeEventListener('mousemove', handleDocumentMousemove);\n enableUserSelect();\n }\n}\n\n/**\n * Handle document.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentKeyup(e) {\n // Cancel rect if Esc is pressed\n if (e.keyCode === 27) {\n let selection = window.getSelection();\n selection.removeAllRanges();\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n overlay = null;\n document.removeEventListener('mousemove', handleDocumentMousemove);\n }\n }\n}\n\n/**\n * Save a rect annotation\n *\n * @param {String} type The type of rect (area, highlight, strikeout)\n * @param {Array} rects The rects to use for annotation\n * @param {String} color The color of the rects\n */\nfunction saveRect(type, rects, color) {\n let svg = findSVGAtPoint(rects[0].left, rects[0].top);\n let node;\n let annotation;\n\n if (!svg) {\n return;\n }\n\n let boundingRect = svg.getBoundingClientRect();\n\n if (!color) {\n if (type === 'highlight') {\n color = 'FFFF00';\n } else if (type === 'strikeout') {\n color = 'FF0000';\n }\n }\n\n // Initialize the annotation\n annotation = {\n type,\n color,\n rectangles: [...rects].map((r) => {\n let offset = 0;\n\n if (type === 'strikeout') {\n offset = r.height / 2;\n }\n\n return scaleDown(svg, {\n y: (r.top + offset) - boundingRect.top,\n x: r.left - boundingRect.left,\n width: r.width,\n height: r.height\n });\n }).filter((r) => r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1)\n };\n \n // Short circuit if no rectangles exist\n if (annotation.rectangles.length === 0) {\n return;\n }\n\n // Special treatment for area as it only supports a single rect\n if (type === 'area') {\n let rect = annotation.rectangles[0];\n delete annotation.rectangles;\n annotation.x = rect.x;\n annotation.y = rect.y;\n annotation.width = rect.width;\n annotation.height = rect.height;\n }\n\n let { documentId, pageNumber } = getMetadata(svg);\n\n // Add the annotation\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n appendChild(svg, annotation);\n });\n}\n\n/**\n * Enable rect behavior\n */\nexport function enableRect(type) {\n _type = type;\n \n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n document.addEventListener('mousedown', handleDocumentMousedown);\n document.addEventListener('keyup', handleDocumentKeyup);\n}\n\n/**\n * Disable rect behavior\n */\nexport function disableRect() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n document.removeEventListener('mousedown', handleDocumentMousedown);\n document.removeEventListener('keyup', handleDocumentKeyup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/rect.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport appendChild from '../render/appendChild';\nimport {\n BORDER_COLOR,\n findSVGAtPoint,\n getMetadata,\n scaleDown\n} from './utils';\n\nlet _enabled = false;\nlet input;\nlet _textSize;\nlet _textColor;\n\n/**\n * Handle document.mouseup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleDocumentMouseup(e) {\n if (input || !findSVGAtPoint(e.clientX, e.clientY)) {\n return;\n }\n\n input = document.createElement('input');\n input.setAttribute('id', 'pdf-annotate-text-input');\n input.setAttribute('placeholder', 'Enter text');\n input.style.border = `3px solid ${BORDER_COLOR}`;\n input.style.borderRadius = '3px';\n input.style.position = 'absolute';\n input.style.top = `${e.clientY}px`;\n input.style.left = `${e.clientX}px`;\n input.style.fontSize = `${_textSize}px`;\n\n input.addEventListener('blur', handleInputBlur);\n input.addEventListener('keyup', handleInputKeyup);\n\n document.body.appendChild(input);\n input.focus();\n}\n\n/**\n * Handle input.blur event\n */\nfunction handleInputBlur() {\n saveText();\n}\n\n/**\n * Handle input.keyup event\n *\n * @param {Event} e The DOM event to handle\n */\nfunction handleInputKeyup(e) {\n if (e.keyCode === 27) {\n closeInput();\n } else if (e.keyCode === 13) {\n saveText();\n }\n}\n\n/**\n * Save a text annotation from input\n */\nfunction saveText() {\n if (input.value.trim().length > 0) {\n let clientX = parseInt(input.style.left, 10);\n let clientY = parseInt(input.style.top, 10);\n let svg = findSVGAtPoint(clientX, clientY);\n if (!svg) {\n return;\n }\n\n let { documentId, pageNumber } = getMetadata(svg);\n let rect = svg.getBoundingClientRect();\n let annotation = Object.assign({\n type: 'textbox',\n size: _textSize,\n color: _textColor,\n content: input.value.trim()\n }, scaleDown(svg, {\n x: clientX - rect.left,\n y: clientY - rect.top,\n width: input.offsetWidth,\n height: input.offsetHeight\n })\n );\n\n PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)\n .then((annotation) => {\n appendChild(svg, annotation);\n });\n }\n\n closeInput();\n}\n\n/**\n * Close the input\n */\nfunction closeInput() {\n try {\n if (input) {\n input.removeEventListener('blur', handleInputBlur);\n input.removeEventListener('keyup', handleInputKeyup);\n document.body.removeChild(input);\n input = null;\n }\n } catch(e){\n console.log('Try/catch is necessary because exist a error in Safari');\n }\n}\n\n/**\n * Set the text attributes\n *\n * @param {Number} textSize The size of the text\n * @param {String} textColor The color of the text\n */\nexport function setText(textSize = 12, textColor = '000000') {\n _textSize = parseInt(textSize, 10);\n _textColor = textColor;\n}\n\n\n/**\n * Enable text behavior\n */\nexport function enableText() {\n if (_enabled) { return; }\n\n _enabled = true;\n document.addEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n/**\n * Disable text behavior\n */\nexport function disableText() {\n if (!_enabled) { return; }\n\n _enabled = false;\n document.removeEventListener('mouseup', handleDocumentMouseup);\n}\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/text.js\n **/","import PDFJSAnnotate from '../PDFJSAnnotate';\nimport renderScreenReaderHints from '../a11y/renderScreenReaderHints';\n\n// Template for creating a new page\nconst PAGE_TEMPLATE = `\n <div style=\"visibility: hidden;\" class=\"page\" data-loaded=\"false\">\n <div class=\"canvasWrapper\">\n <canvas></canvas>\n </div>\n <svg class=\"annotationLayer\"></svg>\n <div class=\"textLayer\"></div>\n </div>\n`;\n\n/**\n * Create a new page to be appended to the DOM.\n *\n * @param {Number} pageNumber The page number that is being created\n * @return {HTMLElement}\n */\nexport function createPage(pageNumber) {\n let temp = document.createElement('div');\n temp.innerHTML = PAGE_TEMPLATE;\n\n let page = temp.children[0];\n let canvas = page.querySelector('canvas');\n\n page.setAttribute('id', `pageContainer${pageNumber}`);\n page.setAttribute('data-page-number', pageNumber);\n\n canvas.mozOpaque = true;\n canvas.setAttribute('id', `page${pageNumber}`);\n\n // let svg = page.querySelector('.');\n // // let svg = document.body;\n // console.log(svg)\n // // let svg = document.getElementById();\n //\n // document.addEventListener('click', function handleDocumentClick(e) {\n // console.log(click)\n // if (!findSVGAtPoint(e.clientX, e.clientY)) {\n // return;\n // }\n //\n // let target = findAnnotationAtPoint(e.clientX, e.clientY);\n //\n // // Emit annotation:blur if clickNode is no longer clicked\n // if (clickNode && clickNode !== target) {\n // emitter.emit('annotation:blur', clickNode);\n // }\n //\n // // Emit annotation:click if target was clicked\n // if (target) {\n // emitter.emit('annotation:click', target);\n // }\n //\n // clickNode = target;\n // });\n\n return page;\n}\n\n/**\n * Render a page that has already been created.\n *\n * @param {Number} pageNumber The page number to be rendered\n * @param {Object} renderOptions The options for rendering\n * @return {Promise} Settled once rendering has completed\n * A settled Promise will be either:\n * - fulfilled: [pdfPage, annotations]\n * - rejected: Error\n */\nexport function renderPage(pageNumber, annotations, renderOptions) {\n let {\n documentId,\n pdfDocument,\n scale,\n rotate\n } = renderOptions;\n\n // Load the page and annotations\n return Promise.all([\n pdfDocument.getPage(pageNumber),\n ]).then(([pdfPage]) => {\n let page = document.getElementById(`pageContainer${pageNumber}`);\n let svg = page.querySelector('.annotationLayer');\n let canvas = page.querySelector('.canvasWrapper canvas');\n let canvasContext = canvas.getContext('2d', {alpha: false});\n let viewport = pdfPage.getViewport(scale, rotate);\n let transform = scalePage(pageNumber, viewport, canvasContext);\n\n // Render the page\n return Promise.all([\n pdfPage.render({ canvasContext, viewport, transform }),\n PDFJSAnnotate.render(svg, viewport, {pageNumber, documentId, annotations:annotations[pageNumber]})\n ]).then(() => {\n // Text content is needed for a11y, but is also necessary for creating\n // highlight and strikeout annotations which require selecting text.\n return pdfPage.getTextContent({normalizeWhitespace: true}).then((textContent) => {\n return new Promise((resolve, reject) => {\n // Render text layer for a11y of text content\n let textLayer = page.querySelector(`.textLayer`);\n let textLayerFactory = new pdfjsViewer.DefaultTextLayerFactory();\n let textLayerBuilder = textLayerFactory.createTextLayerBuilder(textLayer, pageNumber -1, viewport);\n textLayerBuilder.setTextContent(textContent);\n textLayerBuilder.render();\n\n // Enable a11y for annotations\n // Timeout is needed to wait for `textLayerBuilder.render`\n setTimeout(() => {\n try {\n renderScreenReaderHints(annotations.annotations);\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n });\n }).then(() => {\n // Indicate that the page was loaded\n page.setAttribute('data-loaded', 'true');\n\n return [pdfPage, annotations];\n });\n });\n}\n\n/**\n * Scale the elements of a page.\n *\n * @param {Number} pageNumber The page number to be scaled\n * @param {Object} viewport The viewport of the PDF page (see pdfPage.getViewport(scale, rotate))\n * @param {Object} context The canvas context that the PDF page is rendered to\n * @return {Array} The transform data for rendering the PDF page\n */\nfunction scalePage(pageNumber, viewport, context) {\n let page = document.getElementById(`pageContainer${pageNumber}`);\n let canvas = page.querySelector('.canvasWrapper canvas');\n let svg = page.querySelector('.annotationLayer');\n let wrapper = page.querySelector('.canvasWrapper');\n let textLayer = page.querySelector('.textLayer');\n let outputScale = getOutputScale(context);\n let transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n let sfx = approximateFraction(outputScale.sx);\n let sfy = approximateFraction(outputScale.sy);\n\n // Adjust width/height for scale\n page.style.visibility = '';\n canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px';\n canvas.style.height = roundToDivide(viewport.height, sfx[1]) + 'px';\n svg.setAttribute('width', viewport.width);\n svg.setAttribute('height', viewport.height);\n svg.style.width = `${viewport.width}px`;\n svg.style.height = `${viewport.height}px`;\n page.style.width = `${viewport.width}px`;\n page.style.height = `${viewport.height}px`;\n wrapper.style.width = `${viewport.width}px`;\n wrapper.style.height = `${viewport.height}px`;\n textLayer.style.width = `${viewport.width}px`;\n textLayer.style.height = `${viewport.height}px`;\n\n return transform;\n}\n\n/**\n * The following methods are taken from mozilla/pdf.js and as such fall under\n * the Apache License (http://www.apache.org/licenses/).\n *\n * Original source can be found at mozilla/pdf.js:\n * https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js\n */\n\n/**\n * Approximates a float number as a fraction using Farey sequence (max order\n * of 8).\n *\n * @param {Number} x Positive float number\n * @return {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n */\nfunction approximateFraction(x) {\n // Fast path for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n \n // a/b and c/d are neighbours in Farey sequence.\n let a = 0, b = 1, c = 1, d = 1;\n \n // Limit search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n let p = a + c, q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p; d = q;\n } else {\n a = p; b = q;\n }\n }\n\n // Select closest of neighbours to x.\n if (x_ - a / b < c / d - x_) {\n return x_ === x ? [a, b] : [b, a];\n } else {\n return x_ === x ? [c, d] : [d, c];\n }\n}\n\nfunction getOutputScale(ctx) {\n let devicePixelRatio = window.devicePixelRatio || 1;\n let backingStoreRatio = ctx.webkitBackingStorePixelRatio ||\n ctx.mozBackingStorePixelRatio ||\n ctx.msBackingStorePixelRatio ||\n ctx.oBackingStorePixelRatio ||\n ctx.backingStorePixelRatio || 1;\n let pixelRatio = devicePixelRatio / backingStoreRatio;\n return {\n sx: pixelRatio,\n sy: pixelRatio,\n scaled: pixelRatio !== 1\n };\n}\n\nfunction roundToDivide(x, div) {\n let r = x % div;\n return r === 0 ? x : Math.round(x - r + div);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/UI/page.js\n **/","// Color picker component\nconst COLORS = [\n {hex: '#000000', name: 'Black'},\n {hex: '#EF4437', name: 'Red'},\n {hex: '#E71F63', name: 'Pink'},\n {hex: '#8F3E97', name: 'Purple'},\n {hex: '#65499D', name: 'Deep Purple'},\n {hex: '#4554A4', name: 'Indigo'},\n {hex: '#2083C5', name: 'Blue'},\n {hex: '#35A4DC', name: 'Light Blue'},\n {hex: '#09BCD3', name: 'Cyan'},\n {hex: '#009688', name: 'Teal'},\n {hex: '#43A047', name: 'Green'},\n {hex: '#8BC34A', name: 'Light Green'},\n {hex: '#FDC010', name: 'Yellow'},\n {hex: '#F8971C', name: 'Orange'},\n {hex: '#F0592B', name: 'Deep Orange'},\n {hex: '#F06291', name: 'Light Pink'}\n];\n\nexport default function initColorPicker(el, value, onChange) {\n function setColor(value, fireOnChange = true) {\n currentValue = value;\n a.setAttribute('data-color', value);\n a.style.background = value;\n if (fireOnChange && typeof onChange === 'function') {\n onChange(value);\n }\n closePicker();\n }\n\n function togglePicker() {\n if (isPickerOpen) {\n closePicker();\n } else {\n openPicker();\n }\n }\n\n function closePicker() {\n document.removeEventListener('keyup', handleDocumentKeyup);\n if (picker && picker.parentNode) {\n picker.parentNode.removeChild(picker);\n }\n isPickerOpen = false;\n a.focus();\n }\n\n function openPicker() {\n if (!picker) {\n picker = document.createElement('div');\n picker.style.background = '#fff';\n picker.style.border = '1px solid #ccc';\n picker.style.padding = '2px';\n picker.style.position = 'absolute';\n picker.style.width = '122px';\n el.style.position = 'relative';\n\n COLORS.map(createColorOption).forEach((c) => {\n c.style.margin = '2px';\n c.onclick = function () { setColor(c.getAttribute('data-color')); };\n picker.appendChild(c);\n });\n }\n\n document.addEventListener('keyup', handleDocumentKeyup);\n el.appendChild(picker);\n isPickerOpen = true;\n }\n\n function createColorOption(color) {\n let e = document.createElement('a');\n e.className = 'color';\n e.setAttribute('href', 'javascript://');\n\n if(color.name)\n e.setAttribute('title', color.name);\n else\n e.setAttribute('title', 'Choisir une couleur');\n\n e.setAttribute('data-color', color.hex);\n e.style.background = color.hex;\n return e;\n }\n\n function handleDocumentKeyup(e) {\n if (e.keyCode === 27) {\n closePicker();\n }\n }\n\n let picker;\n let isPickerOpen = false;\n let currentValue;\n let a = createColorOption({hex: value});\n a.onclick = togglePicker;\n el.appendChild(a);\n setColor(value, false);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/initColorPicker.js\n **/"],"sourceRoot":""}
\ No newline at end of file