Help
RSS
API
Feed
Maltego
Contact
Domain > www.underboard.id
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2023-07-21
203.80.8.45
(
ClassC
)
2025-01-21
148.135.128.46
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Tue, 21 Jan 2025 08:24:36 GMTContent-Type: text/htmlContent-Length: 795Connection: keep-alivelocation: https://www.underboard.id/platform: hostingerpanel: hpanelcontent-security-policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: d8c37e9ea454cf1df98ad99cc2c04ff3-phx-edge5x-hcdn-cache-status: EXPIREDx-hcdn-upstream-rt: 0.426 !DOCTYPE html>html styleheight:100%>head>meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno />title> 301 Moved Permanently/title>style>@media (prefers-color-scheme:dark){body{background-color:#000!important}}/style>/head>body stylecolor: #444; margin:0;font: normal 14px/20px Arial, Helvetica, sans-serif; height:100%; background-color: #fff;>div styleheight:auto; min-height:100%; > div styletext-align: center; width:800px; margin-left: -400px; position:absolute; top: 30%; left:50%;> h1 stylemargin:0; font-size:150px; line-height:150px; font-weight:bold;>301/h1>h2 stylemargin-top:20px;font-size: 30px;>Moved Permanently/h2>p>The document has been permanently moved./p>/div>/div>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Tue, 21 Jan 2025 08:24:37 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveVary: Accept-Encodingx-powered-by: PHP/8.1.27platform: hostingerpanel: hpanelcontent-security-policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 467153b91369448bbddb84277a30642e-phx-edge4x-hcdn-cache-status: DYNAMICx-hcdn-upstream-rt: 0.746 !DOCTYPE html>html>head> link relicon typeimage/x-icon hreflogo_new.png>meta charsetutf-8/>meta http-equivX-UA-Compatible contentIEedge/>meta nameviewport contentwidthdevice-width, initial-scale1.0>title>UnderBroaded Media/title>style idapplicationStylesheet typetext/css> .mediaViewInfo { --web-view-name: Web 1920 – 1; --web-view-id: Web_1920__1; --web-scale-on-resize: true; --web-enable-deep-linking: true; } :root { --web-view-ids: Web_1920__1; } * { margin: 0; padding: 0; box-sizing: border-box; border: none; } #Web_1920__1 { position: absolute; width: 100%; height: 100%; background-color: rgba(255,255,255,1); overflow: hidden; --web-view-name: Web 1920 – 1; --web-view-id: Web_1920__1; --web-scale-on-resize: true; --web-enable-deep-linking: true; } #Scroll_Group_1 { mix-blend-mode: normal; position: absolute; width: 162px; height: 323px; left: 195px; top: 174px; overflow: hidden; } #Pendekar { position: absolute; width: 530px; height: 530px; left: -179px; top: -105px; overflow: visible; } #coming_soon { left: 374px; top: 234px; position: absolute; overflow: visible; width: 551px; white-space: nowrap; text-align: left; font-family: Microsoft Yi Baiti; font-style: normal; font-weight: normal; font-size: 123px; color: rgba(42,42,42,1); } #Icon_feather-youtube { position: absolute; width: 33.002px; height: 23.19px; left: 379px; top: 382.845px; overflow: visible; } #Path_1 { fill: transparent; stroke: rgba(0,0,0,1); stroke-width: 3px; stroke-linejoin: round; stroke-linecap: round; stroke-miterlimit: 4; shape-rendering: auto; } .Path_1 { overflow: visible; position: absolute; width: 36.002px; height: 26.19px; left: 0px; top: 0px; transform: matrix(1,0,0,1,0,0); } #Path_2 { fill: transparent; stroke: rgba(0,0,0,1); stroke-width: 3px; stroke-linejoin: round; stroke-linecap: round; stroke-miterlimit: 4; shape-rendering: auto; } .Path_2 { overflow: visible; position: absolute; width: 11.625px; height: 12.81px; left: 13.126px; top: 6.72px; transform: matrix(1,0,0,1,0,0); } #Icon_ion-logo-facebook { fill: rgba(0,0,0,1); } .Icon_ion-logo-facebook { overflow: visible; position: absolute; width: 31.5px; height: 31.311px; left: 444.05px; top: 378.784px; transform: matrix(1,0,0,1,0,0); } #Icon_akar-instagram-fill { fill: rgba(0,0,0,1); } .Icon_akar-instagram-fill { overflow: visible; position: absolute; width: 33px; height: 33px; left: 507.598px; top: 377.94px; transform: matrix(1,0,0,1,0,0); } #underboard_media { left: 784px; top: 242px; position: absolute; overflow: visible; width: 139px; white-space: nowrap; text-align: left; font-family: Microsoft Yi Baiti; font-style: normal; font-weight: normal; font-size: 22px; color: rgba(42,42,42,1); } #logo_new { position: absolute; width: 27px; height: 31px; left: 752px; top: 240px; overflow: visible; }/style>script idapplicationScript>///////////////////////////////////////// INITIALIZATION////////////////////////////////////////** * Functionality for scaling, showing by media query, and navigation between multiple pages on a single page. * Code subject to change. **/if (window.consolenull) { windowconsole { log : function() {} } }; // some browsers do not set consolevar Application function() { // event constants this.prefix --web-; this.NAVIGATION_CHANGE viewChange; this.VIEW_NOT_FOUND viewNotFound; this.VIEW_CHANGE viewChange; this.VIEW_CHANGING viewChanging; this.STATE_NOT_FOUND stateNotFound; this.APPLICATION_COMPLETE applicationComplete; this.APPLICATION_RESIZE applicationResize; this.SIZE_STATE_NAME data-is-view-scaled; this.STATE_NAME this.prefix + state; this.lastTrigger null; this.lastView null; this.lastState null; this.lastOverlay null; this.currentView null; this.currentState null; this.currentOverlay null; this.currentQuery {index: 0, rule: null, mediaText: null, id: null}; this.inclusionQuery (min-width: 0px); this.exclusionQuery none and (min-width: 99999px); this.LastModifiedDateLabelName LastModifiedDateLabel; this.viewScaleSliderId ViewScaleSliderInput; this.pageRefreshedName showPageRefreshedNotification; this.application null; this.applicationStylesheet null; this.showByMediaQuery null; this.mediaQueryDictionary {}; this.viewsDictionary {}; this.addedViews ; this.viewStates ; this.views ; this.viewIds ; this.viewQueries {}; this.overlays {}; this.overlayIds ; this.numberOfViews 0; this.verticalPadding 0; this.horizontalPadding 0; this.stateName null; this.viewScale 1; this.viewLeft 0; this.viewTop 0; this.horizontalScrollbarsNeeded false; this.verticalScrollbarsNeeded false; // view settings this.showUpdateNotification false; this.showNavigationControls false; this.scaleViewsToFit false; this.scaleToFitOnDoubleClick false; this.actualSizeOnDoubleClick false; this.scaleViewsOnResize false; this.navigationOnKeypress false; this.showViewName false; this.enableDeepLinking true; this.refreshPageForChanges false; this.showRefreshNotifications true; // view controls this.scaleViewSlider null; this.lastModifiedLabel null; this.supportsPopState false; // window.history.pushState!null; this.initialized false; // refresh properties this.refreshDuration 250; this.lastModifiedDate null; this.refreshRequest null; this.refreshInterval null; this.refreshContent null; this.refreshContentSize null; this.refreshCheckContent false; this.refreshCheckContentSize false; var self this; self.initialize function(event) { var view self.getVisibleView(); var views self.getVisibleViews(); if (viewnull) view self.getInitialView(); self.collectViews(); self.collectOverlays(); self.collectMediaQueries(); for (let index 0; index views.length; index++) { var view viewsindex; self.setViewOptions(view); self.setViewVariables(view); self.centerView(view); } // sometimes the body size is 0 so we call this now and again later if (self.initialized) { window.addEventListener(self.NAVIGATION_CHANGE, self.viewChangeHandler); window.addEventListener(keyup, self.keypressHandler); window.addEventListener(keypress, self.keypressHandler); window.addEventListener(resize, self.resizeHandler); window.document.addEventListener(dblclick, self.doubleClickHandler); if (self.supportsPopState) { window.addEventListener(popstate, self.popStateHandler); } else { window.addEventListener(hashchange, self.hashChangeHandler); } // we are ready to go window.dispatchEvent(new Event(self.APPLICATION_COMPLETE)); } if (self.initializedfalse) { if (self.enableDeepLinking) { self.syncronizeViewToURL(); } if (self.refreshPageForChanges) { self.setupRefreshForChanges(); } self.initialized true; } if (self.scaleViewsToFit) { self.viewScale self.scaleViewToFit(view); if (self.viewScale0) { setTimeout(self.scaleViewToFit, 500, view); } } else if (view) { self.viewScale self.getViewScaleValue(view); self.centerView(view); self.updateSliderValue(self.viewScale); } else { // no view found } if (self.showUpdateNotification) { self.showNotification(); } //addEventListener in window ? null : window.addEventListener window.attachEvent; //addEventListener in document ? null : document.addEventListener document.attachEvent; } /////////////////////////////////////// // AUTO REFRESH /////////////////////////////////////// self.setupRefreshForChanges function() { self.refreshRequest new XMLHttpRequest(); if (!self.refreshRequest) { return false; } // get document start values immediately self.requestRefreshUpdate(); } /** * Attempt to check the last modified date by the headers * or the last modified property from the byte array (experimental) **/ self.requestRefreshUpdate function() { var url document.location.href; var protocol window.location.protocol; var method; try { if (self.refreshCheckContentSize) { self.refreshRequest.open(HEAD, url, true); } else if (self.refreshCheckContent) { self.refreshContent document.documentElement.outerHTML; self.refreshRequest.open(GET, url, true); self.refreshRequest.responseType text; } else { // get page last modified date for the first call to compare to later if (self.lastModifiedDatenull) { // File system does not send headers in FF so get blob if possible if (protocolfile:) { self.refreshRequest.open(GET, url, true); self.refreshRequest.responseType blob; } else { self.refreshRequest.open(HEAD, url, true); self.refreshRequest.responseType blob; } self.refreshRequest.onload self.refreshOnLoadOnceHandler; } else { self.refreshRequest new XMLHttpRequest(); self.refreshRequest.onreadystatechange self.refreshHandler; self.refreshRequest.ontimeout function() { self.log(Couldnt find page to check for updates); } var method; if (protocolfile:) { method GET; } else { method HEAD; } //refreshRequest.open(HEAD, url, true); self.refreshRequest.open(method, url, true); self.refreshRequest.responseType blob; self.refreshRequest.send(null); } } } catch (error) { self.log(Refresh failed for the following reason:) self.log(error); } } self.refreshHandler function() { var contentSize; try { if (self.refreshRequest.readyState XMLHttpRequest.DONE) { if (self.refreshRequest.status 2 || self.refreshRequest.status 200) { var pageChanged false; self.updateLastModifiedLabel(); if (self.refreshCheckContentSize) { var lastModifiedHeader self.refreshRequest.getResponseHeader(Last-Modified); contentSize self.refreshRequest.getResponseHeader(Content-Length); //lastModifiedDate refreshRequest.getResponseHeader(Last-Modified); var headers self.refreshRequest.getAllResponseHeaders(); var hasContentHeader headers.indexOf(Content-Length)!-1; if (hasContentHeader) { contentSize self.refreshRequest.getResponseHeader(Content-Length); // size has not been set yet if (self.refreshContentSizenull) { self.refreshContentSize contentSize; // exit and let interval call this method again return; } if (contentSize!self.refreshContentSize) { pageChanged true; } } } else if (self.refreshCheckContent) { if (self.refreshRequest.responseText!self.refreshContent) { pageChanged true; } } else { lastModifiedHeader self.getLastModified(self.refreshRequest); if (self.lastModifiedDate!lastModifiedHeader) { self.log(lastModifiedDate: + self.lastModifiedDate + ,lastModifiedHeader: +lastModifiedHeader); pageChanged true; } } if (pageChanged) { clearInterval(self.refreshInterval); self.refreshUpdatedPage(); return; } } else { self.log(There was a problem with the request.); } } } catch( error ) { //console.log(Caught Exception: + error); } } self.refreshOnLoadOnceHandler function(event) { // get the last modified date if (self.refreshRequest.response) { self.lastModifiedDate self.getLastModified(self.refreshRequest); if (self.lastModifiedDate!null) { if (self.refreshIntervalnull) { self.refreshInterval setInterval(self.requestRefreshUpdate, self.refreshDuration); } } else { self.log(Could not get last modified date from the server); } } } self.refreshUpdatedPage function() { if (self.showRefreshNotifications) { var date new Date().setTime((new Date().getTime()+10000)); document.cookie encodeURIComponent(self.pageRefreshedName) + true + ; max-age6000; + path/; } document.location.reload(true); } self.showNotification function(duration) { var notificationID self.pageRefreshedName+ID; var notification document.getElementById(notificationID); if (durationnull) duration 4000; if (notification!null) {return;} notification document.createElement(div); notification.id notificationID; notification.textContent PAGE UPDATED; var styleRule styleRule position: fixed; padding: 7px 16px 6px 16px; font-family: Arial, sans-serif; font-size: 10px; font-weight: bold; left: 50%;; styleRule + top: 20px; background-color: rgba(0,0,0,.5); border-radius: 12px; color:rgb(235, 235, 235); transition: all 2s linear;; styleRule + transform: translateX(-50%); letter-spacing: .5px; filter: drop-shadow(2px 2px 6px rgba(0, 0, 0, .1)); cursor: pointer; notification.setAttribute(style, styleRule); notification.className PageRefreshedClass; notification.addEventListener(click, function() { notification.parentNode.removeChild(notification); }); document.body.appendChild(notification); setTimeout(function() { notification.style.opacity 0; notification.style.filter drop-shadow( 0px 0px 0px rgba(0,0,0, .5)); setTimeout(function() { try { notification.parentNode.removeChild(notification); } catch(error) {} }, duration) }, duration); document.cookie encodeURIComponent(self.pageRefreshedName) + ; max-age1; path/; } /** * Get the last modified date from the header * or file object after request has been received **/ self.getLastModified function(request) { var date; // file protocol - FILE object with last modified property if (request.response && request.response.lastModified) { date request.response.lastModified; } // http protocol - check headers if (datenull) { date request.getResponseHeader(Last-Modified); } return date; } self.updateLastModifiedLabel function() { var labelValue ; if (self.lastModifiedLabelnull) { self.lastModifiedLabel document.getElementById(LastModifiedLabel); } if (self.lastModifiedLabel) { var seconds parseInt(((new Date().getTime() - Date.parse(document.lastModified)) / 1000 / 60) * 100 + ); var minutes 0; var hours 0; if (seconds 60) { seconds Math.floor(seconds/10)*10; labelValue seconds + seconds; } else { minutes parseInt((seconds/60) + ); if (minutes>60) { hours parseInt((seconds/60/60) +); labelValue + hours1 ? hour : hours; } else { labelValue minutes+; labelValue + minutes1 ? minute : minutes; } } if (seconds10) { labelValue Updated now; } else { labelValue Updated + labelValue + ago; } if (self.lastModifiedLabel.firstElementChild) { self.lastModifiedLabel.firstElementChild.textContent labelValue; } else if (textContent in self.lastModifiedLabel) { self.lastModifiedLabel.textContent labelValue; } } } self.getShortString function(string, length) { if (lengthnull) length 30; string string!null ? string.substr(0, length).replace(/\n/g, ) : String is null; return string; } self.getShortNumber function(value, places) { if (placesnull || places1) places 4; value Math.round(value * Math.pow(10,places)) / Math.pow(10, places); return value; } /////////////////////////////////////// // NAVIGATION CONTROLS /////////////////////////////////////// self.updateViewLabel function() { var viewNavigationLabel document.getElementById(ViewNavigationLabel); var view self.getVisibleView(); var viewIndex view ? self.getViewIndex(view) : -1; var viewName view ? self.getViewPreferenceValue(view, self.prefix + view-name) : null; var viewId view ? view.id : null; if (viewNavigationLabel && view) { if (viewName && viewName.indexOf()!-1) { viewName viewName.replace(//g, ); } if (self.showViewName) { viewNavigationLabel.textContent viewName; self.setTooltip(viewNavigationLabel, viewIndex + 1 + of + self.numberOfViews); } else { viewNavigationLabel.textContent viewIndex + 1 + of + self.numberOfViews; self.setTooltip(viewNavigationLabel, viewName); } } } self.updateURL function(view) { view view null ? self.getVisibleView() : view; var viewId view ? view.id : null var viewFragment view ? #+ viewId : null; if (viewId && self.viewIds.length>1 && self.enableDeepLinking) { if (self.supportsPopStatefalse) { self.setFragment(viewId); } else { if (viewFragment!window.location.hash) { if (window.location.hashnull) { window.history.replaceState({name:viewId}, null, viewFragment); } else { window.history.pushState({name:viewId}, null, viewFragment); } } } } } self.updateURLState function(view, stateName) { stateName view && (stateName || stateNamenull) ? self.getStateNameByViewId(view.id) : stateName; if (self.supportsPopStatefalse) { self.setFragment(stateName); } else { if (stateName!window.location.hash) { if (window.location.hashnull) { window.history.replaceState({name:view.viewId}, null, stateName); } else { window.history.pushState({name:view.viewId}, null, stateName); } } } } self.setFragment function(value) { window.location.hash # + value; } self.setTooltip function(element, value) { // setting the tooltip in edge causes a page crash on hover if (/Edge/.test(navigator.userAgent)) { return; } if (title in element) { element.title value; } } self.getStylesheetRules function(styleSheet) { try { if (styleSheet) return styleSheet.cssRules || styleSheet.rules; return document.styleSheets0cssRules || document.styleSheets0rules; } catch (error) { // ERRORS: // SecurityError: The operation is insecure. // Errors happen when script loads before stylesheet or loading an external css locally // InvalidAccessError: A parameter or an operation is not supported by the underlying object // Place script after stylesheet console.log(error); if (error.toString().indexOf(The operation is insecure)!-1) { console.log(Load the stylesheet before the script or load the stylesheet inline until it can be loaded on a server) } return ; } } /** * If single page application hide all of the views. * @param {Number} selectedIndex if provided shows the view at index provided **/ self.hideViews function(selectedIndex, animation) { var rules self.getStylesheetRules(); var queryIndex 0; var numberOfRules rules!null ? rules.length : 0; // loop through rules and hide media queries except selected for (var i0;inumberOfRules;i++) { var rule rulesi; var cssText rule && rule.cssText; if (rule.media!null && cssText.match(--web-view-name:)) { if (queryIndexselectedIndex) { self.currentQuery.mediaText rule.conditionText; self.currentQuery.index selectedIndex; self.currentQuery.rule rule; self.enableMediaQuery(rule); } else { if (animation) { self.fadeOut(rule) } else { self.disableMediaQuery(rule); } } queryIndex++; } } self.numberOfViews queryIndex; self.updateViewLabel(); self.updateURL(); self.dispatchViewChange(); var view self.getVisibleView(); var viewIndex view ? self.getViewIndex(view) : -1; return viewIndexselectedIndex ? view : null; } /** * If single page application hide all of the views. * @param {HTMLElement} selectedView if provided shows the view passed in **/ self.hideAllViews function(selectedView, animation) { var views self.views; var queryIndex 0; var numberOfViews views!null ? views.length : 0; // loop through rules and hide media queries except selected for (var i0;inumberOfViews;i++) { var viewData viewsi; var view viewData && viewData.view; var mediaRule viewData && viewData.mediaRule; if (viewselectedView) { self.currentQuery.mediaText mediaRule.conditionText; self.currentQuery.index queryIndex; self.currentQuery.rule mediaRule; self.enableMediaQuery(mediaRule); } else { if (animation) { self.fadeOut(mediaRule) } else { self.disableMediaQuery(mediaRule); } } queryIndex++; } self.numberOfViews queryIndex; self.updateViewLabel(); self.updateURL(); self.dispatchViewChange(); var visibleView self.getVisibleView(); return visibleViewselectedView ? selectedView : null; } /** * Hide view * @param {Object} view element to hide **/ self.hideView function(view) { var rule view ? self.mediaQueryDictionaryview.id : null; if (rule) { self.disableMediaQuery(rule); } } /** * Hide overlay * @param {Object} overlay element to hide **/ self.hideOverlay function(overlay) { var rule overlay ? self.mediaQueryDictionaryoverlay.id : null; if (rule) { self.disableMediaQuery(rule); //if (self.showByMediaQuery) { overlay.style.display none; //} } } /** * Show the view by media query. Does not hide current views * Sets view options by default * @param {Object} view element to show * @param {Boolean} setViewOptions sets view options if null or true */ self.showViewByMediaQuery function(view, setViewOptions) { var id view ? view.id : null; var query id ? self.mediaQueryDictionaryid : null; var isOverlay view ? self.isOverlay(view) : false; setViewOptions setViewOptionsnull ? true : setViewOptions; if (query) { self.enableMediaQuery(query); if (isOverlay && view && setViewOptions) { self.setViewVariables(null, view); } else { if (view && setViewOptions) self.setViewOptions(view); if (view && setViewOptions) self.setViewVariables(view); } } } /** * Show the view. Does not hide current views */ self.showView function(view, setViewOptions) { var id view ? view.id : null; var query id ? self.mediaQueryDictionaryid : null; var display null; setViewOptions setViewOptionsnull ? true : setViewOptions; if (query) { self.enableMediaQuery(query); if (viewnull) view self.getVisibleView(); if (view && setViewOptions) self.setViewOptions(view); } else if (id) { display window.getComputedStyle(view).getPropertyValue(display); if (display || displaynone) { view.style.display block; } } if (view) { if (self.currentView!null) { self.lastView self.currentView; } self.currentView view; } } self.showViewById function(id, setViewOptions) { var view id ? self.getViewById(id) : null; if (view) { self.showView(view); return; } self.log(View not found + id + ); } self.getElementView function(element) { var view element; var viewFound false; while (viewFoundfalse || viewnull) { if (view && self.viewsDictionaryview.id) { return view; } view view.parentNode; } } /** * Show overlay over view * @param {Event | HTMLElement} event event or html element with styles applied * @param {String} id id of view or view reference * @param {Number} x x location * @param {Number} y y location */ self.showOverlay function(event, id, x, y) { var overlay id && typeof id string ? self.getViewById(id) : id ? id : null; var query overlay ? self.mediaQueryDictionaryoverlay.id : null; var centerHorizontally false; var centerVertically false; var anchorLeft false; var anchorTop false; var anchorRight false; var anchorBottom false; var display null; var reparent true; var view null; if (overlaynull || overlayfalse) { self.log(Overlay not found, + id + ); return; } // get enter animation - event target must have css variables declared if (event) { var button event.currentTarget || event; // can be event or htmlelement var buttonComputedStyles getComputedStyle(button); var actionTargetValue buttonComputedStyles.getPropertyValue(self.prefix+action-target).trim(); var animation buttonComputedStyles.getPropertyValue(self.prefix+animation).trim(); var isAnimated animation!; var targetType buttonComputedStyles.getPropertyValue(self.prefix+action-type).trim(); var actionTarget self.application ? null : self.getElement(actionTargetValue); var actionTargetStyles actionTarget ? actionTarget.style : null; if (actionTargetStyles) { actionTargetStyles.setProperty(animation, animation); } if (stopImmediatePropagation in event) { event.stopImmediatePropagation(); } } if (self.applicationfalse || targetTypepage) { document.location.href ./ + actionTargetValue; return; } // remove any current overlays if (self.currentOverlay) { // act as switch if same button if (self.currentOverlayactionTarget || self.currentOverlaynull) { if (self.lastTriggerbutton) { self.removeOverlay(isAnimated); return; } } else { self.removeOverlay(isAnimated); } } if (reparent) { view self.getElementView(button); if (view) { view.appendChild(overlay); } } if (query) { //self.setElementAnimation(overlay, null); //overlay.style.animation animation; self.enableMediaQuery(query); var display overlay && overlay.style.display; if (overlay && display || displaynone) { overlay.style.display block; //self.setViewOptions(overlay); } // add animation defined in event target style declaration if (animation && self.supportAnimations) { self.fadeIn(overlay, false, animation); } } else if (id) { display window.getComputedStyle(overlay).getPropertyValue(display); if (display || displaynone) { overlay.style.display block; } // add animation defined in event target style declaration if (animation && self.supportAnimations) { self.fadeIn(overlay, false, animation); } } // do not set x or y position if centering var horizontal self.prefix + center-horizontally; var vertical self.prefix + center-vertically; var style overlay.style; var transform ; centerHorizontally self.getIsStyleDefined(id, horizontal) ? self.getViewPreferenceBoolean(overlay, horizontal) : false; centerVertically self.getIsStyleDefined(id, vertical) ? self.getViewPreferenceBoolean(overlay, vertical) : false; anchorLeft self.getIsStyleDefined(id, left); anchorRight self.getIsStyleDefined(id, right); anchorTop self.getIsStyleDefined(id, top); anchorBottom self.getIsStyleDefined(id, bottom); if (self.viewsDictionaryoverlay.id && self.viewsDictionaryoverlay.id.styleDeclaration) { style self.viewsDictionaryoverlay.id.styleDeclaration.style; } if (centerHorizontally) { style.left 50%; style.transformOrigin 0 0; transform.push(translateX(-50%)); } else if (anchorRight && anchorLeft) { style.left x + px; } else if (anchorRight) { //style.right x + px; } else { style.left x + px; } if (centerVertically) { style.top 50%; transform.push(translateY(-50%)); style.transformOrigin 0 0; } else if (anchorTop && anchorBottom) { style.top y + px; } else if (anchorBottom) { //style.bottom y + px; } else { style.top y + px; } if (transform.length) { style.transform transform.join( ); } self.currentOverlay overlay; self.lastTrigger button; } self.goBack function() { if (self.currentOverlay) { self.removeOverlay(); } else if (self.lastView) { self.goToView(self.lastView.id); } } self.removeOverlay function(animate) { var overlay self.currentOverlay; animate animatefalse ? false : true; if (overlay) { var style overlay.style; if (style.animation && self.supportAnimations && animate) { self.reverseAnimation(overlay, true); var duration self.getAnimationDuration(style.animation, true); setTimeout(function() { self.setElementAnimation(overlay, null); self.hideOverlay(overlay); self.currentOverlay null; }, duration); } else { self.setElementAnimation(overlay, null); self.hideOverlay(overlay); self.currentOverlay null; } } } /** * Reverse the animation and hide after * @param {Object} target element with animation * @param {Boolean} hide hide after animation ends */ self.reverseAnimation function(target, hide) { var lastAnimation null; var style target.style; style.animationPlayState paused; lastAnimation style.animation; style.animation null; style.animationPlayState paused; if (hide) { //target.addEventListener(animationend, self.animationEndHideHandler); var duration self.getAnimationDuration(lastAnimation, true); var isOverlay self.isOverlay(target); setTimeout(function() { self.setElementAnimation(target, null); if (isOverlay) { self.hideOverlay(target); } else { self.hideView(target); } }, duration); } setTimeout(function() { style.animation lastAnimation; style.animationPlayState paused; style.animationDirection reverse; style.animationPlayState running; }, 30); } self.animationEndHandler function(event) { var target event.currentTarget; self.dispatchEvent(new Event(event.type)); } self.isOverlay function(view) { var result view ? self.getViewPreferenceBoolean(view, self.prefix + is-overlay) : false; return result; } self.animationEndHideHandler function(event) { var target event.currentTarget; self.setViewVariables(null, target); self.hideView(target); target.removeEventListener(animationend, self.animationEndHideHandler); } self.animationEndShowHandler function(event) { var target event.currentTarget; target.removeEventListener(animationend, self.animationEndShowHandler); } self.setViewOptions function(view) { if (view) { self.minimumScale self.getViewPreferenceValue(view, self.prefix + minimum-scale); self.maximumScale self.getViewPreferenceValue(view, self.prefix + maximum-scale); self.scaleViewsToFit self.getViewPreferenceBoolean(view, self.prefix + scale-to-fit); self.scaleToFitType self.getViewPreferenceValue(view, self.prefix + scale-to-fit-type); self.scaleToFitOnDoubleClick self.getViewPreferenceBoolean(view, self.prefix + scale-on-double-click); self.actualSizeOnDoubleClick self.getViewPreferenceBoolean(view, self.prefix + actual-size-on-double-click); self.scaleViewsOnResize self.getViewPreferenceBoolean(view, self.prefix + scale-on-resize); self.enableScaleUp self.getViewPreferenceBoolean(view, self.prefix + enable-scale-up); self.centerHorizontally self.getViewPreferenceBoolean(view, self.prefix + center-horizontally); self.centerVertically self.getViewPreferenceBoolean(view, self.prefix + center-vertically); self.navigationOnKeypress self.getViewPreferenceBoolean(view, self.prefix + navigate-on-keypress); self.showViewName self.getViewPreferenceBoolean(view, self.prefix + show-view-name); self.refreshPageForChanges self.getViewPreferenceBoolean(view, self.prefix + refresh-for-changes); self.refreshPageForChangesInterval self.getViewPreferenceValue(view, self.prefix + refresh-interval); self.showNavigationControls self.getViewPreferenceBoolean(view, self.prefix + show-navigation-controls); self.scaleViewSlider self.getViewPreferenceBoolean(view, self.prefix + show-scale-controls); self.enableDeepLinking self.getViewPreferenceBoolean(view, self.prefix + enable-deep-linking); self.singlePageApplication self.getViewPreferenceBoolean(view, self.prefix + application); self.showByMediaQuery self.getViewPreferenceBoolean(view, self.prefix + show-by-media-query); self.showUpdateNotification document.cookie! ? document.cookie.indexOf(self.pageRefreshedName)!-1 : false; self.imageComparisonDuration self.getViewPreferenceValue(view, self.prefix + image-comparison-duration); self.supportAnimations self.getViewPreferenceBoolean(view, self.prefix + enable-animations, true); if (self.scaleViewsToFit) { var newScaleValue self.scaleViewToFit(view); if (newScaleValue0) { setTimeout(self.scaleViewToFit, 500, view); } } else { self.viewScale self.getViewScaleValue(view); self.viewToFitWidthScale self.getViewFitToViewportWidthScale(view, self.enableScaleUp) self.viewToFitHeightScale self.getViewFitToViewportScale(view, self.enableScaleUp); self.updateSliderValue(self.viewScale); } if (self.imageComparisonDuration!null) { // todo } if (self.refreshPageForChangesInterval!null) { self.refreshDuration Number(self.refreshPageForChangesInterval); } } } self.previousView function(event) { var rules self.getStylesheetRules(); var view self.getVisibleView() var index view ? self.getViewIndex(view) : -1; var prevQueryIndex index!-1 ? index-1 : self.currentQuery.index-1; var queryIndex 0; var numberOfRules rules!null ? rules.length : 0; if (event) { event.stopImmediatePropagation(); } if (prevQueryIndex0) { return; } // loop through rules and hide media queries except selected for (var i0;inumberOfRules;i++) { var rule rulesi; if (rule.media!null) { if (queryIndexprevQueryIndex) { self.currentQuery.mediaText rule.conditionText; self.currentQuery.index prevQueryIndex; self.currentQuery.rule rule; self.enableMediaQuery(rule); self.updateViewLabel(); self.updateURL(); self.dispatchViewChange(); } else { self.disableMediaQuery(rule); } queryIndex++; } } } self.nextView function(event) { var rules self.getStylesheetRules(); var view self.getVisibleView(); var index view ? self.getViewIndex(view) : -1; var nextQueryIndex index!-1 ? index+1 : self.currentQuery.index+1; var queryIndex 0; var numberOfRules rules!null ? rules.length : 0; var numberOfMediaQueries self.getNumberOfMediaRules(); if (event) { event.stopImmediatePropagation(); } if (nextQueryIndex>numberOfMediaQueries) { return; } // loop through rules and hide media queries except selected for (var i0;inumberOfRules;i++) { var rule rulesi; if (rule.media!null) { if (queryIndexnextQueryIndex) { self.currentQuery.mediaText rule.conditionText; self.currentQuery.index nextQueryIndex; self.currentQuery.rule rule; self.enableMediaQuery(rule); self.updateViewLabel(); self.updateURL(); self.dispatchViewChange(); } else { self.disableMediaQuery(rule); } queryIndex++; } } } /** * Enables a view via media query */ self.enableMediaQuery function(rule) { try { rule.media.mediaText self.inclusionQuery; } catch(error) { //self.log(error); rule.conditionText self.inclusionQuery; } } self.disableMediaQuery function(rule) { try { rule.media.mediaText self.exclusionQuery; } catch(error) { rule.conditionText self.exclusionQuery; } } self.dispatchViewChange function() { try { var event new Event(self.NAVIGATION_CHANGE); window.dispatchEvent(event); } catch (error) { // In IE 11: Object doesnt support this action } } self.getNumberOfMediaRules function() { var rules self.getStylesheetRules(); var numberOfRules rules ? rules.length : 0; var numberOfQueries 0; for (var i0;inumberOfRules;i++) { if (rulesi.media!null) { numberOfQueries++; } } return numberOfQueries; } ///////////////////////////////////////// // VIEW SCALE ///////////////////////////////////////// self.sliderChangeHandler function(event) { var value self.getShortNumber(event.currentTarget.value/100); var view self.getVisibleView(); self.setViewScaleValue(view, false, value, true); } self.updateSliderValue function(scale) { var slider document.getElementById(self.viewScaleSliderId); var tooltip parseInt(scale * 100 + ) + %; var inputType; var inputValue; if (slider) { inputValue self.getShortNumber(scale * 100); if (inputValue!slidervalue) { slidervalue inputValue; } inputType slider.getAttributeNS(null, type); if (inputType!range) { // input range is not supported slider.style.display none; } self.setTooltip(slider, tooltip); } } self.viewChangeHandler function(event) { var view self.getVisibleView(); var matrix view ? getComputedStyle(view).transform : null; if (matrix) { self.viewScale self.getViewScaleValue(view); var scaleNeededToFit self.getViewFitToViewportScale(view); var isViewLargerThanViewport scaleNeededToFit1; // scale large view to fit if scale to fit is enabled if (self.scaleViewsToFit) { self.scaleViewToFit(view); } else { self.updateSliderValue(self.viewScale); } } } self.getViewScaleValue function(view) { var matrix getComputedStyle(view).transform; if (matrix) { var matrixArray matrix.replace(matrix(, ).split(,); var scaleX parseFloat(matrixArray0); var scaleY parseFloat(matrixArray3); var scale Math.min(scaleX, scaleY); } return scale; } /** * Scales view to scale. * @param {Object} view view to scale. views are in views array * @param {Boolean} scaleToFit set to true to scale to fit. set false to use desired scale value * @param {Number} desiredScale scale to define. not used if scale to fit is false * @param {Boolean} isSliderChange indicates if slider is callee */ self.setViewScaleValue function(view, scaleToFit, desiredScale, isSliderChange) { var enableScaleUp self.enableScaleUp; var scaleToFitType self.scaleToFitType; var minimumScale self.minimumScale; var maximumScale self.maximumScale; var hasMinimumScale !isNaN(minimumScale) && minimumScale!; var hasMaximumScale !isNaN(maximumScale) && maximumScale!; var scaleNeededToFit self.getViewFitToViewportScale(view, enableScaleUp); var scaleNeededToFitWidth self.getViewFitToViewportWidthScale(view, enableScaleUp); var scaleNeededToFitHeight self.getViewFitToViewportHeightScale(view, enableScaleUp); var scaleToFitFull self.getViewFitToViewportScale(view, true); var scaleToFitFullWidth self.getViewFitToViewportWidthScale(view, true); var scaleToFitFullHeight self.getViewFitToViewportHeightScale(view, true); var scaleToWidth scaleToFitTypewidth; var scaleToHeight scaleToFitTypeheight; var shrunkToFit false; var topPosition null; var leftPosition null; var translateY null; var translateX null; var transformValue ; var canCenterVertically true; var canCenterHorizontally true; var style view.style; if (view && self.viewsDictionaryview.id && self.viewsDictionaryview.id.styleDeclaration) { style self.viewsDictionaryview.id.styleDeclaration.style; } if (scaleToFit && isSliderChange!true) { if (scaleToFitTypefit || scaleToFitType) { desiredScale scaleNeededToFit; } else if (scaleToFitTypewidth) { desiredScale scaleNeededToFitWidth; } else if (scaleToFitTypeheight) { desiredScale scaleNeededToFitHeight; } } else { if (isNaN(desiredScale)) { desiredScale 1; } } self.updateSliderValue(desiredScale); // scale to fit width if (scaleToWidth && scaleToHeightfalse) { canCenterVertically scaleNeededToFitHeight>scaleNeededToFitWidth; canCenterHorizontally scaleNeededToFitWidth>1 && enableScaleUpfalse; if (isSliderChange) { canCenterHorizontally desiredScalescaleToFitFullWidth; } else if (scaleToFit) { desiredScale scaleNeededToFitWidth; } if (hasMinimumScale) { desiredScale Math.max(desiredScale, Number(minimumScale)); } if (hasMaximumScale) { desiredScale Math.min(desiredScale, Number(maximumScale)); } desiredScale self.getShortNumber(desiredScale); canCenterHorizontally self.canCenterHorizontally(view, width, enableScaleUp, desiredScale, minimumScale, maximumScale); canCenterVertically self.canCenterVertically(view, width, enableScaleUp, desiredScale, minimumScale, maximumScale); if (desiredScale>1 && (enableScaleUp || isSliderChange)) { transformValue scale( + desiredScale + ); } else if (desiredScale>1 && enableScaleUpfalse) { transformValue scale( + 1 + ); } else { transformValue scale( + desiredScale + ); } if (self.centerVertically) { if (canCenterVertically) { translateY -50%; topPosition 50%; } else { translateY 0; topPosition 0; } if (style.top ! topPosition) { style.top topPosition + ; } if (canCenterVertically) { transformValue + translateY( + translateY+ ); } } if (self.centerHorizontally) { if (canCenterHorizontally) { translateX -50%; leftPosition 50%; } else { translateX 0; leftPosition 0; } if (style.left ! leftPosition) { style.left leftPosition + ; } if (canCenterHorizontally) { transformValue + translateX( + translateX+ ); } } style.transformOrigin 0 0; style.transform transformValue; self.viewScale desiredScale; self.viewToFitWidthScale scaleNeededToFitWidth; self.viewToFitHeightScale scaleNeededToFitHeight; self.viewLeft leftPosition; self.viewTop topPosition; return desiredScale; } // scale to fit height if (scaleToHeight && scaleToWidthfalse) { //canCenterVertically scaleNeededToFitHeight>scaleNeededToFitWidth; //canCenterHorizontally scaleNeededToFitHeightscaleNeededToFitWidth && enableScaleUpfalse; canCenterVertically scaleNeededToFitHeight>scaleNeededToFitWidth; canCenterHorizontally scaleNeededToFitWidth>1 && enableScaleUpfalse; if (isSliderChange) { canCenterHorizontally desiredScalescaleToFitFullHeight; } else if (scaleToFit) { desiredScale scaleNeededToFitHeight; } if (hasMinimumScale) { desiredScale Math.max(desiredScale, Number(minimumScale)); } if (hasMaximumScale) { desiredScale Math.min(desiredScale, Number(maximumScale)); //canCenterVertically desiredScale>scaleNeededToFitHeight && enableScaleUpfalse; } desiredScale self.getShortNumber(desiredScale); canCenterHorizontally self.canCenterHorizontally(view, height, enableScaleUp, desiredScale, minimumScale, maximumScale); canCenterVertically self.canCenterVertically(view, height, enableScaleUp, desiredScale, minimumScale, maximumScale); if (desiredScale>1 && (enableScaleUp || isSliderChange)) { transformValue scale( + desiredScale + ); } else if (desiredScale>1 && enableScaleUpfalse) { transformValue scale( + 1 + ); } else { transformValue scale( + desiredScale + ); } if (self.centerHorizontally) { if (canCenterHorizontally) { translateX -50%; leftPosition 50%; } else { translateX 0; leftPosition 0; } if (style.left ! leftPosition) { style.left leftPosition + ; } if (canCenterHorizontally) { transformValue + translateX( + translateX+ ); } } if (self.centerVertically) { if (canCenterVertically) { translateY -50%; topPosition 50%; } else { translateY 0; topPosition 0; } if (style.top ! topPosition) { style.top topPosition + ; } if (canCenterVertically) { transformValue + translateY( + translateY+ ); } } style.transformOrigin 0 0; style.transform transformValue; self.viewScale desiredScale; self.viewToFitWidthScale scaleNeededToFitWidth; self.viewToFitHeightScale scaleNeededToFitHeight; self.viewLeft leftPosition; self.viewTop topPosition; return scaleNeededToFitHeight; } if (scaleToFitTypefit) { //canCenterVertically scaleNeededToFitHeight>scaleNeededToFitWidth; //canCenterHorizontally scaleNeededToFitWidth>scaleNeededToFitHeight; canCenterVertically scaleNeededToFitHeight>scaleNeededToFit; canCenterHorizontally scaleNeededToFitWidth>scaleNeededToFit; if (hasMinimumScale) { desiredScale Math.max(desiredScale, Number(minimumScale)); } desiredScale self.getShortNumber(desiredScale); if (isSliderChange || scaleToFitfalse) { canCenterVertically scaleToFitFullHeight>desiredScale; canCenterHorizontally desiredScalescaleToFitFullWidth; } else if (scaleToFit) { desiredScale scaleNeededToFit; } transformValue scale( + desiredScale + ); //canCenterHorizontally self.canCenterHorizontally(view, fit, false, desiredScale); //canCenterVertically self.canCenterVertically(view, fit, false, desiredScale); if (self.centerVertically) { if (canCenterVertically) { translateY -50%; topPosition 50%; } else { translateY 0; topPosition 0; } if (style.top ! topPosition) { style.top topPosition + ; } if (canCenterVertically) { transformValue + translateY( + translateY+ ); } } if (self.centerHorizontally) { if (canCenterHorizontally) { translateX -50%; leftPosition 50%; } else { translateX 0; leftPosition 0; } if (style.left ! leftPosition) { style.left leftPosition + ; } if (canCenterHorizontally) { transformValue + translateX( + translateX+ ); } } style.transformOrigin 0 0; style.transform transformValue; self.viewScale desiredScale; self.viewToFitWidthScale scaleNeededToFitWidth; self.viewToFitHeightScale scaleNeededToFitHeight; self.viewLeft leftPosition; self.viewTop topPosition; self.updateSliderValue(desiredScale); return desiredScale; } if (scaleToFitTypedefault || scaleToFitType) { desiredScale 1; if (hasMinimumScale) { desiredScale Math.max(desiredScale, Number(minimumScale)); } if (hasMaximumScale) { desiredScale Math.min(desiredScale, Number(maximumScale)); } canCenterHorizontally self.canCenterHorizontally(view, none, false, desiredScale, minimumScale, maximumScale); canCenterVertically self.canCenterVertically(view, none, false, desiredScale, minimumScale, maximumScale); if (self.centerVertically) { if (canCenterVertically) { translateY -50%; topPosition 50%; } else { translateY 0; topPosition 0; } if (style.top ! topPosition) { style.top topPosition + ; } if (canCenterVertically) { transformValue + translateY( + translateY+ ); } } if (self.centerHorizontally) { if (canCenterHorizontally) { translateX -50%; leftPosition 50%; } else { translateX 0; leftPosition 0; } if (style.left ! leftPosition) { style.left leftPosition + ; } if (canCenterHorizontally) { transformValue + translateX( + translateX+ ); } else { transformValue + translateX( + 0 + ); } } style.transformOrigin 0 0; style.transform transformValue; self.viewScale desiredScale; self.viewToFitWidthScale scaleNeededToFitWidth; self.viewToFitHeightScale scaleNeededToFitHeight; self.viewLeft leftPosition; self.viewTop topPosition; self.updateSliderValue(desiredScale); return desiredScale; } } /** * Returns true if view can be centered horizontally * @param {HTMLElement} view view * @param {String} type type of scaling - width, height, all, none * @param {Boolean} scaleUp if scale up enabled * @param {Number} scale target scale value */ self.canCenterHorizontally function(view, type, scaleUp, scale, minimumScale, maximumScale) { var scaleNeededToFit self.getViewFitToViewportScale(view, scaleUp); var scaleNeededToFitHeight self.getViewFitToViewportHeightScale(view, scaleUp); var scaleNeededToFitWidth self.getViewFitToViewportWidthScale(view, scaleUp); var canCenter false; var minScale; type typenull ? none : type; scale scalenull ? scale : scaleNeededToFitWidth; scaleUp scaleUp null ? false : scaleUp; if (typewidth) { if (scaleUp && maximumScalenull) { canCenter false; } else if (scaleNeededToFitWidth>1) { canCenter true; } } else if (typeheight) { minScale Math.min(1, scaleNeededToFitHeight); if (minimumScale! && maximumScale!) { minScale Math.max(minimumScale, Math.min(maximumScale, scaleNeededToFitHeight)); } else { if (minimumScale!) { minScale Math.max(minimumScale, scaleNeededToFitHeight); } if (maximumScale!) { minScale Math.max(minimumScale, Math.min(maximumScale, scaleNeededToFitHeight)); } } if (scaleUp && maximumScale) { canCenter false; } else if (scaleNeededToFitWidth>minScale) { canCenter true; } } else if (typefit) { canCenter scaleNeededToFitWidth>scaleNeededToFit; } else { if (scaleUp) { canCenter false; } else if (scaleNeededToFitWidth>1) { canCenter true; } } self.horizontalScrollbarsNeeded canCenter; return canCenter; } /** * Returns true if view can be centered horizontally * @param {HTMLElement} view view to scale * @param {String} type type of scaling * @param {Boolean} scaleUp if scale up enabled * @param {Number} scale target scale value */ self.canCenterVertically function(view, type, scaleUp, scale, minimumScale, maximumScale) { var scaleNeededToFit self.getViewFitToViewportScale(view, scaleUp); var scaleNeededToFitWidth self.getViewFitToViewportWidthScale(view, scaleUp); var scaleNeededToFitHeight self.getViewFitToViewportHeightScale(view, scaleUp); var canCenter false; var minScale; type typenull ? none : type; scale scalenull ? 1 : scale; scaleUp scaleUp null ? false : scaleUp; if (typewidth) { canCenter scaleNeededToFitHeight>scaleNeededToFitWidth; } else if (typeheight) { minScale Math.max(minimumScale, Math.min(maximumScale, scaleNeededToFit)); canCenter scaleNeededToFitHeight>minScale; } else if (typefit) { canCenter scaleNeededToFitHeight>scaleNeededToFit; } else { if (scaleUp) { canCenter false; } else if (scaleNeededToFitHeight>1) { canCenter true; } } self.verticalScrollbarsNeeded canCenter; return canCenter; } self.getViewFitToViewportScale function(view, scaleUp) { var enableScaleUp scaleUp; var availableWidth window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var availableHeight window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var elementWidth parseFloat(getComputedStyle(view, style).width); var elementHeight parseFloat(getComputedStyle(view, style).height); var newScale 1; // if element is not added to the document computed values are NaN if (isNaN(elementWidth) || isNaN(elementHeight)) { return newScale; } availableWidth - self.horizontalPadding; availableHeight - self.verticalPadding; if (enableScaleUp) { newScale Math.min(availableHeight/elementHeight, availableWidth/elementWidth); } else if (elementWidth > availableWidth || elementHeight > availableHeight) { newScale Math.min(availableHeight/elementHeight, availableWidth/elementWidth); } return newScale; } self.getViewFitToViewportWidthScale function(view, scaleUp) { // need to get browser viewport width when element var isParentWindow view && view.parentNode && view.parentNodedocument.body; var enableScaleUp scaleUp; var availableWidth window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var elementWidth parseFloat(getComputedStyle(view, style).width); var newScale 1; // if element is not added to the document computed values are NaN if (isNaN(elementWidth)) { return newScale; } availableWidth - self.horizontalPadding; if (enableScaleUp) { newScale availableWidth/elementWidth; } else if (elementWidth > availableWidth) { newScale availableWidth/elementWidth; } return newScale; } self.getViewFitToViewportHeightScale function(view, scaleUp) { var enableScaleUp scaleUp; var availableHeight window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var elementHeight parseFloat(getComputedStyle(view, style).height); var newScale 1; // if element is not added to the document computed values are NaN if (isNaN(elementHeight)) { return newScale; } availableHeight - self.verticalPadding; if (enableScaleUp) { newScale availableHeight/elementHeight; } else if (elementHeight > availableHeight) { newScale availableHeight/elementHeight; } return newScale; } self.keypressHandler function(event) { var rightKey 39; var leftKey 37; // listen for both events if (event.typekeypress) { window.removeEventListener(keyup, self.keypressHandler); } else { window.removeEventListener(keypress, self.keypressHandler); } if (self.showNavigationControls) { if (self.navigationOnKeypress) { if (event.keyCoderightKey) { self.nextView(); } if (event.keyCodeleftKey) { self.previousView(); } } } else if (self.navigationOnKeypress) { if (event.keyCoderightKey) { self.nextView(); } if (event.keyCodeleftKey) { self.previousView(); } } } /////////////////////////////////// // GENERAL FUNCTIONS /////////////////////////////////// self.getViewById function(id) { id id ? id.replace(#, ) : ; var view self.viewIds.indexOf(id)!-1 && self.getElement(id); return view; } self.getViewIds function() { var viewIds self.getViewPreferenceValue(document.body, self.prefix + view-ids); var viewId null; viewIds viewIds!null && viewIds! ? viewIds.split(,) : ; if (viewIds.length0) { viewId self.getViewPreferenceValue(document.body, self.prefix + view-id); viewIds viewId ? viewId : ; } return viewIds; } self.getInitialViewId function() { var viewId self.getViewPreferenceValue(document.body, self.prefix + view-id); return viewId; } self.getApplicationStylesheet function() { var stylesheetId self.getViewPreferenceValue(document.body, self.prefix + stylesheet-id); self.applicationStylesheet document.getElementById(applicationStylesheet); return self.applicationStylesheet.sheet; } self.getVisibleView function() { var viewIds self.getViewIds(); for (var i0;iviewIds.length;i++) { var viewId viewIdsi.replace(/\#?\.?(.*)/, $ + 1); var view self.getElement(viewId); var postName _Class; if (viewnull && viewId && viewId.lastIndexOf(postName)!-1) { view self.getElement(viewId.replace(postName, )); } if (view) { var display getComputedStyle(view).display; if (displayblock || displayflex) { return view; } } } return null; } self.getVisibleViews function() { var viewIds self.getViewIds(); var views ; for (var i0;iviewIds.length;i++) { var viewId viewIdsi.replace(/\#?\.?(.*)/, $ + 1); var view self.getElement(viewId); var postName _Class; if (viewnull && viewId && viewId.lastIndexOf(postName)!-1) { view self.getElement(viewId.replace(postName, )); } if (view) { var display getComputedStyle(view).display; if (displaynone) { continue; } if (displayblock || displayflex) { views.push(view); } } } return views; } self.getStateNameByViewId function(id) { var state self.viewsDictionaryid; return state && state.stateName; } self.getMatchingViews function(ids) { var views self.addedViews.slice(0); var matchingViews ; if (self.showByMediaQuery) { for (let index 0; index views.length; index++) { var viewId viewsindex; var state self.viewsDictionaryviewId; var rule state && state.rule; var matchResults window.matchMedia(rule.conditionText); var view self.viewsviewId; if (matchResults.matches) { if (idstrue) { matchingViews.push(viewId); } else { matchingViews.push(view); } } } } return matchingViews; } self.ruleMatchesQuery function(rule) { var result window.matchMedia(rule.conditionText); return result.matches; } self.getViewsByStateName function(stateName, matchQuery) { var views self.addedViews.slice(0); var matchingViews ; if (self.showByMediaQuery) { // find state name for (let index 0; index views.length; index++) { var viewId viewsindex; var state self.viewsDictionaryviewId; var rule state.rule; var mediaRule state.mediaRule; var view self.viewsviewId; var viewStateName self.getStyleRuleValue(mediaRule, self.STATE_NAME, state); var stateFoundAtt view.getAttribute(self.STATE_NAME)state; var matchesResults false; if (viewStateNamestateName) { if (matchQuery) { matchesResults self.ruleMatchesQuery(rule); if (matchesResults) { matchingViews.push(view); } } else { matchingViews.push(view); } } } } return matchingViews; } self.getInitialView function() { var viewId self.getInitialViewId(); viewId viewId.replace(/\#?\.?(.*)/, $ + 1); var view self.getElement(viewId); var postName _Class; if (viewnull && viewId && viewId.lastIndexOf(postName)!-1) { view self.getElement(viewId.replace(postName, )); } return view; } self.getViewIndex function(view) { var viewIds self.getViewIds(); var id view ? view.id : null; var index id && viewIds ? viewIds.indexOf(id) : -1; return index; } self.syncronizeViewToURL function() { var fragment self.getHashFragment(); if (self.showByMediaQuery) { var stateName fragment; if (stateNamenull || stateName) { var initialView self.getInitialView(); stateName initialView ? self.getStateNameByViewId(initialView.id) : null; } self.showMediaQueryViewsByState(stateName); return; } var view self.getViewById(fragment); var index view ? self.getViewIndex(view) : 0; if (index-1) index 0; var currentView self.hideViews(index); if (self.supportsPopState && currentView) { if (fragmentnull) { window.history.replaceState({name:currentView.id}, null, #+ currentView.id); } else { window.history.pushState({name:currentView.id}, null, #+ currentView.id); } } self.setViewVariables(view); return view; } /** * Set the currentView or currentOverlay properties and set the lastView or lastOverlay properties */ self.setViewVariables function(view, overlay, parentView) { if (view) { if (self.currentView) { self.lastView self.currentView; } self.currentView view; } if (overlay) { if (self.currentOverlay) { self.lastOverlay self.currentOverlay; } self.currentOverlay overlay; } } self.getViewPreferenceBoolean function(view, property, altValue) { var computedStyle window.getComputedStyle(view); var value computedStyle.getPropertyValue(property); var type typeof value; if (valuetrue || (typestring && value.indexOf(true)!-1)) { return true; } else if (value && arguments.length3) { return altValue; } return false; } self.getViewPreferenceValue function(view, property, defaultValue) { var value window.getComputedStyle(view).getPropertyValue(property); if (valueundefined) { return defaultValue; } value value.replace(/^\s\*/, ); value value.replace(/\s\*$/, ); value value.replace(/^\s*(.*?)\s*$/, function (match, capture) { return capture; }); return value; } self.getStyleRuleValue function(cssRule, property) { var value cssRule ? cssRule.style.getPropertyValue(property) : null; if (valueundefined) { return null; } value value.replace(/^\s\*/, ); value value.replace(/\s\*$/, ); value value.replace(/^\s*(.*?)\s*$/, function (match, capture) { return capture; }); return value; } /** * Get the first defined value of property. Returns empty string if not defined * @param {String} id id of element * @param {String} property */ self.getCSSPropertyValueForElement function(id, property) { var styleSheets document.styleSheets; var numOfStylesheets styleSheets.length; var values ; var selectorIDText # + id; var selectorClassText . + id + _Class; var value; for(var i0;inumOfStylesheets;i++) { var styleSheet styleSheetsi; var cssRules self.getStylesheetRules(styleSheet); var numOfCSSRules cssRules.length; var cssRule; for (var j0;jnumOfCSSRules;j++) { cssRule cssRulesj; if (cssRule.media) { var mediaRules cssRule.cssRules; var numOfMediaRules mediaRules ? mediaRules.length : 0; for(var k0;knumOfMediaRules;k++) { var mediaRule mediaRulesk; if (mediaRule.selectorTextselectorIDText || mediaRule.selectorTextselectorClassText) { if (mediaRule.style && mediaRule.style.getPropertyValue(property)!) { value mediaRule.style.getPropertyValue(property); values.push(value); } } } } else { if (cssRule.selectorTextselectorIDText || cssRule.selectorTextselectorClassText) { if (cssRule.style && cssRule.style.getPropertyValue(property)!) { value cssRule.style.getPropertyValue(property); values.push(value); } } } } } return values.pop(); } self.getIsStyleDefined function(id, property) { var value self.getCSSPropertyValueForElement(id, property); return value!undefined && value!; } self.collectViews function() { var viewIds self.getViewIds(); for (let index 0; index viewIds.length; index++) { const id viewIdsindex; const view self.getElement(id); self.viewsid view; } self.viewIds viewIds; } self.collectOverlays function() { var viewIds self.getViewIds(); var ids ; for (let index 0; index viewIds.length; index++) { const id viewIdsindex; const view self.getViewById(id); const isOverlay view && self.isOverlay(view); if (isOverlay) { ids.push(id); self.overlaysid view; } } self.overlayIds ids; } self.collectMediaQueries function() { var viewIds self.getViewIds(); var styleSheet self.getApplicationStylesheet(); var cssRules self.getStylesheetRules(styleSheet); var numOfCSSRules cssRules ? cssRules.length : 0; var cssRule; var id viewIds.length ? viewIds0: ; // single view var selectorIDText # + id; var selectorClassText . + id + _Class; var viewsNotFound viewIds.slice(); var viewsFound ; var selectorText null; var property self.prefix + view-id; var stateName self.prefix + state; var stateValue null; var view null; for (var j0;jnumOfCSSRules;j++) { cssRule cssRulesj; if (cssRule.media) { var mediaRules cssRule.cssRules; var numOfMediaRules mediaRules ? mediaRules.length : 0; var mediaViewInfoFound false; var mediaId null; for(var k0;knumOfMediaRules;k++) { var mediaRule mediaRulesk; selectorText mediaRule.selectorText; if (selectorText.mediaViewInfo && mediaViewInfoFoundfalse) { mediaId self.getStyleRuleValue(mediaRule, property); stateValue self.getStyleRuleValue(mediaRule, stateName); selectorIDText # + mediaId; selectorClassText . + mediaId + _Class; view self.getElement(mediaId); // prevent duplicates from load and domcontentloaded events if (self.addedViews.indexOf(mediaId)-1) { self.addView(view, mediaId, cssRule, mediaRule, stateValue); } viewsFound.push(mediaId); if (viewsNotFound.indexOf(mediaId)!-1) { viewsNotFound.splice(viewsNotFound.indexOf(mediaId)); } mediaViewInfoFound true; } if (selectorIDTextselectorText || selectorClassTextselectorText) { var styleObject self.viewsDictionarymediaId; if (styleObject) { styleObject.styleDeclaration mediaRule; } break; } } } else { selectorText cssRule.selectorText; if (selectorTextnull) continue; selectorText selectorText.replace(/#|\s|*?/g, ); if (viewIds.indexOf(selectorText)!-1) { view self.getElement(selectorText); self.addView(view, selectorText, cssRule, null, stateValue); if (viewsNotFound.indexOf(selectorText)!-1) { viewsNotFound.splice(viewsNotFound.indexOf(selectorText)); } break; } } } if (viewsNotFound.length) { console.log(Could not find the following views: + viewsNotFound.join(,) + ); console.log(Views found: + viewsFound.join(,) + ); } } /** * Adds a view * @param {HTMLElement} view view element * @param {String} id id of view element * @param {CSSRule} cssRule of view element * @param {CSSMediaRule} mediaRule media rule of view element * @param {String} stateName name of state if applicable **/ self.addView function(view, viewId, cssRule, mediaRule, stateName) { var viewData {}; viewData.name viewId; viewData.rule cssRule; viewData.id viewId; viewData.mediaRule mediaRule; viewData.stateName stateName; self.views.push(viewData); self.addedViews.push(viewId); self.viewsDictionaryviewId viewData; self.mediaQueryDictionaryviewId cssRule; } self.hasView function(name) { if (self.addedViews.indexOf(name)!-1) { return true; } return false; } /** * Go to view by id. Views are added in addView() * @param {String} id id of view in current * @param {Boolean} maintainPreviousState if true then do not hide other views * @param {String} parent id of parent view **/ self.goToView function(id, maintainPreviousState, parent) { var state self.viewsDictionaryid; if (state) { if (maintainPreviousStatefalse || maintainPreviousStatenull) { self.hideViews(); } self.enableMediaQuery(state.rule); self.updateViewLabel(); self.updateURL(); } else { var event new Event(self.STATE_NOT_FOUND); self.stateName id; window.dispatchEvent(event); } } /** * Go to the view in the event targets CSS variable **/ self.goToTargetView function(event) { var button event.currentTarget; var buttonComputedStyles getComputedStyle(button); var actionTargetValue buttonComputedStyles.getPropertyValue(self.prefix+action-target).trim(); var animation buttonComputedStyles.getPropertyValue(self.prefix+animation).trim(); var targetType buttonComputedStyles.getPropertyValue(self.prefix+action-type).trim(); var targetView self.application ? null : self.getElement(actionTargetValue); var targetState targetView ? self.getStateNameByViewId(targetView.id) : null; var actionTargetStyles targetView ? targetView.style : null; var state self.viewsDictionaryactionTargetValue; // navigate to page if (self.applicationfalse || targetTypepage) { document.location.href ./ + actionTargetValue; return; } // if view is found if (targetView) { if (self.currentOverlay) { self.removeOverlay(false); } if (self.showByMediaQuery) { var stateName targetState; if (stateNamenull || stateName) { var initialView self.getInitialView(); stateName initialView ? self.getStateNameByViewId(initialView.id) : null; } self.showMediaQueryViewsByState(stateName, event); return; } // add animation set in event target style declaration if (animation && self.supportAnimations) { self.crossFade(self.currentView, targetView, false, animation); } else { self.setViewVariables(self.currentView); self.hideViews(); self.enableMediaQuery(state.rule); self.scaleViewIfNeeded(targetView); self.centerView(targetView); self.updateViewLabel(); self.updateURL(); } } else { var stateEvent new Event(self.STATE_NOT_FOUND); self.stateName name; window.dispatchEvent(stateEvent); } event.stopImmediatePropagation(); } /** * Cross fade between views **/ self.crossFade function(from, to, update, animation) { var targetIndex to.parentNode var fromIndex Array.prototype.slice.call(from.parentElement.children).indexOf(from); var toIndex Array.prototype.slice.call(to.parentElement.children).indexOf(to); if (from.parentNodeto.parentNode) { var reverse self.getReverseAnimation(animation); var duration self.getAnimationDuration(animation, true); // if target view is above (higher index) // then fade in target view // and after fade in then hide previous view instantly if (fromIndextoIndex) { self.setElementAnimation(from, null); self.setElementAnimation(to, null); self.showViewByMediaQuery(to); self.fadeIn(to, update, animation); setTimeout(function() { self.setElementAnimation(to, null); self.setElementAnimation(from, null); self.hideView(from); self.updateURL(); self.setViewVariables(to); self.updateViewLabel(); }, duration) } // if target view is on bottom // then show target view instantly // and fade out current view else if (fromIndex>toIndex) { self.setElementAnimation(to, null); self.setElementAnimation(from, null); self.showViewByMediaQuery(to); self.fadeOut(from, update, reverse); setTimeout(function() { self.setElementAnimation(to, null); self.setElementAnimation(from, null); self.hideView(from); self.updateURL(); self.setViewVariables(to); }, duration) } } } self.fadeIn function(element, update, animation) { self.showViewByMediaQuery(element); if (update) { self.updateURL(element); element.addEventListener(animationend, function(event) { element.style.animation null; self.setViewVariables(element); self.updateViewLabel(); element.removeEventListener(animationend, arguments.callee); }); } self.setElementAnimation(element, null); element.style.animation animation; } self.fadeOutCurrentView function(animation, update) { if (self.currentView) { self.fadeOut(self.currentView, update, animation); } if (self.currentOverlay) { self.fadeOut(self.currentOverlay, update, animation); } } self.fadeOut function(element, update, animation) { if (update) { element.addEventListener(animationend, function(event) { element.style.animation null; self.hideView(element); element.removeEventListener(animationend, arguments.callee); }); } element.style.animationPlayState paused; element.style.animation animation; element.style.animationPlayState running; } self.getReverseAnimation function(animation) { if (animation && animation.indexOf(reverse)-1) { animation + reverse; } return animation; } /** * Get duration in animation string * @param {String} animation animation value * @param {Boolean} inMilliseconds length in milliseconds if true */ self.getAnimationDuration function(animation, inMilliseconds) { var duration 0; var expression /.+(\d\.\d)s.+/; if (animation && animation.match(expression)) { duration parseFloat(animation.replace(expression, $ + 1)); if (duration && inMilliseconds) duration duration * 1000; } return duration; } self.setElementAnimation function(element, animation, priority) { element.style.setProperty(animation, animation, important); } self.getElement function(id) { id id ? id.trim() : id; var element id ? document.getElementById(id) : null; return element; } self.getElementById function(id) { id id ? id.trim() : id; var element id ? document.getElementById(id) : null; return element; } self.getElementByClass function(className) { className className ? className.trim() : className; var elements document.getElementsByClassName(className); return elements.length ? elements0 : null; } self.resizeHandler function(event) { if (self.showByMediaQuery) { if (self.enableDeepLinking) { var stateName self.getHashFragment(); if (stateNamenull || stateName) { var initialView self.getInitialView(); stateName initialView ? self.getStateNameByViewId(initialView.id) : null; } self.showMediaQueryViewsByState(stateName, event); } } else { var visibleViews self.getVisibleViews(); for (let index 0; index visibleViews.length; index++) { var view visibleViewsindex; self.scaleViewIfNeeded(view); } } window.dispatchEvent(new Event(self.APPLICATION_RESIZE)); } self.scaleViewIfNeeded function(view) { if (self.scaleViewsOnResize) { if (viewnull) { view self.getVisibleView(); } var isViewScaled view.getAttributeNS(null, self.SIZE_STATE_NAME)false ? false : true; if (isViewScaled) { self.scaleViewToFit(view, true); } else { self.scaleViewToActualSize(view); } } else if (view) { self.centerView(view); } } self.centerView function(view) { if (self.scaleViewsToFit) { self.scaleViewToFit(view, true); } else { self.scaleViewToActualSize(view); // for centering support for now } } self.preventDoubleClick function(event) { event.stopImmediatePropagation(); } self.getHashFragment function() { var value window.location.hash ? window.location.hash.replace(#, ) : ; return value; } self.showBlockElement function(view) { view.style.display block; } self.hideElement function(view) { view.style.display none; } self.showStateFunction null; self.showMediaQueryViewsByState function(state, event) { // browser will hide and show by media query (small, medium, large) // but if multiple views exists at same size user may want specific view // if showStateFunction is defined that is called with state fragment and user can show or hide each media matching view by returning true or false // if showStateFunction is not defined and state is defined and view has a defined state that matches then show that and hide other matching views // if no state is defined show view // an viewChanging event is dispatched before views are shown or hidden that can be prevented // get all matched queries // if state name is specified then show that view and hide other views // if no state name is defined then show var matchedViews self.getMatchingViews(); var matchMediaQuery true; var foundViews self.getViewsByStateName(state, matchMediaQuery); var showViews ; var hideViews ; // loop views that match media query for (let index 0; index matchedViews.length; index++) { var view matchedViewsindex; // let user determine visible view if (self.showStateFunction!null) { if (self.showStateFunction(view, state)) { showViews.push(view); } else { hideViews.push(view); } } // state was defined so check if view matches state else if (foundViews.length) { if (foundViews.indexOf(view)!-1) { showViews.push(view); } else { hideViews.push(view); } } // if no state names are defined show view (define unused state name to exclude) else if (statenull || state) { showViews.push(view); } } if (showViews.length) { var viewChangingEvent new Event(self.VIEW_CHANGING); viewChangingEvent.showViews showViews; viewChangingEvent.hideViews hideViews; window.dispatchEvent(viewChangingEvent); if (viewChangingEvent.defaultPreventedfalse) { for (var index 0; index hideViews.length; index++) { var view hideViewsindex; if (self.isOverlay(view)) { self.removeOverlay(view); } else { self.hideElement(view); } } for (var index 0; index showViews.length; index++) { var view showViewsindex; if (indexshowViews.length-1) { self.clearDisplay(view); self.setViewOptions(view); self.setViewVariables(view); self.centerView(view); self.updateURLState(view, state); } } } var viewChangeEvent new Event(self.VIEW_CHANGE); viewChangeEvent.showViews showViews; viewChangeEvent.hideViews hideViews; window.dispatchEvent(viewChangeEvent); } } self.clearDisplay function(view) { view.style.setProperty(display, null); } self.hashChangeHandler function(event) { var fragment self.getHashFragment(); var view self.getViewById(fragment); if (self.showByMediaQuery) { var stateName fragment; if (stateNamenull || stateName) { var initialView self.getInitialView(); stateName initialView ? self.getStateNameByViewId(initialView.id) : null; } self.showMediaQueryViewsByState(stateName); } else { if (view) { self.hideViews(); self.showView(view); self.setViewVariables(view); self.updateViewLabel(); window.dispatchEvent(new Event(self.VIEW_CHANGE)); } else { window.dispatchEvent(new Event(self.VIEW_NOT_FOUND)); } } } self.popStateHandler function(event) { var state event.state; var fragment state ? state.name : window.location.hash; var view self.getViewById(fragment); if (view) { self.hideViews(); self.showView(view); self.updateViewLabel(); } else { window.dispatchEvent(new Event(self.VIEW_NOT_FOUND)); } } self.doubleClickHandler function(event) { var view self.getVisibleView(); var scaleValue view ? self.getViewScaleValue(view) : 1; var scaleNeededToFit view ? self.getViewFitToViewportScale(view) : 1; var scaleNeededToFitWidth view ? self.getViewFitToViewportWidthScale(view) : 1; var scaleNeededToFitHeight view ? self.getViewFitToViewportHeightScale(view) : 1; var scaleToFitType self.scaleToFitType; // Three scenarios // - scale to fit on double click // - set scale to actual size on double click // - switch between scale to fit and actual page size if (scaleToFitTypewidth) { scaleNeededToFit scaleNeededToFitWidth; } else if (scaleToFitTypeheight) { scaleNeededToFit scaleNeededToFitHeight; } // if scale and actual size enabled then switch between if (self.scaleToFitOnDoubleClick && self.actualSizeOnDoubleClick) { var isViewScaled view.getAttributeNS(null, self.SIZE_STATE_NAME); var isScaled false; // if scale is not 1 then view needs scaling if (scaleNeededToFit!1) { // if current scale is at 1 it is at actual size // scale it to fit if (scaleValue1) { self.scaleViewToFit(view); isScaled true; } else { // scale is not at 1 so switch to actual size self.scaleViewToActualSize(view); isScaled false; } } else { // view is smaller than viewport // so scale to fit() is scale actual size // actual size and scaled size are the same // but call scale to fit to retain centering self.scaleViewToFit(view); isScaled false; } view.setAttributeNS(null, self.SIZE_STATE_NAME, isScaled+); isViewScaled view.getAttributeNS(null, self.SIZE_STATE_NAME); } else if (self.scaleToFitOnDoubleClick) { self.scaleViewToFit(view); } else if (self.actualSizeOnDoubleClick) { self.scaleViewToActualSize(view); } } self.scaleViewToFit function(view) { return self.setViewScaleValue(view, true); } self.scaleViewToActualSize function(view) { self.setViewScaleValue(view, false, 1); } self.onloadHandler function(event) { self.initialize(); } self.setElementHTML function(id, value) { var element self.getElement(id); element.innerHTML value; } self.getStackArray function(error) { var value ; if (errornull) { try { error new Error(Stack); } catch (e) { } } if (stack in error) { value error.stack; var methods value.split(/\n/g); var newArray methods ? methods.map(function (value, index, array) { value value.replace(/\@.*/,); return value; }) : null; if (newArray && newArray0.includes(getStackTrace)) { newArray.shift(); } if (newArray && newArray0.includes(getStackArray)) { newArray.shift(); } if (newArray && newArray0) { newArray.shift(); } return newArray; } return null; } self.log function(value) { console.log.apply(this, value); } // initialize on load // sometimes the body size is 0 so we call this now and again later window.addEventListener(load, self.onloadHandler); window.document.addEventListener(DOMContentLoaded, self.onloadHandler);}window.application new Application();/script>/head>body>div idWeb_1920__1> div idScroll_Group_1> img idPendekar srcPendekar.png srcsetPendekar.png 1x, Pendekar@2x.png 2x> /div> div idcoming_soon> span>coming soon/span> /div> div idIcon_feather-youtube> a hrefhttps://www.youtube.com/@UnderboardMedia/> svg classPath_1 viewBox1.499 6 33.002 23.19> path idPath_1 dM 33.81000137329102 9.630000114440918 C 33.44731903076172 8.180986404418945 32.33729934692383 7.036636352539062 30.90000152587891 6.630000114440918 C 28.31999969482422 6 18 6 18 6 C 18 6 7.680000305175781 6 5.100000381469727 6.690000057220459 C 3.662703275680542 7.09663724899292 2.55268406867981 8.240986824035645 2.190000057220459 9.690000534057617 C 1.717823028564453 12.30832672119141 1.486858367919922 14.96446228027344 1.5 17.625 C 1.483169555664062 20.3055534362793 1.714149475097656 22.98194313049316 2.189998626708984 25.61999320983887 C 2.589524030685425 27.02288055419922 3.693049907684326 28.11503219604492 5.100001335144043 28.49999809265137 C 7.679999828338623 29.19000053405762 18 29.19000053405762 18 29.19000053405762 C 18 29.19000053405762 28.31999969482422 29.19000053405762 30.89999961853027 28.5 C 32.33729553222656 28.09336280822754 33.44731521606445 26.94901275634766 33.81000137329102 25.49999809265137 C 34.27854156494141 22.90138244628906 34.50949478149414 20.26550102233887 34.50000762939453 17.625 C 34.51684188842773 14.94443130493164 34.28585815429688 12.26804542541504 33.81000518798828 9.629998207092285 Z> /path> /svg> svg classPath_2 viewBox14.625 12.72 8.625 9.81> path idPath_2 dM 14.625 22.53000068664551 L 23.25 17.625 L 14.625 12.71999931335449 L 14.625 22.52999877929688 Z> /path> /svg> /div> svg classIcon_ion-logo-facebook viewBox2.25 2.345 31.5 31.311> a hrefhttps://www.facebook.com/underboardid/> path idIcon_ion-logo-facebook dM 33.75 18.09492111206055 C 33.75 9.39726448059082 26.69765663146973 2.344921112060547 18 2.344921112060547 C 9.302343368530273 2.344921112060547 2.25 9.39726448059082 2.25 18.09492111206055 C 2.25 25.95585823059082 8.008593559265137 32.47171783447266 15.5390625 33.65437316894531 L 15.5390625 22.64906311035156 L 11.53898429870605 22.64906311035156 L 11.53898429870605 18.09492301940918 L 15.5390625 18.09492301940918 L 15.5390625 14.625 C 15.5390625 10.67835903167725 17.89101600646973 8.496562957763672 21.48820304870605 8.496562957763672 C 23.21156311035156 8.496562957763672 25.01437568664551 8.804532051086426 25.01437568664551 8.804532051086426 L 25.01437568664551 12.68086051940918 L 23.02734375 12.68086051940918 C 21.07195281982422 12.68086051940918 20.46023368835449 13.89445400238037 20.46023368835449 15.14179801940918 L 20.46023368835449 18.09492301940918 L 24.82804679870605 18.09492301940918 L 24.13054656982422 22.64906311035156 L 20.4609375 22.64906311035156 L 20.4609375 33.65578079223633 C 27.99140548706055 32.47382736206055 33.75 25.95796775817871 33.75 18.09492111206055 Z> /path> /svg> svg classIcon_akar-instagram-fill viewBox1.5 1.5 33 33> a hrefhttps://www.instagram.com/underboard_id/> path idIcon_akar-instagram-fill dM 11.19750022888184 1.598999977111816 C 12.95699977874756 1.51800000667572 13.51799964904785 1.5 18 1.5 C 22.48200035095215 1.5 23.04299926757812 1.519500017166138 24.80100059509277 1.598999977111816 C 26.55900001525879 1.678499937057495 27.75900077819824 1.958999991416931 28.80900001525879 2.365499973297119 C 29.90850067138672 2.780999898910522 30.9060001373291 3.430500030517578 31.73099899291992 4.270500183105469 C 32.57099914550781 5.094000339508057 33.21899795532227 6.090000152587891 33.63299942016602 7.190999984741211 C 34.04100036621094 8.241000175476074 34.31999969482422 9.440999984741211 34.4010009765625 11.19600009918213 C 34.48199844360352 12.95849990844727 34.5 13.51949977874756 34.5 18 C 34.5 22.48200035095215 34.48049926757812 23.04299926757812 34.4010009765625 24.80249977111816 C 34.32150268554688 26.55749893188477 34.04100036621094 27.75749969482422 33.63299942016602 28.80749893188477 C 33.21898651123047 29.90863990783691 32.56991577148438 30.90629959106445 31.73099708557129 31.73099899291992 C 30.90599822998047 32.57099914550781 29.90849876403809 33.21899795532227 28.80899810791016 33.63299942016602 C 27.75899887084961 34.04100036621094 26.55899810791016 34.31999969482422 24.80399703979492 34.4010009765625 C 23.04299736022949 34.48200225830078 22.48199653625488 34.5 17.99999618530273 34.5 C 13.51799583435059 34.5 12.95699596405029 34.48049926757812 11.19749641418457 34.4010009765625 C 9.442496299743652 34.32150268554688 8.242496490478516 34.04100036621094 7.192496299743652 33.63299942016602 C 6.091377258300781 33.21894836425781 5.093727111816406 32.56988525390625 4.268996238708496 31.73100280761719 C 3.429566860198975 30.90700912475586 2.779969215393066 29.90983009338379 2.365496635437012 28.80900192260742 C 1.958996176719666 27.75899887084961 1.679996132850647 26.55899810791016 1.598996162414551 24.80399703979492 C 1.51800000667572 23.04150009155273 1.5 22.48049926757812 1.5 18 C 1.5 13.51799964904785 1.519500017166138 12.95699977874756 1.598999977111816 11.19899940490723 C 1.678499937057495 9.440999031066895 1.958999991416931 8.240999221801758 2.365499973297119 7.190999507904053 C 2.780584335327148 6.090121746063232 3.430678367614746 5.09296989440918 4.270499706268311 4.26900053024292 C 5.094061851501465 3.429750919342041 6.090709686279297 2.780163288116455 7.191001892089844 2.365498065948486 C 8.241000175476074 1.958999514579773 9.440999984741211 1.679999470710754 11.19600009918213 1.598999500274658 Z M 24.66749954223633 4.569000244140625 C 22.92749977111816 4.489500045776367 22.40549850463867 4.473000049591064 18 4.473000049591064 C 13.5944995880127 4.473000049591064 13.07250022888184 4.489500045776367 11.33250045776367 4.569000244140625 C 9.723000526428223 4.642500400543213 8.850000381469727 4.91100025177002 8.268000602722168 5.137500286102295 C 7.498500823974609 5.437500476837158 6.948000431060791 5.793000221252441 6.370500564575195 6.370500564575195 C 5.823067188262939 6.903078079223633 5.401771068572998 7.5514235496521 5.137500762939453 8.267999649047852 C 4.911000728607178 8.850000381469727 4.642500877380371 9.723000526428223 4.569000720977783 11.33250045776367 C 4.489500522613525 13.07250022888184 4.473000526428223 13.59450054168701 4.473000526428223 18 C 4.473000526428223 22.4055004119873 4.489500522613525 22.92749977111816 4.569000720977783 24.66749954223633 C 4.642500877380371 26.27700042724609 4.911000728607178 27.14999961853027 5.137500762939453 27.73200035095215 C 5.401500701904297 28.44750022888184 5.823000907897949 29.09700012207031 6.370500564575195 29.62950134277344 C 6.903000831604004 30.177001953125 7.55250072479248 30.59850120544434 8.268000602722168 30.86250114440918 C 8.850000381469727 31.0890007019043 9.723000526428223 31.35750198364258 11.33250045776367 31.43100166320801 C 13.07250022888184 31.51050186157227 13.5930004119873 31.52700233459473 18 31.52700233459473 C 22.4069995880127 31.52700233459473 22.92749977111816 31.51050186157227 24.66749954223633 31.43100166320801 C 26.27700042724609 31.35750198364258 27.14999961853027 31.0890007019043 27.73200035095215 30.86250114440918 C 28.50150108337402 30.56250190734863 29.05200004577637 30.20700073242188 29.62950134277344 29.62950134277344 C 30.177001953125 29.09700202941895 30.59850120544434 28.44750213623047 30.86250114440918 27.73200225830078 C 31.0890007019043 27.15000152587891 31.35750198364258 26.27700233459473 31.43100166320801 24.66750144958496 C 31.51050186157227 22.9275016784668 31.52700233459473 22.40550231933594 31.52700233459473 18.00000190734863 C 31.52700233459473 13.59450149536133 31.51050186157227 13.07250213623047 31.43100166320801 11.3325023651123 C 31.35750198364258 9.723002433776855 31.0890007019043 8.850002288818359 30.86250114440918 8.268002510070801 C 30.56250190734863 7.498502731323242 30.20700073242188 6.948002338409424 29.62950134277344 6.370502471923828 C 29.09689331054688 5.823110103607178 28.44855499267578 5.401819229125977 27.73200225830078 5.137503147125244 C 27.15000152587891 4.911002635955811 26.27700233459473 4.642502784729004 24.66750144958496 4.569002628326416 Z M 15.89249992370605 23.08650016784668 C 18.31974220275879 24.09689521789551 21.1226692199707 23.2493724822998 22.58341598510742 21.0633659362793 C 24.04416275024414 18.87735939025879 23.75472640991211 15.96344089508057 21.89249992370605 14.10750007629395 C 20.31791496276855 12.53389739990234 17.95058250427246 12.06349086761475 15.89400005340576 12.91555404663086 C 13.83741855621338 13.76761531829834 12.49641990661621 15.77442073822021 12.49609184265137 18.00052452087402 C 12.49609088897705 20.22744178771973 13.83679389953613 22.23444366455078 15.89325046539307 23.0868091583252 Z M 12.00300025939941 12.00300025939941 C 15.3150520324707 8.690947532653809 20.6849479675293 8.690948486328125 23.99700164794922 12.00300025939941 C 27.30905151367188 15.3150520324707 27.30905151367188 20.6849479675293 23.99699974060059 23.99700164794922 C 20.6849479675293 27.30905342102051 15.31505012512207 27.30905151367188 12.00300025939941 23.99699974060059 C 8.690948486328125 20.68494987487793 8.690949440002441 15.3150520324707 12.00300216674805 12.00300216674805 Z M 28.36199951171875 10.78200054168701 C 28.89334106445312 10.28077793121338 29.11014938354492 9.530304908752441 28.92796325683594 8.82294750213623 C 28.74577713012695 8.11559009552002 28.19341278076172 7.563224315643311 27.48605346679688 7.381038665771484 C 26.77869606018066 7.1988525390625 26.02822494506836 7.415661334991455 25.52700042724609 7.947000980377197 C 24.7825984954834 8.736136436462402 24.80065155029297 9.974160194396973 25.56774711608887 10.74125480651855 C 26.33484077453613 11.50834846496582 27.5728645324707 11.52640151977539 28.36199951171875 10.78200054168701 Z> /path> /svg> div idunderboard_media> span>underboard media/span> /div> img idlogo_new srclogo_new.png srcsetlogo_new.png 1x, logo_new@2x.png 2x> /div>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]