/*! elementor - v3.16.0 - 14-09-2023 */ "use strict"; (self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["accordion"],{ /***/ "../assets/dev/js/frontend/handlers/accordion.js": /*!*******************************************************!*\ !*** ../assets/dev/js/frontend/handlers/accordion.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../assets/dev/js/frontend/handlers/base-tabs.js")); class Accordion extends _baseTabs.default { getDefaultSettings() { const defaultSettings = super.getDefaultSettings(); return { ...defaultSettings, showTabFn: 'slideDown', hideTabFn: 'slideUp' }; } } exports["default"] = Accordion; /***/ }), /***/ "../assets/dev/js/frontend/handlers/base-tabs.js": /*!*******************************************************!*\ !*** ../assets/dev/js/frontend/handlers/base-tabs.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class baseTabs extends elementorModules.frontend.handlers.Base { getDefaultSettings() { return { selectors: { tablist: '[role="tablist"]', tabTitle: '.elementor-tab-title', tabContent: '.elementor-tab-content' }, classes: { active: 'elementor-active' }, showTabFn: 'show', hideTabFn: 'hide', toggleSelf: true, hidePrevious: true, autoExpand: true, keyDirection: { ArrowLeft: elementorFrontendConfig.is_rtl ? 1 : -1, ArrowUp: -1, ArrowRight: elementorFrontendConfig.is_rtl ? -1 : 1, ArrowDown: 1 } }; } getDefaultElements() { const selectors = this.getSettings('selectors'); return { $tabTitles: this.findElement(selectors.tabTitle), $tabContents: this.findElement(selectors.tabContent) }; } activateDefaultTab() { const settings = this.getSettings(); if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) { return; } const defaultActiveTab = this.getEditSettings('activeItemIndex') || 1, originalToggleMethods = { showTabFn: settings.showTabFn, hideTabFn: settings.hideTabFn }; // Toggle tabs without animation to avoid jumping this.setSettings({ showTabFn: 'show', hideTabFn: 'hide' }); this.changeActiveTab(defaultActiveTab); // Return back original toggle effects this.setSettings(originalToggleMethods); } handleKeyboardNavigation(event) { const tab = event.currentTarget, $tabList = jQuery(tab.closest(this.getSettings('selectors').tablist)), // eslint-disable-next-line @wordpress/no-unused-vars-before-return $tabs = $tabList.find(this.getSettings('selectors').tabTitle), isVertical = 'vertical' === $tabList.attr('aria-orientation'); switch (event.key) { case 'ArrowLeft': case 'ArrowRight': if (isVertical) { return; } break; case 'ArrowUp': case 'ArrowDown': if (!isVertical) { return; } event.preventDefault(); break; case 'Home': event.preventDefault(); $tabs.first().trigger('focus'); return; case 'End': event.preventDefault(); $tabs.last().trigger('focus'); return; default: return; } const tabIndex = tab.getAttribute('data-tab') - 1, direction = this.getSettings('keyDirection')[event.key], nextTab = $tabs[tabIndex + direction]; if (nextTab) { nextTab.focus(); } else if (-1 === tabIndex + direction) { $tabs.last().trigger('focus'); } else { $tabs.first().trigger('focus'); } } deactivateActiveTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass, $activeTitle = this.elements.$tabTitles.filter(activeFilter), $activeContent = this.elements.$tabContents.filter(activeFilter); $activeTitle.add($activeContent).removeClass(activeClass); $activeTitle.attr({ tabindex: '-1', 'aria-selected': 'false', 'aria-expanded': 'false' }); $activeContent[settings.hideTabFn](); $activeContent.attr('hidden', 'hidden'); } activateTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'), $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]'), animationDuration = 'show' === settings.showTabFn ? 0 : 400; $requestedTitle.add($requestedContent).addClass(activeClass); $requestedTitle.attr({ tabindex: '0', 'aria-selected': 'true', 'aria-expanded': 'true' }); $requestedContent[settings.showTabFn](animationDuration, () => elementorFrontend.elements.$window.trigger('elementor-pro/motion-fx/recalc')); $requestedContent.removeAttr('hidden'); } isActiveTab(tabIndex) { return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active')); } bindEvents() { this.elements.$tabTitles.on({ keydown: event => { // Support for old markup that includes an `` tag in the tab if (jQuery(event.target).is('a') && `Enter` === event.key) { event.preventDefault(); } // We listen to keydowon event for these keys in order to prevent undesired page scrolling if (['End', 'Home', 'ArrowUp', 'ArrowDown'].includes(event.key)) { this.handleKeyboardNavigation(event); } }, keyup: event => { switch (event.code) { case 'ArrowLeft': case 'ArrowRight': this.handleKeyboardNavigation(event); break; case 'Enter': case 'Space': event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); break; } }, click: event => { event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); } }); } onInit() { super.onInit(...arguments); this.activateDefaultTab(); } onEditSettingsChange(propertyName) { if ('activeItemIndex' === propertyName) { this.activateDefaultTab(); } } changeActiveTab(tabIndex) { const isActiveTab = this.isActiveTab(tabIndex), settings = this.getSettings(); if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) { this.deactivateActiveTab(); } if (!settings.hidePrevious && isActiveTab) { this.deactivateActiveTab(tabIndex); } if (!isActiveTab) { this.activateTab(tabIndex); } } } exports["default"] = baseTabs; /***/ }) }]); //# sourceMappingURL=accordion.c16b88b2e8a0c50189bc.bundle.js.map(function(e,t){"use strict";var n=e.History=e.History||{},r=e.jQuery;if(typeof n.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");n.Adapter={bind:function(e,t,n){r(e).bind(t,n)},trigger:function(e,t,n){r(e).trigger(t,n)},extractEventData:function(e,n,r){var i=n&&n.originalEvent&&n.originalEvent[e]||r&&r[e]||t;return i},onDomLoad:function(e){r(e)}},typeof n.init!="undefined"&&n.init()})(window),function(e,t){"use strict";var n=e.console||t,r=e.document,i=e.navigator,s=!1,o=e.setTimeout,u=e.clearTimeout,a=e.setInterval,f=e.clearInterval,l=e.JSON,c=e.alert,h=e.History=e.History||{},p=e.history;try{s=e.sessionStorage,s.setItem("TEST","1"),s.removeItem("TEST")}catch(d){s=!1}l.stringify=l.stringify||l.encode,l.parse=l.parse||l.decode;if(typeof h.init!="undefined")throw new Error("History.js Core has already been loaded...");h.init=function(e){return typeof h.Adapter=="undefined"?!1:(typeof h.initCore!="undefined"&&h.initCore(),typeof h.initHtml4!="undefined"&&h.initHtml4(),!0)},h.initCore=function(d){if(typeof h.initCore.initialized!="undefined")return!1;h.initCore.initialized=!0,h.options=h.options||{},h.options.hashChangeInterval=h.options.hashChangeInterval||100,h.options.safariPollInterval=h.options.safariPollInterval||500,h.options.doubleCheckInterval=h.options.doubleCheckInterval||500,h.options.disableSuid=h.options.disableSuid||!1,h.options.storeInterval=h.options.storeInterval||1e3,h.options.busyDelay=h.options.busyDelay||250,h.options.debug=h.options.debug||!1,h.options.initialTitle=h.options.initialTitle||r.title,h.options.html4Mode=h.options.html4Mode||!1,h.options.delayInit=h.options.delayInit||!1,h.intervalList=[],h.clearAllIntervals=function(){var e,t=h.intervalList;if(typeof t!="undefined"&&t!==null){for(e=0;e")&&n[0]);return e>4?e:!1}();return e},h.isInternetExplorer=function(){var e=h.isInternetExplorer.cached=typeof h.isInternetExplorer.cached!="undefined"?h.isInternetExplorer.cached:Boolean(h.getInternetExplorerMajorVersion());return e},h.options.html4Mode?h.emulated={pushState:!0,hashChange:!0}:h.emulated={pushState:!Boolean(e.history&&e.history.pushState&&e.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(i.userAgent)),hashChange:Boolean(!("onhashchange"in e||"onhashchange"in r)||h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8)},h.enabled=!h.emulated.pushState,h.bugs={setHash:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),safariPoll:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),ieDoubleCheck:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<7)},h.isEmptyObject=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},h.cloneObject=function(e){var t,n;return e?(t=l.stringify(e),n=l.parse(t)):n={},n},h.getRootUrl=function(){var e=r.location.protocol+"//"+(r.location.hostname||r.location.host);if(r.location.port||!1)e+=":"+r.location.port;return e+="/",e},h.getBaseHref=function(){var e=r.getElementsByTagName("base"),t=null,n="";return e.length===1&&(t=e[0],n=t.href.replace(/[^\/]+$/,"")),n=n.replace(/\/+$/,""),n&&(n+="/"),n},h.getBaseUrl=function(){var e=h.getBaseHref()||h.getBasePageUrl()||h.getRootUrl();return e},h.getPageUrl=function(){var e=h.getState(!1,!1),t=(e||{}).url||h.getLocationHref(),n;return n=t.replace(/\/+$/,"").replace(/[^\/]+$/,function(e,t,n){return/\./.test(e)?e:e+"/"}),n},h.getBasePageUrl=function(){var e=h.getLocationHref().replace(/[#\?].*/,"").replace(/[^\/]+$/,function(e,t,n){return/[^\/]$/.test(e)?"":e}).replace(/\/+$/,"")+"/";return e},h.getFullUrl=function(e,t){var n=e,r=e.substring(0,1);return t=typeof t=="undefined"?!0:t,/[a-z]+\:\/\//.test(e)||(r==="/"?n=h.getRootUrl()+e.replace(/^\/+/,""):r==="#"?n=h.getPageUrl().replace(/#.*/,"")+e:r==="?"?n=h.getPageUrl().replace(/[\?#].*/,"")+e:t?n=h.getBaseUrl()+e.replace(/^(\.\/)+/,""):n=h.getBasePageUrl()+e.replace(/^(\.\/)+/,"")),n.replace(/\#$/,"")},h.getShortUrl=function(e){var t=e,n=h.getBaseUrl(),r=h.getRootUrl();return h.emulated.pushState&&(t=t.replace(n,"")),t=t.replace(r,"/"),h.isTraditionalAnchor(t)&&(t="./"+t),t=t.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),t},h.getLocationHref=function(e){return e=e||r,e.URL===e.location.href?e.location.href:e.location.href===decodeURIComponent(e.URL)?e.URL:e.location.hash&&decodeURIComponent(e.location.href.replace(/^[^#]+/,""))===e.location.hash?e.location.href:e.URL.indexOf("#")==-1&&e.location.href.indexOf("#")!=-1?e.location.href:e.URL||e.location.href},h.store={},h.idToState=h.idToState||{},h.stateToId=h.stateToId||{},h.urlToId=h.urlToId||{},h.storedStates=h.storedStates||[],h.savedStates=h.savedStates||[],h.normalizeStore=function(){h.store.idToState=h.store.idToState||{},h.store.urlToId=h.store.urlToId||{},h.store.stateToId=h.store.stateToId||{}},h.getState=function(e,t){typeof e=="undefined"&&(e=!0),typeof t=="undefined"&&(t=!0);var n=h.getLastSavedState();return!n&&t&&(n=h.createStateObject()),e&&(n=h.cloneObject(n),n.url=n.cleanUrl||n.url),n},h.getIdByState=function(e){var t=h.extractId(e.url),n;if(!t){n=h.getStateString(e);if(typeof h.stateToId[n]!="undefined")t=h.stateToId[n];else if(typeof h.store.stateToId[n]!="undefined")t=h.store.stateToId[n];else{for(;;){t=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof h.idToState[t]=="undefined"&&typeof h.store.idToState[t]=="undefined")break}h.stateToId[n]=t,h.idToState[t]=e}}return t},h.normalizeState=function(e){var t,n;if(!e||typeof e!="object")e={};if(typeof e.normalized!="undefined")return e;if(!e.data||typeof e.data!="object")e.data={};return t={},t.normalized=!0,t.title=e.title||"",t.url=h.getFullUrl(e.url?e.url:h.getLocationHref()),t.hash=h.getShortUrl(t.url),t.data=h.cloneObject(e.data),t.id=h.getIdByState(t),t.cleanUrl=t.url.replace(/\??\&_suid.*/,""),t.url=t.cleanUrl,n=!h.isEmptyObject(t.data),(t.title||n)&&h.options.disableSuid!==!0&&(t.hash=h.getShortUrl(t.url).replace(/\??\&_suid.*/,""),/\?/.test(t.hash)||(t.hash+="?"),t.hash+="&_suid="+t.id),t.hashedUrl=h.getFullUrl(t.hash),(h.emulated.pushState||h.bugs.safariPoll)&&h.hasUrlDuplicate(t)&&(t.url=t.hashedUrl),t},h.createStateObject=function(e,t,n){var r={data:e,title:t,url:n};return r=h.normalizeState(r),r},h.getStateById=function(e){e=String(e);var n=h.idToState[e]||h.store.idToState[e]||t;return n},h.getStateString=function(e){var t,n,r;return t=h.normalizeState(e),n={data:t.data,title:e.title,url:e.url},r=l.stringify(n),r},h.getStateId=function(e){var t,n;return t=h.normalizeState(e),n=t.id,n},h.getHashByState=function(e){var t,n;return t=h.normalizeState(e),n=t.hash,n},h.extractId=function(e){var t,n,r,i;return e.indexOf("#")!=-1?i=e.split("#")[0]:i=e,n=/(.*)\&_suid=([0-9]+)$/.exec(i),r=n?n[1]||e:e,t=n?String(n[2]||""):"",t||!1},h.isTraditionalAnchor=function(e){var t=!/[\/\?\.]/.test(e);return t},h.extractState=function(e,t){var n=null,r,i;return t=t||!1,r=h.extractId(e),r&&(n=h.getStateById(r)),n||(i=h.getFullUrl(e),r=h.getIdByUrl(i)||!1,r&&(n=h.getStateById(r)),!n&&t&&!h.isTraditionalAnchor(e)&&(n=h.createStateObject(null,null,i))),n},h.getIdByUrl=function(e){var n=h.urlToId[e]||h.store.urlToId[e]||t;return n},h.getLastSavedState=function(){return h.savedStates[h.savedStates.length-1]||t},h.getLastStoredState=function(){return h.storedStates[h.storedStates.length-1]||t},h.hasUrlDuplicate=function(e){var t=!1,n;return n=h.extractState(e.url),t=n&&n.id!==e.id,t},h.storeState=function(e){return h.urlToId[e.url]=e.id,h.storedStates.push(h.cloneObject(e)),e},h.isLastSavedState=function(e){var t=!1,n,r,i;return h.savedStates.length&&(n=e.id,r=h.getLastSavedState(),i=r.id,t=n===i),t},h.saveState=function(e){return h.isLastSavedState(e)?!1:(h.savedStates.push(h.cloneObject(e)),!0)},h.getStateByIndex=function(e){var t=null;return typeof e=="undefined"?t=h.savedStates[h.savedStates.length-1]:e<0?t=h.savedStates[h.savedStates.length+e]:t=h.savedStates[e],t},h.getCurrentIndex=function(){var e=null;return h.savedStates.length<1?e=0:e=h.savedStates.length-1,e},h.getHash=function(e){var t=h.getLocationHref(e),n;return n=h.getHashByUrl(t),n},h.unescapeHash=function(e){var t=h.normalizeHash(e);return t=decodeURIComponent(t),t},h.normalizeHash=function(e){var t=e.replace(/[^#]*#/,"").replace(/#.*/,"");return t},h.setHash=function(e,t){var n,i;return t!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.setHash,args:arguments,queue:t}),!1):(h.busy(!0),n=h.extractState(e,!0),n&&!h.emulated.pushState?h.pushState(n.data,n.title,n.url,!1):h.getHash()!==e&&(h.bugs.setHash?(i=h.getPageUrl(),h.pushState(null,null,i+"#"+e,!1)):r.location.hash=e),h)},h.escapeHash=function(t){var n=h.normalizeHash(t);return n=e.encodeURIComponent(n),h.bugs.hashEscape||(n=n.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),n},h.getHashByUrl=function(e){var t=String(e).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return t=h.unescapeHash(t),t},h.setTitle=function(e){var t=e.title,n;t||(n=h.getStateByIndex(0),n&&n.url===e.url&&(t=n.title||h.options.initialTitle));try{r.getElementsByTagName("title")[0].innerHTML=t.replace("<","<").replace(">",">").replace(" & "," & ")}catch(i){}return r.title=t,h},h.queues=[],h.busy=function(e){typeof e!="undefined"?h.busy.flag=e:typeof h.busy.flag=="undefined"&&(h.busy.flag=!1);if(!h.busy.flag){u(h.busy.timeout);var t=function(){var e,n,r;if(h.busy.flag)return;for(e=h.queues.length-1;e>=0;--e){n=h.queues[e];if(n.length===0)continue;r=n.shift(),h.fireQueueItem(r),h.busy.timeout=o(t,h.options.busyDelay)}};h.busy.timeout=o(t,h.options.busyDelay)}return h.busy.flag},h.busy.flag=!1,h.fireQueueItem=function(e){return e.callback.apply(e.scope||h,e.args||[])},h.pushQueue=function(e){return h.queues[e.queue||0]=h.queues[e.queue||0]||[],h.queues[e.queue||0].push(e),h},h.queue=function(e,t){return typeof e=="function"&&(e={callback:e}),typeof t!="undefined"&&(e.queue=t),h.busy()?h.pushQueue(e):h.fireQueueItem(e),h},h.clearQueue=function(){return h.busy.flag=!1,h.queues=[],h},h.stateChanged=!1,h.doubleChecker=!1,h.doubleCheckComplete=function(){return h.stateChanged=!0,h.doubleCheckClear(),h},h.doubleCheckClear=function(){return h.doubleChecker&&(u(h.doubleChecker),h.doubleChecker=!1),h},h.doubleCheck=function(e){return h.stateChanged=!1,h.doubleCheckClear(),h.bugs.ieDoubleCheck&&(h.doubleChecker=o(function(){return h.doubleCheckClear(),h.stateChanged||e(),!0},h.options.doubleCheckInterval)),h},h.safariStatePoll=function(){var t=h.extractState(h.getLocationHref()),n;if(!h.isLastSavedState(t))return n=t,n||(n=h.createStateObject()),h.Adapter.trigger(e,"popstate"),h;return},h.back=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.back,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.back(!1)}),p.go(-1),!0)},h.forward=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.forward,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.forward(!1)}),p.go(1),!0)},h.go=function(e,t){var n;if(e>0)for(n=1;n<=e;++n)h.forward(t);else{if(!(e<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(n=-1;n>=e;--n)h.back(t)}return h};if(h.emulated.pushState){var v=function(){};h.pushState=h.pushState||v,h.replaceState=h.replaceState||v}else h.onPopState=function(t,n){var r=!1,i=!1,s,o;return h.doubleCheckComplete(),s=h.getHash(),s?(o=h.extractState(s||h.getLocationHref(),!0),o?h.replaceState(o.data,o.title,o.url,!1):(h.Adapter.trigger(e,"anchorchange"),h.busy(!1)),h.expectedStateId=!1,!1):(r=h.Adapter.extractEventData("state",t,n)||!1,r?i=h.getStateById(r):h.expectedStateId?i=h.getStateById(h.expectedStateId):i=h.extractState(h.getLocationHref()),i||(i=h.createStateObject(null,null,h.getLocationHref())),h.expectedStateId=!1,h.isLastSavedState(i)?(h.busy(!1),!1):(h.storeState(i),h.saveState(i),h.setTitle(i),h.Adapter.trigger(e,"statechange"),h.busy(!1),!0))},h.Adapter.bind(e,"popstate",h.onPopState),h.pushState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.pushState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.pushState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0},h.replaceState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.replaceState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.replaceState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0};if(s){try{h.store=l.parse(s.getItem("History.store"))||{}}catch(m){h.store={}}h.normalizeStore()}else h.store={},h.normalizeStore();h.Adapter.bind(e,"unload",h.clearAllIntervals),h.saveState(h.storeState(h.extractState(h.getLocationHref(),!0))),s&&(h.onUnload=function(){var e,t,n;try{e=l.parse(s.getItem("History.store"))||{}}catch(r){e={}}e.idToState=e.idToState||{},e.urlToId=e.urlToId||{},e.stateToId=e.stateToId||{};for(t in h.idToState){if(!h.idToState.hasOwnProperty(t))continue;e.idToState[t]=h.idToState[t]}for(t in h.urlToId){if(!h.urlToId.hasOwnProperty(t))continue;e.urlToId[t]=h.urlToId[t]}for(t in h.stateToId){if(!h.stateToId.hasOwnProperty(t))continue;e.stateToId[t]=h.stateToId[t]}h.store=e,h.normalizeStore(),n=l.stringify(e);try{s.setItem("History.store",n)}catch(i){if(i.code!==DOMException.QUOTA_EXCEEDED_ERR)throw i;s.length&&(s.removeItem("History.store"),s.setItem("History.store",n))}},h.intervalList.push(a(h.onUnload,h.options.storeInterval)),h.Adapter.bind(e,"beforeunload",h.onUnload),h.Adapter.bind(e,"unload",h.onUnload));if(!h.emulated.pushState){h.bugs.safariPoll&&h.intervalList.push(a(h.safariStatePoll,h.options.safariPollInterval));if(i.vendor==="Apple Computer, Inc."||(i.appCodeName||"")==="Mozilla")h.Adapter.bind(e,"hashchange",function(){h.Adapter.trigger(e,"popstate")}),h.getHash()&&h.Adapter.onDomLoad(function(){h.Adapter.trigger(e,"hashchange")})}},(!h.options||!h.options.delayInit)&&h.init()}(window){"id":1819,"date":"2021-08-02T17:34:55","date_gmt":"2021-08-02T10:34:55","guid":{"rendered":"https:\/\/uetacad.com\/?p=1819"},"modified":"2021-08-02T17:34:58","modified_gmt":"2021-08-02T10:34:58","slug":"cac-phuong-thuc-scaling-trong-aws","status":"publish","type":"post","link":"https:\/\/uetacad.com\/cac-phuong-thuc-scaling-trong-aws\/","title":{"rendered":"C\u00e1c ph\u01b0\u01a1ng th\u1ee9c Scaling trong AWS"},"content":{"rendered":"\n

1. Scaling<\/h2>\n\n\n\n
  • Scaling<\/strong> \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a l\u00e0 kh\u1ea3 n\u0103ng c\u1ee7a m\u1ed9t t\u00e0i nguy\u00ean CNTT c\u00f3 th\u1ec3 x\u1eed l\u00fd c\u00e1c nhu c\u1ea7u (demands) khi t\u0103ng ho\u1eb7c gi\u1ea3m. \u0110\u00e2y l\u00e0 m\u1ed9t trong nh\u1eefng t\u00ednh n\u0103ng ph\u1ed5 bi\u1ebfn v\u00e0 c\u00f3 l\u1ee3i nh\u1ea5t c\u1ee7a \u0111i\u1ec7n to\u00e1n \u0111\u00e1m m\u00e2y, v\u00ec c\u00e1c doanh nghi\u1ec7p c\u00f3 th\u1ec3 t\u0103ng ho\u1eb7c gi\u1ea3m \u0111\u1ec3 \u0111\u00e1p \u1ee9ng nhu c\u1ea7u d\u1ef1a tr\u00ean t\u1eebng kho\u1ea3ng th\u1eddi gian, theo c\u00e1c giai \u0111o\u1ea1n c\u1ee7a d\u1ef1 \u00e1n v\u00e0 h\u01a1n th\u1ebf n\u1eefa. B\u1eb1ng c\u00e1ch tri\u1ec3n khai kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng \u0111\u00e1m m\u00e2y (cloud scalability), b\u1ea1n cho ph\u00e9p t\u00e0i nguy\u00ean c\u1ee7a m\u00ecnh ph\u00e1t tri\u1ec3n khi l\u01b0u l\u01b0\u1ee3ng truy c\u1eadp t\u0103ng l\u00ean ho\u1eb7c quy m\u00f4 t\u1ed5 ch\u1ee9c c\u1ee7a b\u1ea1n \u0111\u01b0\u1ee3c m\u1edf r\u1ed9ng v\u00e0 ng\u01b0\u1ee3c l\u1ea1i.<\/li><\/ul>\n\n\n\n
    \"\"\/<\/figure>\n\n\n\n
    • Scalability<\/strong> \u0111\u01b0a ra \u00fd t\u01b0\u1edfng v\u1ec1 m\u1ed9t h\u1ec7 th\u1ed1ng trong \u0111\u00f3 m\u1ecdi \u1ee9ng d\u1ee5ng ho\u1eb7c ph\u1ea7n c\u01a1 s\u1edf h\u1ea1 t\u1ea7ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c m\u1edf r\u1ed9ng \u0111\u1ec3 x\u1eed l\u00fd t\u1ea3i t\u0103ng (increased load). C\u00e1c h\u1ec7 th\u1ed1ng th\u01b0\u1eddng \u00e1p d\u1ee5ng t\u00ednh scalability l\u00ean 4 th\u00e0nh ph\u1ea7n sau:
      • Disk I\/O<\/li>
      • Memory<\/li>
      • Network I\/O<\/li>
      • CPU<\/li><\/ul><\/li>
      • C\u00f3 m\u1ed9t v\u00e0i c\u00e1ch ch\u00ednh \u0111\u1ec3 m\u1edf r\u1ed9ng quy m\u00f4 trong cloud:
        • Vertical Scaling<\/li>
        • Horizontal Scaling<\/li>
        • Diagonal Scaling<\/li><\/ul><\/li><\/ul>\n\n\n\n

          2. Vertical scaling<\/h2>\n\n\n\n
          • Vertical scaling<\/strong> l\u00e0 th\u1ee9 m\u00e0 ph\u1ea7n l\u1edbn m\u1ecdi ng\u01b0\u1eddi s\u1ebd ngh\u0129 t\u1edbi khi nh\u1eafc \u0111\u1ebfn scaling. \u0110\u00e2y l\u00e0 lo\u1ea1i scaling truy\u1ec1n th\u1ed1ng kh\u00f4ng th\u1ef1c s\u1ef1 y\u00eau c\u1ea7u b\u1ea5t k\u1ef3 s\u1eeda \u0111\u1ed5i \u1ee9ng d\u1ee5ng n\u00e0o.<\/li>
          • H\u00e3y t\u01b0\u1edfng t\u01b0\u1ee3ng m\u1ed9t \u1ee9ng d\u1ee5ng ch\u1ea1y tr\u00ean m\u1ed9t m\u00e1y ch\u1ee7 \u1ea3o v\u00e0 gi\u1ea3 s\u1eed, n\u00f3 c\u00f3 th\u1ec3 x\u1eed l\u00fd 1.000 kh\u00e1ch truy c\u1eadp m\u1ed7i gi\u1edd. N\u1ebfu blog c\u1ee7a b\u1ea1n tr\u1edf n\u00ean ph\u1ed5 bi\u1ebfn v\u00e0 b\u1eaft \u0111\u1ea7u nh\u1eadn \u0111\u01b0\u1ee3c 1500 kh\u00e1ch truy c\u1eadp m\u1ed7i gi\u1edd th\u00ec tr\u1ea3i nghi\u1ec7m c\u1ee7a h\u1ecd t\u1ea1i trang web s\u1ebd gi\u1ea3m. M\u00e1y ch\u1ee7 \u1ea3o s\u1ebd kh\u00f4ng c\u00f3 \u0111\u1ee7 t\u00e0i nguy\u00ean \u0111\u1ec3 x\u1eed l\u00fd m\u1ed9t c\u00e1ch ho\u00e0n h\u1ea3o. Khi \u1ea5y, v\u1ea5n \u0111\u1ec1 \u0111\u1eb7t ra l\u00e0 b\u1ea1n c\u1ea7n m\u1edf r\u1ed9ng quy m\u00f4 m\u00e1y ch\u1ee7: t\u0103ng k\u00edch th\u01b0\u1edbc c\u1ee7a m\u00e1y ch\u1ee7 b\u1eb1ng c\u00e1ch th\u00eam CPU, b\u1ed9 nh\u1edb b\u1ed5 sung, dung l\u01b0\u1ee3ng \u1ed5 \u0111\u0129a,…<\/li>
          • Vertical scaling<\/strong> \u0111\u1ea1t \u0111\u01b0\u1ee3c b\u1eb1ng c\u00e1ch th\u00eam t\u00e0i nguy\u00ean b\u1ed5 sung d\u01b0\u1edbi d\u1ea1ng CPU ho\u1eb7c b\u1ed9 nh\u1edb v\u00e0o m\u00e1y hi\u1ec7n c\u00f3. B\u1eb1ng c\u00e1ch \u0111\u00f3, m\u00e1y c\u00f3 th\u1ec3 ph\u1ee5c v\u1ee5 th\u00eam kh\u00e1ch h\u00e0ng ho\u1eb7c th\u1ef1c hi\u1ec7n c\u00e1c t\u00e1c v\u1ee5 t\u00ednh to\u00e1n nhanh h\u01a1n \u0111\u1ec3 b\u1ea1n c\u00f3 th\u1ec3 \u0111i t\u1eeb m\u00e1y ch\u1ee7 trung b\u00ecnh (medium server) \u0111\u1ebfn m\u00e1y ch\u1ee7 l\u1edbn (large server) hay th\u1eadm ch\u00ed \u0111\u1ebfn m\u00e1y ch\u1ee7 c\u1ef1c l\u1edbn (extra large server) v\u00e0 khi l\u00e0m nh\u01b0 v\u1eady, b\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ed1i ph\u00f3 v\u1edbi s\u1ef1 gia t\u0103ng kh\u00f4ng ng\u1eebng s\u1ed1 l\u01b0\u1ee3ng ng\u01b0\u1eddi d\u00f9ng.<\/li><\/ul>\n\n\n\n
            \"\"\/<\/figure>\n\n\n\n
            • M\u00e1y ch\u1ee7 \u1ea3o c\u00e0ng l\u1edbn ho\u1eb7c instance c\u00e0ng l\u1edbn th\u00ec c\u00e0ng c\u00f3 nhi\u1ec1u ng\u01b0\u1eddi d\u00f9ng nh\u01b0ng nh\u00ecn chung n\u00f3 c\u00f3 m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf th\u1ef1c s\u1ef1 quan tr\u1ecdng.
              • Khi ch\u1ec9 c\u00f3 m\u1ed9t instance ho\u1eb7c m\u1ed9t m\u00e1y ch\u1ee7 \u1ea3o duy nh\u1ea5t l\u01b0u tr\u1eef \u1ee9ng d\u1ee5ng, \u0111i\u1ec1u \u0111\u00f3 c\u0169ng c\u00f3 ngh\u0129a l\u00e0 r\u1ee7i ro t\u0103ng l\u00ean \u0111\u00e1ng k\u1ec3.<\/li>
              • M\u1ed9t v\u1ea5n \u0111\u1ec1 kh\u00e1c l\u00e0 c\u00f3 nh\u1eefng gi\u1edbi h\u1ea1n \u0111\u1ed1i v\u1edbi vi\u1ec7c m\u1ed9t instance c\u00f3 th\u1ec3 l\u1edbn \u0111\u1ebfn m\u1ee9c n\u00e0o. B\u1ea1n c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c th\u00eam CPU, b\u1ed9 nh\u1edb b\u1ed5 sung, nh\u01b0ng \u0111\u1ebfn m\u1ed9t l\u00fac n\u00e0o \u0111\u00f3 ch\u00fang s\u1ebd \u0111\u1ea1t \u0111\u1ebfn gi\u1edbi h\u1ea1n. Quy m\u00f4 c\u00e0ng l\u1edbn, b\u1ea1n c\u00e0ng t\u1ed1n nhi\u1ec1u ph\u00ed cho m\u1ed7i \u0111\u01a1n v\u1ecb n\u0103ng l\u1ef1c b\u1ed5 sung. Trong tr\u01b0\u1eddng h\u1ee3p m\u00e1y ch\u1ee7 v\u1eadt l\u00fd, b\u1ea1n c\u1ea7n t\u1eaft ngu\u1ed3n m\u00e1y ch\u1ee7 v\u00e0 th\u1ef1c hi\u1ec7n thay \u0111\u1ed5i ph\u1ea7n c\u1ee9ng m\u00e1y ch\u1ee7 \u0111\u00f3. N\u1ebfu \u0111\u00f3 l\u00e0 m\u1ed9t m\u00e1y ch\u1ee7 \u1ea3o, b\u1ea1n th\u01b0\u1eddng c\u00f3 th\u1ec3 thay \u0111\u1ed5i t\u00e0i nguy\u00ean nh\u01b0ng n\u00f3 v\u1eabn y\u00eau c\u1ea7u kh\u1edfi \u0111\u1ed9ng l\u1ea1i. \u0110i\u1ec1u n\u00e0y g\u00e2y gi\u00e1n \u0111o\u1ea1n cho tr\u1ea3i nghi\u1ec7m c\u1ee7a ng\u01b0\u1eddi d\u00f9ng.<\/li><\/ul><\/li><\/ul>\n\n\n\n

                3. Horizontal scaling<\/h2>\n\n\n\n
                • Horizontal scaling<\/strong> l\u00e0 m\u1ed9t ki\u1ebfn tr\u00fac ho\u00e0n to\u00e0n kh\u00e1c. V\u1edbi horizontal scaling, ch\u00fang ta kh\u00f4ng t\u0103ng k\u00edch th\u01b0\u1edbc c\u1ee7a instance, thay v\u00e0o \u0111\u00f3 l\u00e0 th\u00eam c\u00e1c instance b\u1ed5 sung.<\/li>
                • M\u1ed9t platform, thay v\u00ec l\u00e0 m\u1ed9t instance l\u1edbn, c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng 1, 3, 6 ho\u1eb7c th\u1eadm ch\u00ed h\u00e0ng tr\u0103m instance nh\u1ecf h\u01a1n. Horizont scaling \u0111\u1ea1t \u0111\u01b0\u1ee3c b\u1eb1ng c\u00e1ch th\u00eam c\u00e1c m\u00e1y b\u1ed5 sung v\u00e0o nh\u00f3m t\u00e0i nguy\u00ean m\u00e0 m\u1ed7i m\u00e1y cung c\u1ea5p c\u00f9ng m\u1ed9t d\u1ecbch v\u1ee5. Horizont scaling kh\u00f4ng b\u1ecb gi\u1edbi h\u1ea1n k\u00edch th\u01b0\u1edbc c\u1ee7a quy m\u00f4 \u1ea3o v\u00e0 n\u00f3 th\u1ef1c s\u1ef1 c\u00f3 th\u1ec3 m\u1edf r\u1ed9ng \u0111\u1ebfn m\u1ee9c g\u1ea7n v\u00f4 h\u1ea1n nh\u01b0ng n\u00f3 y\u00eau c\u1ea7u h\u1ed7 tr\u1ee3 t\u1eeb \u1ee9ng d\u1ee5ng \u0111\u1ec3 m\u1edf r\u1ed9ng hi\u1ec7u qu\u1ea3.<\/li><\/ul>\n\n\n\n
                  \"\"\/<\/figure>\n\n\n\n
                  • C\u00e1c nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a Vertical scaling g\u1ea7n nh\u01b0 \u0111\u1ec1u \u0111\u01b0\u1ee3c kh\u1eafc ph\u1ee5c khi s\u1eed d\u1ee5ng Horizont scaling:
                    • Ph\u00e2n t\u00e1n r\u1ee7i ro l\u00ean nhi\u1ec1u th\u00e0nh ph\u1ea7n nh\u1ecf thay v\u00ec l\u00ean m\u1ed9t kh\u1ed1i duy nh\u1ea5t<\/li>
                    • C\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n Scaling th\u01b0\u1eddng xuy\u00ean m\u00e0 kh\u00f4ng b\u1ecb ng\u1eebng ho\u1ea1t \u0111\u1ed9ng v\u00ec b\u1ea1n ch\u1ec9 th\u00eam t\u00e0i nguy\u00ean b\u1ed5 sung ch\u1ee9 kh\u00f4ng thay \u0111\u1ed5i t\u00e0i nguy\u00ean hi\u1ec7n c\u00f3 n\u00ean b\u1ea3n ch\u1ea5t l\u00e0 kh\u00f4ng ph\u00e1 v\u1ee1 vi\u1ec7c cung c\u1ea5p d\u1ecbch v\u1ee5 hi\u1ec7n t\u1ea1i c\u1ee7a m\u00ecnh.<\/li>
                    • Chi ph\u00ed r\u1ebb h\u01a1n: S\u1eed d\u1ee5ng 10 m\u00e1y ch\u1ee7 c\u00f3 k\u00edch th\u01b0\u1edbc b\u1eb1ng 1\/10 k\u00edch th\u01b0\u1edbc c\u1ee7a m\u00e1y ch\u1ee7 l\u1edbn duy nh\u1ea5t th\u00ec 10 m\u00e1y ch\u1ee7 \u0111\u00f3 c\u00f3 gi\u00e1 r\u1ebb h\u01a1n so v\u1edbi 1 m\u00e1y ch\u1ee7 l\u1edbn nh\u1ea5t<\/li><\/ul><\/li>
                    • Horizont scaling y\u00eau c\u1ea7u c\u1ea5u h\u00ecnh ph\u1ee9c t\u1ea1p h\u01a1n so v\u1edbi Vertical scaling , nh\u01b0ng s\u1ebd hi\u1ec7u qu\u1ea3 h\u01a1n nhi\u1ec1u n\u1ebfu b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng n\u00f3.<\/li><\/ul>\n\n\n\n

                      4. Diagonal Scaling<\/h2>\n\n\n\n
                      • \u0110\u00e2y l\u00e0 ph\u01b0\u01a1ng ph\u00e1p k\u1ebft h\u1ee3p hai c\u00e1ch scaling tr\u00ean. Diagonal scaling cung c\u1ea5p s\u1ef1 linh ho\u1ea1t cho kh\u1ed1i l\u01b0\u1ee3ng c\u00f4ng vi\u1ec7c \u0111\u00f2i h\u1ecfi ngu\u1ed3n l\u1ef1c b\u1ed5 sung trong m\u1ed9t th\u1eddi gian c\u1ee5 th\u1ec3.<\/li>
                      • Khi k\u1ebft h\u1ee3p c\u1ea3 vertical v\u00e0 horizontal, b\u1ea1n ch\u1ec9 c\u1ea7n m\u1edf r\u1ed9ng trong m\u00e1y ch\u1ee7 hi\u1ec7n t\u1ea1i c\u1ee7a m\u00ecnh cho \u0111\u1ebfn khi b\u1ea1n \u0111\u1ea1t \u0111\u01b0\u1ee3c dung l\u01b0\u1ee3ng nh\u01b0 \u00fd. Sau \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 sao ch\u00e9p (clone) m\u00e1y ch\u1ee7 \u0111\u00f3 khi nhu c\u1ea7u t\u0103ng, cho ph\u00e9p b\u1ea1n x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi r\u1ea5t nhi\u1ec1u y\u00eau c\u1ea7u v\u00e0 l\u01b0u l\u01b0\u1ee3ng truy c\u1eadp.<\/li><\/ul>\n\n\n\n
                        \"\"\/<\/figure>\n","protected":false},"excerpt":{"rendered":"

                        1. Scaling Scaling \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a l\u00e0 kh\u1ea3 n\u0103ng c\u1ee7a m\u1ed9t t\u00e0i nguy\u00ean CNTT c\u00f3 th\u1ec3 x\u1eed l\u00fd c\u00e1c nhu c\u1ea7u (demands) khi t\u0103ng ho\u1eb7c gi\u1ea3m. \u0110\u00e2y l\u00e0 m\u1ed9t trong nh\u1eefng t\u00ednh n\u0103ng ph\u1ed5 bi\u1ebfn v\u00e0 c\u00f3 l\u1ee3i nh\u1ea5t c\u1ee7a \u0111i\u1ec7n to\u00e1n \u0111\u00e1m m\u00e2y, v\u00ec c\u00e1c doanh nghi\u1ec7p c\u00f3 th\u1ec3 t\u0103ng ho\u1eb7c gi\u1ea3m \u0111\u1ec3 \u0111\u00e1p \u1ee9ng […]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[122,128],"tags":[],"class_list":["post-1819","post","type-post","status-publish","format-standard","hentry","category-blog","category-tech"],"_links":{"self":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1819"}],"collection":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/comments?post=1819"}],"version-history":[{"count":1,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1819\/revisions"}],"predecessor-version":[{"id":1820,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1819\/revisions\/1820"}],"wp:attachment":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/media?parent=1819"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/categories?post=1819"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/tags?post=1819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}