/*! * Bootstrap v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */const alert=document.getElementById("page-alert"),closeBtn=document.getElementById("page-alert-btn-close");if(alert!==null&&closeBtn!==null){const version=alert.getAttribute("data-page-alert-version")||"unknown",hideAlert=getSessionStorage(`page-alert-${version}`,null,"functional")!==null;hideAlert&&alert.classList.add("d-none"),closeBtn.addEventListener("click",()=>{setSessionStorage(`page-alert-${version}`,"seen","functional"),alert.classList.add("d-none")})}function reveal(){const reveals=document.querySelectorAll(".reveal");for(let i=0;i{document.querySelectorAll("pre > code").forEach(codeBlock=>{const button=document.createElement("button");button.className="clipboard-button",button.setAttribute("data-toast-target","toast-copied-code-message"),button.setAttribute("aria-label","copy to clipboard"),button.type="button",button.innerHTML=svgCopy,button.addEventListener("click",()=>{const text=codeBlock.innerText.split(` `).filter(Boolean).join(` `);clipboard.writeText(text).then(()=>{button.blur(),button.innerHTML=svgCheck,setTimeout(()=>button.innerHTML=svgCopy,2e3)},error=>button.innerHTML="Error")});const pre=codeBlock.parentNode;pre.parentNode.insertBefore(button,pre)})};navigator&&navigator.clipboard&&addCopyButtons(navigator.clipboard),document.querySelectorAll("[data-clipboard]").forEach(trigger=>{const text=trigger.getAttribute("data-clipboard");trigger.addEventListener("click",()=>{navigator.clipboard.writeText(text)})});const url=new URL(window.location.href),menu=url.searchParams.get("menu"),child=url.searchParams.get("child"),menuItems=document.querySelectorAll('[data-nav="main"]');if(menu!==null){menuItems.forEach(element=>{element.classList.remove("active")});const targetMainItems=document.querySelectorAll(`[data-nav-main="${menu}"]:not([data-nav-child])`);targetMainItems.forEach(element=>{element.classList.add("active")});const targetChildItems=document.querySelectorAll(`[data-nav-main="${menu}"][data-nav-child="${child}"]`);targetChildItems.forEach(element=>{element.classList.add("active")})}(function(global,factory){typeof exports=="object"&&typeof module!="undefined"?module.exports=factory():typeof define=="function"&&define.amd?define(factory):(global=typeof globalThis!="undefined"?globalThis:global||self,global.bootstrap=factory())})(this,function(){"use strict";const elementMap=new Map,Data={set(element,key,instance){elementMap.has(element)||elementMap.set(element,new Map);const instanceMap=elementMap.get(element);if(!instanceMap.has(key)&&instanceMap.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);return}instanceMap.set(key,instance)},get(element,key){return elementMap.has(element)?elementMap.get(element).get(key)||null:null},remove(element,key){if(!elementMap.has(element))return;const instanceMap=elementMap.get(element);instanceMap.delete(key),instanceMap.size===0&&elementMap.delete(element)}},MAX_UID=1e6,MILLISECONDS_MULTIPLIER=1e3,TRANSITION_END="transitionend",parseSelector=selector=>(selector&&window.CSS&&window.CSS.escape&&(selector=selector.replace(/#([^\s"#']+)/g,(match,id)=>`#${CSS.escape(id)}`)),selector),toType=object=>object==null?`${object}`:Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(),getUID=prefix=>{do prefix+=Math.floor(Math.random()*MAX_UID);while(document.getElementById(prefix))return prefix},getTransitionDurationFromElement=element=>{if(!element)return 0;let{transitionDuration,transitionDelay}=window.getComputedStyle(element);const floatTransitionDuration=Number.parseFloat(transitionDuration),floatTransitionDelay=Number.parseFloat(transitionDelay);return!floatTransitionDuration&&!floatTransitionDelay?0:(transitionDuration=transitionDuration.split(",")[0],transitionDelay=transitionDelay.split(",")[0],(Number.parseFloat(transitionDuration)+Number.parseFloat(transitionDelay))*MILLISECONDS_MULTIPLIER)},triggerTransitionEnd=element=>{element.dispatchEvent(new Event(TRANSITION_END))},isElement$1=object=>!!object&&typeof object=="object"&&(typeof object.jquery!="undefined"&&(object=object[0]),typeof object.nodeType!="undefined"),getElement=object=>isElement$1(object)?object.jquery?object[0]:object:typeof object=="string"&&object.length>0?document.querySelector(parseSelector(object)):null,isVisible=element=>{if(!isElement$1(element)||element.getClientRects().length===0)return!1;const elementIsVisible=getComputedStyle(element).getPropertyValue("visibility")==="visible",closedDetails=element.closest("details:not([open])");if(!closedDetails)return elementIsVisible;if(closedDetails!==element){const summary=element.closest("summary");if(summary&&summary.parentNode!==closedDetails)return!1;if(summary===null)return!1}return elementIsVisible},isDisabled=element=>!element||element.nodeType!==Node.ELEMENT_NODE||!!element.classList.contains("disabled")||(typeof element.disabled!="undefined"?element.disabled:element.hasAttribute("disabled")&&element.getAttribute("disabled")!=="false"),findShadowRoot=element=>{if(!document.documentElement.attachShadow)return null;if(typeof element.getRootNode=="function"){const root=element.getRootNode();return root instanceof ShadowRoot?root:null}return element instanceof ShadowRoot?element:element.parentNode?findShadowRoot(element.parentNode):null},noop=()=>{},reflow=element=>{element.offsetHeight},getjQuery=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,DOMContentLoadedCallbacks=[],onDOMContentLoaded=callback=>{document.readyState==="loading"?(DOMContentLoadedCallbacks.length||document.addEventListener("DOMContentLoaded",()=>{for(const callback of DOMContentLoadedCallbacks)callback()}),DOMContentLoadedCallbacks.push(callback)):callback()},isRTL=()=>document.documentElement.dir==="rtl",defineJQueryPlugin=plugin=>{onDOMContentLoaded(()=>{const $=getjQuery();if($){const name=plugin.NAME,JQUERY_NO_CONFLICT=$.fn[name];$.fn[name]=plugin.jQueryInterface,$.fn[name].Constructor=plugin,$.fn[name].noConflict=()=>($.fn[name]=JQUERY_NO_CONFLICT,plugin.jQueryInterface)}})},execute=(possibleCallback,args=[],defaultValue=possibleCallback)=>typeof possibleCallback=="function"?possibleCallback(...args):defaultValue,executeAfterTransition=(callback,transitionElement,waitForTransition=!0)=>{if(!waitForTransition){execute(callback);return}const durationPadding=5,emulatedDuration=getTransitionDurationFromElement(transitionElement)+durationPadding;let called=!1;const handler=({target})=>{if(target!==transitionElement)return;called=!0,transitionElement.removeEventListener(TRANSITION_END,handler),execute(callback)};transitionElement.addEventListener(TRANSITION_END,handler),setTimeout(()=>{called||triggerTransitionEnd(transitionElement)},emulatedDuration)},getNextActiveElement=(list,activeElement,shouldGetNext,isCycleAllowed)=>{const listLength=list.length;let index=list.indexOf(activeElement);return index===-1?!shouldGetNext&&isCycleAllowed?list[listLength-1]:list[0]:(index+=shouldGetNext?1:-1,isCycleAllowed&&(index=(index+listLength)%listLength),list[Math.max(0,Math.min(index,listLength-1))])},namespaceRegex=/[^.]*(?=\..*)\.|.*/,stripNameRegex=/\..*/,stripUidRegex=/::\d+$/,eventRegistry={};let uidEvent=1;const customEvents={mouseenter:"mouseover",mouseleave:"mouseout"},nativeEvents=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function makeEventUid(element,uid){return uid&&`${uid}::${uidEvent++}`||element.uidEvent||uidEvent++}function getElementEvents(element){const uid=makeEventUid(element);return element.uidEvent=uid,eventRegistry[uid]=eventRegistry[uid]||{},eventRegistry[uid]}function bootstrapHandler(element,fn){return function handler(event){return hydrateObj(event,{delegateTarget:element}),handler.oneOff&&EventHandler.off(element,event.type,fn),fn.apply(element,[event])}}function bootstrapDelegationHandler(element,selector,fn){return function handler(event){const domElements=element.querySelectorAll(selector);for(let{target}=event;target&&target!==this;target=target.parentNode)for(const domElement of domElements){if(domElement!==target)continue;return hydrateObj(event,{delegateTarget:target}),handler.oneOff&&EventHandler.off(element,event.type,selector,fn),fn.apply(target,[event])}}}function findHandler(events,callable,delegationSelector=null){return Object.values(events).find(event=>event.callable===callable&&event.delegationSelector===delegationSelector)}function normalizeParameters(originalTypeEvent,handler,delegationFunction){const isDelegated=typeof handler=="string",callable=isDelegated?delegationFunction:handler||delegationFunction;let typeEvent=getTypeEvent(originalTypeEvent);return nativeEvents.has(typeEvent)||(typeEvent=originalTypeEvent),[isDelegated,callable,typeEvent]}function addHandler(element,originalTypeEvent,handler,delegationFunction,oneOff){if(typeof originalTypeEvent!="string"||!element)return;let[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction);if(originalTypeEvent in customEvents){const wrapFunction=fn=>function(event){if(!event.relatedTarget||event.relatedTarget!==event.delegateTarget&&!event.delegateTarget.contains(event.relatedTarget))return fn.call(this,event)};callable=wrapFunction(callable)}const events=getElementEvents(element),handlers=events[typeEvent]||(events[typeEvent]={}),previousFunction=findHandler(handlers,callable,isDelegated?handler:null);if(previousFunction){previousFunction.oneOff=previousFunction.oneOff&&oneOff;return}const uid=makeEventUid(callable,originalTypeEvent.replace(namespaceRegex,"")),fn=isDelegated?bootstrapDelegationHandler(element,handler,callable):bootstrapHandler(element,callable);fn.delegationSelector=isDelegated?handler:null,fn.callable=callable,fn.oneOff=oneOff,fn.uidEvent=uid,handlers[uid]=fn,element.addEventListener(typeEvent,fn,isDelegated)}function removeHandler(element,events,typeEvent,handler,delegationSelector){const fn=findHandler(events[typeEvent],handler,delegationSelector);if(!fn)return;element.removeEventListener(typeEvent,fn,Boolean(delegationSelector)),delete events[typeEvent][fn.uidEvent]}function removeNamespacedHandlers(element,events,typeEvent,namespace){const storeElementEvent=events[typeEvent]||{};for(const[handlerKey,event]of Object.entries(storeElementEvent))handlerKey.includes(namespace)&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}function getTypeEvent(event){return event=event.replace(stripNameRegex,""),customEvents[event]||event}const EventHandler={on(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!1)},one(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!0)},off(element,originalTypeEvent,handler,delegationFunction){if(typeof originalTypeEvent!="string"||!element)return;const[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction),inNamespace=typeEvent!==originalTypeEvent,events=getElementEvents(element),storeElementEvent=events[typeEvent]||{},isNamespace=originalTypeEvent.startsWith(".");if(typeof callable!="undefined"){if(!Object.keys(storeElementEvent).length)return;removeHandler(element,events,typeEvent,callable,isDelegated?handler:null);return}if(isNamespace)for(const elementEvent of Object.keys(events))removeNamespacedHandlers(element,events,elementEvent,originalTypeEvent.slice(1));for(const[keyHandlers,event]of Object.entries(storeElementEvent)){const handlerKey=keyHandlers.replace(stripUidRegex,"");(!inNamespace||originalTypeEvent.includes(handlerKey))&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}},trigger(element,event,args){if(typeof event!="string"||!element)return null;const $=getjQuery(),typeEvent=getTypeEvent(event),inNamespace=event!==typeEvent;let jQueryEvent=null,bubbles=!0,nativeDispatch=!0,defaultPrevented=!1;inNamespace&&$&&(jQueryEvent=$.Event(event,args),$(element).trigger(jQueryEvent),bubbles=!jQueryEvent.isPropagationStopped(),nativeDispatch=!jQueryEvent.isImmediatePropagationStopped(),defaultPrevented=jQueryEvent.isDefaultPrevented());const evt=hydrateObj(new Event(event,{bubbles,cancelable:!0}),args);return defaultPrevented&&evt.preventDefault(),nativeDispatch&&element.dispatchEvent(evt),evt.defaultPrevented&&jQueryEvent&&jQueryEvent.preventDefault(),evt}};function hydrateObj(obj,meta={}){for(const[key,value]of Object.entries(meta))try{obj[key]=value}catch{Object.defineProperty(obj,key,{configurable:!0,get(){return value}})}return obj}function normalizeData(value){if(value==="true")return!0;if(value==="false")return!1;if(value===Number(value).toString())return Number(value);if(value===""||value==="null")return null;if(typeof value!="string")return value;try{return JSON.parse(decodeURIComponent(value))}catch{return value}}function normalizeDataKey(key){return key.replace(/[A-Z]/g,chr=>`-${chr.toLowerCase()}`)}const Manipulator={setDataAttribute(element,key,value){element.setAttribute(`data-bs-${normalizeDataKey(key)}`,value)},removeDataAttribute(element,key){element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)},getDataAttributes(element){if(!element)return{};const attributes={},bsKeys=Object.keys(element.dataset).filter(key=>key.startsWith("bs")&&!key.startsWith("bsConfig"));for(const key of bsKeys){let pureKey=key.replace(/^bs/,"");pureKey=pureKey.charAt(0).toLowerCase()+pureKey.slice(1,pureKey.length),attributes[pureKey]=normalizeData(element.dataset[key])}return attributes},getDataAttribute(element,key){return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))}};class Config{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(config){return config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config}_mergeConfigObj(config,element){const jsonConfig=isElement$1(element)?Manipulator.getDataAttribute(element,"config"):{};return{...this.constructor.Default,...typeof jsonConfig=="object"?jsonConfig:{},...isElement$1(element)?Manipulator.getDataAttributes(element):{},...typeof config=="object"?config:{}}}_typeCheckConfig(config,configTypes=this.constructor.DefaultType){for(const[property,expectedTypes]of Object.entries(configTypes)){const value=config[property],valueType=isElement$1(value)?"element":toType(value);if(!new RegExp(expectedTypes).test(valueType))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`)}}}const VERSION="5.3.3";class BaseComponent extends Config{constructor(element,config){if(super(),element=getElement(element),!element)return;this._element=element,this._config=this._getConfig(config),Data.set(this._element,this.constructor.DATA_KEY,this)}dispose(){Data.remove(this._element,this.constructor.DATA_KEY),EventHandler.off(this._element,this.constructor.EVENT_KEY);for(const propertyName of Object.getOwnPropertyNames(this))this[propertyName]=null}_queueCallback(callback,element,isAnimated=!0){executeAfterTransition(callback,element,isAnimated)}_getConfig(config){return config=this._mergeConfigObj(config,this._element),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}static getInstance(element){return Data.get(getElement(element),this.DATA_KEY)}static getOrCreateInstance(element,config={}){return this.getInstance(element)||new this(element,typeof config=="object"?config:null)}static get VERSION(){return VERSION}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(name){return`${name}${this.EVENT_KEY}`}}const getSelector=element=>{let selector=element.getAttribute("data-bs-target");if(!selector||selector==="#"){let hrefAttribute=element.getAttribute("href");if(!hrefAttribute||!hrefAttribute.includes("#")&&!hrefAttribute.startsWith("."))return null;hrefAttribute.includes("#")&&!hrefAttribute.startsWith("#")&&(hrefAttribute=`#${hrefAttribute.split("#")[1]}`),selector=hrefAttribute&&hrefAttribute!=="#"?hrefAttribute.trim():null}return selector?selector.split(",").map(sel=>parseSelector(sel)).join(","):null},SelectorEngine={find(selector,element=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(element,selector))},findOne(selector,element=document.documentElement){return Element.prototype.querySelector.call(element,selector)},children(element,selector){return[].concat(...element.children).filter(child=>child.matches(selector))},parents(element,selector){const parents=[];let ancestor=element.parentNode.closest(selector);for(;ancestor;)parents.push(ancestor),ancestor=ancestor.parentNode.closest(selector);return parents},prev(element,selector){let previous=element.previousElementSibling;for(;previous;){if(previous.matches(selector))return[previous];previous=previous.previousElementSibling}return[]},next(element,selector){let next=element.nextElementSibling;for(;next;){if(next.matches(selector))return[next];next=next.nextElementSibling}return[]},focusableChildren(element){const focusables=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(selector=>`${selector}:not([tabindex^="-"])`).join(",");return this.find(focusables,element).filter(el=>!isDisabled(el)&&isVisible(el))},getSelectorFromElement(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector)?selector:null:null},getElementFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector):null},getMultipleElementsFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.find(selector):[]}},enableDismissTrigger=(component,method="hide")=>{const clickEvent=`click.dismiss${component.EVENT_KEY}`,name=component.NAME;EventHandler.on(document,clickEvent,`[data-bs-dismiss="${name}"]`,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;const target=SelectorEngine.getElementFromSelector(this)||this.closest(`.${name}`),instance=component.getOrCreateInstance(target);instance[method]()})},NAME$f="alert",DATA_KEY$a="bs.alert",EVENT_KEY$b=`.${DATA_KEY$a}`,EVENT_CLOSE=`close${EVENT_KEY$b}`,EVENT_CLOSED=`closed${EVENT_KEY$b}`,CLASS_NAME_FADE$5="fade",CLASS_NAME_SHOW$8="show";class Alert extends BaseComponent{static get NAME(){return NAME$f}close(){const closeEvent=EventHandler.trigger(this._element,EVENT_CLOSE);if(closeEvent.defaultPrevented)return;this._element.classList.remove(CLASS_NAME_SHOW$8);const isAnimated=this._element.classList.contains(CLASS_NAME_FADE$5);this._queueCallback(()=>this._destroyElement(),this._element,isAnimated)}_destroyElement(){this._element.remove(),EventHandler.trigger(this._element,EVENT_CLOSED),this.dispose()}static jQueryInterface(config){return this.each(function(){const data=Alert.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config](this)})}}enableDismissTrigger(Alert,"close"),defineJQueryPlugin(Alert);const NAME$e="button",DATA_KEY$9="bs.button",EVENT_KEY$a=`.${DATA_KEY$9}`,DATA_API_KEY$6=".data-api",CLASS_NAME_ACTIVE$3="active",SELECTOR_DATA_TOGGLE$5='[data-bs-toggle="button"]',EVENT_CLICK_DATA_API$6=`click${EVENT_KEY$a}${DATA_API_KEY$6}`;class Button extends BaseComponent{static get NAME(){return NAME$e}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(CLASS_NAME_ACTIVE$3))}static jQueryInterface(config){return this.each(function(){const data=Button.getOrCreateInstance(this);config==="toggle"&&data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API$6,SELECTOR_DATA_TOGGLE$5,event=>{event.preventDefault();const button=event.target.closest(SELECTOR_DATA_TOGGLE$5),data=Button.getOrCreateInstance(button);data.toggle()}),defineJQueryPlugin(Button);const NAME$d="swipe",EVENT_KEY$9=".bs.swipe",EVENT_TOUCHSTART=`touchstart${EVENT_KEY$9}`,EVENT_TOUCHMOVE=`touchmove${EVENT_KEY$9}`,EVENT_TOUCHEND=`touchend${EVENT_KEY$9}`,EVENT_POINTERDOWN=`pointerdown${EVENT_KEY$9}`,EVENT_POINTERUP=`pointerup${EVENT_KEY$9}`,POINTER_TYPE_TOUCH="touch",POINTER_TYPE_PEN="pen",CLASS_NAME_POINTER_EVENT="pointer-event",SWIPE_THRESHOLD=40,Default$c={endCallback:null,leftCallback:null,rightCallback:null},DefaultType$c={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Swipe extends Config{constructor(element,config){if(super(),this._element=element,!element||!Swipe.isSupported())return;this._config=this._getConfig(config),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return Default$c}static get DefaultType(){return DefaultType$c}static get NAME(){return NAME$d}dispose(){EventHandler.off(this._element,EVENT_KEY$9)}_start(event){if(!this._supportPointerEvents){this._deltaX=event.touches[0].clientX;return}this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX)}_end(event){this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX-this._deltaX),this._handleSwipe(),execute(this._config.endCallback)}_move(event){this._deltaX=event.touches&&event.touches.length>1?0:event.touches[0].clientX-this._deltaX}_handleSwipe(){const absDeltaX=Math.abs(this._deltaX);if(absDeltaX<=SWIPE_THRESHOLD)return;const direction=absDeltaX/this._deltaX;if(this._deltaX=0,!direction)return;execute(direction>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(EventHandler.on(this._element,EVENT_POINTERDOWN,event=>this._start(event)),EventHandler.on(this._element,EVENT_POINTERUP,event=>this._end(event)),this._element.classList.add(CLASS_NAME_POINTER_EVENT)):(EventHandler.on(this._element,EVENT_TOUCHSTART,event=>this._start(event)),EventHandler.on(this._element,EVENT_TOUCHMOVE,event=>this._move(event)),EventHandler.on(this._element,EVENT_TOUCHEND,event=>this._end(event)))}_eventIsPointerPenTouch(event){return this._supportPointerEvents&&(event.pointerType===POINTER_TYPE_PEN||event.pointerType===POINTER_TYPE_TOUCH)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const NAME$c="carousel",DATA_KEY$8="bs.carousel",EVENT_KEY$8=`.${DATA_KEY$8}`,DATA_API_KEY$5=".data-api",ARROW_LEFT_KEY$1="ArrowLeft",ARROW_RIGHT_KEY$1="ArrowRight",TOUCHEVENT_COMPAT_WAIT=500,ORDER_NEXT="next",ORDER_PREV="prev",DIRECTION_LEFT="left",DIRECTION_RIGHT="right",EVENT_SLIDE=`slide${EVENT_KEY$8}`,EVENT_SLID=`slid${EVENT_KEY$8}`,EVENT_KEYDOWN$1=`keydown${EVENT_KEY$8}`,EVENT_MOUSEENTER$1=`mouseenter${EVENT_KEY$8}`,EVENT_MOUSELEAVE$1=`mouseleave${EVENT_KEY$8}`,EVENT_DRAG_START=`dragstart${EVENT_KEY$8}`,EVENT_LOAD_DATA_API$3=`load${EVENT_KEY$8}${DATA_API_KEY$5}`,EVENT_CLICK_DATA_API$5=`click${EVENT_KEY$8}${DATA_API_KEY$5}`,CLASS_NAME_CAROUSEL="carousel",CLASS_NAME_ACTIVE$2="active",CLASS_NAME_SLIDE="slide",CLASS_NAME_END="carousel-item-end",CLASS_NAME_START="carousel-item-start",CLASS_NAME_NEXT="carousel-item-next",CLASS_NAME_PREV="carousel-item-prev",SELECTOR_ACTIVE=".active",SELECTOR_ITEM=".carousel-item",SELECTOR_ACTIVE_ITEM=SELECTOR_ACTIVE+SELECTOR_ITEM,SELECTOR_ITEM_IMG=".carousel-item img",SELECTOR_INDICATORS=".carousel-indicators",SELECTOR_DATA_SLIDE="[data-bs-slide], [data-bs-slide-to]",SELECTOR_DATA_RIDE='[data-bs-ride="carousel"]',KEY_TO_DIRECTION={[ARROW_LEFT_KEY$1]:DIRECTION_RIGHT,[ARROW_RIGHT_KEY$1]:DIRECTION_LEFT},Default$b={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},DefaultType$b={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Carousel extends BaseComponent{constructor(element,config){super(element,config),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=SelectorEngine.findOne(SELECTOR_INDICATORS,this._element),this._addEventListeners(),this._config.ride===CLASS_NAME_CAROUSEL&&this.cycle()}static get Default(){return Default$b}static get DefaultType(){return DefaultType$b}static get NAME(){return NAME$c}next(){this._slide(ORDER_NEXT)}nextWhenVisible(){!document.hidden&&isVisible(this._element)&&this.next()}prev(){this._slide(ORDER_PREV)}pause(){this._isSliding&&triggerTransitionEnd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.cycle());return}this.cycle()}to(index){const items=this._getItems();if(index>items.length-1||index<0)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.to(index));return}const activeIndex=this._getItemIndex(this._getActive());if(activeIndex===index)return;const order=index>activeIndex?ORDER_NEXT:ORDER_PREV;this._slide(order,items[index])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(config){return config.defaultInterval=config.interval,config}_addEventListeners(){this._config.keyboard&&EventHandler.on(this._element,EVENT_KEYDOWN$1,event=>this._keydown(event)),this._config.pause==="hover"&&(EventHandler.on(this._element,EVENT_MOUSEENTER$1,()=>this.pause()),EventHandler.on(this._element,EVENT_MOUSELEAVE$1,()=>this._maybeEnableCycle())),this._config.touch&&Swipe.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const img of SelectorEngine.find(SELECTOR_ITEM_IMG,this._element))EventHandler.on(img,EVENT_DRAG_START,event=>event.preventDefault());const endCallBack=()=>{if(this._config.pause!=="hover")return;this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),TOUCHEVENT_COMPAT_WAIT+this._config.interval)},swipeConfig={leftCallback:()=>this._slide(this._directionToOrder(DIRECTION_LEFT)),rightCallback:()=>this._slide(this._directionToOrder(DIRECTION_RIGHT)),endCallback:endCallBack};this._swipeHelper=new Swipe(this._element,swipeConfig)}_keydown(event){if(/input|textarea/i.test(event.target.tagName))return;const direction=KEY_TO_DIRECTION[event.key];direction&&(event.preventDefault(),this._slide(this._directionToOrder(direction)))}_getItemIndex(element){return this._getItems().indexOf(element)}_setActiveIndicatorElement(index){if(!this._indicatorsElement)return;const activeIndicator=SelectorEngine.findOne(SELECTOR_ACTIVE,this._indicatorsElement);activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2),activeIndicator.removeAttribute("aria-current");const newActiveIndicator=SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`,this._indicatorsElement);newActiveIndicator&&(newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2),newActiveIndicator.setAttribute("aria-current","true"))}_updateInterval(){const element=this._activeElement||this._getActive();if(!element)return;const elementInterval=Number.parseInt(element.getAttribute("data-bs-interval"),10);this._config.interval=elementInterval||this._config.defaultInterval}_slide(order,element=null){if(this._isSliding)return;const activeElement=this._getActive(),isNext=order===ORDER_NEXT,nextElement=element||getNextActiveElement(this._getItems(),activeElement,isNext,this._config.wrap);if(nextElement===activeElement)return;const nextElementIndex=this._getItemIndex(nextElement),triggerEvent=eventName=>EventHandler.trigger(this._element,eventName,{relatedTarget:nextElement,direction:this._orderToDirection(order),from:this._getItemIndex(activeElement),to:nextElementIndex}),slideEvent=triggerEvent(EVENT_SLIDE);if(slideEvent.defaultPrevented)return;if(!activeElement||!nextElement)return;const isCycling=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(nextElementIndex),this._activeElement=nextElement;const directionalClassName=isNext?CLASS_NAME_START:CLASS_NAME_END,orderClassName=isNext?CLASS_NAME_NEXT:CLASS_NAME_PREV;nextElement.classList.add(orderClassName),reflow(nextElement),activeElement.classList.add(directionalClassName),nextElement.classList.add(directionalClassName);const completeCallBack=()=>{nextElement.classList.remove(directionalClassName,orderClassName),nextElement.classList.add(CLASS_NAME_ACTIVE$2),activeElement.classList.remove(CLASS_NAME_ACTIVE$2,orderClassName,directionalClassName),this._isSliding=!1,triggerEvent(EVENT_SLID)};this._queueCallback(completeCallBack,activeElement,this._isAnimated()),isCycling&&this.cycle()}_isAnimated(){return this._element.classList.contains(CLASS_NAME_SLIDE)}_getActive(){return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM,this._element)}_getItems(){return SelectorEngine.find(SELECTOR_ITEM,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(direction){return isRTL()?direction===DIRECTION_LEFT?ORDER_PREV:ORDER_NEXT:direction===DIRECTION_LEFT?ORDER_NEXT:ORDER_PREV}_orderToDirection(order){return isRTL()?order===ORDER_PREV?DIRECTION_LEFT:DIRECTION_RIGHT:order===ORDER_PREV?DIRECTION_RIGHT:DIRECTION_LEFT}static jQueryInterface(config){return this.each(function(){const data=Carousel.getOrCreateInstance(this,config);if(typeof config=="number"){data.to(config);return}if(typeof config=="string"){if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$5,SELECTOR_DATA_SLIDE,function(event){const target=SelectorEngine.getElementFromSelector(this);if(!target||!target.classList.contains(CLASS_NAME_CAROUSEL))return;event.preventDefault();const carousel=Carousel.getOrCreateInstance(target),slideIndex=this.getAttribute("data-bs-slide-to");if(slideIndex){carousel.to(slideIndex),carousel._maybeEnableCycle();return}if(Manipulator.getDataAttribute(this,"slide")==="next"){carousel.next(),carousel._maybeEnableCycle();return}carousel.prev(),carousel._maybeEnableCycle()}),EventHandler.on(window,EVENT_LOAD_DATA_API$3,()=>{const carousels=SelectorEngine.find(SELECTOR_DATA_RIDE);for(const carousel of carousels)Carousel.getOrCreateInstance(carousel)}),defineJQueryPlugin(Carousel);const NAME$b="collapse",DATA_KEY$7="bs.collapse",EVENT_KEY$7=`.${DATA_KEY$7}`,DATA_API_KEY$4=".data-api",EVENT_SHOW$6=`show${EVENT_KEY$7}`,EVENT_SHOWN$6=`shown${EVENT_KEY$7}`,EVENT_HIDE$6=`hide${EVENT_KEY$7}`,EVENT_HIDDEN$6=`hidden${EVENT_KEY$7}`,EVENT_CLICK_DATA_API$4=`click${EVENT_KEY$7}${DATA_API_KEY$4}`,CLASS_NAME_SHOW$7="show",CLASS_NAME_COLLAPSE="collapse",CLASS_NAME_COLLAPSING="collapsing",CLASS_NAME_COLLAPSED="collapsed",CLASS_NAME_DEEPER_CHILDREN=`:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`,CLASS_NAME_HORIZONTAL="collapse-horizontal",WIDTH="width",HEIGHT="height",SELECTOR_ACTIVES=".collapse.show, .collapse.collapsing",SELECTOR_DATA_TOGGLE$4='[data-bs-toggle="collapse"]',Default$a={parent:null,toggle:!0},DefaultType$a={parent:"(null|element)",toggle:"boolean"};class Collapse extends BaseComponent{constructor(element,config){super(element,config),this._isTransitioning=!1,this._triggerArray=[];const toggleList=SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);for(const elem of toggleList){const selector=SelectorEngine.getSelectorFromElement(elem),filterElement=SelectorEngine.find(selector).filter(foundElement=>foundElement===this._element);selector!==null&&filterElement.length&&this._triggerArray.push(elem)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Default$a}static get DefaultType(){return DefaultType$a}static get NAME(){return NAME$b}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let activeChildren=[];if(this._config.parent&&(activeChildren=this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element=>element!==this._element).map(element=>Collapse.getOrCreateInstance(element,{toggle:!1}))),activeChildren.length&&activeChildren[0]._isTransitioning)return;const startEvent=EventHandler.trigger(this._element,EVENT_SHOW$6);if(startEvent.defaultPrevented)return;for(const activeInstance of activeChildren)activeInstance.hide();const dimension=this._getDimension();this._element.classList.remove(CLASS_NAME_COLLAPSE),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.style[dimension]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7),this._element.style[dimension]="",EventHandler.trigger(this._element,EVENT_SHOWN$6)},capitalizedDimension=dimension[0].toUpperCase()+dimension.slice(1),scrollSize=`scroll${capitalizedDimension}`;this._queueCallback(complete,this._element,!0),this._element.style[dimension]=`${this._element[scrollSize]}px`}hide(){if(this._isTransitioning||!this._isShown())return;const startEvent=EventHandler.trigger(this._element,EVENT_HIDE$6);if(startEvent.defaultPrevented)return;const dimension=this._getDimension();this._element.style[dimension]=`${this._element.getBoundingClientRect()[dimension]}px`,reflow(this._element),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.classList.remove(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7);for(const trigger of this._triggerArray){const element=SelectorEngine.getElementFromSelector(trigger);element&&!this._isShown(element)&&this._addAriaAndCollapsedClass([trigger],!1)}this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE),EventHandler.trigger(this._element,EVENT_HIDDEN$6)};this._element.style[dimension]="",this._queueCallback(complete,this._element,!0)}_isShown(element=this._element){return element.classList.contains(CLASS_NAME_SHOW$7)}_configAfterMerge(config){return config.toggle=Boolean(config.toggle),config.parent=getElement(config.parent),config}_getDimension(){return this._element.classList.contains(CLASS_NAME_HORIZONTAL)?WIDTH:HEIGHT}_initializeChildren(){if(!this._config.parent)return;const children=this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);for(const element of children){const selected=SelectorEngine.getElementFromSelector(element);selected&&this._addAriaAndCollapsedClass([element],this._isShown(selected))}}_getFirstLevelChildren(selector){const children=SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN,this._config.parent);return SelectorEngine.find(selector,this._config.parent).filter(element=>!children.includes(element))}_addAriaAndCollapsedClass(triggerArray,isOpen){if(!triggerArray.length)return;for(const element of triggerArray)element.classList.toggle(CLASS_NAME_COLLAPSED,!isOpen),element.setAttribute("aria-expanded",isOpen)}static jQueryInterface(config){const _config={};return typeof config=="string"&&/show|hide/.test(config)&&(_config.toggle=!1),this.each(function(){const data=Collapse.getOrCreateInstance(this,_config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$4,SELECTOR_DATA_TOGGLE$4,function(event){(event.target.tagName==="A"||event.delegateTarget&&event.delegateTarget.tagName==="A")&&event.preventDefault();for(const element of SelectorEngine.getMultipleElementsFromSelector(this))Collapse.getOrCreateInstance(element,{toggle:!1}).toggle()}),defineJQueryPlugin(Collapse);var top="top",bottom="bottom",right="right",left="left",auto="auto",basePlacements=[top,bottom,right,left],start="start",end="end",clippingParents="clippingParents",viewport="viewport",popper="popper",reference="reference",variationPlacements=basePlacements.reduce(function(acc,placement){return acc.concat([placement+"-"+start,placement+"-"+end])},[]),placements=[].concat(basePlacements,[auto]).reduce(function(acc,placement){return acc.concat([placement,placement+"-"+start,placement+"-"+end])},[]),beforeRead="beforeRead",read="read",afterRead="afterRead",beforeMain="beforeMain",main="main",afterMain="afterMain",beforeWrite="beforeWrite",write="write",afterWrite="afterWrite",modifierPhases=[beforeRead,read,afterRead,beforeMain,main,afterMain,beforeWrite,write,afterWrite];function getNodeName(element){return element?(element.nodeName||"").toLowerCase():null}function getWindow(node){if(node==null)return window;if(node.toString()!=="[object Window]"){var ownerDocument=node.ownerDocument;return ownerDocument?ownerDocument.defaultView||window:window}return node}function isElement(node){var OwnElement=getWindow(node).Element;return node instanceof OwnElement||node instanceof Element}function isHTMLElement(node){var OwnElement=getWindow(node).HTMLElement;return node instanceof OwnElement||node instanceof HTMLElement}function isShadowRoot(node){if(typeof ShadowRoot=="undefined")return!1;var OwnElement=getWindow(node).ShadowRoot;return node instanceof OwnElement||node instanceof ShadowRoot}function applyStyles(_ref){var state=_ref.state;Object.keys(state.elements).forEach(function(name){var style=state.styles[name]||{},attributes=state.attributes[name]||{},element=state.elements[name];if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(name){var value=attributes[name];value===!1?element.removeAttribute(name):element.setAttribute(name,value===!0?"":value)})})}function effect$2(_ref2){var state=_ref2.state,initialStyles={popper:{position:state.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(state.elements.popper.style,initialStyles.popper),state.styles=initialStyles,state.elements.arrow&&Object.assign(state.elements.arrow.style,initialStyles.arrow),function(){Object.keys(state.elements).forEach(function(name){var element=state.elements[name],attributes=state.attributes[name]||{},styleProperties=Object.keys(state.styles.hasOwnProperty(name)?state.styles[name]:initialStyles[name]),style=styleProperties.reduce(function(style,property){return style[property]="",style},{});if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(attribute){element.removeAttribute(attribute)})})}}const applyStyles$1={name:"applyStyles",enabled:!0,phase:"write",fn:applyStyles,effect:effect$2,requires:["computeStyles"]};function getBasePlacement(placement){return placement.split("-")[0]}var max=Math.max,min=Math.min,round=Math.round;function getUAString(){var uaData=navigator.userAgentData;return uaData!=null&&uaData.brands&&Array.isArray(uaData.brands)?uaData.brands.map(function(item){return item.brand+"/"+item.version}).join(" "):navigator.userAgent}function isLayoutViewport(){return!/^((?!chrome|android).)*safari/i.test(getUAString())}function getBoundingClientRect(element,includeScale,isFixedStrategy){includeScale===void 0&&(includeScale=!1),isFixedStrategy===void 0&&(isFixedStrategy=!1);var clientRect=element.getBoundingClientRect(),scaleX=1,scaleY=1;includeScale&&isHTMLElement(element)&&(scaleX=element.offsetWidth>0?round(clientRect.width)/element.offsetWidth||1:1,scaleY=element.offsetHeight>0?round(clientRect.height)/element.offsetHeight||1:1);var _ref=isElement(element)?getWindow(element):window,visualViewport=_ref.visualViewport,addVisualOffsets=!isLayoutViewport()&&isFixedStrategy,x=(clientRect.left+(addVisualOffsets&&visualViewport?visualViewport.offsetLeft:0))/scaleX,y=(clientRect.top+(addVisualOffsets&&visualViewport?visualViewport.offsetTop:0))/scaleY,width=clientRect.width/scaleX,height=clientRect.height/scaleY;return{width,height,top:y,right:x+width,bottom:y+height,left:x,x,y}}function getLayoutRect(element){var clientRect=getBoundingClientRect(element),width=element.offsetWidth,height=element.offsetHeight;return Math.abs(clientRect.width-width)<=1&&(width=clientRect.width),Math.abs(clientRect.height-height)<=1&&(height=clientRect.height),{x:element.offsetLeft,y:element.offsetTop,width,height}}function contains(parent,child){var rootNode=child.getRootNode&&child.getRootNode();if(parent.contains(child))return!0;if(rootNode&&isShadowRoot(rootNode)){var next=child;do{if(next&&parent.isSameNode(next))return!0;next=next.parentNode||next.host}while(next)}return!1}function getComputedStyle$1(element){return getWindow(element).getComputedStyle(element)}function isTableElement(element){return["table","td","th"].indexOf(getNodeName(element))>=0}function getDocumentElement(element){return((isElement(element)?element.ownerDocument:element.document)||window.document).documentElement}function getParentNode(element){return getNodeName(element)==="html"?element:element.assignedSlot||element.parentNode||(isShadowRoot(element)?element.host:null)||getDocumentElement(element)}function getTrueOffsetParent(element){return!isHTMLElement(element)||getComputedStyle$1(element).position==="fixed"?null:element.offsetParent}function getContainingBlock(element){var isFirefox=/firefox/i.test(getUAString()),isIE=/Trident/i.test(getUAString());if(isIE&&isHTMLElement(element)){var elementCss=getComputedStyle$1(element);if(elementCss.position==="fixed")return null}var css,currentNode=getParentNode(element);for(isShadowRoot(currentNode)&&(currentNode=currentNode.host);isHTMLElement(currentNode)&&["html","body"].indexOf(getNodeName(currentNode))<0;){if(css=getComputedStyle$1(currentNode),css.transform!=="none"||css.perspective!=="none"||css.contain==="paint"||["transform","perspective"].indexOf(css.willChange)!==-1||isFirefox&&css.willChange==="filter"||isFirefox&&css.filter&&css.filter!=="none")return currentNode;currentNode=currentNode.parentNode}return null}function getOffsetParent(element){for(var window=getWindow(element),offsetParent=getTrueOffsetParent(element);offsetParent&&isTableElement(offsetParent)&&getComputedStyle$1(offsetParent).position==="static";)offsetParent=getTrueOffsetParent(offsetParent);return offsetParent&&(getNodeName(offsetParent)==="html"||getNodeName(offsetParent)==="body"&&getComputedStyle$1(offsetParent).position==="static")?window:offsetParent||getContainingBlock(element)||window}function getMainAxisFromPlacement(placement){return["top","bottom"].indexOf(placement)>=0?"x":"y"}function within(min$1,value,max$1){return max(min$1,min(value,max$1))}function withinMaxClamp(min,value,max){var v=within(min,value,max);return v>max?max:v}function getFreshSideObject(){return{top:0,right:0,bottom:0,left:0}}function mergePaddingObject(paddingObject){return Object.assign({},getFreshSideObject(),paddingObject)}function expandToHashMap(value,keys){return keys.reduce(function(hashMap,key){return hashMap[key]=value,hashMap},{})}var toPaddingObject=function(padding,state){return padding=typeof padding=="function"?padding(Object.assign({},state.rects,{placement:state.placement})):padding,mergePaddingObject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements))};function arrow(_ref){var _state$modifiersData$,state=_ref.state,name=_ref.name,options=_ref.options,arrowElement=state.elements.arrow,popperOffsets=state.modifiersData.popperOffsets,basePlacement=getBasePlacement(state.placement),axis=getMainAxisFromPlacement(basePlacement),isVertical=[left,right].indexOf(basePlacement)>=0,len=isVertical?"height":"width";if(!arrowElement||!popperOffsets)return;var paddingObject=toPaddingObject(options.padding,state),arrowRect=getLayoutRect(arrowElement),minProp=axis==="y"?top:left,maxProp=axis==="y"?bottom:right,endDiff=state.rects.reference[len]+state.rects.reference[axis]-popperOffsets[axis]-state.rects.popper[len],startDiff=popperOffsets[axis]-state.rects.reference[axis],arrowOffsetParent=getOffsetParent(arrowElement),clientSize=arrowOffsetParent?axis==="y"?arrowOffsetParent.clientHeight||0:arrowOffsetParent.clientWidth||0:0,centerToReference=endDiff/2-startDiff/2,min=paddingObject[minProp],max=clientSize-arrowRect[len]-paddingObject[maxProp],center=clientSize/2-arrowRect[len]/2+centerToReference,offset=within(min,center,max),axisProp=axis;state.modifiersData[name]=(_state$modifiersData$={},_state$modifiersData$[axisProp]=offset,_state$modifiersData$.centerOffset=offset-center,_state$modifiersData$)}function effect$1(_ref2){var state=_ref2.state,options=_ref2.options,_options$element=options.element,arrowElement=_options$element===void 0?"[data-popper-arrow]":_options$element;if(arrowElement==null)return;if(typeof arrowElement=="string"&&(arrowElement=state.elements.popper.querySelector(arrowElement),!arrowElement))return;if(!contains(state.elements.popper,arrowElement))return;state.elements.arrow=arrowElement}const arrow$1={name:"arrow",enabled:!0,phase:"main",fn:arrow,effect:effect$1,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function getVariation(placement){return placement.split("-")[1]}var unsetSides={top:"auto",right:"auto",bottom:"auto",left:"auto"};function roundOffsetsByDPR(_ref,win){var x=_ref.x,y=_ref.y,dpr=win.devicePixelRatio||1;return{x:round(x*dpr)/dpr||0,y:round(y*dpr)/dpr||0}}function mapToStyles(_ref2){var _Object$assign2,_Object$assign,popper=_ref2.popper,popperRect=_ref2.popperRect,placement=_ref2.placement,variation=_ref2.variation,offsets=_ref2.offsets,position=_ref2.position,gpuAcceleration=_ref2.gpuAcceleration,adaptive=_ref2.adaptive,roundOffsets=_ref2.roundOffsets,isFixed=_ref2.isFixed,_offsets$x=offsets.x,x=_offsets$x===void 0?0:_offsets$x,_offsets$y=offsets.y,y=_offsets$y===void 0?0:_offsets$y,_ref3=typeof roundOffsets=="function"?roundOffsets({x,y}):{x,y},x=_ref3.x,y=_ref3.y,hasX=offsets.hasOwnProperty("x"),hasY=offsets.hasOwnProperty("y"),sideX=left,sideY=top,win=window;if(adaptive){var offsetParent=getOffsetParent(popper),heightProp="clientHeight",widthProp="clientWidth";if(offsetParent===getWindow(popper)&&(offsetParent=getDocumentElement(popper),getComputedStyle$1(offsetParent).position!=="static"&&position==="absolute"&&(heightProp="scrollHeight",widthProp="scrollWidth")),offsetParent=offsetParent,placement===top||(placement===left||placement===right)&&variation===end){sideY=bottom;var offsetY=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.height:offsetParent[heightProp];y-=offsetY-popperRect.height,y*=gpuAcceleration?1:-1}if(placement===left||(placement===top||placement===bottom)&&variation===end){sideX=right;var offsetX=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.width:offsetParent[widthProp];x-=offsetX-popperRect.width,x*=gpuAcceleration?1:-1}}var commonStyles=Object.assign({position},adaptive&&unsetSides),_ref4=roundOffsets===!0?roundOffsetsByDPR({x,y},getWindow(popper)):{x,y},x=_ref4.x,y=_ref4.y;return gpuAcceleration?Object.assign({},commonStyles,(_Object$assign={},_Object$assign[sideY]=hasY?"0":"",_Object$assign[sideX]=hasX?"0":"",_Object$assign.transform=(win.devicePixelRatio||1)<=1?"translate("+x+"px, "+y+"px)":"translate3d("+x+"px, "+y+"px, 0)",_Object$assign)):Object.assign({},commonStyles,(_Object$assign2={},_Object$assign2[sideY]=hasY?y+"px":"",_Object$assign2[sideX]=hasX?x+"px":"",_Object$assign2.transform="",_Object$assign2))}function computeStyles(_ref5){var state=_ref5.state,options=_ref5.options,_options$gpuAccelerat=options.gpuAcceleration,gpuAcceleration=_options$gpuAccelerat===void 0||_options$gpuAccelerat,_options$adaptive=options.adaptive,adaptive=_options$adaptive===void 0||_options$adaptive,_options$roundOffsets=options.roundOffsets,roundOffsets=_options$roundOffsets===void 0||_options$roundOffsets,commonStyles={placement:getBasePlacement(state.placement),variation:getVariation(state.placement),popper:state.elements.popper,popperRect:state.rects.popper,gpuAcceleration,isFixed:state.options.strategy==="fixed"};state.modifiersData.popperOffsets!=null&&(state.styles.popper=Object.assign({},state.styles.popper,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.popperOffsets,position:state.options.strategy,adaptive,roundOffsets})))),state.modifiersData.arrow!=null&&(state.styles.arrow=Object.assign({},state.styles.arrow,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets})))),state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-placement":state.placement})}const computeStyles$1={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:computeStyles,data:{}};var passive={passive:!0};function effect(_ref){var state=_ref.state,instance=_ref.instance,options=_ref.options,_options$scroll=options.scroll,scroll=_options$scroll===void 0||_options$scroll,_options$resize=options.resize,resize=_options$resize===void 0||_options$resize,window=getWindow(state.elements.popper),scrollParents=[].concat(state.scrollParents.reference,state.scrollParents.popper);return scroll&&scrollParents.forEach(function(scrollParent){scrollParent.addEventListener("scroll",instance.update,passive)}),resize&&window.addEventListener("resize",instance.update,passive),function(){scroll&&scrollParents.forEach(function(scrollParent){scrollParent.removeEventListener("scroll",instance.update,passive)}),resize&&window.removeEventListener("resize",instance.update,passive)}}const eventListeners={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect,data:{}};var hash$1={left:"right",right:"left",bottom:"top",top:"bottom"};function getOppositePlacement(placement){return placement.replace(/left|right|bottom|top/g,function(matched){return hash$1[matched]})}var hash={start:"end",end:"start"};function getOppositeVariationPlacement(placement){return placement.replace(/start|end/g,function(matched){return hash[matched]})}function getWindowScroll(node){var win=getWindow(node),scrollLeft=win.pageXOffset,scrollTop=win.pageYOffset;return{scrollLeft,scrollTop}}function getWindowScrollBarX(element){return getBoundingClientRect(getDocumentElement(element)).left+getWindowScroll(element).scrollLeft}function getViewportRect(element,strategy){var win=getWindow(element),html=getDocumentElement(element),visualViewport=win.visualViewport,width=html.clientWidth,height=html.clientHeight,x=0,y=0;if(visualViewport){width=visualViewport.width,height=visualViewport.height;var layoutViewport=isLayoutViewport();(layoutViewport||!layoutViewport&&strategy==="fixed")&&(x=visualViewport.offsetLeft,y=visualViewport.offsetTop)}return{width,height,x:x+getWindowScrollBarX(element),y}}function getDocumentRect(element){var _element$ownerDocumen,html=getDocumentElement(element),winScroll=getWindowScroll(element),body=(_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body,width=max(html.scrollWidth,html.clientWidth,body?body.scrollWidth:0,body?body.clientWidth:0),height=max(html.scrollHeight,html.clientHeight,body?body.scrollHeight:0,body?body.clientHeight:0),x=-winScroll.scrollLeft+getWindowScrollBarX(element),y=-winScroll.scrollTop;return getComputedStyle$1(body||html).direction==="rtl"&&(x+=max(html.clientWidth,body?body.clientWidth:0)-width),{width,height,x,y}}function isScrollParent(element){var _getComputedStyle=getComputedStyle$1(element),overflow=_getComputedStyle.overflow,overflowX=_getComputedStyle.overflowX,overflowY=_getComputedStyle.overflowY;return/auto|scroll|overlay|hidden/.test(overflow+overflowY+overflowX)}function getScrollParent(node){return["html","body","#document"].indexOf(getNodeName(node))>=0?node.ownerDocument.body:isHTMLElement(node)&&isScrollParent(node)?node:getScrollParent(getParentNode(node))}function listScrollParents(element,list){list===void 0&&(list=[]);var _element$ownerDocumen,scrollParent=getScrollParent(element),isBody=scrollParent===((_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body),win=getWindow(scrollParent),target=isBody?[win].concat(win.visualViewport||[],isScrollParent(scrollParent)?scrollParent:[]):scrollParent,updatedList=list.concat(target);return isBody?updatedList:updatedList.concat(listScrollParents(getParentNode(target)))}function rectToClientRect(rect){return Object.assign({},rect,{left:rect.x,top:rect.y,right:rect.x+rect.width,bottom:rect.y+rect.height})}function getInnerBoundingClientRect(element,strategy){var rect=getBoundingClientRect(element,!1,strategy==="fixed");return rect.top=rect.top+element.clientTop,rect.left=rect.left+element.clientLeft,rect.bottom=rect.top+element.clientHeight,rect.right=rect.left+element.clientWidth,rect.width=element.clientWidth,rect.height=element.clientHeight,rect.x=rect.left,rect.y=rect.top,rect}function getClientRectFromMixedType(element,clippingParent,strategy){return clippingParent===viewport?rectToClientRect(getViewportRect(element,strategy)):isElement(clippingParent)?getInnerBoundingClientRect(clippingParent,strategy):rectToClientRect(getDocumentRect(getDocumentElement(element)))}function getClippingParents(element){var clippingParents=listScrollParents(getParentNode(element)),canEscapeClipping=["absolute","fixed"].indexOf(getComputedStyle$1(element).position)>=0,clipperElement=canEscapeClipping&&isHTMLElement(element)?getOffsetParent(element):element;return isElement(clipperElement)?clippingParents.filter(function(clippingParent){return isElement(clippingParent)&&contains(clippingParent,clipperElement)&&getNodeName(clippingParent)!=="body"}):[]}function getClippingRect(element,boundary,rootBoundary,strategy){var mainClippingParents=boundary==="clippingParents"?getClippingParents(element):[].concat(boundary),clippingParents=[].concat(mainClippingParents,[rootBoundary]),firstClippingParent=clippingParents[0],clippingRect=clippingParents.reduce(function(accRect,clippingParent){var rect=getClientRectFromMixedType(element,clippingParent,strategy);return accRect.top=max(rect.top,accRect.top),accRect.right=min(rect.right,accRect.right),accRect.bottom=min(rect.bottom,accRect.bottom),accRect.left=max(rect.left,accRect.left),accRect},getClientRectFromMixedType(element,firstClippingParent,strategy));return clippingRect.width=clippingRect.right-clippingRect.left,clippingRect.height=clippingRect.bottom-clippingRect.top,clippingRect.x=clippingRect.left,clippingRect.y=clippingRect.top,clippingRect}function computeOffsets(_ref){var offsets,len,reference=_ref.reference,element=_ref.element,placement=_ref.placement,basePlacement=placement?getBasePlacement(placement):null,variation=placement?getVariation(placement):null,commonX=reference.x+reference.width/2-element.width/2,commonY=reference.y+reference.height/2-element.height/2;switch(basePlacement){case top:offsets={x:commonX,y:reference.y-element.height};break;case bottom:offsets={x:commonX,y:reference.y+reference.height};break;case right:offsets={x:reference.x+reference.width,y:commonY};break;case left:offsets={x:reference.x-element.width,y:commonY};break;default:offsets={x:reference.x,y:reference.y}}var mainAxis=basePlacement?getMainAxisFromPlacement(basePlacement):null;if(mainAxis!=null)switch(len=mainAxis==="y"?"height":"width",variation){case start:offsets[mainAxis]=offsets[mainAxis]-(reference[len]/2-element[len]/2);break;case end:offsets[mainAxis]=offsets[mainAxis]+(reference[len]/2-element[len]/2);break}return offsets}function detectOverflow(state,options){options===void 0&&(options={});var _options=options,_options$placement=_options.placement,placement=_options$placement===void 0?state.placement:_options$placement,_options$strategy=_options.strategy,strategy=_options$strategy===void 0?state.strategy:_options$strategy,_options$boundary=_options.boundary,boundary=_options$boundary===void 0?clippingParents:_options$boundary,_options$rootBoundary=_options.rootBoundary,rootBoundary=_options$rootBoundary===void 0?viewport:_options$rootBoundary,_options$elementConte=_options.elementContext,elementContext=_options$elementConte===void 0?popper:_options$elementConte,_options$altBoundary=_options.altBoundary,altBoundary=_options$altBoundary!==void 0&&_options$altBoundary,_options$padding=_options.padding,padding=_options$padding===void 0?0:_options$padding,paddingObject=mergePaddingObject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements)),altContext=elementContext===popper?reference:popper,popperRect=state.rects.popper,element=state.elements[altBoundary?altContext:elementContext],clippingClientRect=getClippingRect(isElement(element)?element:element.contextElement||getDocumentElement(state.elements.popper),boundary,rootBoundary,strategy),referenceClientRect=getBoundingClientRect(state.elements.reference),popperOffsets=computeOffsets({reference:referenceClientRect,element:popperRect,strategy:"absolute",placement}),popperClientRect=rectToClientRect(Object.assign({},popperRect,popperOffsets)),elementClientRect=elementContext===popper?popperClientRect:referenceClientRect,overflowOffsets={top:clippingClientRect.top-elementClientRect.top+paddingObject.top,bottom:elementClientRect.bottom-clippingClientRect.bottom+paddingObject.bottom,left:clippingClientRect.left-elementClientRect.left+paddingObject.left,right:elementClientRect.right-clippingClientRect.right+paddingObject.right},offsetData=state.modifiersData.offset;if(elementContext===popper&&offsetData){var offset=offsetData[placement];Object.keys(overflowOffsets).forEach(function(key){var multiply=[right,bottom].indexOf(key)>=0?1:-1,axis=[top,bottom].indexOf(key)>=0?"y":"x";overflowOffsets[key]+=offset[axis]*multiply})}return overflowOffsets}function computeAutoPlacement(state,options){options===void 0&&(options={});var _options=options,placement=_options.placement,boundary=_options.boundary,rootBoundary=_options.rootBoundary,padding=_options.padding,flipVariations=_options.flipVariations,_options$allowedAutoP=_options.allowedAutoPlacements,allowedAutoPlacements=_options$allowedAutoP===void 0?placements:_options$allowedAutoP,variation=getVariation(placement),placements$1=variation?flipVariations?variationPlacements:variationPlacements.filter(function(placement){return getVariation(placement)===variation}):basePlacements,allowedPlacements=placements$1.filter(function(placement){return allowedAutoPlacements.indexOf(placement)>=0});allowedPlacements.length===0&&(allowedPlacements=placements$1);var overflows=allowedPlacements.reduce(function(acc,placement){return acc[placement]=detectOverflow(state,{placement,boundary,rootBoundary,padding})[getBasePlacement(placement)],acc},{});return Object.keys(overflows).sort(function(a,b){return overflows[a]-overflows[b]})}function getExpandedFallbackPlacements(placement){if(getBasePlacement(placement)===auto)return[];var oppositePlacement=getOppositePlacement(placement);return[getOppositeVariationPlacement(placement),oppositePlacement,getOppositeVariationPlacement(oppositePlacement)]}function flip(_ref){var state=_ref.state,options=_ref.options,name=_ref.name;if(state.modifiersData[name]._skip)return;for(var _options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis===void 0||_options$altAxis,specifiedFallbackPlacements=options.fallbackPlacements,padding=options.padding,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,_options$flipVariatio=options.flipVariations,flipVariations=_options$flipVariatio===void 0||_options$flipVariatio,allowedAutoPlacements=options.allowedAutoPlacements,preferredPlacement=state.options.placement,basePlacement=getBasePlacement(preferredPlacement),isBasePlacement=basePlacement===preferredPlacement,fallbackPlacements=specifiedFallbackPlacements||(isBasePlacement||!flipVariations?[getOppositePlacement(preferredPlacement)]:getExpandedFallbackPlacements(preferredPlacement)),placements=[preferredPlacement].concat(fallbackPlacements).reduce(function(acc,placement){return acc.concat(getBasePlacement(placement)===auto?computeAutoPlacement(state,{placement,boundary,rootBoundary,padding,flipVariations,allowedAutoPlacements}):placement)},[]),referenceRect=state.rects.reference,popperRect=state.rects.popper,checksMap=new Map,makeFallbackChecks=!0,firstFittingPlacement=placements[0],i=0;i=0,len=isVertical?"width":"height",overflow=detectOverflow(state,{placement,boundary,rootBoundary,altBoundary,padding}),mainVariationSide=isVertical?isStartVariation?right:left:isStartVariation?bottom:top;referenceRect[len]>popperRect[len]&&(mainVariationSide=getOppositePlacement(mainVariationSide));var altVariationSide=getOppositePlacement(mainVariationSide),checks=[];if(checkMainAxis&&checks.push(overflow[_basePlacement]<=0),checkAltAxis&&checks.push(overflow[mainVariationSide]<=0,overflow[altVariationSide]<=0),checks.every(function(check){return check})){firstFittingPlacement=placement,makeFallbackChecks=!1;break}checksMap.set(placement,checks)}if(makeFallbackChecks)for(var numberOfChecks=flipVariations?3:1,_loop=function(_i){var fittingPlacement=placements.find(function(placement){var checks=checksMap.get(placement);if(checks)return checks.slice(0,_i).every(function(check){return check})});if(fittingPlacement)return firstFittingPlacement=fittingPlacement,"break"},_i=numberOfChecks;_i>0;_i--){var _ret=_loop(_i);if(_ret==="break")break}state.placement!==firstFittingPlacement&&(state.modifiersData[name]._skip=!0,state.placement=firstFittingPlacement,state.reset=!0)}const flip$1={name:"flip",enabled:!0,phase:"main",fn:flip,requiresIfExists:["offset"],data:{_skip:!1}};function getSideOffsets(overflow,rect,preventedOffsets){return preventedOffsets===void 0&&(preventedOffsets={x:0,y:0}),{top:overflow.top-rect.height-preventedOffsets.y,right:overflow.right-rect.width+preventedOffsets.x,bottom:overflow.bottom-rect.height+preventedOffsets.y,left:overflow.left-rect.width-preventedOffsets.x}}function isAnySideFullyClipped(overflow){return[top,right,bottom,left].some(function(side){return overflow[side]>=0})}function hide(_ref){var state=_ref.state,name=_ref.name,referenceRect=state.rects.reference,popperRect=state.rects.popper,preventedOffsets=state.modifiersData.preventOverflow,referenceOverflow=detectOverflow(state,{elementContext:"reference"}),popperAltOverflow=detectOverflow(state,{altBoundary:!0}),referenceClippingOffsets=getSideOffsets(referenceOverflow,referenceRect),popperEscapeOffsets=getSideOffsets(popperAltOverflow,popperRect,preventedOffsets),isReferenceHidden=isAnySideFullyClipped(referenceClippingOffsets),hasPopperEscaped=isAnySideFullyClipped(popperEscapeOffsets);state.modifiersData[name]={referenceClippingOffsets,popperEscapeOffsets,isReferenceHidden,hasPopperEscaped},state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-reference-hidden":isReferenceHidden,"data-popper-escaped":hasPopperEscaped})}const hide$1={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:hide};function distanceAndSkiddingToXY(placement,rects,offset){var basePlacement=getBasePlacement(placement),invertDistance=[left,top].indexOf(basePlacement)>=0?-1:1,_ref=typeof offset=="function"?offset(Object.assign({},rects,{placement})):offset,skidding=_ref[0],distance=_ref[1],skidding=skidding||0,distance=(distance||0)*invertDistance;return[left,right].indexOf(basePlacement)>=0?{x:distance,y:skidding}:{x:skidding,y:distance}}function offset(_ref2){var state=_ref2.state,options=_ref2.options,name=_ref2.name,_options$offset=options.offset,offset=_options$offset===void 0?[0,0]:_options$offset,data=placements.reduce(function(acc,placement){return acc[placement]=distanceAndSkiddingToXY(placement,state.rects,offset),acc},{}),_data$state$placement=data[state.placement],x=_data$state$placement.x,y=_data$state$placement.y;state.modifiersData.popperOffsets!=null&&(state.modifiersData.popperOffsets.x+=x,state.modifiersData.popperOffsets.y+=y),state.modifiersData[name]=data}const offset$1={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:offset};function popperOffsets(_ref){var state=_ref.state,name=_ref.name;state.modifiersData[name]=computeOffsets({reference:state.rects.reference,element:state.rects.popper,strategy:"absolute",placement:state.placement})}const popperOffsets$1={name:"popperOffsets",enabled:!0,phase:"read",fn:popperOffsets,data:{}};function getAltAxis(axis){return axis==="x"?"y":"x"}function preventOverflow(_ref){var _offsetModifierState$,_offsetModifierState$2,state=_ref.state,options=_ref.options,name=_ref.name,_options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis!==void 0&&_options$altAxis,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,padding=options.padding,_options$tether=options.tether,tether=_options$tether===void 0||_options$tether,_options$tetherOffset=options.tetherOffset,tetherOffset=_options$tetherOffset===void 0?0:_options$tetherOffset,overflow=detectOverflow(state,{boundary,rootBoundary,padding,altBoundary}),basePlacement=getBasePlacement(state.placement),variation=getVariation(state.placement),isBasePlacement=!variation,mainAxis=getMainAxisFromPlacement(basePlacement),altAxis=getAltAxis(mainAxis),popperOffsets=state.modifiersData.popperOffsets,referenceRect=state.rects.reference,popperRect=state.rects.popper,tetherOffsetValue=typeof tetherOffset=="function"?tetherOffset(Object.assign({},state.rects,{placement:state.placement})):tetherOffset,normalizedTetherOffsetValue=typeof tetherOffsetValue=="number"?{mainAxis:tetherOffsetValue,altAxis:tetherOffsetValue}:Object.assign({mainAxis:0,altAxis:0},tetherOffsetValue),offsetModifierState=state.modifiersData.offset?state.modifiersData.offset[state.placement]:null,data={x:0,y:0};if(!popperOffsets)return;if(checkMainAxis){var mainSide=mainAxis==="y"?top:left,altSide=mainAxis==="y"?bottom:right,len=mainAxis==="y"?"height":"width",offset=popperOffsets[mainAxis],min$1=offset+overflow[mainSide],max$1=offset-overflow[altSide],additive=tether?-popperRect[len]/2:0,minLen=variation===start?referenceRect[len]:popperRect[len],maxLen=variation===start?-popperRect[len]:-referenceRect[len],arrowElement=state.elements.arrow,arrowRect=tether&&arrowElement?getLayoutRect(arrowElement):{width:0,height:0},arrowPaddingObject=state.modifiersData["arrow#persistent"]?state.modifiersData["arrow#persistent"].padding:getFreshSideObject(),arrowPaddingMin=arrowPaddingObject[mainSide],arrowPaddingMax=arrowPaddingObject[altSide],arrowLen=within(0,referenceRect[len],arrowRect[len]),minOffset=isBasePlacement?referenceRect[len]/2-additive-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis:minLen-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis,maxOffset=isBasePlacement?-referenceRect[len]/2+additive+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis:maxLen+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis,arrowOffsetParent=state.elements.arrow&&getOffsetParent(state.elements.arrow),clientOffset=arrowOffsetParent?mainAxis==="y"?arrowOffsetParent.clientTop||0:arrowOffsetParent.clientLeft||0:0,offsetModifierValue=(_offsetModifierState$=offsetModifierState?.[mainAxis])!=null?_offsetModifierState$:0,tetherMin=offset+minOffset-offsetModifierValue-clientOffset,tetherMax=offset+maxOffset-offsetModifierValue,preventedOffset=within(tether?min(min$1,tetherMin):min$1,offset,tether?max(max$1,tetherMax):max$1);popperOffsets[mainAxis]=preventedOffset,data[mainAxis]=preventedOffset-offset}if(checkAltAxis){var _mainSide=mainAxis==="x"?top:left,_altSide=mainAxis==="x"?bottom:right,_offset=popperOffsets[altAxis],_len=altAxis==="y"?"height":"width",_min=_offset+overflow[_mainSide],_max=_offset-overflow[_altSide],isOriginSide=[top,left].indexOf(basePlacement)!==-1,_offsetModifierValue=(_offsetModifierState$2=offsetModifierState?.[altAxis])!=null?_offsetModifierState$2:0,_tetherMin=isOriginSide?_min:_offset-referenceRect[_len]-popperRect[_len]-_offsetModifierValue+normalizedTetherOffsetValue.altAxis,_tetherMax=isOriginSide?_offset+referenceRect[_len]+popperRect[_len]-_offsetModifierValue-normalizedTetherOffsetValue.altAxis:_max,_preventedOffset=tether&&isOriginSide?withinMaxClamp(_tetherMin,_offset,_tetherMax):within(tether?_tetherMin:_min,_offset,tether?_tetherMax:_max);popperOffsets[altAxis]=_preventedOffset,data[altAxis]=_preventedOffset-_offset}state.modifiersData[name]=data}const preventOverflow$1={name:"preventOverflow",enabled:!0,phase:"main",fn:preventOverflow,requiresIfExists:["offset"]};function getHTMLElementScroll(element){return{scrollLeft:element.scrollLeft,scrollTop:element.scrollTop}}function getNodeScroll(node){return node===getWindow(node)||!isHTMLElement(node)?getWindowScroll(node):getHTMLElementScroll(node)}function isElementScaled(element){var rect=element.getBoundingClientRect(),scaleX=round(rect.width)/element.offsetWidth||1,scaleY=round(rect.height)/element.offsetHeight||1;return scaleX!==1||scaleY!==1}function getCompositeRect(elementOrVirtualElement,offsetParent,isFixed){isFixed===void 0&&(isFixed=!1);var isOffsetParentAnElement=isHTMLElement(offsetParent),offsetParentIsScaled=isHTMLElement(offsetParent)&&isElementScaled(offsetParent),documentElement=getDocumentElement(offsetParent),rect=getBoundingClientRect(elementOrVirtualElement,offsetParentIsScaled,isFixed),scroll={scrollLeft:0,scrollTop:0},offsets={x:0,y:0};return(isOffsetParentAnElement||!isOffsetParentAnElement&&!isFixed)&&((getNodeName(offsetParent)!=="body"||isScrollParent(documentElement))&&(scroll=getNodeScroll(offsetParent)),isHTMLElement(offsetParent)?(offsets=getBoundingClientRect(offsetParent,!0),offsets.x+=offsetParent.clientLeft,offsets.y+=offsetParent.clientTop):documentElement&&(offsets.x=getWindowScrollBarX(documentElement))),{x:rect.left+scroll.scrollLeft-offsets.x,y:rect.top+scroll.scrollTop-offsets.y,width:rect.width,height:rect.height}}function order(modifiers){var map=new Map,visited=new Set,result=[];modifiers.forEach(function(modifier){map.set(modifier.name,modifier)});function sort(modifier){visited.add(modifier.name);var requires=[].concat(modifier.requires||[],modifier.requiresIfExists||[]);requires.forEach(function(dep){if(!visited.has(dep)){var depModifier=map.get(dep);depModifier&&sort(depModifier)}}),result.push(modifier)}return modifiers.forEach(function(modifier){visited.has(modifier.name)||sort(modifier)}),result}function orderModifiers(modifiers){var orderedModifiers=order(modifiers);return modifierPhases.reduce(function(acc,phase){return acc.concat(orderedModifiers.filter(function(modifier){return modifier.phase===phase}))},[])}function debounce(fn){var pending;return function(){return pending||(pending=new Promise(function(resolve){Promise.resolve().then(function(){pending=void 0,resolve(fn())})})),pending}}function mergeByName(modifiers){var merged=modifiers.reduce(function(merged,current){var existing=merged[current.name];return merged[current.name]=existing?Object.assign({},existing,current,{options:Object.assign({},existing.options,current.options),data:Object.assign({},existing.data,current.data)}):current,merged},{});return Object.keys(merged).map(function(key){return merged[key]})}var DEFAULT_OPTIONS={placement:"bottom",modifiers:[],strategy:"absolute"};function areValidElements(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return!args.some(function(element){return!element||typeof element.getBoundingClientRect!="function"})}function popperGenerator(generatorOptions){generatorOptions===void 0&&(generatorOptions={});var _generatorOptions=generatorOptions,_generatorOptions$def=_generatorOptions.defaultModifiers,defaultModifiers=_generatorOptions$def===void 0?[]:_generatorOptions$def,_generatorOptions$def2=_generatorOptions.defaultOptions,defaultOptions=_generatorOptions$def2===void 0?DEFAULT_OPTIONS:_generatorOptions$def2;return function(reference,popper,options){options===void 0&&(options=defaultOptions);var state={placement:"bottom",orderedModifiers:[],options:Object.assign({},DEFAULT_OPTIONS,defaultOptions),modifiersData:{},elements:{reference,popper},attributes:{},styles:{}},effectCleanupFns=[],isDestroyed=!1,instance={state,setOptions:function(setOptionsAction){var options=typeof setOptionsAction=="function"?setOptionsAction(state.options):setOptionsAction;cleanupModifierEffects(),state.options=Object.assign({},defaultOptions,state.options,options),state.scrollParents={reference:isElement(reference)?listScrollParents(reference):reference.contextElement?listScrollParents(reference.contextElement):[],popper:listScrollParents(popper)};var orderedModifiers=orderModifiers(mergeByName([].concat(defaultModifiers,state.options.modifiers)));return state.orderedModifiers=orderedModifiers.filter(function(m){return m.enabled}),runModifierEffects(),instance.update()},forceUpdate:function(){if(isDestroyed)return;var _state$elements=state.elements,reference=_state$elements.reference,popper=_state$elements.popper;if(!areValidElements(reference,popper))return;state.rects={reference:getCompositeRect(reference,getOffsetParent(popper),state.options.strategy==="fixed"),popper:getLayoutRect(popper)},state.reset=!1,state.placement=state.options.placement,state.orderedModifiers.forEach(function(modifier){return state.modifiersData[modifier.name]=Object.assign({},modifier.data)});for(var index=0;indexNumber.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_getPopperConfig(){const defaultBsPopperConfig={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Manipulator.setDataAttribute(this._menu,"popper","static"),defaultBsPopperConfig.modifiers=[{name:"applyStyles",enabled:!1}]),{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_selectMenuItem({key,target}){const items=SelectorEngine.find(SELECTOR_VISIBLE_ITEMS,this._menu).filter(element=>isVisible(element));if(!items.length)return;getNextActiveElement(items,target,key===ARROW_DOWN_KEY$1,!items.includes(target)).focus()}static jQueryInterface(config){return this.each(function(){const data=Dropdown.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}static clearMenus(event){if(event.button===RIGHT_MOUSE_BUTTON||event.type==="keyup"&&event.key!==TAB_KEY$1)return;const openToggles=SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);for(const toggle of openToggles){const context=Dropdown.getInstance(toggle);if(!context||context._config.autoClose===!1)continue;const composedPath=event.composedPath(),isMenuTarget=composedPath.includes(context._menu);if(composedPath.includes(context._element)||context._config.autoClose==="inside"&&!isMenuTarget||context._config.autoClose==="outside"&&isMenuTarget)continue;if(context._menu.contains(event.target)&&(event.type==="keyup"&&event.key===TAB_KEY$1||/input|select|option|textarea|form/i.test(event.target.tagName)))continue;const relatedTarget={relatedTarget:context._element};event.type==="click"&&(relatedTarget.clickEvent=event),context._completeHide(relatedTarget)}}static dataApiKeydownHandler(event){const isInput=/input|textarea/i.test(event.target.tagName),isEscapeEvent=event.key===ESCAPE_KEY$2,isUpOrDownEvent=[ARROW_UP_KEY$1,ARROW_DOWN_KEY$1].includes(event.key);if(!isUpOrDownEvent&&!isEscapeEvent)return;if(isInput&&!isEscapeEvent)return;event.preventDefault();const getToggleButton=this.matches(SELECTOR_DATA_TOGGLE$3)?this:SelectorEngine.prev(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.next(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3,event.delegateTarget.parentNode),instance=Dropdown.getOrCreateInstance(getToggleButton);if(isUpOrDownEvent){event.stopPropagation(),instance.show(),instance._selectMenuItem(event);return}instance._isShown()&&(event.stopPropagation(),instance.hide(),getToggleButton.focus())}}EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_DATA_TOGGLE$3,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_MENU,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_CLICK_DATA_API$3,Dropdown.clearMenus),EventHandler.on(document,EVENT_KEYUP_DATA_API,Dropdown.clearMenus),EventHandler.on(document,EVENT_CLICK_DATA_API$3,SELECTOR_DATA_TOGGLE$3,function(event){event.preventDefault(),Dropdown.getOrCreateInstance(this).toggle()}),defineJQueryPlugin(Dropdown);const NAME$9="backdrop",CLASS_NAME_FADE$4="fade",CLASS_NAME_SHOW$5="show",EVENT_MOUSEDOWN=`mousedown.bs.${NAME$9}`,Default$8={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},DefaultType$8={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Backdrop extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isAppended=!1,this._element=null}static get Default(){return Default$8}static get DefaultType(){return DefaultType$8}static get NAME(){return NAME$9}show(callback){if(!this._config.isVisible){execute(callback);return}this._append();const element=this._getElement();this._config.isAnimated&&reflow(element),element.classList.add(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{execute(callback)})}hide(callback){if(!this._config.isVisible){execute(callback);return}this._getElement().classList.remove(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{this.dispose(),execute(callback)})}dispose(){if(!this._isAppended)return;EventHandler.off(this._element,EVENT_MOUSEDOWN),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const backdrop=document.createElement("div");backdrop.className=this._config.className,this._config.isAnimated&&backdrop.classList.add(CLASS_NAME_FADE$4),this._element=backdrop}return this._element}_configAfterMerge(config){return config.rootElement=getElement(config.rootElement),config}_append(){if(this._isAppended)return;const element=this._getElement();this._config.rootElement.append(element),EventHandler.on(element,EVENT_MOUSEDOWN,()=>{execute(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(callback){executeAfterTransition(callback,this._getElement(),this._config.isAnimated)}}const NAME$8="focustrap",DATA_KEY$5="bs.focustrap",EVENT_KEY$5=`.${DATA_KEY$5}`,EVENT_FOCUSIN$2=`focusin${EVENT_KEY$5}`,EVENT_KEYDOWN_TAB=`keydown.tab${EVENT_KEY$5}`,TAB_KEY="Tab",TAB_NAV_FORWARD="forward",TAB_NAV_BACKWARD="backward",Default$7={autofocus:!0,trapElement:null},DefaultType$7={autofocus:"boolean",trapElement:"element"};class FocusTrap extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Default$7}static get DefaultType(){return DefaultType$7}static get NAME(){return NAME$8}activate(){if(this._isActive)return;this._config.autofocus&&this._config.trapElement.focus(),EventHandler.off(document,EVENT_KEY$5),EventHandler.on(document,EVENT_FOCUSIN$2,event=>this._handleFocusin(event)),EventHandler.on(document,EVENT_KEYDOWN_TAB,event=>this._handleKeydown(event)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,EventHandler.off(document,EVENT_KEY$5)}_handleFocusin(event){const{trapElement}=this._config;if(event.target===document||event.target===trapElement||trapElement.contains(event.target))return;const elements=SelectorEngine.focusableChildren(trapElement);elements.length===0?trapElement.focus():this._lastTabNavDirection===TAB_NAV_BACKWARD?elements[elements.length-1].focus():elements[0].focus()}_handleKeydown(event){if(event.key!==TAB_KEY)return;this._lastTabNavDirection=event.shiftKey?TAB_NAV_BACKWARD:TAB_NAV_FORWARD}}const SELECTOR_FIXED_CONTENT=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",SELECTOR_STICKY_CONTENT=".sticky-top",PROPERTY_PADDING="padding-right",PROPERTY_MARGIN="margin-right";class ScrollBarHelper{constructor(){this._element=document.body}getWidth(){const documentWidth=document.documentElement.clientWidth;return Math.abs(window.innerWidth-documentWidth)}hide(){const width=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN,calculatedValue=>calculatedValue-width)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(selector,styleProperty,callback){const scrollbarWidth=this.getWidth(),manipulationCallBack=element=>{if(element!==this._element&&window.innerWidth>element.clientWidth+scrollbarWidth)return;this._saveInitialAttribute(element,styleProperty);const calculatedValue=window.getComputedStyle(element).getPropertyValue(styleProperty);element.style.setProperty(styleProperty,`${callback(Number.parseFloat(calculatedValue))}px`)};this._applyManipulationCallback(selector,manipulationCallBack)}_saveInitialAttribute(element,styleProperty){const actualValue=element.style.getPropertyValue(styleProperty);actualValue&&Manipulator.setDataAttribute(element,styleProperty,actualValue)}_resetElementAttributes(selector,styleProperty){const manipulationCallBack=element=>{const value=Manipulator.getDataAttribute(element,styleProperty);if(value===null){element.style.removeProperty(styleProperty);return}Manipulator.removeDataAttribute(element,styleProperty),element.style.setProperty(styleProperty,value)};this._applyManipulationCallback(selector,manipulationCallBack)}_applyManipulationCallback(selector,callBack){if(isElement$1(selector)){callBack(selector);return}for(const sel of SelectorEngine.find(selector,this._element))callBack(sel)}}const NAME$7="modal",DATA_KEY$4="bs.modal",EVENT_KEY$4=`.${DATA_KEY$4}`,DATA_API_KEY$2=".data-api",ESCAPE_KEY$1="Escape",EVENT_HIDE$4=`hide${EVENT_KEY$4}`,EVENT_HIDE_PREVENTED$1=`hidePrevented${EVENT_KEY$4}`,EVENT_HIDDEN$4=`hidden${EVENT_KEY$4}`,EVENT_SHOW$4=`show${EVENT_KEY$4}`,EVENT_SHOWN$4=`shown${EVENT_KEY$4}`,EVENT_RESIZE$1=`resize${EVENT_KEY$4}`,EVENT_CLICK_DISMISS=`click.dismiss${EVENT_KEY$4}`,EVENT_MOUSEDOWN_DISMISS=`mousedown.dismiss${EVENT_KEY$4}`,EVENT_KEYDOWN_DISMISS$1=`keydown.dismiss${EVENT_KEY$4}`,EVENT_CLICK_DATA_API$2=`click${EVENT_KEY$4}${DATA_API_KEY$2}`,CLASS_NAME_OPEN="modal-open",CLASS_NAME_FADE$3="fade",CLASS_NAME_SHOW$4="show",CLASS_NAME_STATIC="modal-static",OPEN_SELECTOR$1=".modal.show",SELECTOR_DIALOG=".modal-dialog",SELECTOR_MODAL_BODY=".modal-body",SELECTOR_DATA_TOGGLE$2='[data-bs-toggle="modal"]',Default$6={backdrop:!0,focus:!0,keyboard:!0},DefaultType$6={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Modal extends BaseComponent{constructor(element,config){super(element,config),this._dialog=SelectorEngine.findOne(SELECTOR_DIALOG,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ScrollBarHelper,this._addEventListeners()}static get Default(){return Default$6}static get DefaultType(){return DefaultType$6}static get NAME(){return NAME$7}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown||this._isTransitioning)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$4,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(CLASS_NAME_OPEN),this._adjustDialog(),this._backdrop.show(()=>this._showElement(relatedTarget))}hide(){if(!this._isShown||this._isTransitioning)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$4);if(hideEvent.defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(CLASS_NAME_SHOW$4),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){EventHandler.off(window,EVENT_KEY$4),EventHandler.off(this._dialog,EVENT_KEY$4),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Backdrop({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_showElement(relatedTarget){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const modalBody=SelectorEngine.findOne(SELECTOR_MODAL_BODY,this._dialog);modalBody&&(modalBody.scrollTop=0),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW$4);const transitionComplete=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,EventHandler.trigger(this._element,EVENT_SHOWN$4,{relatedTarget})};this._queueCallback(transitionComplete,this._dialog,this._isAnimated())}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS$1,event=>{if(event.key!==ESCAPE_KEY$1)return;if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}),EventHandler.on(window,EVENT_RESIZE$1,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),EventHandler.on(this._element,EVENT_MOUSEDOWN_DISMISS,event=>{EventHandler.one(this._element,EVENT_CLICK_DISMISS,event2=>{if(this._element!==event.target||this._element!==event2.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(CLASS_NAME_OPEN),this._resetAdjustments(),this._scrollBar.reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$4)})}_isAnimated(){return this._element.classList.contains(CLASS_NAME_FADE$3)}_triggerBackdropTransition(){const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED$1);if(hideEvent.defaultPrevented)return;const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,initialOverflowY=this._element.style.overflowY;if(initialOverflowY==="hidden"||this._element.classList.contains(CLASS_NAME_STATIC))return;isModalOverflowing||(this._element.style.overflowY="hidden"),this._element.classList.add(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.classList.remove(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.style.overflowY=initialOverflowY},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,scrollbarWidth=this._scrollBar.getWidth(),isBodyOverflowing=scrollbarWidth>0;if(isBodyOverflowing&&!isModalOverflowing){const property=isRTL()?"paddingLeft":"paddingRight";this._element.style[property]=`${scrollbarWidth}px`}if(!isBodyOverflowing&&isModalOverflowing){const property=isRTL()?"paddingRight":"paddingLeft";this._element.style[property]=`${scrollbarWidth}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(config,relatedTarget){return this.each(function(){const data=Modal.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config](relatedTarget)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$2,SELECTOR_DATA_TOGGLE$2,function(event){const target=SelectorEngine.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&event.preventDefault(),EventHandler.one(target,EVENT_SHOW$4,showEvent=>{if(showEvent.defaultPrevented)return;EventHandler.one(target,EVENT_HIDDEN$4,()=>{isVisible(this)&&this.focus()})});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR$1);alreadyOpen&&Modal.getInstance(alreadyOpen).hide();const data=Modal.getOrCreateInstance(target);data.toggle(this)}),enableDismissTrigger(Modal),defineJQueryPlugin(Modal);const NAME$6="offcanvas",DATA_KEY$3="bs.offcanvas",EVENT_KEY$3=`.${DATA_KEY$3}`,DATA_API_KEY$1=".data-api",EVENT_LOAD_DATA_API$2=`load${EVENT_KEY$3}${DATA_API_KEY$1}`,ESCAPE_KEY="Escape",CLASS_NAME_SHOW$3="show",CLASS_NAME_SHOWING$1="showing",CLASS_NAME_HIDING="hiding",CLASS_NAME_BACKDROP="offcanvas-backdrop",OPEN_SELECTOR=".offcanvas.show",EVENT_SHOW$3=`show${EVENT_KEY$3}`,EVENT_SHOWN$3=`shown${EVENT_KEY$3}`,EVENT_HIDE$3=`hide${EVENT_KEY$3}`,EVENT_HIDE_PREVENTED=`hidePrevented${EVENT_KEY$3}`,EVENT_HIDDEN$3=`hidden${EVENT_KEY$3}`,EVENT_RESIZE=`resize${EVENT_KEY$3}`,EVENT_CLICK_DATA_API$1=`click${EVENT_KEY$3}${DATA_API_KEY$1}`,EVENT_KEYDOWN_DISMISS=`keydown.dismiss${EVENT_KEY$3}`,SELECTOR_DATA_TOGGLE$1='[data-bs-toggle="offcanvas"]',Default$5={backdrop:!0,keyboard:!0,scroll:!1},DefaultType$5={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Offcanvas extends BaseComponent{constructor(element,config){super(element,config),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Default$5}static get DefaultType(){return DefaultType$5}static get NAME(){return NAME$6}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$3,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||(new ScrollBarHelper).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(CLASS_NAME_SHOWING$1);const completeCallBack=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(CLASS_NAME_SHOW$3),this._element.classList.remove(CLASS_NAME_SHOWING$1),EventHandler.trigger(this._element,EVENT_SHOWN$3,{relatedTarget})};this._queueCallback(completeCallBack,this._element,!0)}hide(){if(!this._isShown)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$3);if(hideEvent.defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(CLASS_NAME_HIDING),this._backdrop.hide();const completeCallback=()=>{this._element.classList.remove(CLASS_NAME_SHOW$3,CLASS_NAME_HIDING),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new ScrollBarHelper).reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$3)};this._queueCallback(completeCallback,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const clickCallback=()=>{if(this._config.backdrop==="static"){EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED);return}this.hide()},isVisible=Boolean(this._config.backdrop);return new Backdrop({className:CLASS_NAME_BACKDROP,isVisible,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:isVisible?clickCallback:null})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS,event=>{if(event.key!==ESCAPE_KEY)return;if(this._config.keyboard){this.hide();return}EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED)})}static jQueryInterface(config){return this.each(function(){const data=Offcanvas.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config](this)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$1,SELECTOR_DATA_TOGGLE$1,function(event){const target=SelectorEngine.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;EventHandler.one(target,EVENT_HIDDEN$3,()=>{isVisible(this)&&this.focus()});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR);alreadyOpen&&alreadyOpen!==target&&Offcanvas.getInstance(alreadyOpen).hide();const data=Offcanvas.getOrCreateInstance(target);data.toggle(this)}),EventHandler.on(window,EVENT_LOAD_DATA_API$2,()=>{for(const selector of SelectorEngine.find(OPEN_SELECTOR))Offcanvas.getOrCreateInstance(selector).show()}),EventHandler.on(window,EVENT_RESIZE,()=>{for(const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(element).position!=="fixed"&&Offcanvas.getOrCreateInstance(element).hide()}),enableDismissTrigger(Offcanvas),defineJQueryPlugin(Offcanvas);const ARIA_ATTRIBUTE_PATTERN=/^aria-[\w-]*$/i,DefaultAllowlist={"*":["class","dir","id","lang","role",ARIA_ATTRIBUTE_PATTERN],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},uriAttributes=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),SAFE_URL_PATTERN=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,allowedAttribute=(attribute,allowedAttributeList)=>{const attributeName=attribute.nodeName.toLowerCase();return allowedAttributeList.includes(attributeName)?!uriAttributes.has(attributeName)||Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)):allowedAttributeList.filter(attributeRegex=>attributeRegex instanceof RegExp).some(regex=>regex.test(attributeName))};function sanitizeHtml(unsafeHtml,allowList,sanitizeFunction){if(!unsafeHtml.length)return unsafeHtml;if(sanitizeFunction&&typeof sanitizeFunction=="function")return sanitizeFunction(unsafeHtml);const domParser=new window.DOMParser,createdDocument=domParser.parseFromString(unsafeHtml,"text/html"),elements=[].concat(...createdDocument.body.querySelectorAll("*"));for(const element of elements){const elementName=element.nodeName.toLowerCase();if(!Object.keys(allowList).includes(elementName)){element.remove();continue}const attributeList=[].concat(...element.attributes),allowedAttributes=[].concat(allowList["*"]||[],allowList[elementName]||[]);for(const attribute of attributeList)allowedAttribute(attribute,allowedAttributes)||element.removeAttribute(attribute.nodeName)}return createdDocument.body.innerHTML}const NAME$5="TemplateFactory",Default$4={allowList:DefaultAllowlist,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},DefaultType$4={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},DefaultContentType={entry:"(string|element|function|null)",selector:"(string|element)"};class TemplateFactory extends Config{constructor(config){super(),this._config=this._getConfig(config)}static get Default(){return Default$4}static get DefaultType(){return DefaultType$4}static get NAME(){return NAME$5}getContent(){return Object.values(this._config.content).map(config=>this._resolvePossibleFunction(config)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(content){return this._checkContent(content),this._config.content={...this._config.content,...content},this}toHtml(){const templateWrapper=document.createElement("div");templateWrapper.innerHTML=this._maybeSanitize(this._config.template);for(const[selector,text]of Object.entries(this._config.content))this._setContent(templateWrapper,text,selector);const template=templateWrapper.children[0],extraClass=this._resolvePossibleFunction(this._config.extraClass);return extraClass&&template.classList.add(...extraClass.split(" ")),template}_typeCheckConfig(config){super._typeCheckConfig(config),this._checkContent(config.content)}_checkContent(arg){for(const[selector,content]of Object.entries(arg))super._typeCheckConfig({selector,entry:content},DefaultContentType)}_setContent(template,content,selector){const templateElement=SelectorEngine.findOne(selector,template);if(!templateElement)return;if(content=this._resolvePossibleFunction(content),!content){templateElement.remove();return}if(isElement$1(content)){this._putElementInTemplate(getElement(content),templateElement);return}if(this._config.html){templateElement.innerHTML=this._maybeSanitize(content);return}templateElement.textContent=content}_maybeSanitize(arg){return this._config.sanitize?sanitizeHtml(arg,this._config.allowList,this._config.sanitizeFn):arg}_resolvePossibleFunction(arg){return execute(arg,[this])}_putElementInTemplate(element,templateElement){if(this._config.html){templateElement.innerHTML="",templateElement.append(element);return}templateElement.textContent=element.textContent}}const NAME$4="tooltip",DISALLOWED_ATTRIBUTES=new Set(["sanitize","allowList","sanitizeFn"]),CLASS_NAME_FADE$2="fade",CLASS_NAME_MODAL="modal",CLASS_NAME_SHOW$2="show",SELECTOR_TOOLTIP_INNER=".tooltip-inner",SELECTOR_MODAL=`.${CLASS_NAME_MODAL}`,EVENT_MODAL_HIDE="hide.bs.modal",TRIGGER_HOVER="hover",TRIGGER_FOCUS="focus",TRIGGER_CLICK="click",TRIGGER_MANUAL="manual",EVENT_HIDE$2="hide",EVENT_HIDDEN$2="hidden",EVENT_SHOW$2="show",EVENT_SHOWN$2="shown",EVENT_INSERTED="inserted",EVENT_CLICK$1="click",EVENT_FOCUSIN$1="focusin",EVENT_FOCUSOUT$1="focusout",EVENT_MOUSEENTER="mouseenter",EVENT_MOUSELEAVE="mouseleave",AttachmentMap={AUTO:"auto",TOP:"top",RIGHT:isRTL()?"left":"right",BOTTOM:"bottom",LEFT:isRTL()?"right":"left"},Default$3={allowList:DefaultAllowlist,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},DefaultType$3={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Tooltip extends BaseComponent{constructor(element,config){if(typeof Popper=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(element,config),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Default$3}static get DefaultType(){return DefaultType$3}static get NAME(){return NAME$4}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){clearTimeout(this._timeout),EventHandler.off(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const showEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOW$2)),shadowRoot=findShadowRoot(this._element),isInTheDom=(shadowRoot||this._element.ownerDocument.documentElement).contains(this._element);if(showEvent.defaultPrevented||!isInTheDom)return;this._disposePopper();const tip=this._getTipElement();this._element.setAttribute("aria-describedby",tip.getAttribute("id"));const{container}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(container.append(tip),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_INSERTED))),this._popper=this._createPopper(tip),tip.classList.add(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.on(element,"mouseover",noop);const complete=()=>{EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOWN$2)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(complete,this.tip,this._isAnimated())}hide(){if(!this._isShown())return;const hideEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDE$2));if(hideEvent.defaultPrevented)return;const tip=this._getTipElement();if(tip.classList.remove(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.off(element,"mouseover",noop);this._activeTrigger[TRIGGER_CLICK]=!1,this._activeTrigger[TRIGGER_FOCUS]=!1,this._activeTrigger[TRIGGER_HOVER]=!1,this._isHovered=null;const complete=()=>{if(this._isWithActiveTrigger())return;this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDDEN$2))};this._queueCallback(complete,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(content){const tip=this._getTemplateFactory(content).toHtml();if(!tip)return null;tip.classList.remove(CLASS_NAME_FADE$2,CLASS_NAME_SHOW$2),tip.classList.add(`bs-${this.constructor.NAME}-auto`);const tipId=getUID(this.constructor.NAME).toString();return tip.setAttribute("id",tipId),this._isAnimated()&&tip.classList.add(CLASS_NAME_FADE$2),tip}setContent(content){this._newContent=content,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(content){return this._templateFactory?this._templateFactory.changeContent(content):this._templateFactory=new TemplateFactory({...this._config,content,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[SELECTOR_TOOLTIP_INNER]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(event){return this.constructor.getOrCreateInstance(event.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(CLASS_NAME_FADE$2)}_isShown(){return this.tip&&this.tip.classList.contains(CLASS_NAME_SHOW$2)}_createPopper(tip){const placement=execute(this._config.placement,[this,tip,this._element]),attachment=AttachmentMap[placement.toUpperCase()];return createPopper(this._element,tip,this._getPopperConfig(attachment))}_getOffset(){const{offset}=this._config;return typeof offset=="string"?offset.split(",").map(value=>Number.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_resolvePossibleFunction(arg){return execute(arg,[this._element])}_getPopperConfig(attachment){const defaultBsPopperConfig={placement:attachment,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:data=>{this._getTipElement().setAttribute("data-popper-placement",data.state.placement)}}]};return{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_setListeners(){const triggers=this._config.trigger.split(" ");for(const trigger of triggers)if(trigger==="click")EventHandler.on(this._element,this.constructor.eventName(EVENT_CLICK$1),this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context.toggle()});else if(trigger!==TRIGGER_MANUAL){const eventIn=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSEENTER):this.constructor.eventName(EVENT_FOCUSIN$1),eventOut=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSELEAVE):this.constructor.eventName(EVENT_FOCUSOUT$1);EventHandler.on(this._element,eventIn,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusin"?TRIGGER_FOCUS:TRIGGER_HOVER]=!0,context._enter()}),EventHandler.on(this._element,eventOut,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusout"?TRIGGER_FOCUS:TRIGGER_HOVER]=context._element.contains(event.relatedTarget),context._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},EventHandler.on(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler)}_fixTitle(){const title=this._element.getAttribute("title");if(!title)return;!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",title),this._element.setAttribute("data-bs-original-title",title),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide)}_setTimeout(handler,timeout){clearTimeout(this._timeout),this._timeout=setTimeout(handler,timeout)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(config){const dataAttributes=Manipulator.getDataAttributes(this._element);for(const dataAttribute of Object.keys(dataAttributes))DISALLOWED_ATTRIBUTES.has(dataAttribute)&&delete dataAttributes[dataAttribute];return config={...dataAttributes,...typeof config=="object"&&config?config:{}},config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config.container=config.container===!1?document.body:getElement(config.container),typeof config.delay=="number"&&(config.delay={show:config.delay,hide:config.delay}),typeof config.title=="number"&&(config.title=config.title.toString()),typeof config.content=="number"&&(config.content=config.content.toString()),config}_getDelegateConfig(){const config={};for(const[key,value]of Object.entries(this._config))this.constructor.Default[key]!==value&&(config[key]=value);return config.selector=!1,config.trigger="manual",config}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(config){return this.each(function(){const data=Tooltip.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Tooltip);const NAME$3="popover",SELECTOR_TITLE=".popover-header",SELECTOR_CONTENT=".popover-body",Default$2={...Tooltip.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},DefaultType$2={...Tooltip.DefaultType,content:"(null|string|element|function)"};class Popover extends Tooltip{static get Default(){return Default$2}static get DefaultType(){return DefaultType$2}static get NAME(){return NAME$3}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[SELECTOR_TITLE]:this._getTitle(),[SELECTOR_CONTENT]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(config){return this.each(function(){const data=Popover.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Popover);const NAME$2="scrollspy",DATA_KEY$2="bs.scrollspy",EVENT_KEY$2=`.${DATA_KEY$2}`,DATA_API_KEY=".data-api",EVENT_ACTIVATE=`activate${EVENT_KEY$2}`,EVENT_CLICK=`click${EVENT_KEY$2}`,EVENT_LOAD_DATA_API$1=`load${EVENT_KEY$2}${DATA_API_KEY}`,CLASS_NAME_DROPDOWN_ITEM="dropdown-item",CLASS_NAME_ACTIVE$1="active",SELECTOR_DATA_SPY='[data-bs-spy="scroll"]',SELECTOR_TARGET_LINKS="[href]",SELECTOR_NAV_LIST_GROUP=".nav, .list-group",SELECTOR_NAV_LINKS=".nav-link",SELECTOR_NAV_ITEMS=".nav-item",SELECTOR_LIST_ITEMS=".list-group-item",SELECTOR_LINK_ITEMS=`${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`,SELECTOR_DROPDOWN=".dropdown",SELECTOR_DROPDOWN_TOGGLE$1=".dropdown-toggle",Default$1={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},DefaultType$1={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ScrollSpy extends BaseComponent{constructor(element,config){super(element,config),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Default$1}static get DefaultType(){return DefaultType$1}static get NAME(){return NAME$2}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const section of this._observableSections.values())this._observer.observe(section)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(config){return config.target=getElement(config.target)||document.body,config.rootMargin=config.offset?`${config.offset}px 0px -30%`:config.rootMargin,typeof config.threshold=="string"&&(config.threshold=config.threshold.split(",").map(value=>Number.parseFloat(value))),config}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;EventHandler.off(this._config.target,EVENT_CLICK),EventHandler.on(this._config.target,EVENT_CLICK,SELECTOR_TARGET_LINKS,event=>{const observableSection=this._observableSections.get(event.target.hash);if(observableSection){event.preventDefault();const root=this._rootElement||window,height=observableSection.offsetTop-this._element.offsetTop;if(root.scrollTo){root.scrollTo({top:height,behavior:"smooth"});return}root.scrollTop=height}})}_getNewObserver(){const options={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(entries=>this._observerCallback(entries),options)}_observerCallback(entries){const targetElement=entry=>this._targetLinks.get(`#${entry.target.id}`),activate=entry=>{this._previousScrollData.visibleEntryTop=entry.target.offsetTop,this._process(targetElement(entry))},parentScrollTop=(this._rootElement||document.documentElement).scrollTop,userScrollsDown=parentScrollTop>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=parentScrollTop;for(const entry of entries){if(!entry.isIntersecting){this._activeTarget=null,this._clearActiveClass(targetElement(entry));continue}const entryIsLowerThanPrevious=entry.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(userScrollsDown&&entryIsLowerThanPrevious){if(activate(entry),!parentScrollTop)return;continue}!userScrollsDown&&!entryIsLowerThanPrevious&&activate(entry)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const targetLinks=SelectorEngine.find(SELECTOR_TARGET_LINKS,this._config.target);for(const anchor of targetLinks){if(!anchor.hash||isDisabled(anchor))continue;const observableSection=SelectorEngine.findOne(decodeURI(anchor.hash),this._element);isVisible(observableSection)&&(this._targetLinks.set(decodeURI(anchor.hash),anchor),this._observableSections.set(anchor.hash,observableSection))}}_process(target){if(this._activeTarget===target)return;this._clearActiveClass(this._config.target),this._activeTarget=target,target.classList.add(CLASS_NAME_ACTIVE$1),this._activateParents(target),EventHandler.trigger(this._element,EVENT_ACTIVATE,{relatedTarget:target})}_activateParents(target){if(target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)){SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1,target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);return}for(const listGroup of SelectorEngine.parents(target,SELECTOR_NAV_LIST_GROUP))for(const item of SelectorEngine.prev(listGroup,SELECTOR_LINK_ITEMS))item.classList.add(CLASS_NAME_ACTIVE$1)}_clearActiveClass(parent){parent.classList.remove(CLASS_NAME_ACTIVE$1);const activeNodes=SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`,parent);for(const node of activeNodes)node.classList.remove(CLASS_NAME_ACTIVE$1)}static jQueryInterface(config){return this.each(function(){const data=ScrollSpy.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()})}}EventHandler.on(window,EVENT_LOAD_DATA_API$1,()=>{for(const spy of SelectorEngine.find(SELECTOR_DATA_SPY))ScrollSpy.getOrCreateInstance(spy)}),defineJQueryPlugin(ScrollSpy);const NAME$1="tab",DATA_KEY$1="bs.tab",EVENT_KEY$1=`.${DATA_KEY$1}`,EVENT_HIDE$1=`hide${EVENT_KEY$1}`,EVENT_HIDDEN$1=`hidden${EVENT_KEY$1}`,EVENT_SHOW$1=`show${EVENT_KEY$1}`,EVENT_SHOWN$1=`shown${EVENT_KEY$1}`,EVENT_CLICK_DATA_API=`click${EVENT_KEY$1}`,EVENT_KEYDOWN=`keydown${EVENT_KEY$1}`,EVENT_LOAD_DATA_API=`load${EVENT_KEY$1}`,ARROW_LEFT_KEY="ArrowLeft",ARROW_RIGHT_KEY="ArrowRight",ARROW_UP_KEY="ArrowUp",ARROW_DOWN_KEY="ArrowDown",HOME_KEY="Home",END_KEY="End",CLASS_NAME_ACTIVE="active",CLASS_NAME_FADE$1="fade",CLASS_NAME_SHOW$1="show",CLASS_DROPDOWN="dropdown",SELECTOR_DROPDOWN_TOGGLE=".dropdown-toggle",SELECTOR_DROPDOWN_MENU=".dropdown-menu",NOT_SELECTOR_DROPDOWN_TOGGLE=`:not(${SELECTOR_DROPDOWN_TOGGLE})`,SELECTOR_TAB_PANEL='.list-group, .nav, [role="tablist"]',SELECTOR_OUTER=".nav-item, .list-group-item",SELECTOR_INNER=`.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`,SELECTOR_DATA_TOGGLE='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',SELECTOR_INNER_ELEM=`${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`,SELECTOR_DATA_TOGGLE_ACTIVE=`.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;class Tab extends BaseComponent{constructor(element){if(super(element),this._parent=this._element.closest(SELECTOR_TAB_PANEL),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),EventHandler.on(this._element,EVENT_KEYDOWN,event=>this._keydown(event))}static get NAME(){return NAME$1}show(){const innerElem=this._element;if(this._elemIsActive(innerElem))return;const active=this._getActiveElem(),hideEvent=active?EventHandler.trigger(active,EVENT_HIDE$1,{relatedTarget:innerElem}):null,showEvent=EventHandler.trigger(innerElem,EVENT_SHOW$1,{relatedTarget:active});if(showEvent.defaultPrevented||hideEvent&&hideEvent.defaultPrevented)return;this._deactivate(active,innerElem),this._activate(innerElem,active)}_activate(element,relatedElem){if(!element)return;element.classList.add(CLASS_NAME_ACTIVE),this._activate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.add(CLASS_NAME_SHOW$1);return}element.removeAttribute("tabindex"),element.setAttribute("aria-selected",!0),this._toggleDropDown(element,!0),EventHandler.trigger(element,EVENT_SHOWN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_deactivate(element,relatedElem){if(!element)return;element.classList.remove(CLASS_NAME_ACTIVE),element.blur(),this._deactivate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.remove(CLASS_NAME_SHOW$1);return}element.setAttribute("aria-selected",!1),element.setAttribute("tabindex","-1"),this._toggleDropDown(element,!1),EventHandler.trigger(element,EVENT_HIDDEN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_keydown(event){if(![ARROW_LEFT_KEY,ARROW_RIGHT_KEY,ARROW_UP_KEY,ARROW_DOWN_KEY,HOME_KEY,END_KEY].includes(event.key))return;event.stopPropagation(),event.preventDefault();const children=this._getChildren().filter(element=>!isDisabled(element));let nextActiveElement;if([HOME_KEY,END_KEY].includes(event.key))nextActiveElement=children[event.key===HOME_KEY?0:children.length-1];else{const isNext=[ARROW_RIGHT_KEY,ARROW_DOWN_KEY].includes(event.key);nextActiveElement=getNextActiveElement(children,event.target,isNext,!0)}nextActiveElement&&(nextActiveElement.focus({preventScroll:!0}),Tab.getOrCreateInstance(nextActiveElement).show())}_getChildren(){return SelectorEngine.find(SELECTOR_INNER_ELEM,this._parent)}_getActiveElem(){return this._getChildren().find(child=>this._elemIsActive(child))||null}_setInitialAttributes(parent,children){this._setAttributeIfNotExists(parent,"role","tablist");for(const child of children)this._setInitialAttributesOnChild(child)}_setInitialAttributesOnChild(child){child=this._getInnerElement(child);const isActive=this._elemIsActive(child),outerElem=this._getOuterElement(child);child.setAttribute("aria-selected",isActive),outerElem!==child&&this._setAttributeIfNotExists(outerElem,"role","presentation"),isActive||child.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(child,"role","tab"),this._setInitialAttributesOnTargetPanel(child)}_setInitialAttributesOnTargetPanel(child){const target=SelectorEngine.getElementFromSelector(child);if(!target)return;this._setAttributeIfNotExists(target,"role","tabpanel"),child.id&&this._setAttributeIfNotExists(target,"aria-labelledby",`${child.id}`)}_toggleDropDown(element,open){const outerElem=this._getOuterElement(element);if(!outerElem.classList.contains(CLASS_DROPDOWN))return;const toggle=(selector,className)=>{const element=SelectorEngine.findOne(selector,outerElem);element&&element.classList.toggle(className,open)};toggle(SELECTOR_DROPDOWN_TOGGLE,CLASS_NAME_ACTIVE),toggle(SELECTOR_DROPDOWN_MENU,CLASS_NAME_SHOW$1),outerElem.setAttribute("aria-expanded",open)}_setAttributeIfNotExists(element,attribute,value){element.hasAttribute(attribute)||element.setAttribute(attribute,value)}_elemIsActive(elem){return elem.classList.contains(CLASS_NAME_ACTIVE)}_getInnerElement(elem){return elem.matches(SELECTOR_INNER_ELEM)?elem:SelectorEngine.findOne(SELECTOR_INNER_ELEM,elem)}_getOuterElement(elem){return elem.closest(SELECTOR_OUTER)||elem}static jQueryInterface(config){return this.each(function(){const data=Tab.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API,SELECTOR_DATA_TOGGLE,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;Tab.getOrCreateInstance(this).show()}),EventHandler.on(window,EVENT_LOAD_DATA_API,()=>{for(const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE))Tab.getOrCreateInstance(element)}),defineJQueryPlugin(Tab);const NAME="toast",DATA_KEY="bs.toast",EVENT_KEY=`.${DATA_KEY}`,EVENT_MOUSEOVER=`mouseover${EVENT_KEY}`,EVENT_MOUSEOUT=`mouseout${EVENT_KEY}`,EVENT_FOCUSIN=`focusin${EVENT_KEY}`,EVENT_FOCUSOUT=`focusout${EVENT_KEY}`,EVENT_HIDE=`hide${EVENT_KEY}`,EVENT_HIDDEN=`hidden${EVENT_KEY}`,EVENT_SHOW=`show${EVENT_KEY}`,EVENT_SHOWN=`shown${EVENT_KEY}`,CLASS_NAME_FADE="fade",CLASS_NAME_HIDE="hide",CLASS_NAME_SHOW="show",CLASS_NAME_SHOWING="showing",DefaultType={animation:"boolean",autohide:"boolean",delay:"number"},Default={animation:!0,autohide:!0,delay:5e3};class Toast extends BaseComponent{constructor(element,config){super(element,config),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Default}static get DefaultType(){return DefaultType}static get NAME(){return NAME}show(){const showEvent=EventHandler.trigger(this._element,EVENT_SHOW);if(showEvent.defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(CLASS_NAME_FADE);const complete=()=>{this._element.classList.remove(CLASS_NAME_SHOWING),EventHandler.trigger(this._element,EVENT_SHOWN),this._maybeScheduleHide()};this._element.classList.remove(CLASS_NAME_HIDE),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW,CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}hide(){if(!this.isShown())return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE);if(hideEvent.defaultPrevented)return;const complete=()=>{this._element.classList.add(CLASS_NAME_HIDE),this._element.classList.remove(CLASS_NAME_SHOWING,CLASS_NAME_SHOW),EventHandler.trigger(this._element,EVENT_HIDDEN)};this._element.classList.add(CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(CLASS_NAME_SHOW),super.dispose()}isShown(){return this._element.classList.contains(CLASS_NAME_SHOW)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(event,isInteracting){switch(event.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=isInteracting;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=isInteracting;break}}if(isInteracting){this._clearTimeout();return}const nextElement=event.relatedTarget;if(this._element===nextElement||this._element.contains(nextElement))return;this._maybeScheduleHide()}_setListeners(){EventHandler.on(this._element,EVENT_MOUSEOVER,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_MOUSEOUT,event=>this._onInteraction(event,!1)),EventHandler.on(this._element,EVENT_FOCUSIN,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_FOCUSOUT,event=>this._onInteraction(event,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(config){return this.each(function(){const data=Toast.getOrCreateInstance(this,config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config](this)}})}}enableDismissTrigger(Toast),defineJQueryPlugin(Toast);const index_umd={Alert,Button,Carousel,Collapse,Dropdown,Modal,Offcanvas,Popover,ScrollSpy,Tab,Toast,Tooltip};return index_umd}),function _f(self){"use strict";typeof module!="undefined"?self=module:typeof process!="undefined"&&(self=process),self._factory=_f;function z(a,b,c){const e=typeof c,d=typeof a;if("undefined"!==e){if("undefined"!==d){if(c){if("function"===d&&e===d)return function(h){return a(c(h))};if(b=a.constructor,b===c.constructor){if(b===Array)return c.concat(a);if(b===Map){var g,f=new Map(c);for(g of a)f.set(g[0],g[1]);return f}if(b===Set){g=new Set(c);for(f of a.values())g.add(f);return g}}}return a}return c}return"undefined"===d?b:a}function B(){return Object.create(null)}function F(a){return"string"==typeof a}function H(a){return"object"==typeof a}function aa(a){const b=[];for(const c of a.keys())b.push(c);return b}function I(a,b){if(F(b))a=a[b];else for(let c=0;a&&c"a1a".split(c).length;this.numeric=z(a.numeric,e)}else{try{this.split=z(this.split,ca)}catch{this.split=/\s+/}this.numeric=z(a.numeric,z(this.numeric,!0))}if(this.prepare=z(a.prepare,null,this.prepare),this.finalize=z(a.finalize,null,this.finalize),c=a.filter,this.filter="function"==typeof c?c:z(c&&new Set(c),null,this.filter),this.dedupe=z(a.dedupe,!1,this.dedupe),this.matcher=z((c=a.matcher)&&new Map(c),null,this.matcher),this.mapper=z((c=a.mapper)&&new Map(c),null,this.mapper),this.stemmer=z((c=a.stemmer)&&new Map(c),null,this.stemmer),this.replacer=z(a.replacer,null,this.replacer),this.minlength=z(a.minlength,1,this.minlength),this.maxlength=z(a.maxlength,0,this.maxlength),this.rtl=z(a.rtl,!1,this.rtl),(this.cache=c=z(a.cache,!0,this.cache))&&(this.H=null,this.S="number"==typeof c?c:2e5,this.B=new Map,this.G=new Map,this.L=this.K=128),this.h="",this.M=null,this.A="",this.N=null,this.matcher)for(const d of this.matcher.keys())this.h+=(this.h?"|":"")+d;if(this.stemmer)for(const d of this.stemmer.keys())this.A+=(this.A?"|":"")+d;return this},u.addStemmer=function(a,b){return this.stemmer||(this.stemmer=new Map),this.stemmer.set(a,b),this.A+=(this.A?"|":"")+a,this.N=null,this.cache&&J(this),this},u.addFilter=function(a){return"function"==typeof a?this.filter=a:(this.filter||(this.filter=new Set),this.filter.add(a)),this.cache&&J(this),this},u.addMapper=function(a,b){return"object"==typeof a?this.addReplacer(a,b):1a.length&&(this.dedupe||this.mapper)?this.addMapper(a,b):(this.matcher||(this.matcher=new Map),this.matcher.set(a,b),this.h+=(this.h?"|":"")+a,this.M=null,this.cache&&J(this),this)},u.addReplacer=function(a,b){return"string"==typeof a?this.addMatcher(a,b):(this.replacer||(this.replacer=[]),this.replacer.push(a,b),this.cache&&J(this),this)},u.encode=function(a){if(this.cache&&a.length<=this.K)if(this.H){if(this.B.has(a))return this.B.get(a)}else this.H=setTimeout(J,50,this);this.normalize&&("function"==typeof this.normalize?a=this.normalize(a):a=ha?a.normalize("NFKD").replace(ha,"").toLowerCase():a.toLowerCase()),this.prepare&&(a=this.prepare(a)),this.numeric&&3this.stemmer.get(k)),d!==g&&this.filter&&g.length>=this.minlength&&("function"==typeof this.filter?!this.filter(g):this.filter.has(g))&&(g="")),g&&(this.mapper||this.dedupe&&1this.matcher.get(k))),g&&this.replacer)for(d=0;g&&dthis.S&&(this.G.clear(),this.L=this.L/1.1|0)),g&&c.push(g)}return this.finalize&&(c=this.finalize(c)||c),this.cache&&a.length<=this.K&&(this.B.set(a,c),this.B.size>this.S&&(this.B.clear(),this.K=this.K/1.1|0)),c};function J(a){a.H=null,a.B.clear(),a.G.clear()}let L,ja;async function ka(a){a=a.data;var b=a.task;const c=a.id;let e=a.args;switch(b){case"init":ja=a.options||{},(b=a.factory)?(Function("return "+b)()(self),L=new self.FlexSearch.Index(ja),delete self.FlexSearch):L=new M(ja),postMessage({id:c});break;default:let d;"export"===b&&(e[1]?(e[0]=ja.export,e[2]=0,e[3]=1):e=null),"import"===b?e[0]&&(a=await ja.import.call(L,e[0]),L.import(e[0],a)):(d=e&&L[b].apply(L,e))&&d.then&&(d=await d),postMessage("search"===b?{id:c,msg:d}:{id:c})}}function la(a){ma.call(a,"add"),ma.call(a,"append"),ma.call(a,"search"),ma.call(a,"update"),ma.call(a,"remove")}let na,oa,pa;function qa(){na=pa=0}function ma(a){this[a+"Async"]=function(){const b=arguments;var c=b[b.length-1];let e;if("function"==typeof c&&(e=c,delete b[b.length-1]),na?pa||(pa=Date.now()-oa>=this.priority*this.priority*3):(na=setTimeout(qa,0),oa=Date.now()),pa){const f=this;return new Promise(g=>{setTimeout(function(){g(f[a+"Async"].apply(f,b))},0)})}const d=this[a].apply(this,b);return c=d.then?d:new Promise(f=>f(d)),e&&c.then(e),c}}let N=0;function P(a={}){function b(g){function h(k){k=k.data||k;const l=k.id,n=l&&d.h[l];n&&(n(k.msg),delete d.h[l])}if(this.worker=g,this.h=B(),this.worker)return e?this.worker.on("message",h):this.worker.onmessage=h,a.config?new Promise(function(k){d.h[++N]=function(){k(d),1e9=g.length)b-=g.length;else{b=g[e?"splice":"slice"](b,c);const h=b.length;if(h&&(d=d.length?d.concat(b):b,c-=h,e&&(a.length-=h),!c))break;b=0}return d}function R(a){if(!this||this.constructor!==R)return new R(a);this.index=a?[a]:[],this.length=a?a.length:0;const b=this;return new Proxy([],{get(c,e){if("length"===e)return b.length;if("push"===e)return function(d){b.index[b.index.length-1].push(d),b.length++};if("pop"===e)return function(){if(b.length)return b.length--,b.index[b.index.length-1].pop()};if("indexOf"===e)return function(d){let f=0;for(let g=0,h,k;gc||e?k.slice(e,c+e):k;else{if(ac||e)&&(k=k.slice(e,c+e));else{d=[];for(let m=0,q;me)e-=q.length;else if((q.length>c||e)&&(q=q.slice(e,c+e),c-=q.length,e&&(e-=q.length)),d.push(q),!c)break;k=1b?b?a.slice(c,c+b):a.slice(c):a,e?V.call(this,a):a;let d=[];for(let f=0,g,h;f=h){c-=h;continue}cb&&(g=g.slice(0,b),h=b),!d.length&&h>=b)return e?V.call(this,g):g;if(d.push(g),b-=h,!b)break}return d=1a.length?this.result=a[0]:(this.result=Ga(a,c,e,!1,this.h),e=0)),f?this.resolve(c,e,d):this}W.prototype.and=function(){let a=this.result.length,b,c,e,d;if(!a){const f=arguments[0];f&&(a=!!f.suggest,d=f.resolve,b=f.limit,c=f.offset,e=f.enrich&&d)}if(a){const{O:f,P:g,limit:h,offset:k,enrich:l,resolve:n,suggest:m}=Ja(this,"and",arguments);return La.call(this,f,g,h,k,l,n,m)}return d?this.resolve(b,c,e):this};function La(a,b,c,e,d,f,g){if(b.length){const h=this;return Promise.all(b).then(function(k){a=[];for(let l=0,n;la.length)this.result=a[0];else{if(b=ba(a))return this.result=Fa(a,b,c,e,g,this.h,f),f?d?V.call(this.index,this.result):this.result:this;this.result=[]}else g||(this.result=a);return f?this.resolve(c,e,d):this}W.prototype.xor=function(){const{O:a,P:b,limit:c,offset:e,enrich:d,resolve:f,suggest:g}=Ja(this,"xor",arguments);return Ma.call(this,a,b,c,e,d,f,g)};function Ma(a,b,c,e,d,f,g){if(b.length){const h=this;return Promise.all(b).then(function(k){a=[];for(let l=0,n;la.length)this.result=a[0];else return this.result=Na.call(this,a,c,e,f,this.h),f?d?V.call(this.index,this.result):this.result:this;else g||(this.result=a);return f?this.resolve(c,e,d):this}function Na(a,b,c,e,d){const f=[],g=B();let h=0;for(let k=0,l;kc||e)&&(a=a.slice(e,e+c)),d&&(a=V.call(this,a)),a}function V(a){if(!this||!this.store)return a;const b=Array(a.length);for(let c=0,e;cthis.limit&&this.cache.delete(this.cache.keys().next().value)},X.prototype.get=function(a){const b=this.cache.get(a);return b&&this.h!==a&&(this.cache.delete(a),this.cache.set(this.h=a,b)),b},X.prototype.remove=function(a){for(const b of this.cache){const c=b[0];b[1].includes(a)&&this.cache.delete(c)}},X.prototype.clear=function(){this.cache.clear(),this.h=""};const Wa={normalize:!1,numeric:!1},Xa={},Ya=new Map([["b","p"],["v","f"],["w","f"],["z","s"],["x","s"],["d","t"],["n","m"],["c","k"],["g","k"],["j","k"],["q","k"],["i","e"],["y","e"],["u","o"]]),Za=new Map([["ae","a"],["oe","o"],["sh","s"],["kh","k"],["th","t"],["ph","f"],["pf","f"]]),$a=[/([^aeo])h(.)/g,"$1$2",/([aeo])h([^aeo]|$)/g,"$1$2",/(.)\1+/g,"$1"],ab={a:"",e:"",i:"",o:"",u:"",y:"",b:1,f:1,p:1,v:1,c:2,g:2,j:2,k:2,q:2,s:2,x:2,z:2,"ß":2,d:3,t:3,l:4,m:5,n:5,r:6};var u,bb={X:Wa,W:Xa,Y:Xa,LatinBalance:{dedupe:!0,mapper:Ya},LatinAdvanced:{dedupe:!0,mapper:Ya,matcher:Za,replacer:$a},LatinExtra:{dedupe:!0,mapper:Ya,replacer:$a.concat([/(?!^)[aeo]/g,""]),matcher:Za},LatinSoundex:{dedupe:!1,include:{letter:!0},finalize:function(a){for(let c=0;cd.length)d.pop();else{const f=d.indexOf(a);f===c.length-1?d.pop():d.splice(f,1)}}else cb(this.map,a),this.depth&&cb(this.ctx,a);b||this.reg.delete(a)}return this.db&&(this.commit_task.push({del:a}),this.T&&db(this)),this.cache&&this.cache.remove(a),this};function cb(a,b){let c=0;var e="undefined"==typeof b;if(a.constructor===Array){for(let d=0,f,g;dt;f--)g=r.substring(t,f),v=this.rtl?d-1-t:t,h=this.score?this.score(b,r,p,g,v):fb(q,e,p,d,v),gb(this,n,g,h,a,c);break}case"bidirectional":case"reverse":if(1g?0:1),e,p,h-1,k-1),v=this.bidirectional&&r>f;gb(this,l,v?f:r,t,a,c,v?r:f)}}}}this.fastupdate||this.reg.add(a)}else b=""}return this.db&&(b||this.commit_task.push({del:a}),this.T&&db(this)),this};function gb(a,b,c,e,d,f,g){let h=g?a.ctx:a.map,k;if((!b[c]||g&&!(k=b[c])[g])&&(g?(b=k||(b[c]=B()),b[g]=1,(k=h.get(g))?h=k:h.set(g,h=new Map)):b[c]=1,(k=h.get(c))?h=k:h.set(c,h=k=[]),h=h[e]||(h[e]=[]),!f||!h.includes(d))){if(h.length===2**31-1){if(b=new R(h),a.fastupdate)for(let l of a.reg.values())l.includes(h)&&(l[l.indexOf(h)]=b);k[e]=h=b}h.push(d),a.fastupdate&&((e=a.reg.get(d))?e.push(h):a.reg.set(d,[h]))}}function fb(a,b,c,e,d){return c&&1c)&&(k=c,c=b,b=k),a.db?a.db.get(b,c,e,d,f,g,h):(a=c?(a=a.ctx.get(c))&&a.get(b):a.map.get(b),a)}function M(a,b){if(!this||this.constructor!==M)return new M(a);if(a){var c=F(a)?a:a.preset;c&&(a=Object.assign({},eb[c],a))}else a={};c=a.context;const e=!0===c?{depth:1}:c||{},d=F(a.encoder)?bb[a.encoder]:a.encode||a.encoder||{};this.encoder=d.encode?d:"object"==typeof d?new ia(d):{encode:d},this.resolution=a.resolution||9,this.tokenize=c=(c=a.tokenize)&&"default"!==c&&"exact"!==c&&c||"strict",this.depth="strict"===c&&e.depth||0,this.bidirectional=!1!==e.bidirectional,this.fastupdate=!!a.fastupdate,this.score=a.score||null,(c=a.keystore||0)&&(this.keystore=c),this.map=c?new S(c):new Map,this.ctx=c?new S(c):new Map,this.reg=b||(this.fastupdate?c?new S(c):new Map:c?new T(c):new Set),this.U=e.resolution||3,this.rtl=d.rtl||a.rtl||!1,this.cache=(c=a.cache||null)&&new X(c),this.resolve=!1!==a.resolve,(c=a.db)&&(this.db=this.mount(c)),this.T=!1!==a.commit,this.commit_task=[],this.commit_timer=null,this.priority=a.priority||4}u=M.prototype,u.mount=function(a){return this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null),a.mount(this)},u.commit=function(a,b){return this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null),this.db.commit(this,a,b)},u.destroy=function(){return this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null),this.db.destroy()};function db(a){a.commit_timer||(a.commit_timer=setTimeout(function(){a.commit_timer=null,a.db.commit(a,void 0,void 0)},1))}u.clear=function(){return this.map.clear(),this.ctx.clear(),this.reg.clear(),this.cache&&this.cache.clear(),this.db&&(this.commit_timer&&clearTimeout(this.commit_timer),this.commit_timer=null,this.commit_task=[{clear:!0}]),this},u.append=function(a,b){return this.add(a,b,!0)},u.contain=function(a){return this.db?this.db.has(a):this.reg.has(a)},u.update=function(a,b){const c=this,e=this.remove(a);return e&&e.then?e.then(()=>c.add(a,b)):this.add(a,b)},u.cleanup=function(){return this.fastupdate?(cb(this.map),this.depth&&cb(this.ctx),this):this},u.searchCache=Va,u.export=function(a,b,c=0,e=0){let d,f;switch(e){case 0:d="reg",f=wa(this.reg);break;case 1:d="cfg",f=null;break;case 2:d="map",f=sa(this.map,this.reg.size);break;case 3:d="ctx",f=ua(this.ctx,this.reg.size);break;default:return}return ya.call(this,a,b,d,f,c,e)},u.import=function(a,b){if(b)switch("string"==typeof b&&(b=JSON.parse(b)),a=a.split("."),"json"===a[a.length-1]&&a.pop(),3===a.length&&a.shift(),a=1=n.length){e-=n.length;continue}const m=c?e+Math.min(n.length-e,c):n.length;for(let q=e;q=f.length?[]:!b&&!c?f:(f=f.slice(c,c+b),e?d.enrich(f):f)})},u.enrich=function(a){"object"!=typeof a&&(a=[a]);const b=this.db.transaction("reg","readonly").objectStore("reg"),c=[];for(let e=0;e{a.onsuccess=a.oncomplete=function(){b&&b(this.result),b=null,c(this.result)},a.onerror=a.onblocked=e,a=null})}const pb={Index:M,Charset:bb,Encoder:ia,Document:U,Worker:P,Resolver:W,IndexedDB:nb,Language:{}},rb="undefined"!=typeof self?self:"undefined"!=typeof global?global:self;let sb;(sb=rb.define)&&sb.amd?sb([],function(){return pb}):"object"==typeof rb.exports?rb.exports=pb:rb.FlexSearch=pb}(this||self);const search=document.querySelector(".search-input"),suggestions=document.querySelector(".search-suggestions"),background=document.querySelector(".search-background"),encoder=new FlexSearch.Encoder(FlexSearch.Charset.LatinSimple);encoder.assign({minlength:3});var index=new FlexSearch.Document({tokenize:"forward",cache:100,document:{id:"id",store:["href","title","description"],index:[{field:"title",tokenize:"forward",resolution:3},{field:"description",encoder,resolution:20,tokenize:"full"},{field:"content",encoder,resolution:20,tokenize:"full"}]}});function initIndex(){index.add({id:0,href:"/blog/project-prikaza/",title:"Аккредитованным IT компаниям на заметку.",description:"О дополнительных требованиях, предъявляемых к официальному сайту аккредитованных российских ИТ организаций.",content:`Минцифры, в соответствии с подпунктом «г» пункта 4 Положения о государственной аккредитации российских организаций, осуществляющих деятельность в области информационных технологий, утвержденного постановлением Правительства Российской Федерации от 30 сентября 2022 г. № 1729, разработан Проект приказа о дополнительных требованиях, предъявляемых к официальному сайту аккредитованных российских ИТ организаций и организаций, подавших заявление о предоставлении государственной аккредитации. Проект размещен по адресу: https://regulation.gov.ru/Regulation/Npa/PublicView?npaID=154659 Согласно проекту сайт должен содержать: наименование организации; адрес и место нахождения организации; идентификационный номер налогоплательщика; основной код Общероссийского классификатора видов экономической деятельности; адрес электронной почты организации (при наличии); телефон организации (при наличии). об осуществляемых организацией видах деятельности в соответствии с перечнем видов деятельности в области информационных технологий; о реализуемых (разрабатываемых) организацией товарах, и (или) выполняемых ею работах, и (или) оказываемых ею услугах, а также достоверная информация о стоимости указанных товаров (работ, услуг); информация об исключительных правах на разработанные программы для электронных вычислительных машин, базы данных, способах предоставления права использования указанных программ; об используемых языках программирования, наименованиях фреймворков, программного обеспечения; информация, позволяющая идентифицировать программы для электронных вычислительных машин и баз данных, включенные в единый реестр российских программ для электронных вычислительных машин и баз данных, правообладателем которых является организация. Есть и другие требования.`}).add({id:1,href:"/docs/act-prava/",title:"Акт приема-передачи исключительных прав",description:"Общий образец Акта приема-передачи исключительных прав. Этот Акт передачи исключительных прав подходит для передачи прав на программное обеспечение, на программный код.",content:"Настоящий Акт составлен в подтверждение того, что Подрядчик передал, а Заказчик принял исключительные права, на все результаты работ Подрядчика (результаты интеллектуальной деятельности и средства индивидуализации) согласно условиям Договора № ___________, в том числе: 1.1. графический и текстовый дизайн внешнего интерфейса ___________, полученный в том числе, путем модификации (редизайна) исходного дизайна ___________; 1.2. графический и текстовый дизайн внешнего веб интерфейса ___________; 1.3. промежуточные результаты, черновики и т.п., и в случае, если ___________. Стоимость исключительных на результаты работ Подрядчика по Договору, передаваемых по настоящему Акту, составляет ___________ (_____________) рублей Российской Федерации, без НДС, в связи применением Подрядчиком специального налогового режима «Налог на профессиональный доход». Стороны подтверждают, что исключительные права переданы Заказчику Подрядчиком в соответствии с положениями Договора, Подрядчик претензий к Заказчику не имеет. Все результаты работ по Договору предоставлены Заказчиком Подрядчику в электронном виде, все исходные материалы, копии и сами результаты работ у Заказчика удалены и/или уничтожены. Заказчик не предоставляет Подрядчику право на использование наименования Заказчика в официальных списках организаций, для которых Подрядчик выполнял и/или выполняет работы, а также упоминать наименование Заказчика, использовать изображение сайта Заказчика, результатов работ по Договору, в своем портфолио и иных формируемых списках и каталогах. Подписывая настоящий акт, Подрядчик заявляет понимание и согласие со всем указанным в настоящем акте, и подтверждает отсутствие каких-либо притязаний и ограничений на все результаты работ по Договору № в том числе и на интеллектуальные права, на такие результаты. Настоящий Акт составлен в 2 (двух) экземплярах, по одному для каждой из Сторон, имеющих одинаковую юридическую силу. …Дополнительные и особые условия… Реквизиты и подписи Сторон. Внимание. Этот акт общей формы. В некоторых случаях требуется внести дополнительные условия."}).add({id:2,href:"/docs/dogo-samozan-designer/",title:"Договор на выполнение работ по созданию графических материалов и контента",description:"Договор на выполнение работ по созданию графических материалов и контента с самозанятым дизайнером",content:`фрагмент проекта договора 1. ПРЕДМЕТ ДОГОВОРА   1.1. По настоящему Договору Подрядчик, по поручению Заказчика, обязуется выполнять работы по созданию, модификации и адаптации графических материалов, графического и текстового дизайна, документации и иного контента   (далее – Работы) и передавать Заказчику исключительное право на все результаты интеллектуальной деятельности, а Заказчик принимать указанные работы и уплачивать Подрядчику вознаграждение за принятые результаты работ и за исключительное право на такие результаты.   Совершенно не стоит указывать того, что Дизайнер не будет делать, это только усложнит и запутает договор, а то и вообще получите признаки незаключенного договора. Лучше составьте дополнительное соглашение при необходимости и подробнее укажите условия в заданиях. Подрядчик выполняет работы на основании согласованных Сторонами Заданий Заказчика на выполнение работ (далее – Задания, Задания на выполнение работ). В согласованных Сторонами Заданиях на выполнение работ содержатся: название и описание работ, важность (приоритет выполнения), объем и сложность выполнения (трудозатраты), необходимость представления предварительных вариантов (образцов, макетов, проектов) результатов работ и количество таких вариантов, способ демонстрации, способ проверки и приемки результатов выполнения работ, сроки выполнения, стоимость работ и размер вознаграждения за исключительные права, а также, при необходимости, иные условия. 1.2. Стороны приняли и согласовали, что работы по настоящему договору могут оказываться Подрядчиком в пользу указанных Заказчиком третьих лиц. 1.3. Работы по настоящему договору выполняются Подрядчиком лично, без привлечения третьих лиц. 1.4. Все любые результаты работ и исключительные права на них, созданные Подрядчиком в результате исполнения настоящего Договора, передаются Заказчику и могут быть выражены, в том числе, кроме прочего, в виде отдельных или сложных произведений графики, графического и текстового дизайна, документации и иного контента, а также модификаций или адаптаций указанных объектов. 1.5. Стоимость материальных носителей, на которых передаются результаты интеллектуальной деятельности, включены в стоимость работ по Договору и дополнительно Заказчиком не оплачиваются, если Сторонами не предусмотрено иное для каждого отдельного случая. 1.6. Исключительные права на все любые результаты работ, выраженные в том числе, как в виде отдельных произведений, так и в виде модификаций и адаптаций, и созданные Подрядчиком в результате исполнения настоящего Договора, в том числе и в случае если такой результат работ прямо не предусматривался и не оговаривался Сторонами, передаются Заказчику на условиях настоящего договора. Исключительные права на все любые результаты работ, передаются Заказчику на весь срок их действия и без ограничения территории и/или иных обременений со стороны Подрядчика и/или иных третьих лиц. 2. ПОРЯДОК СОГЛАСОВАНИЯ, ВЫПОЛНЕНИЯ И ПРИЕМКИ РАБОТ   2.1. Работы по настоящему договору выполняются Подрядчиком на основании Заданий, полученных от Заказчика и согласованных Сторонами к выполнению. Задания передаются Заказчиком Подрядчику по мере необходимости. (важно транслировать такое условие взаимодействия на весь договор ..f-arbitrage) 2.2. Если Сторонами не согласовано иное, передача Подрядчику Заданий и согласование таких Заданий Сторонами к выполнению осуществляется посредством информационных ресурсов в информационно-телекоммуникационной сети Интернет, на условиях настоящего договора. 2.3. Заказчик, в любое время действия настоящего Договора, направляет Подрядчику Задания на выполнение работ. В направляемых Заказчиком Заданиях на выполнение работ содержатся: название и описание работ, важность (приоритет выполнения), объем и сложность выполнения (трудозатраты), необходимость представления предварительных вариантов (образцов, макетов, проектов) результатов работ и количество таких вариантов, способ демонстрации, способ проверки и приемки результатов выполнения работ, предлагаемые Заказчиком сроки выполнения работ, предложение о стоимости таких работ и размере вознаграждения за исключительные права, а также, при необходимости, иные условия. 2.4. Подрядчик в срок не более 2 (двух) рабочих дней с момента отправки Задания Заказчиком, подтверждает (согласовывает) такое Задание или направляет Заказчику свои возражения, вопросы, предложения и комментарии. 2.5. Фактом согласия Заказчика с какими-либо возражениями или предложениями Подрядчика, направленными в ответ на Задание Заказчика, является исключительно письменно выраженная воля Заказчика о таком согласии. 3. ВЫБОР ИНФОРМАЦИОННЫХ РЕСУРСОВ ДЛЯ ВЗАИМОДЕЙСТВИЯ СТОРОН ДОГОВОРА.   3.1. Передача, корректировка, согласование Сторонами Заданий, характеристик Заданий, списков принятых работ и выполненных Заданий, возражений и иных соглашений, приложений, документов и комментариев осуществляется Сторонами посредством электронной почты и/или иной согласованной Сторонами информационной системы управления проектами, позволяющей установить отправителя и адресата передаваемого сообщения и информации, а также дату и время отправки. Фактом согласования Сторонами выбора информационной системы управления проектами является фактическое осуществление Сторонами передачи, корректировки и согласования Заданий, характеристик Заданий, списков принятых работ и выполненных Заданий, возражений и иных соглашений, приложений, документов и комментариев в такой информационной системе. 3.2. Выбор информационной системы управления проектами осуществляется Заказчиком и согласовывается Сторонами путем направления, посредством электронной почты, Заказчиком информации Подрядчику о такой системе и обеспечения возможности его регистрации в указанной системе. В случае отсутствия мотивированных возражений со стороны Подрядчика, в срок не более 2 (двух) рабочих дней с момента отправки Заказчиком Подрядчику электронного письма о выбранной информационной системе управления проектами, такая система считается согласованной Сторонами. … 4. ПЕРЕДАЧА ИСКЛЮЧИТЕЛЬНЫХ ПРАВ   … документ дополняется …`}).add({id:3,href:"/docs/dogo-ts/",title:"Договор на оказание услуг по технической поддержке и администрированию.",description:"фрагмент проекта Договора на оказание услуг по технической поддержке и администрированию. Форма разрабатывалась как для обслуживания софта, так и для оборудования.",content:`1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ   1.1. Программное обеспечение (далее – ПО) — Совокупность компьютерных программ, баз данных и программных документов, необходимых для эксплуатации этих программ. 1.2. Операционная Система (далее — ОС) — Совокупность системных программ, предназначенная для обеспечения определенного уровня эффективности системы обработки информации за счет автоматизированного управления ее работой и предоставляемого пользователю определенного набора услуг. 1.3. Аппаратные и технические средства — Материальная часть вычислительной системы и иное оборудование, включающее в себя электрические и электронные элементы (например, приборы и схемы), электромеханические элементы (например, дисководы) и механические элементы (например, стойки). 2. ПРЕДМЕТ ДОГОВОРА   2.1. По настоящему Договору Исполнитель обязуется оказывать Заказчику услуги по технической поддержке, техническому обслуживанию и администрирования аппаратных и технических средств, операционных систем, программного обеспечения и баз данных (далее – Услуги), а Заказчик обязуется оплачивать услуги Исполнителя в размере, порядке и сроки, которые установлены настоящим Договором. 2.2. Перечень услуг, а также перечень аппаратных и технических средств, ОС, ПО и баз данных, на которые направлено оказание Услуг Исполнителем, Стороны согласовали в Приложении №1 к настоящему Договору. 2.3. Стороны приняли и согласовали, что услуги по настоящему договору могут оказываться Исполнителем в пользу указанных Заказчиком третьих лиц, при согласовании Сторонами такого на условиях настоящего Договора. 2.4. Все любые результаты услуг и интеллектуальные права на них, полученные Исполнителем в результате исполнения настоящего Договора, передаются Заказчику в объеме и на условиях настоящего Договора. Результаты услуг могут быть выражены, в том числе, кроме прочего, в виде отдельных или сложных программ ЭВМ, баз данных, отдельного программного кода, патчей, исправлений, модулей, произведений графики и дизайна, документации, а также модификаций или адаптаций указанных объектов. 2.5. Взаиморасчеты Сторон за Услуги выполняются Сторонами в порядке абонентского обслуживания (ст. 429.4 ГК РФ Договор с исполнением по требованию (абонентский договор)), если не согласовано иное. 2.6. Стороны определяют ежемесячный объем оказываемых Исполнителем Услуг путем оценки количества и перечня аппаратных и технических средств, ОС, ПО и баз данных, и иных отдельных соглашений Сторон, все вместе указанных в Приложении №1. 2.7. Если иное не установлено настоящим Договором или отдельным соглашением Сторон, место оказания Услуг — офис Исполнителя, Услуги оказываются путем осуществления дистанционного доступа. По согласованию Сторон, Услуги могут оказываться Исполнителем путем личного присутствия по месту нахождения Заказчика или иного согласованного Сторонами лица. В таком случае Заказчик оплачивает Исполнителю выезд, проживание и питание в дополнительно согласованном Сторонами порядке и объеме. 3. ПОРЯДОК СОГЛАСОВАНИЯ, ВЫПОЛНЕНИЯ И ПРИЕМКИ УСЛУГ   3.1. Услуги оказываются Исполнителем на условиях настоящего Договора и в течение всего срока его действия, разово по требованию Заказчика (Услуги на основании обращений), или периодически, по расписанию, согласованному Сторонами в Приложении №1 (Профилактические Услуги). 3.2. Услуги ограничены следующим общим перечнем: 3.2.1. Профилактические Услуги (Услуги по техническому обслуживанию и администрированию) — согласованные Сторонами, профилактические периодические и разовые действия, направленные на обеспечение работы согласованных сторонами аппаратных и технических средств, ОС, ПО и баз данных, находящихся, в том числе у третьих лиц и уменьшающих вероятность возникновения сбоев и ошибок в их работе; 3.2.2. Услуги на основании обращений (Услуги по технической поддержке) — разовые действия выполняемые Исполнителем на основании обращений, принятых от согласованных Сторонами сотрудников Заказчика (пользователей), о возникших технических вопросах, ошибках, сбоях, иных предложениях и пожеланиях, в части эксплуатации согласованного Сторонами перечня аппаратных и технических средств, ОС, ПО и баз данных. 3.3. При оказании Услуг по техническому обслуживанию и администрированию, Исполнитель совершает действия по дистанционному контролю, наблюдению и исправлению сбоев согласованных Сторонами аппаратных и технических средств, ОС, ПО и баз данных. Периодичность, объем и характер Услуг по техническому обслуживанию и администрированию, определен Сторонами в Приложении №1. 3.4. Для оказания Услуг по технической поддержке на основании обращений, Исполнитель принимает такие обращения по номеру +7 499 000000000, или на электронную почту, на следующий адрес support@00000000000.ru в период с 09:00 по 18:00, по будням, исключительно со следующих адресов электронной почты или номеров телефонов: (….., ……, …..) 3.5. Каждое обращение должно содержать следующие обязательные сведения: 3.5.1. … 3.5.2. подробное описание действий пользователя предшествующие возникновению ошибки или сбою; 3.5.3. подробные сведения об ошибке, сбое, или описание пожелания, или вопроса, если обращение не связано с нештатной работой; 3.5.4. … 3.5.5. …. В случае отсутствия в каком-либо обращении указанных в настоящем пункте обязательных сведений, Исполнитель вправе не рассматривать такое обращение, с учетом обязательной отправки ответа об отказе в рассмотрении, на адрес отправителя. 3.6. После получения обращения, Исполнитель осуществляет его проверку, обработку и при необходимости уточнение. Если у Исполнителя отсутствуют препятствия, вопросы и какие-либо оговорки по полученному обращению, в таком случае Исполнитель осуществляет действия направленные на устранение причины такого обращения. 3.7. В случае, если по результатам проверки и обработки обращения, Исполнителем заявляется, что указанная в таком обращении ошибка, сбой или иной недостаток не могут быть им устранены в срок не более 3 (трех) рабочих дней с момента его получения или уточнения, такое обращение рассматривается Сторонами как Задание на выполнение отдельных работ или оказание дополнительных услуг и подлежит дальнейшему согласованию Сторонами. 3.8. Стороны оговаривают, что все любые Услуги оказываемые Исполнителем могут содержать совершение Исполнителем действий по изменению программного кода, конфигурационных файлов, настроек, разметки, дизайна и текстов в целях исправления ошибок и/или реакции на обращения пользователей. 3.9. Услуги оказываются Исполнителем в порядке абонентского обслуживания, с отчетным периодом равным одному месяцу. По завершении каждого отчетного месяца Исполнитель, посредством электронной почты, выставляет акт об оказании услуг. В таком акте Исполнителем указывается наименование услуги с указанием абонентской платы. Указанный акт считается Сторонами подписанным и принятым Заказчиком, в случае отсутствия мотивированных возражений в срок не более 5 (пяти) рабочих дней с момента отправки скан-копии акта Исполнителем. При этом, в силу оказания Исполнителем услуг, в порядке абонентского обслуживания, размер ежемесячной оплаты не зависит от фактического оказания или количества таких услуг. … материал дополняется…`}).add({id:4,href:"/blog/pentest/",title:"Договор на пентест, условия и особенности.",description:"Пентест с точки зрения права. Что необходимо включить в договор пентеста (договор на проведение тестирования на проникновение).",content:`Каждый владелец сайта, приложения, информационной системы и т.д. сталкивается с вопросом обеспечения информационной безопасности, то есть комплекса мер, направленных на обеспечение непрерывной работы сайта/приложения, конфиденциальности, целостности и доступности информации на указанных ресурсах, в условиях обеспечения непрерывности бизнеса и его восстановления после прерывания. Для ряда субъектов, таких как банки, значимые объекты КИИ и пр., а также для государственных информационных систем, информационных систем государственных органов, государственных предприятий и учреждений и пр., требования о защите информации должны соответствовать определённым стандартам. Например, Положение N 683-П, Положение N 757-П, Приказ ФСТЭК N 17 и пр. Отметим сразу, договор на проведение тестирования на проникновение не может быть стандартным договором на оказание информационных услуг. Слишком много специальных условий и особенностей при проведении пентеста информационной системы, которые должны быть оговорены заранее. В ином случае, несогласованность условий в договоре на проведение тестирования на проникновение может быть причиной не только претензий у сторон, но и материальных требований о возмещении убытков.   Рассмотрим один из многих вопросов, необходимых для четкого и внятного согласования в договоре на проведение тестирование на проникновение. Специфика услуги проведения пентеста не исключает возможности получения доступа к конфиденциальной информации, в обход стандартных процедур, и нанесения ущерба стабильности информационной системы Заказчика. Таким образом, в договоре должна быть оговорена возможность утраты значимой информации в тестируемой системе и исключено трактование действий Исполнителя как «неправомерный доступ к информации третьих лиц». Вроде бы у Заказчика есть архивы, технический персонал, готовый все восстановить, да и согласовали все на встрече Сторон. Что может случиться? Но вот вопрос, а Исполнитель, как лицо проводящее тестирование, точно уверен в квалификации персонала Заказчика, имеет достоверную информации о качестве и стабильности информационной системы Заказчика, в том числе на момент проведения пентеста. Очевидный ответ - если Заказчик и Исполнитель не связанные лица, конечно нет. В договоре на пентест необходимо максимально четко ограничить ответственность Исполнителя. Это важно. В ином случае, у Заказчика появляется возможность недобросовестно переложить ответственность на Исполнителя, в случае, например, неквалифицированных и несогласованных с Исполнителем действий сотрудников Заказчика в период проведения тестирования. Более того, Заказчик, в таком случае, может использовать пока недостаточно неурегулированный статус программного обеспечения, использованного Исполнителем. Статья: Криминалистическая классификация средств высокотехнологичных преступлений (Поляков В.В.) (“Вестник Санкт-Петербургского государственного университета. Право”, 2024, N 2) Очевидно, что стандартным договором на информационные услуги не стоит искушать Заказчика использовать впоследствии как меру давления на Исполнителя отсылкой к уголовной ответственности. Например, ст. 183 УК РФ Незаконные получение и разглашение сведений, составляющих коммерческую, налоговую или банковскую тайну, ст. 272 УК РФ Неправомерный доступ к компьютерной информации, ст. 273 УК РФ Создание, использование и распространение вредоносных компьютерных программ (при проведении пентеста) и пр.   Приведенное в этой статье только часть того, что следует согласовать Сторонам при выполнении услуги на тестирование на проникновение.`}).add({id:5,href:"/docs/dogo-scrum/",title:"Договор на разработку программного обеспечения (метод SCRUM)",description:"это фрагмент договора на разработку программного обеспечения и использованием SCRUM",content:`договор на разработку программного обеспечения (метод SCRUM) фрагмент проекта договора на разработку ПО (SCRUM) при создании использована версия Scrum Guide 2017 1.Термины и определения   Термины и определения, а так же иная техническая и специальная информация указанные, но не определенные в настоящем договоре, используются Сторонами в том значении, как они определены в соответствующих ГОСТах, иной технической документации, в том числе ГОСТ Р 51904-2002 “Программное обеспечение встроенных систем. Общие требования к разработке и документированию”. AGILE   — модель гибкой разработки, основанной на адаптивном планировании, эволюционном развитии, ранней реализации и постоянном совершенствовании разрабатываемого программного обеспечения (ПО). Основополагающие принципы размещены на странице в сети Интернет: http://agilemanifesto.org/iso/ru/principles.html SCRUM   — метод управления проектами, набор принципов, ценностей, политик, ритуалов, артефактов, позволяющий в жестко фиксированные и небольшие по времени итерации, (Sprints), предоставлять конечному пользователю работающий продукт с новыми бизнес-возможностями, для которых определен наибольший приоритет. Описание и правила метода размещены на странице в сети Интернет https://www.scrumguides.org/scrum-guide.html программное обеспечение (ПО)   — Совокупность компьютерных программ и программных документов, необходимых для эксплуатации этих программ. разработка ПО   — Набор действий (работ), результатом выполнения которых являются программные средства. Разработка ПО может включать в себя новую разработку, модификацию, многократное использование, перепроектирование или любое другое действие, требуемое для создания программных средств. Sprint   — фиксированный по времени циклично повторяющийся этап работ (итерация), в ходе которого Подрядчиком выполняется часть согласованных Сторонами работ по разработке ПО. Длительность одного спринта равняется фиксированному количеству дней. Каждый Sprint может включать один или несколько процессов разработки ПО, такие как определение требований к ПО, проектирование ПО, кодирование ПО, интеграция. Story point   — показатель, используемый Сторонами для оценки трудозатрат и сложности реализации заданной пользовательской истории, который является мерой усилий и времени, необходимых для ее реализации. Показатель может быть связан с количеством работ, сложностью, рисками и задействованными усилиями и ресурсами. Показатель равен данной Подрядчиком предварительной оценке предполагаемых трудозатрат в идеальных человеко-днях по каждой пользовательской истории. Product backlog   — обновляемый список требований к продукту, которые Подрядчик обязуется реализовать, на условиях настоящего договора. Product backlog - включает в себя согласованные Сторонами на основании инициатив Заказчика или Подрядчика, отдельные требования (пользовательские истории – User Story). Список требований определяет согласованные Сторонами функции, исправления ошибок, нефункциональные требования и т. д. - все, что должно быть сделано для создания жизнеспособного ПО. Sprint backlog   — согласованный сторонами список работ запланированный совместно Сторонами к выполнению Подрядчиком в период этапа работ (Sprint). User story   — отдельный элемент списка Product backlog, Sprint backlog, описание отдельного согласованного Сторонами требования к разрабатываемому ПО. Формат User story (отдельного пользовательского требования) состоит из следующих обязательных элементов: ID — порядковый номер; Название — краткое изложение отдельного требования к ПО, если иное не оговорено Сторонами для каждого отдельного случая, содержащее выражение в следующем формате: Как пользователь с определенными правами/сотрудник/ может получить предполагаемый результат, эффективность, действие в своей работе при актуализации/наступлении условия, обязанности; Важность — степень важности выполнения указанного требования для Подрядчика; Предварительная оценка объема и сложности работ — начальная, совместно согласованная Сторонами оценка объема и сложности работ выраженная в указанном количестве Story point; Демонстрация — способ и описание демонстрации Подрядчиком выполненного отдельного объема работ; Способ приемки — способ оценки и описание критерии приемки Заказчиком выполненного отдельного объема работ; Примечания — любая дополнительная для Сторон информация. 2. Отдельные взаимные соглашения и заверения Сторон   2.1. Стороны согласовали руководствоваться и использовать для взаимодействия, при исполнении настоящего договора, модель гибкой разработки – AGILE, и метод управления проектами – SCRUM. Заключая настоящий договор, Стороны, добровольно и совместно, действуя в силу принципов свободы договора, приняли и согласовали, что следование правилам AGILE и SCRUM, в том числе и в случае решения каких-либо споров, разногласий между Сторонами, обязательно, и определяется Сторонами как признак добросовестности действий любой из Сторон. 2.2. Заказчик, для представления своих интересов во взаимодействии Сторон, в рамках исполнения настоящего договора, назначает своего Представителя (далее – Product Owner) и заверяет Подрядчика, в его надлежащих полномочиях и компетентности, в том числе, технической, позволяющей четко формулировать требования Заказчика к разрабатываемому ПО. Полномочия представителя Заказчика подтверждены соответствующей доверенностью, форма доверенности согласована Сторонами в Приложении №3 к настоящему договору. Подрядчик, в свою очередь, для обеспечения взаимодействия Сторон, в том числе координирования участия в таком взаимодействии иных сотрудников Подрядчика (программистов, дизайнеров, тестировщиков, менеджеров и т.д.) назначает своего ответственного представителя (далее – SCRUM Master). 2.3. Подрядчиком, для исполнения настоящего договора, организуется из числа собственных сотрудников и привлеченных специалистов – постоянно действующая, в течение всего времени исполнения настоящего договора, группа, состоящая из ▒▒ человек (далее – Development Team). Подрядчик заверяет и гарантирует, что он не привлекает Development Team для выполнения несогласованных с Заказчиком работ. Команда разработчиков состоит из сотрудников и привлеченных специалистов, указанных в обособленной группе списка Приложения №2. 2.4. Стороны определяют перечень всех назначенных ими для исполнения договора лиц (Product Owner, SCRUM Master, Development Team), с указанием ФИО, уровня образования, занимаемой должности, компетенций в рамках исполнения настоящего договора, в Приложении №2. С учетом совместной работы представителей, сотрудников Сторон, и привлеченных специалистов, Стороны соглашаются и заявляют, что до заключения настоящего договора с каждым таким сотрудником, представителем и привлеченным специалистом, каждой Стороной договора заключены действительные соглашения, оговаривающие передачу исключительных прав Заказчику и получение конкретным сотрудником, представителем и привлеченным специалистом авторского вознаграждения, за выполненную по настоящему договору работу. 2.5. Настоящим, Стороны заверяют, что в течение срока исполнения договора Стороны принимают все необходимые и возможные действия в целях обеспечения эффективной деятельности и совместной работы SCRUM Master, Product Owner и Development Team (вместе именуемые SCRUM-команда). Стороны оценивают любые действия/бездействия участника SCRUM-команды, приведшие к нарушениям условий настоящего договора, как нарушение соответствующих обязательств одной из Сторон договора, со стороны которой указанный участник назначен в SCRUM-команду. 2.6. Настоящим договором, Стороны принимают и соглашаются, что для каждого случая совместных встреч и переговоров, таких как Согласование Sprint backlog, Обзор этапа Sprint, Ретроспектива этапа Sprint, Стороны соблюдают обязательное присутствие всех своих представителей и сотрудников, входящих в SCRUM-команду. Любые изменения в указанном в настоящем пункте и/или привлечение на такие встречи специалистов, не включенных в SCRUM-команду, согласовывается Сторонами отдельно, для каждого случая. 2.7. Настоящим договором, Стороны заявляют и гарантируют участие, по запросу другой Стороны, иных заинтересованных и необходимых своих специалистов в обсуждениях и встречах, в целях согласования и выполнения работ Подрядчиком. 2.8. Действую разумно и добросовестно, Заказчик понимает и соглашается, что, несмотря на его возможность изменять и дополнять Product Backlog в течение исполнения Подрядчиком настоящего договора, внесение Заказчиком существенных изменений приведет к увеличению срока выполнения работ и их стоимости. 3. Предмет договора   3.1. По настоящему договору Подрядчик обязуется выполнить работы по разработке Программного обеспечения (далее - ПО), состоящие из следующих наборов взаимосвязанных работ - процессов разработки ПО: определение требований, проектирование, кодирование, интеграцию (далее - Работы). 3.2. Каждая из Сторон, исполняя настоящий договор, в том числе, руководствуется моделью гибкой разработки – AGILE и методом управления проектами - SCRUM. 3.3. Стороны согласовали, что учитывая отсутствие четких требований Заказчика к ПО (технического задания, спецификации), работы по настоящему договору выполняются Подрядчиком с учетом непрерывного, на условиях настоящего договора, согласования изменений и дополнений Сторонами списка требований к разрабатываемому ПО – Product backlog и, в отдельности, каждого элемента списка – User story. 3.4. Стороны, в соответствии с указанными выше принципами, и непрерывным характером согласования Product backlog и User story, определили цикличный и повторяющийся принцип выполнения Работ. При этом, Работы выполняются Подрядчиком отдельными этапами (итерациями) — Sprint, включающими согласованное конечное количество объема Работ, на основании утвержденного сторонами, по каждому Sprint отдельного, списка, содержащего User story (далее такой список именуется — Sprint backlog) и составленного Сторонами из элементов списка Product backlog, путем выбора и приоритизации Заказчиком (Product Owner), с учетом мнения Developer team, SCRUM Master. 3.5. По каждому этапу Sprint, Стороны совместно согласовывают количество работ — перечень User story, с учетом того, что длительность каждого этапа выполнения работ Sprint остается неизменна и равна ▒▒ рабочим дням, а объем запланированных к выполнению работ конечен и определен в соответствии с условиями договора. В одном этапе Sprint Подрядчиком могут выполняться работы, включающие один или несколько процессов разработки ПО. 3.6. Работы, выполняемые Подрядчиком по каждому Sprint, кроме прочего, по факту согласования, отражаются сторонами в отдельных приложениях к настоящему Договору. 3.7. Настоящим, каждая из Сторон подтверждает, что сотрудники (привлеченные по иным основаниям лица), участвующие в исполнении настоящего договора, имеют надлежащие соглашения со своим работодателем, или иные соглашения, о вознаграждении автору согласно ст. 1295 ГК РФ. Все поступившие претензии к какой-либо Стороне, так или иначе затрагивающие выплату авторского вознаграждения сотруднику (привлеченному по иным основаниям лицу) другой Стороны, находятся под ответственностью и риском несения расходов Стороны, от которой такой сотрудник (привлеченное по иным основаниям лицо) выступает в настоящем договоре. 3.8. Дополнительным существенным условием настоящего договора является факт периодического, перед каждым отдельным этапом работ Sprint, проведения Сторонами согласования списка (планирования) Sprint backlog, путем личного присутствия, по адресу нахождения Подрядчика, с обязательным участием Development team, SCRUM master, Product owner. 4. Отдельные особые условия.   4.1. Стороны, в течение всего срока действия настоящего договора находясь в постоянном взаимодействии, дополняют и изменяют список требований к ПО — Product backlog. Список требований Product backlog редактируется и согласовывается Сторонами с учетом обязательного выполнения следующих условий: 4.1.1. на любой момент времени действия настоящего договора не существует какого-либо требования к ПО — User story или изменения такого требования, по которому стороны пришли к соглашению и/или не имеют разногласий, но такое User story или изменение не внесено в Product backlog; 4.1.2. в случае, если какой-либо из Сторон стало известно о необходимости внести или изменить User story в Product backlog, такая Сторона незамедлительно информирует о таком другую Сторону и инициирует обсуждение. 4.2. Стороны приняли и согласовали, что совместно утвержденный Sprint backlog — список User story на этап работ (Sprint), не подлежит изменению и является окончательным. В случае необходимости внесения изменений в какой-либо элемент списка Sprint backlog, Product owner руководствуется принципом внесения такого изменения как отдельного User story в Product backlog и включения его в следующий этап работ. 4.3. Стороны приняли и согласовали, что право в одностороннем порядке отменить начавшийся и не окончившийся этап работ – Sprint, принадлежит исключительно Product Owner от имени Заказчика, в следующих исключительных случаях: 4.3.1. Product Owner получил обоснованный запрос от Подрядчика на отмену этапа выполнения согласованных Сторонами работ (Sprint) и согласен с таким запросом; 4.3.2. Существенная часть результатов этапа работ Sprint более не актуальна для Заказчика, настолько, что даже предположительно полученные результаты не могут быть им частично использованы. В случае отмены этапа работ Sprint, Стороны согласовывают распределение рисков и расходов на выполненные и невыполненные работы, за исключением случаев, если решение о прекращении продолжения начатого и согласованного Sprint будет принято Заказчиком, и не по вине Подрядчика. В таком случае Заказчик производит оплату Подрядчику за фактически затраченное время на выполнение согласованного Sprint без выполнения конкретного результата по этапу . Все незавершенные и необходимые для Заказчика работы, элементы Product backlog переоцениваются и возвращаются в Product backlog. 4.4. Основываясь на своем опыте и знаниях, Подрядчик, с учетом отсутствия существенного изменения требований Заказчика, и не характерных трактовок Заказчиком своих общих требований к ПО, предварительно оценивает выполнение работ по настоящему договору за ▒▒ рабочих дней (или ▒▒ этапов Sprint). Заказчик согласен и принимает указанный срок как предварительный и не являющийся оценкой качества исполнения договора Подрядчиком 4.5. Стороны согласились трактовать качество работ Подрядчика, в части соблюдения сроков исполнения работ, оценкой результатов и объема работ по каждому этапу, с обязательным учетом следующих условий: 4.5.1. Первые ▒▒ этапа (Sprint), Подрядчик вправе не выполнить ▒▒% объема работ в связи с сопутствующим исполнению договора проведением Заказчиком исследовательских, экспериментальных и испытательских работ; 4.5.2. В ином любом другом случае, Стороны оценивают невыполненные работы в любом этапе Sprint, как нарушение обязательства Подрядчика, при условии, если такое нарушение явилось халатностью Подрядчика, его персонала в SCRUM-команде, и/или иной некомпетентностью его сотрудников и привлеченных им специалистов. 5. Общий порядок взаимодействия и согласования работ.   5.1. Стороны, основываясь на общих требованиях Заказчика к ПО, указанных в Приложении №1, в дату ▒▒.▒▒.▒▒▒▒ и время ▒▒:▒▒, проводят встречу – первое планирование, по адресу Подрядчика – г. Москва, ул. ▒▒▒▒▒▒▒▒▒▒▒▒▒▒, д. ▒▒▒/▒▒, оф. ▒▒, с целью первого согласования (планирования) списка Product backlog и списка Sprint backlog на первый этап работ Sprint (формат Sprint backlog и Product backlog определен в Приложении №4). 5.2. В случае, если Стороны, в результате первого планирования, не пришли к взаимному, и достаточному для Подрядчика, соглашению, проводится повторная встреча в срок не позже, чем через 3 (три) рабочих дня с момента проведения первого планирования. Если за время проведения двух встреч первого планирования Стороны не пришли к соглашению о формулировании требований User story и согласованном их внесении в списки Product backlog и Sprint backlog, настоящей договор прекращает свое действие без каких-либо взаимных претензий, штрафов и иных требований Сторон. 5.3. Любое дальнейшее согласование внесения изменений и/или дополнений в Product backlog выполняется Сторонами совместно и непрерывно, на условиях и в течение всего срока действия настоящего договора, на основании инициатив любой из Сторон. В любой момент времени действия договора, Стороны, внося изменения и/или дополнения в Product backlog, стремятся согласовать все элементы изменяемого или добавляемого User story. 5.4. Стороны, каждый раз по истечении срока этапа выполнения согласованных работ Sprint, и без учета и отдельного ожидания выполнения Подрядчиком всех запланированных на этап работ, в случае задержки выполнения таковых, проводят две итоговые встречи, завершающие этап Sprint: Обзор этапа Sprint и Ретроспективу этапа Sprint. 5.4.1. Обзор этапа Sprint проводится Сторонами совместно, в целях демонстрации и приемки результатов выполненных Подрядчиков работ в течение этапа Sprint, в срок не более 2 рабочих дней с момента истечения срока Sprint. В случае выполнения Подрядчиком согласованных Сторонами условий приемки какого-либо отдельного объема работ (User story), указанного в утвержденном к выполнению Sprint backlog, такие работы принимаются на условиях настоящего договора Заказчиком. По результатам проведения Обзора этапа Sprint и приемки работ, Стороны заполняют и совместно подписывают Перечень выполненных на этапе Sprint и принятых Заказчиком работ (форма определена в Приложении №5 к договору). В срок не более 5 рабочих дней с момента подписания Сторонами, Подрядчик направляет Заказчику акт выполненных работ, согласно подписанному Сторонами Перечню выполненных на этапе Sprint и принятых работ. Указанный акт считается Сторонами подписанным и принятым Заказчиком, в случае отсутствия мотивированных возражений в срок не более ▒▒ рабочих дней с момента отправки скан-копии акта Подрядчиком. 5.4.2. Ретроспектива этапа Sprint проводится Сторонами совместно, в целях обсуждения улучшений и недостатков совместной работы в срок не более 2 рабочих дней с момента проведения Сторонами Обзора этапа Sprint. 5.5. Стороны, каждый раз, по итогам проведения встреч Обзор этапа Sprint и Ретроспектива этапа Sprint, в срок не более 2 рабочих дней с момента проведения Сторонами встречи Ретроспективы этапа Sprint, проводят планирование нового этапа Sprint – согласование (планирование) Sprint backlog. 5.6. Согласование Сторонами списка Sprint backlog, при проведении планирования этапа Sprint, считается завершенным, если по всем User Story в списке Sprint backlog Сторонами согласованы: название, важность (приоритет выполнения работ), предварительная оценка объема и сложности работ выполняемых работ, способ демонстрации, способ проверки и приемки результатов каждой из согласованных работ. Согласование Сторонами списка Sprint backlog, подтверждается путем подписания дополнительного соглашения, (по форме указанной в приложении №4) и применяется Сторонами, как к первому, так и ко всем последующим согласованиям списков Sprint backlog. 5.7. При каждом проведении согласования списка Sprint backlog (при планировании этапа работ Sprint), Стороны определяют и согласовывают количество реализуемых Подрядчиком требований к ПО - User story, руководствуясь показателем Story point по каждому User story. Показатель трудозатрат и сложности Story point для каждого User story определяется Подрядчиком и согласовывается Сторонами. Если Заказчик не согласен с оценкой трудозатрат Story point для каждого User story, определенных Подрядчиком, он вправе разбить User story на отдельные задачи с меньшей оценкой трудозатрат по каждой и изменить приоритетность User story в Product backlog, и, в конечном итоге, включить измененные User Story в список Sprint backlog. В любом случае, показатель трудозатрат Подрядчика приоритетен, и, в случае его оспаривания Заказчиком, Подрядчик не приступает к работе до его согласования. 5.8. Для первого этапа Sprint, Стороны, с учетом количества и квалификации задействованного персонала Подрядчика, и предварительной оценки Подрядчиком списка общих требований к ПО, установили суммарное (всех User story, которые включены в Sprint backlog) максимальное значение показателя Story point для всего первого Sprint backlog, равное ▒▒, исходя из которого Заказчик подбирает и приоритизирует User story. 5.9. Для каждого последующего этапа, Подрядчик вправе в одностороннем порядке корректировать суммарное максимальное значение показателя Story point для соответствующего Sprint backlog в меньшую сторону не более чем на ▒▒%, в случае если иное не согласовано Сторонами, для каждого отдельного случая. 5.10. По итогам планирования очередного Sprint, и только в случае согласования сторонами списка Sprint backlog, Подрядчик приступает к выполнению работ, на следующий рабочий день, если иное не согласовано Сторонами.   Совет Для чего нужно вообще вносить в договор упоминание SCRUM, указывать соответствующий AGILE и SCRUM порядок взаимодействия Сторон и прочие условия? Если совсем кратко, для того, что бы Стороны могли смело использовать условия SCRUM (а эти условия иногда достаточно странные с точки зрения Права условия и требования), не боясь взаимных претензий и обвинений. Более подробно читайте в статье - Зачем включать условия SCRUM в договор.`}).add({id:6,href:"/docs/dogo-razrabotki-programm/",title:"Договор на разработку программного обеспечения 2025",description:"Договор на выполнение работ по разработке программного обеспечения, модификации и адаптации.",content:`1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ   1.1. Программное обеспечение (далее – ПО) — Совокупность компьютерных программ, баз данных и программных документов, необходимых для эксплуатации этих программ. 1.2. Операционная Система (далее — ОС) — Совокупность системных программ, предназначенная для обеспечения определенного уровня эффективности системы обработки информации за счет автоматизированного управления ее работой и предоставляемого пользователю определенного набора услуг. 1.3. Аппаратные и технические средства — Материальная часть вычислительной системы и иное оборудование, включающее в себя электрические и электронные элементы (например, приборы и схемы), электромеханические элементы (например, дисководы) и механические элементы (например, стойки). 2. ПРЕДМЕТ ДОГОВОРА   2.1. По настоящему Договору Подрядчик, по поручению Заказчика, обязуется выполнять работы по разработке, модификации и адаптации программного обеспечения, баз данных, графики и дизайна, документации (работы по созданию, а так же внесению изменений и дополнений) (далее – Работы) и передавать Заказчику исключительное право на все результаты интеллектуальной деятельности, а Заказчик принимать указанные работы и уплачивать Подрядчику вознаграждение за принятые результаты работ и за исключительное право на такие результаты. Подрядчик выполняет работы на основании согласованных Сторонами Заданий Заказчика на выполнение работ (далее – Задания, Задания на выполнение работ). В согласованных Сторонами Заданиях на выполнение работ содержатся название и описание работ, важность (приоритет выполнения), объем и сложность выполнения (трудозатраты), способ демонстрации, способ проверки и приемки результатов выполнения работ, сроки выполнения и стоимость работ, а также, при необходимости, иные условия. 2.2. Кроме выполнения работ, Подрядчик, по настоящему договору, обязуется оказать услуги по технической поддержке и администрированию аппаратных и технических средств, программного обеспечения, баз данных и иных информационных ресурсов (далее – Услуги) на основании согласованных Сторонами Заявок на оказание услуг (далее – Заявки, Заявки на оказание услуг). В согласованных Сторонами Заявках на оказание услуг содержатся название и описание услуг, важность (приоритет совершения определенных действий и/или осуществления определенной деятельности), объем и сложность (трудозатраты), сроки оказания и стоимость услуг, а также, при необходимости, иные условия. 2.3. Стороны приняли и согласовали, что работы и услуги по настоящему договору могут оказываться Подрядчиком в пользу указанных Заказчиком третьих лиц. 2.4. Работы (Услуги) по настоящему договору выполняются Подрядчиком лично, без привлечения третьих лиц. 2.5. Все любые результаты работ (услуг) и исключительные права на них, созданные Подрядчиком в результате исполнения настоящего Договора, передаются Заказчику и могут быть выражены, в том числе, кроме прочего, в виде отдельных или сложных программ ЭВМ, баз данных, отдельного программного кода, патчей, исправлений, модулей, произведений графики и дизайна, документации, а также модификаций или адаптаций указанных объектов. 2.6. Стоимость материальных носителей, на которых передаются результаты интеллектуальной деятельности, включены в стоимость работ/услуг по Договору и дополнительно Заказчиком не оплачиваются, если Сторонами не предусмотрено иное для каждого отдельного случая. 2.7. Исключительные права на все любые результаты работ (услуг), выраженные в том числе, как в виде отдельных произведений, так и в виде модификаций и адаптаций, и созданные Подрядчиком в результате исполнения настоящего Договора, в том числе и в случае если такой результат работ (услуг) прямо не предусматривался и не оговаривался Сторонами, передаются Заказчику на условиях настоящего договора. Исключительные права на все любые результаты работ (услуг), передаются Заказчику на весь срок их действия и без ограничения территории и/или иных обременений со стороны Подрядчика и/или иных третьих лиц. 3. ПОРЯДОК СОГЛАСОВАНИЯ, ВЫПОЛНЕНИЯ И ПРИЕМКИ РАБОТ   3.1. Работы по настоящему договору выполняются Подрядчиком на основании Заданий, полученных от Заказчика и согласованных Сторонами к выполнению. Задания передаются Заказчиком Подрядчику по мере необходимости. 3.2. Если Сторонами не согласовано иное, передача Подрядчику Заданий и согласование таких Заданий Сторонами к выполнению осуществляется посредством информационных ресурсов в информационно-телекоммуникационной сети Интернет, на условиях настоящего договора. 3.3. Заказчик, в любое время действия настоящего Договора, направляет Подрядчику Задания на выполнение работ. В направляемых Заказчиком Заданиях на выполнение работ содержатся (укажите особенности соглашения и другие условия). 3.4. И далее - порядок согласования зависит от конкретных договоренностей сторон 4. ПОРЯДОК СОГЛАСОВАНИЯ, ВЫПОЛНЕНИЯ И ПРИЕМКИ УСЛУГ   4.1. Перечень, объем, вид услуг, сроки (в том числе периодические) их оказания и стоимость, иные условия, а также аппаратные и технические средства, ПО и базы данных, в целях обеспечении работоспособности которых осуществляется техническая поддержка, Стороны согласовывают на основании отдельных Заявок Заказчика на оказание услуг. 4.2. Если Сторонами не согласовано иное, передача Подрядчику Заявок и согласование таких Заявок Сторонами к выполнению осуществляется посредством информационных ресурсов в информационно-телекоммуникационной сети Интернет, на условиях настоящего договора. 4.3. И далее - порядок согласования зависит от конкретных договоренностей сторон 5. ВЫБОР ИНФОРМАЦИОННЫХ РЕСУРСОВ В ИНФОРМАЦИОННО-ТЕЛЕКОММУНИКАЦИОННОЙ СЕТИ ИНТЕРНЕТ ДЛЯ ВЗАИМОДЕЙСТВИЯ СТОРОН ДОГОВОРА.   5.1. Передача, корректировка, согласование Сторонами Заданий (Заявок на оказание услуг), характеристик Заданий (Заявок на оказание услуг), списков принятых работ и выполненных Заданий, Заявок на оказание услуг, возражений и иных соглашений, приложений, документов и комментариев осуществляется Сторонами посредством электронной почты и/или иной согласованной Сторонами информационной системы управления проектами, позволяющей установить отправителя и адресата передаваемого сообщения и информации, а также дату и время отправки. Фактом согласования Сторонами выбора информационной системы управления проектами является фактическое осуществление Сторонами передачи, корректировки и согласования Заданий (Заявок на оказание услуг), характеристик Заданий (Заявок на оказание услуг), списков принятых работ и выполненных Заданий, Заявок на оказание услуг, возражений, и иных соглашений, приложений, документов и комментариев в такой информационной системе. 5.2. Выбор информационной системы управления проектами осуществляется Заказчиком и согласовывается Сторонами путем направления, посредством электронной почты, Заказчиком информации Подрядчику о такой системе и обеспечения возможности его регистрации в указанной системе. В случае отсутствия мотивированных возражений со стороны Подрядчика, в срок не более 2 (двух) рабочих дней с момента отправки Заказчиком Подрядчику электронного письма о выбранной информационной системе управления проектами, такая система считается согласованной Сторонами. 5.3. . . . 6. ПЕРЕДАЧА ИСКЛЮЧИТЕЛЬНЫХ ПРАВ   В этом разделе регулируется передача Заказчику прав на программное обеспечение. 7. ПРАВА И ОБЯЗАННОСТИ СТОРОН   Очень часто к разделу права и обязанности Стороны подходят формально. Но, именно в этом разделе мы регулируем важные вопросы взаимодействия Сторон, в том числе, связанные с разрешением ряда ситуаций, до того как они станут спорными. Например, в случаях, согласованных Сторонами в разделе Права и обязанности, Исполнитель вправе приостановить или отказать в приеме новых заданий либо внесений изменений в уже существующие задания без ущерба для себя и без изменения цены работы. Заказчик же, со своей стороны, будет заранее осведомлен о рабочих процессах и, в конечном итоге, корректно спланирует бюджет и сроки на выполнение заданий. На основе согласованного Сторонами, в разделе Права и обязанности, порядка взаимодействия Сторон и выполнения заданий, в тексте Договора уже легко можно разрешить спорные вопросы о том, какими законными способами можно воздействовать на Исполнителя в случае нарушений договоренностей, что делать Исполнителю, когда Заказчик злоупотребляет своим правом на подачу заявок о внесении изменений в согласованные задания, когда подача изменений в задание по сути формирует новую задачу, не связанную с уже проделанной работой, которая попросту уже не нужна Заказчику и он планирует ее не оплачивать, или когда подаются изменения в задание, а срок исполнения задания не изменяется, когда, под видом проверки исполнения задания Заказчик затягиваются сроки его утверждения и, соответственно, внесения окончательной оплаты, и многие, многие другие моменты. 8. ПОРЯДОК ОПЛАТЫ   9. ОТВЕТСТВЕННОСТЬ СТОРОН   10. КОНФИДЕНЦИАЛЬНОСТЬ   В этом разделе мы указываем условия соблюдения конфиденциальности Сторонами. 11. ОТКАЗ ОТ ДОГОВОРА   12. ДЕЙСТВИЕ ОБСТОЯТЕЛЬСТВ НЕПРЕОДОЛИМОЙ СИЛЫ   13. ПОРЯДОК РАЗРЕШЕНИЯ СПОРОВ   14. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ   14.1. Любая Сторона договора не вправе передавать свои права и обязательства по настоящему договору иным лицам без письменного согласия другой Стороны. 14.2. В случае изменения у какой-либо из Сторон местонахождения, наименования, банковских реквизитов и прочей информации, способной повлиять на надлежащее исполнение сторонами своих обязательств, такая Сторона обязана письменно известить об этом другую Сторону, причем в письме необходимо указать, что оно является неотъемлемой частью настоящего договора. 14.3. Настоящий договор, а так же приложения, дополнительные соглашения, спецификации к нему могут быть заключены путем . . . Далее - порядок заключения договора с помощью выбранного Сторонами способа и порядок обмена документами. 15. СРОК ДЕЙСТВИЯ ДОГОВОРА   15.1. Срок действия договора — по ▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒г. включительно. 15.2. В случае выполнения Сторонами своих прав и обязанностей по настоящему договору после наступления даты окончания срока действия договора, в таком случае если иное, для каждого отдельного случая не оговорено Сторонами, Договор, безусловно, пролонгируется на один год. 16. РЕКВИЗИТЫ И ПОДПИСИ СТОРОН   … материал дополняется…`}).add({id:7,href:"/blog/gde-dogovor/",title:"Зачем нужен договор разработчикам, или -у меня есть договор на одну страницу и все нормально.",description:"Разбираемся, зачем нужен хороший детальный договор программистам и IT специалистам.",content:`Как ни странно, часто задают вопрос, зачем нужен договор вообще, или «вот же он - на одной странице есть и все нормально». Причин, зачем нужен договор программистам и другим it специалистам много, но разберем одну, значимую, в общих чертах. Итак, что такое договор: Статья 420. Понятие договора. Гражданский кодекс РФ. Договором признается соглашение двух или нескольких лиц об установлении, изменении или прекращении гражданских прав и обязанностей. В реальном мире договор - это не обязательно бумажный документ с подписями сторон. Статья 434. Форма договора. Гражданский кодекс РФ. Договор может быть заключен в любой форме, предусмотренной для совершения сделок, если законом для договоров данного вида не установлена определенная форма. Если стороны договорились заключить договор в определенной форме, он считается заключенным после придания ему условленной формы, хотя бы законом для договоров данного вида такая форма не требовалась. Договор в письменной форме может быть заключен путем составления одного документа (в том числе электронного), подписанного сторонами, или обмена письмами, телеграммами, электронными документами либо иными даннымие в соответствии с правилами абзаца второго пункта 1 статьи 160 настоящего Кодекса. Как мы видим, заключение договора - это не всегда подписание листочка бумаги сторонами  . Более того, Статья 432. Основные положения о заключении договора. Гражданский кодекс РФ. Договор считается заключенным, если между сторонами, в требуемой в подлежащих случаях форме, достигнуто соглашение по всем существенным условиям договора. Существенными являются условия о предмете договора, условия, которые названы в законе или иных правовых актах как существенные или необходимые для договоров данного вида, а также все те условия, относительно которых по заявлению одной из сторон должно быть достигнуто соглашение. Что же все это значит? Рассказываю. К примеру, разработчик приложения или сайта, в переписке со своим Заказчиком согласовал все существенные условия, необходимые для заключения договора и выполнения работ. Стороны подписали какой-то “договор из интернетов”, на одной страничке. И далее, еще и продолжают уточнять условия работы в переписке. При этом «договор из интернетов» не меняется и не дополняется от заказа к заказу. В лучшем случае, обычно к договору, прикладывается обобщенное ТЗ, которое еще больше вносит неясностей, так как его толком никто и не составлял. Еще есть “брифы”, про которые так же забывают, но при этом, в некоторых случаях, это единственный подписанный документ, отражающий волю Заказчика. Далее, у Сторон, в зависимости от ситуации, возникают разные интерпретации их взаимоотношений, в том числе и при сдаче работ и окончательном расчете. Заказчик считает, что он вправе требовать всего того, что согласовал в переписке, и чаще всего без увеличения оплаты, а разработчик думает, что переписка – это только пожелания, не согласованные сторонами и их не обязательно выполнять, и ссылается на «договор из интернетов». Что интересно, обычно в переговорах разработчики (в переписке) программисты, дизайнеры и т.д. немного преувеличивают свои возможности, или возможности будущего приложения. Так вот, Заказчик может воспользоваться судебной защитой, и уже там будут исследоваться все письменные доказательства, представленные сторонами. И вполне вероятно, что суд примет во внимание переписку сторон как доказательство возникновения определённых обязательств. И не важно где - в эл. почте, WhatsApp, Telegram и т.д. эти обязательства зафиксированы.   К письменным доказательствам, п.1. ст. 71 ГПК РФ относит, в том числе акты, договоры, справки, деловая корреспонденция, иные документы и материалы, выполненные в форме цифровой, графической записи, в том числе полученные посредством факсимильной, электронной или другой связи, с использованием информационно-телекоммуникационной сети “Интернет”, документы, подписанные электронной подписью в порядке, установленном законодательством Российской Федерации, либо выполненные иным позволяющим установить достоверность документа способом. Аналогичным образом, к письменным доказательствам п.3 ст. 75 АПК РФ, относит документы, полученные посредством факсимильной, электронной или иной связи, в том числе с использованием информационно-телекоммуникационной сети “Интернет”, а также документы, подписанные электронной подписью в порядке, установленном законодательством Российской Федерации, допускаются в качестве письменных доказательств в случаях и порядке, которые предусмотрены настоящим Кодексом, другими федеральными законами, иными нормативными правовыми актами или договором. В заключении можно привести в пример судебное дело, где в качестве доказательства согласования сторонами определённых условий договора суд принял изображение эмодзи, переданное WhatsApp, которое в обычно принятом и распространенном понимании при общении посредством электронной переписки означает «хорошо», и тем самым взыскал в продавца полученный им аванс.   Вывод такой, если не хотите работать больше чем нужно, отвечать за странные и избыточные обязательства, детально и четко пишите все условия в договор. И конечно, нанимайте квалифицированных юристов!   На тему статьи и для размышления: Статья 438. Акцепт. Гражданский кодекс РФ. Акцептом признается ответ лица, которому адресована оферта, о ее принятии. Акцепт должен быть полным и безоговорочным. Молчание не является акцептом, если иное не вытекает из закона, соглашения сторон, обычая или из прежних деловых отношений сторон. Совершение лицом, получившим оферту, в срок, установленный для ее акцепта, действий по выполнению указанных в ней условий договора (отгрузка товаров, предоставление услуг, выполнение работ, уплата соответствующей суммы и т.п.) считается акцептом, если иное не предусмотрено законом, иными правовыми актами или не указано в оферте.`}).add({id:8,href:"/blog/iskluchit-pravo/",title:"Исключительное право - базовые принципы 1. Это нужно знать.",description:"Узнаем, некоторые правовые особенности владением программой или другим объектом интеллектуальной собственности.",content:`Иногда приходится слышать утверждение: “я собственник этого проекта, программы, кода или сайта. Мне это все принадлежит”. Разбираемся, почему это не совсем и не всегда так. Начнем с того, что, по общему правилу, право собственности - это вещное имущественное право. Раздел II. ПРАВО СОБСТВЕННОСТИ И ДРУГИЕ ВЕЩНЫЕ ПРАВА Глава 13. ОБЩИЕ ПОЛОЖЕНИЯ Статья 209. Содержание права собственности. Гражданский кодекс РФ. Собственнику принадлежат права владения, пользования и распоряжения своим имуществом. Написано содержательно и понятно, однако, к программам и другим объектам интеллектуальной собственности это право не применимо. И вот почему. Право собственности - это вещное право, условно говоря, применимое к соответствующим материальным объектам, которыми можно физически обладать, а мы рассматриваем объекты интеллектуальной собственности. Интеллектуальной собственности посвящен отдельный раздел Гражданского кодекса РФ. Читаем: Статья 1226. Интеллектуальные права.Гражданский кодекс РФ. На результаты интеллектуальной деятельности и приравненные к ним средства индивидуализации (результаты интеллектуальной деятельности и средства индивидуализации) признаются интеллектуальные права, которые включают исключительное право, являющееся имущественным правом, а в случаях, предусмотренных настоящим Кодексом, также личные неимущественные права и иные права (право следования, право доступа и другие). Статья 1227. Интеллектуальные права и вещные права. Гражданский кодекс РФ. Интеллектуальные права не зависят от права собственности и иных вещных прав на материальный носитель (вещь), в котором выражены соответствующие результат интеллектуальной деятельности или средство индивидуализации. Переход права собственности на вещь не влечет переход или предоставление интеллектуальных прав на результат интеллектуальной деятельности или на средство индивидуализации, выраженные в этой вещи, за исключением случая, предусмотренного абзацем вторым пункта 1 статьи 1291 настоящего Кодекса. К интеллектуальным правам не применяются положения раздела II настоящего Кодекса, если иное не установлено правилами настоящего раздела. Эти права, хоть во многом и схожи с вещными, однако, в отличие от них, возникают на нематериальные объекты (произведения, к коим относятся и программы, изобретения, товарные знаки и пр.), что исключает возможность обладания ими как вещью. Поэтому законодатель специально указал, в п.3. ст. 1227 ГК РФ, что **положения раздела II Кодекса, право собственности и другие вещные права, не применяются.**   Таким образом, например к программам, понятие права собственности, в том общеизвестном контексте, которым мы привыкли оперировать в обиходе, не применимо. Равнозначной «заменой» права собственности в контексте вещного права для объектов интеллектуальной собственности (да, также определено законодателем как собственность) является исключительное право. Именно обладанием этим правом дает возможность правообладателю распоряжаться объектами интеллектуальной собственности по своему усмотрению любым не противоречащим закону способом. Непонимание этого может послужить причиной ряда роковых ошибок для их обладателя. И вот несколько существенных характеристик исключительного права. Практически все исключительные права имеют срок действия. Статья 1230. Срок действия исключительных прав. Гражданский кодекс РФ. Исключительные права на результаты интеллектуальной деятельности и на средства индивидуализации действуют в течение определенного срока, за исключением случаев, предусмотренных настоящим Кодексом. Продолжительность срока действия исключительного права на результат интеллектуальной деятельности или на средство индивидуализации, порядок исчисления этого срока, основания и порядок его продления, а также основания и порядок прекращения исключительного права до истечения срока устанавливаются настоящим Кодексом. Или в случае программ ЭВМ, закон оговаривает некоторые особенные права пользователей Статья 1280. Право пользователя программы для ЭВМ и базы данных. Гражданский кодекс РФ. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения изучать, исследовать или испытывать функционирование такой программы в целях определения идей и принципов, лежащих в основе любого элемента программы для ЭВМ, путем осуществления действий, предусмотренных подпунктом 1 пункта 1 настоящей статьи. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой, при соблюдении следующих условий… Возникновение исключительного права у Заказчика зависит от статуса автора. Например, в случае если автор физическое лицо, такое право не связано с фактом оплаты автору за работу. Если Заказчик отдельно не выкупил у автора исключительное право или не приобрел права на использование произведения, то он вообще не приобрел прав на объект интеллектуальной собственности: Статья 1288. Договор авторского заказа. Гражданский кодекс РФ. По договору авторского заказа одна сторона (автор) обязуется по заказу другой стороны (заказчика) создать обусловленное договором произведение науки, литературы или искусства на материальном носителе или в иной форме. Материальный носитель произведения передается заказчику в собственность, если соглашением сторон не предусмотрена его передача заказчику во временное пользование. Договор авторского заказа является возмездным, если соглашением сторон не предусмотрено иное. Договором авторского заказа может быть предусмотрено отчуждение заказчику исключительного права на произведение, которое должно быть создано автором, или предоставление заказчику права использования этого произведения в установленных договором пределах. В случае, когда договор авторского заказа предусматривает отчуждение заказчику исключительного права на произведение, которое должно быть создано автором, к такому договору соответственно применяются правила настоящего Кодекса о договоре об отчуждении исключительного права, если из существа договора не вытекает иное. Если договор авторского заказа заключен с условием о предоставлении заказчику права использования произведения в установленных договором пределах, к такому договору соответственно применяются положения, предусмотренные статьями 1286 и 1287 настоящего Кодекса.`}).add({id:9,href:"/blog/iskluchit-pravo-na-site/",title:"Исключительное право на сайт. Что же передает веб-студия своему клиенту?",description:"Разбираем что такое сайт с точки зрения права, как и какие права передавать на сайт.",content:`Часто в договорах на разработку сайтов в разделе передачи интеллектуальных прав пишут что-то подобное: “Исполнитель передает Заказчику исключительное право на сайт” и на этом ограничиваются. В этой статье разберём, что такое сайт с точки зрения права, как и какие права передавать на сайт, и понимать, что вообще происходит. Отсутствие в договоре между Заказчиком и Исполнителем четких формулировок о самом сайте, в том числе понятийных, его составных частях, о возникающих в процессе исполнения заказа правах, их передаче, может привести Стороны в состояние конфликта, просто по причине непонимания того, о чем они договорились. Также надо понимать, что далеко не всегда Исполнитель передает именно исключительные права на сайт, просто по причине того, что и сам такими правами не обладает.   Итак, вернемся к формулировке в договоре "…передает исключительное право…". Исключительное право, это проще говоря, базовое право, позволяющее его обладателю распоряжаться объектом интеллектуальной собственности не только в условиях какого-либо соглашения или договора, но и в любых других, не запрещенных законом случаях. ГК РФ Статья 1229. Исключительное право Гражданин или юридическое лицо, обладающие исключительным правом на результат интеллектуальной деятельности или на средство индивидуализации (правообладатель), вправе использовать такой результат или такое средство по своему усмотрению любым не противоречащим закону способом. Правообладатель может распоряжаться исключительным правом на результат интеллектуальной деятельности или на средство индивидуализации (статья 1233), если настоящим Кодексом не предусмотрено иное. Правообладатель может по своему усмотрению разрешать или запрещать другим лицам использование результата интеллектуальной деятельности или средства индивидуализации. Отсутствие запрета не считается согласием (разрешением). Подробнее об исключительном праве читайте в соответствующей статье нашего блога. Теперь рассмотрим что такое сайт с точки зрения законодателя. Федеральный закон “Об информации, информационных технологиях и о защите информации” от 27.07.2006 N 149-ФЗ Статья 2. Основные понятия, используемые в настоящем Федеральном законе 13) сайт в сети “Интернет” - совокупность программ для электронных вычислительных машин и иной информации, содержащейся в информационной системе, доступ к которой обеспечивается посредством информационно-телекоммуникационной сети “Интернет” (далее - сеть “Интернет”) по доменным именам и (или) по сетевым адресам, позволяющим идентифицировать сайты в сети “Интернет”; Кроме того, для квалификации сайта как объекта авторских прав, сайт признается составным произведением, то есть права на сайт, у его автора, возникают в части подбора и расположения материала. ГК РФ Статья 1260. Переводы, иные производные произведения. Составные произведения Составителю сборника и автору иного составного произведения (антологии, энциклопедии, базы данных, интернет-сайта, атласа или другого подобного произведения) принадлежат авторские права на осуществленные ими подбор или расположение материалов (составительство). Авторские права переводчика, составителя и иного автора производного или составного произведения охраняются как права на самостоятельные объекты авторских прав независимо от охраны прав авторов произведений, на которых основано производное или составное произведение. Пока все отлично. Сделали сайт, передали Заказчику исключительное право на осуществленный подбор или расположение материалов (составительство). Но теперь и начинается самое интересное. Сайт, это еще и совокупность программ и иной информации. А что если Исполнитель сделал скрипт или написал программу, условный модуль, который работает вместе с сайтом. Например, формирует выборку из базы данных, или наоборот принимает и обрабатывает от пользователя сайта какие-либо сведения. Или создал несколько графических элементов. В таком случае, Исполнитель является и автором-составителем сайта и автором произведения, помещенного в составном произведении - сайте. Но как оговаривалось Сторонами создание такой программы или графики? Скорее всего, никак. А если создатель сайта захочет использовать такую программу в другом заказе, это допустимо для него или нет? А если Заказчик захочет использовать графику сайта в своем фирменном стиле или в оформлении магазина? Ответы на эти вопросы вроде бы логичны, но где о них указано в договоре? А может быть, закон это регулирует? Смотрим: ГК РФ Статья 1296. Произведения, созданные по заказу Исключительное право на программу для ЭВМ, базу данных или иное произведение, созданные по договору, предметом которого было создание такого произведения (по заказу), принадлежит заказчику, если договором между подрядчиком (исполнителем) и заказчиком не предусмотрено иное. Или ГК РФ Статья 1297. Произведения, созданные при выполнении работ по договору Исключительное право на программу для ЭВМ, базу данных или иное произведение, созданные при выполнении договора подряда либо договора на выполнение научно-исследовательских, опытно-конструкторских или технологических работ, которые прямо не предусматривали создание такого произведения, принадлежит подрядчику (исполнителю), если договором между ним и заказчиком не предусмотрено иное. А если автор физическое лицо, а не, например, студия – группа разработчиков и дизайнеров. Тогда действует статья 1288 ГК РФ Авторский заказ, в которой вообще не предусматривается передача каких-либо прав по умолчанию.   ГК РФ Статья 1288. Договор авторского заказа По договору авторского заказа одна сторона (автор) обязуется по заказу другой стороны (заказчика) создать обусловленное договором произведение науки, литературы или искусства на материальном носителе или в иной форме. Материальный носитель произведения передается заказчику в собственность, если соглашением сторон не предусмотрена его передача заказчику во временное пользование. Договор авторского заказа является возмездным, если соглашением сторон не предусмотрено иное. Договором авторского заказа может быть предусмотрено отчуждение заказчику исключительного права на произведение, которое должно быть создано автором, или предоставление заказчику права использования этого произведения в установленных договором пределах.     Вывод такой, чтобы не гадать, что кому принадлежит, необходимо, кроме сухого указания "…передает исключительное право на сайт (составное произведение)…" в договоре согласовывать какие элементы сайта будут созданы или модифицированы Заказчиком, и какие права будут переданы на виды таких элементов. Даже если вы маленькая студия или самостоятельный автор, все равно указывайте такое. Отсутствие регулирования передачи таких прав рано или поздно может не только лишить вас дополнительной прибыли, но и привести к убыткам.`}).add({id:10,href:"/blog/peregovory/",title:"Как защитить конфиденциальную информацию при переговорах",description:"Полезная статья о том, как защитить конфиденциальную информацию на переговорах.",content:`Рассмотрим следующую ситуацию. К вам приходит будущий партнёр, клиент, инвестор (контрагент), вы проводите переговоры по будущему взаимодействию, в конечном итоге заключение договора не происходит, кроме того впоследствии вторая сторона исчезает и вы узнаете о применении ею полученной информации в своих коммерческих целях. Знакомо? С целью исключения такого результата необходимо воспринимать каждого контрагента как потенциального конкурента, с которым необходимо готовиться к переговорам. И, даже если вы не выйдете на заключение договора, ваша конфиденциальная информация не пострадает. Для этого, в первую очередь, необходимо: Выделить отдельных лиц со своей стороны для взаимодействия с контрагентами. Наделить их соответствующими полномочиями и ответственностью. Заключить с ними соглашения о неразглашении конфиденциальной информации и оформить иные, требуемые для переговоров документы. Подготовить программу переговоров и состав информации, используемой в ходе переговоров. Не передавать больше информации, чем того требуется. Определить порядок проведения переговоров, прохода приглашенных лиц, ведение ими записей. Подготовить переговорную с таким расчетом, чтобы не произошла утечка информации. Не пользоваться электронной передачей данных до наступления конкретного этапа сделки. Заключить с контрагентом, до проведения переговоров, соглашение о неразглашении конфиденциальной информации, которая передается ей другой стороной в ходе переговоров. Это предусмотрено ст. 434.1 Гражданского кодекса РФ. Проверять полномочия представителей, действующих от имени контрагента при каждом акте переговоров. Желательно, чтобы это были руководители отделов/начальники проектов и т.п. контрагента. Участие таких лиц, во-первых покажет заинтересованность контрагента в заключении договора, а во-вторых, повысит имущественную ответственность.   Вывод. Заключать NDA до проведения переговоров - это абсолютно нормальная и полезная практика!`}).add({id:11,href:"/blog/pravo-na-site/",title:"Как подтвердить исключительное право на сайт.",description:"Отвечаем на вопрос - как подтвердить исключительное право на сайт, какие документы нужны и на что необходимо обратить внимание.",content:`В статье нашего блога мы разбирали, что такое - исключительное право на сайт. Однако на тему подтверждения прав на сайт до сих пор существует множество споров и разногласий у разработчиков. Так как же все-таки подтвердить исключительные права на сайт. Мы разобрали, что сайт - это составное произведение, и исключительное право на сайт необходимо передавать именно в таком контексте. Кроме того мы рекомендуем указывать и отдельные разработанные Исполнителем элементы сайта, такие как элементы графики, дизайн страниц, фотографии, видео и т.д. которые были изготовлены и права на которые были переданы заказчику. Но, что в итоге. Отвечаем, как подтвердить права на сайт и где будет зафиксировано, что сайт принадлежит определенному лицу. Если сайт создавал ИП или юр.лицо, в таком случае у Заказчика должен быть договор на создание сайта с этим лицом - это обязательный пункт подтверждения прав на сайт. Помимо договора должно быть правильно оформленное задание и проведение оплаты за работы (услуги) и права на сайт и элементы сайта - это еще один пункт подтверждения прав. Далее, важный пункт, по завершению работы по договору стороны составляет акт приемки работ (услуг) и акт приема-передачи прав на сайт и элементов такого сайта. Правильное оформление и содержание этих документов особенно важно. Именно в совокупности исполнения всех указанных основных пунктов, при прочих выполненных условиях договора и сопровождающих его документов и соблюдения авторских прав авторов использованных произведений (при их наличии), можно будет утверждать, что исключительные права переданы и подтверждены. Стоит отметить, что в указанной статье не рассматривался вопрос о наличии и объеме прав у разработчика на элементы сайта, в том числе на средства разработки, CMS и т.д., использованные при разработке сайта, которые будут рассмотрены по мере выхода новых статей.   Задать вопрос можно по ссылке в футере сайта.`}).add({id:12,href:"/blog/scrum-v-dogovor/",title:"Когда и зачем включать условия SCRUM в договор.",description:"Стоит ли включать условия Scrum в договор разработки приложения (программы) или сайта.",content:`Разбираемся, стоит ли включать условия Scrum в договор разработки приложения (программы) или сайта. Насколько вообще необходимо указывать в договоре, что разработчики используют Scrum. Будем рассматривать этот кейс в условиях разработки условного приложения IT компанией или ИП (Исполнитель) с программистами, тестировщиками, дизайнерами и другими IT специалистами, где такие IT специалисты оформлены либо как работники по трудовым договорам, либо по гражданским договорам. И конечно, Заказчика, который хочет видеть в названии договора, в предмете и далее в тексте конечный результат, его описание и может даже характеристики. Так как мы рассматриваем случай создания работающего приложения IT компанией или ИП с сотрудниками/привлеченными специалистами, будем руководствоваться статьей Гражданского кодекса 1296 «Произведения, созданные по заказу». В этом случае предметом договора будет конечный результат - созданное произведение, условная программа ЭВМ. Что, собственно и нужно Заказчику. Отметим, что в некоторых случаях соглашение Сторон о разработке приложения допустимо облечь в виде Договора на оказание информационных услуг. Этот вариант взаимодействия ближе к Agile философии и, возможно, в конкретных условиях будет более продуктивным для реализации проекта. Но в таком случае важно не получить недействительную сделку и выполнить ряд определенных условий, которые могут совершенно не понравится Заказчику. Мы вернемся к этой теме в этом блоге еще раз. Но сразу отмечу, что нельзя просто назвать Договор на разработку приложения Договором на оказание IT услуг, это так не работает. Теперь обратим внимание на SRUM Guide с точки зрения договора разработки приложения и материальных интересов Исполнителя и Заказчика. Источник: Руководство по Scrum с официального сайта. Product Backlog — это упорядоченный и постоянно обновляемый список того, что необходимо для улучшения продукта. Это единственный источник работы, выполняемой Scrum Team. Product Owner несет ответственность за максимизацию ценности продукта, получаемого в результате работы Scrum Team. … Product Owner также несет ответственность за эффективное управление Product Backlog, в том числе он: разрабатывает и точно коммуницирует Product Goal; создает и четко объясняет элементы Product Backlog; упорядочивает элементы Product Backlog; а также, обеспечивает прозрачность, доступность и понимание Product Backlog. А вот какое пояснение дает официальный сайт scrum.org на тему Product Owner: Помимо ответственности за максимизацию ценности продукта и работы Scrum-команды, владелец продукта несет ответственность за эффективное управление бэклогом продукта, сообщение о цели продукта, упорядочивание бэклога продукта и обеспечение прозрачности бэклога продукта. Владелец продукта может делать эти вещи или может делегировать ответственность другим. Даже если ответственность делегирована, Владелец продукта остается ответственным. Что же, как мы видим, в Scrum ответственность за максимизацию ценности продукта, получаемого в результате работы Scrum Team и за Product Backlog находится у Product Owner, значимость этого списка в Scrum и так понятна по определению. Ответственность Product Owner в данном случае - это не только степень вины в случае неудач, но и право принимать решения в процессе разработки программы. И тут мы получаем несколько кейсов, которые до сих пор обсуждаются в англоязычном Srum сообществе, кто есть фактически Product Owner. Рассмотрим несколько вариантов: Product owner сотрудник Исполнителя или нанятый им специалист. То есть вообще вся Scrum team находится под контролем Исполнителя. И вполне возможно, что в таком случае применение SRUM внутреннее дело и инициатива Исполнителя. Тогда возникает разумный вопрос, зачем вообще сообщать Заказчику о работе команды в соответствии с правилами Scrum. Product owner для Заказчика выглядит просто как ответственное за коммуникации лицо Исполнителя. И в этом случае на этом можно ставить точку. Все тоже самое, как и в первом варианте, но Заказчик и Исполнитель согласовали, что и Product owner коммуницирует с Заказчиком в рамках и с применением Scrum, и сами стороны договора также взаимодействуют в рамках Scrum. Это самый плохой и чаще всего применяемый вариант. По сути, Исполнитель декларирует статус Product owner как лица, ответственного за проект и берет на себя ответственность не только за разработку приложения, но и за работу Product owner. То есть одновременно Заказчику оказывается и услуга условно консультации и ведения проекта Product owner, и выполняется разработка приложения. И в таком случае, в отличие от первого варианта, Product owner фактически обслуживает проект как отдельное лицо, имеет право давать некие значимые указания, но при этом за его действия несет ответственность только Исполнитель. Если Product owner «накосячил» или, в крайнем случае, исчез, то все убытки лягут на плечи Исполнителя и ничего с этим он поделать не сможет. Это неотвратимый тупик в отношениях сторон и, если так выразиться, жестоко по отношению к Исполнителю. Это одна из многих причин, почему Scrum критикуют. Как вариант такое взаимодействие можно трансформировать в кейс, когда Заказчик нанимает независимого Product owner по отдельному договору со всей присущей такой работе ответственностью. Или хотя бы заключить отдельное соглашение на предоставление услуги Product owner Заказчику. Product owner – сотрудник, представитель Заказчика. В таком случае начинается самое интересное. Для лучшего понимания предлагаю называть характер отношений Сторон своими именами. А именно: Исполнитель, под управлением Заказчика, обязуется под свою ответственность (ответственность Исполнителя) достичь определенных, согласуемых в процессе исполнения договора целей. Странно, да. При том конечный результат может быть и не достигнут или достигнут в другие сроки или вообще результат может быть другой. В таком случае, если мы и применяем конструкцию ст. 1296 ГК РФ «Произведения, созданные по заказу», то должны в договоре очень четко и подробно оговорить ограничение ответственности Исполнителя в зависимости от действий/бездействий представителя Заказчика в лице Product Owner. Так же, кроме ограничения ответственности необходимо указать и другие немаловажные юридические скучности, которыми не стоит раздувать эту статью. А иначе можно получить такой тупик в отношениях Сторон, из которого выбраться Исполнитель сможет, только приняв всю ответственность за действия Product owner на себя, либо перейти в стадию судебного разбирательства с очень и очень большими судебными издержками.   Совет Вот пример основных пунктов Договора на разработку программного обеспечения (метод SCRUM). Ознакомившись с указанным примером, вы, кроме прочего, можете понять, что разрешенные действия/бездействия с точки зрения SCRUM не всегда допустимы с точки зрения права и, как следствие, требуют регулирования в тексте договора.`}).add({id:13,href:"/blog/about-nda/",title:"Опасности NDA (соглашения о неразглашении)",description:"Просто об NDA. Определение, общие опасности и советы.",content:`Nda (Non-disclosure Agreement), а именно соглашение о неразглашении - документ, который пришел к нам из англосаксонского права. Очень часто Nda заключается в IT компаниях со своими сотрудниками или подрядчиками с целью предотвратить распространение последними конфиденциальной информации. Иногда, ошибочно, на NDA возлагают такие возможности, как запрет сотрудниками или подрядчикам на повторную разработку или реализацию какого-либо продукта. Однако, такое условие реализуемо только в совокупности заключения нескольких соглашений, в том числе и в области авторского права. Возлагать такое только на NDA совершенно безосновательно. Тем не менее, соглашение о неразглашении достаточно сложный документ по свое природе, который базируется на многочисленных нормативно-правовых актах, в числе которых: Федеральный закон «Об информации, информационных технологиях и о защите информации»; Федеральный закон “О коммерческой тайне”; Гражданский кодекс, в том числе положения о свободе договора; Трудовой кодекс; Федеральный закон “О персональных данных”. Применение этих положений в соглашении о неразглашении требует от Сторон четкого понимания условий такого соглашения и, самое главное, возможности их исполнения. При этом важно обращать внимание и на составление текса соглашения, исключающего всякую неопределенность, неясность, разную трактовку его положений и разночтений. Потому как совпадение воли (чего желали стороны) и волеизъявления (выражение воли в тексте соглашения) презюмируется. Например, подписывая NDA на “космическую” сумму, сотрудник или подрядчик должен понимать вполне неиллюзорную возможность получить претензию на такую сумму. А что, если условия передачи информации не оговорены? Или такие условия не исключают утечку информации? Например, передача с помощью эл. почты. посредством мессенджера и т. п. Или состав конфиденциальной информации указан обобщительно, Например, “вся информация, касающаяся коммерческой деятельности”. А где начинается и заканчивается ответственность каждой из Сторон за утечку информации? А какие лица от Заказчика (контрагента) передают информацию и находятся ли они под действием аналогичных соглашений?   Все эти и многие другие вопросы должны быть согласованы Сторонами в соглашении о неразглашении. Просто скачать рандомное NDA и использовать его без понимания - это совершенно пустая трата времени и ресурсов.`}).add({id:14,href:"/blog/uvely-cod/",title:"Переход исключительного права от разработчика к заказчику.",description:"Как регулировать права на приложение при заказе его разработки у программистов. Интересные особенности перехода прав от авторов к заказчику.",content:`Каждый проект начинается с идеи, концепции и т.д. Важно понимать, что до определенного момента разработки программы, сайта или другого объекта авторских прав, сотрудничество автора и заказчика находится под защитой NDA, если такое соглашение конечно корректно и подписано. В ином случае, если кто-то угнал вашу идею, которую вы направо и налево транслировали, это обычный случай. Идея не защищена авторским правом, если что. ГК РФ Статья 1259. Объекты авторских прав Авторские права не распространяются на идеи, концепции, принципы, методы, процессы, системы, способы, решения технических, организационных или иных задач, открытия, факты, языки программирования, геологическую информацию о недрах. Но, когда вы обнаруживаете клон своего приложения, который выпущен чуть позже, это уже сложная проблема и потеря денег, и просто наличие базового договора, в таком случае, не поможет. Посмотрим на сам факт заключения договора. С кем его заключил заказчик? Исполнитель по договору - это группа программистов, или один специалист, или юридическое лицо, или ИП, за которым стоит команда, и т. д.? Важно при заключении договора четко знать ответ на этот вопрос и установить ответственность за нарушение этого условия. И вот почему: Во-первых, получение готовой разработанной программы от разработчика(ов) это по сути передача определенных договором файлов, руководств, носителей информации и передача (возникновение) интеллектуальных прав. Логично, что бы возникновение таких прав у Заказчика на разработанную программу, происходило при условии, что стороной договора является автор, авторы или другое надлежащее лицо. В ином случае вы покупаете только заверения и пожелания.   Во-вторых, когда мы разобрались с кем заключать договор, нужно понимать что, есть два кейса взаимодействия при разработке, которые чаще всего применяются на практике. Это заказ разработки лично у автора программы и у команды (представленных в виде юридических лиц, ИП). В зависимости от субъектного состава правоотношений применяются разные нормы закона. Cт. 1288 ГК РФ договор авторского заказа и ст. 1296 ГК РФ произведения, созданные по заказу, соответственно. В тех случаях, когда произведение создается по заказу, отношения сторон договора, в котором стороной является автор, конкретное физическое лицо, регулируются статьей 1288 ГК РФ. Положения статьи 1296 ГК РФ применяются только к случаям, когда подрядчиком (исполнителем) договора заказа на создание произведения выступает лицо, которое само не является автором заказанного произведения. Указанные статьи определяют разный порядок возникновения и перехода интеллектуальных прав, в зависимости от того, с кем заключается договор.   В случае договора с разработчиком ПО напрямую действует: ГК РФ Статья 1288. Договор авторского заказа Договором авторского заказа может быть предусмотрено отчуждение заказчику исключительного права на произведение, которое должно быть создано автором, или предоставление заказчику права использования этого произведения в установленных договором пределах. А именно, если не оговорено иное, ваша программа не ваша, а автора (разработчика), и у вас (Заказчика), только возможность попросить автора принять на себя дополнительные обязанности по передаче заказчику имущественных прав на произведение.   Что же в другом случае? Исполнитель - условная команда представленная в виде юр.лица или ИП. Применяется ГК РФ Статья 1296. Произведения, созданные по заказу Исключительное право на программу для ЭВМ, базу данных или иное произведение, созданные по договору, предметом которого было создание такого произведения (по заказу), принадлежит заказчику, если договором между подрядчиком (исполнителем) и заказчиком не предусмотрено иное. Сам Исполнитель так же заключает с авторами Договор авторского заказа либо при наличии сотрудников, например трудовой договор по которому он получает права ГК РФ Статья 1295. Служебное произведение Исключительное право на служебное произведение принадлежит работодателю, если трудовым или гражданско-правовым договором между работодателем и автором не предусмотрено иное. Уже лучше, и вроде бы можно выдохнуть. Но, увы, подрядчик (исполнитель) (юр. лицо или ИП) в таком случае также выступает Заказчиком или Работодателем у автора (авторов)  , и мы опять возвращаемся к договору авторского заказа - ст. 1288 ГК РФ или к служебному произведению - ст. 1295 ГК РФ. Что в случае отсутствия между подрядчиком/исполнителем (работодалем/сотрудником) конкретных согласованных в договоре договоренностей, или отствия вообще соответствующего договора, обрушивает всю цепочку передачи исключительных прав и Заказчик опять покупает невыполнимые заверения и пожелания. И пусть вас не успокаивает п.2 Ст.1295, установить является ли автор сотрудником и есть ли у его работы статус служебного произведения еще целое дело. Что бы узнать, как этого избежать. Следите за нашим блогом.   Для внимательных и проницательных: ГК РФ Статья 1296. Произведения, созданные по заказу Правила настоящей статьи не распространяются на договоры, в которых подрядчиком (исполнителем) является сам автор произведения (статья 1288).`}).add({id:15,href:"/blog/co-authors/",title:"Соавторство в команде разработчиков. Когда нужно договариваться на берегу.",description:"Что будет, если заранее не заключить соглашение с соавторами. Разбираемся, как делятся права и доходы в зависимости от вклада в разработку.",content:`Собрались как-то два друга и сделали приложение. Вначале оно не пошло, прошло некоторое время, друзья заняты на разных проектах, и в один прекрасный момент одному из них поступило предложение. Он позвонил другу, не дозвонился…и самостоятельно распорядился (продал) таким приложением, попутно еще и доработав до требований клиента. “…А что, друг будет не против, и, вообще, он написал совсем немного, а я довел до ума, упаковал в красивый проект.” И так далее и тому подобное. А потом тебе прилетает иск и на такую сумму, которую не потянешь. Почему же так? Авторские права могут принадлежать нескольким лицам – соавторам. Причем, независимо от того, образует ли такое произведение неразрывное целое или состоит из частей, каждая из которых имеет самостоятельное значение (п.1. ст. 1258 ГК РФ). ГК РФ Статья 1258. Соавторство Граждане, создавшие произведение совместным творческим трудом, признаются соавторами независимо от того, образует ли такое произведение неразрывное целое или состоит из частей, каждая из которых имеет самостоятельное значение. Произведение, созданное в соавторстве, используется соавторами совместно, если соглашением между ними не предусмотрено иное. В случае, когда такое произведение образует неразрывное целое, ни один из соавторов не вправе без достаточных оснований запретить использование такого произведения. Часть произведения, использование которой возможно независимо от других частей, то есть часть, имеющая самостоятельное значение, может быть использована ее автором по своему усмотрению, если соглашением между соавторами не предусмотрено иное. К отношениям соавторов, связанным с распределением доходов от использования произведения и с распоряжением исключительным правом на произведение, соответственно применяются правила пункта 3 статьи 1229 настоящего Кодекса. Каждый из соавторов вправе самостоятельно принимать меры по защите своих прав, в том числе в случае, когда созданное соавторами произведение образует неразрывное целое. Так же, мы помним из других статей нашего блога, программы для ЭВМ охраняются как литературные произведения. Обратите внимание на пункт 2 Статьи 1258. Сразу возникает вопрос: а если соавтор сделал не так много, как другие. Как, например, разделять доходы от продажи исключительного права на произведение? Пункт 3 Статьи 1258 отсылает нас к пункту 3 Статьи 1229 Исключительное право, в которой устанавливается еще несколько совместно осуществляемых действий. Читаем. ГК РФ Статья 1229. Исключительное право … В случае, когда исключительное право на результат интеллектуальной деятельности или на средство индивидуализации принадлежит нескольким лицам совместно, каждый из правообладателей может использовать такой результат или такое средство по своему усмотрению, если настоящим Кодексом или соглашением между правообладателями не предусмотрено иное. Взаимоотношения лиц, которым исключительное право принадлежит совместно, определяются соглашением между ними. Распоряжение исключительным правом на результат интеллектуальной деятельности или на средство индивидуализации осуществляется правообладателями совместно, если настоящим Кодексом или соглашением между правообладателями не предусмотрено иное. Доходы от совместного использования результата интеллектуальной деятельности или средства индивидуализации либо от совместного распоряжения исключительным правом на такой результат или на такое средство распределяются между всеми правообладателями в равных долях, если соглашением между ними не предусмотрено иное. Каждый из правообладателей вправе самостоятельно принимать меры по защите своих прав на результат интеллектуальной деятельности или на средство индивидуализации. И независимо от того, какой творческий вклад внес каждый автор в создание произведения, он будет считаться полноправным соавтором и соправообладателем. Доли в соавторстве законом не предусмотрены. Не путайте с долями в распределении доходов. Указанное подтверждается в п.35 Постановления Пленума Верховного Суда РФ от 23.04.2019 N 10 «Исходя из положений пункта 2 статьи 1229 ГК РФ исключительное право на результат интеллектуальной деятельности или на средство индивидуализации (за исключением права на фирменное наименование) может принадлежать нескольким лицам совместно, в том числе при переходе по наследству. Указанное не означает наличия у данных лиц права на раздел принадлежащего им исключительного права и выдел из него долей.» А раз нет долей, значит, все разработчики условно равны. Еще раз напомню, это в случае, если нет соглашения. Итого.По умолчанию законом предусмотрено совместное распоряжение исключительным правом на произведение и распределение доходов от совместного использования или распоряжения произведением между всеми правообладателями в равных долях. Однако, эти правила могут быть изменены соглашением соправообладателей (п.3. ст. 1229 ГК РФ). Соавторство, как мы видим – это всегда соглашение о совместной работе, которое стороны «забывают» оформить на бумаге, что в конечном итоге приводит к недопонимаю и возникновению незапланированных судебных и иных расходов.   Поэтому, еще на стадии обсуждения проекта, разработчики должны сформулировать и документально закрепить не только рабочие процессы по созданию непосредственно продукта, но и достигнутые соглашения о совместной работе, об использовании/распоряжении результата своего творческого труда и распределении доходов.   Не все участники рабочего процесса создания произведения могут считаться соавторами. Творческий труд – вот ключевое отличие. Подробнее об этом вопросе – в будущих статьях нашего сайта.`}).add({id:16,href:"/docs/sogl-o-rastorgenii/",title:"Соглашение о расторжении договора на выполнение работ по созданию графических материалов и контента",description:"Oбщий образец Соглашения о расторжении договора на выполнение работ по созданию графических материалов и контента.",content:"Стороны пришли к соглашению досрочно расторгнуть заключенный между ними договор на выполнение работ по созданию графических материалов и контента №___ (далее Договор). Договор считается расторгнутым с момента подписания настоящего соглашения Сторонами. Обязательства сторон по договору прекращаются с момента его расторжения. До подписания настоящего Соглашения Стороны осуществили взаимный расчет. Подрядчик подтверждает, что Исключительные права на все любые результаты работ, созданные им по Договору, принадлежат Заказчику и оплачены последним в полном объеме. (В этом пункте Стороны подтверждают указанное, но передеча прав происходит с помощью других документов) Подписывая настоящее Соглашение Стороны подтверждают отсутствие имущественных и иных притязаний друг к другу и гарантируют невозможность возникновения подобных притязаний в будущем ни при каких обстоятельствах и не зависимо ни от каких положений законодательства. ░░░░░░░░ ░░░░░░░░░░░░░░░ ░░░░░░░░░░ ░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░ Настоящее соглашение составлено в двух экземплярах, имеющих одинаковую юридическую силу, по одному экземпляру для каждой из сторон.   *Внимание. Настоящее соглашение может быть использовано как шаблон для расторжения договора с программистом, однако, в таком случае необхожимо внести положение о заключенном ранее NDA и соответствующих действующих обязательствах.   *Внимание.Настоящее соглашение представлено является общей формой. Для каждого конткретного случая необходимо в соглашение вносить корректировки."}).add({id:17,href:"/docs/dogo-dist-trud-programmist/",title:"Трудовой договор с программистом. Дистанционная (удаленная) работа программиста.",description:"Образец Срочного Трудового Договора с программистом дистанционная (удаленная) работа. Порядок обмена документами с дистанционным работником",content:`1. ОБЩИЕ ПОЛОЖЕНИЯ   1.1. По настоящему Трудовому договору Работник обязуется выполнять обязанности по должности программист, вне места нахождения Работодателя, его филиала, представительства, иного обособленного структурного подразделения (включая расположенные в другой местности), вне стационарного рабочего места, территории или объекта, прямо или косвенно находящихся под контролем Работодателя (дистанционно), при условии использования для выполнения данной трудовой функции и для осуществления взаимодействия между Работодателем и Работником по вопросам, связанным с ее выполнением, информационно-телекоммуникационных сетей, в том числе сети Интернет, и сетей связи общего пользования, а Работодатель обязуется обеспечивать Работнику необходимые условия труда, предусмотренные трудовым законодательством, а также своевременную и полную выплату заработной платы. 1.2. По настоящему Трудовому договору работа выполняется дистанционно на постоянной основе в течение срока действия Трудового договора. 1.3. Работник лично исполняет обязанности, возложенные на него Трудовым договором, должностной инструкцией, которая является неотъемлемой частью настоящего Договора и иными локальными нормативными актами Работодателя. 1.4. Работа по настоящему Трудовому договору является для Работника основным местом работы. 1.5. Место выполнения трудовой функции Работник определяет самостоятельно, при этом такое место должно соответствовать обязательным требованиям качественного и своевременного выполнения трудовой функции и своевременного взаимодействия между Работодателем и Работником по вопросам, связанным с ее выполнением в информационно-телекоммуникационных сетях, в том числе сети Интернет, и сетях связи общего пользования. 1.6. Работник подчиняется непосредственно _____________________. 1.7. Срок действия трудового договора с __ _____ 2024 г. до __ ______ 2025 г. Договор заключен на определенный срок на основе соглашения Работника и Работодателя на основании части 2 ст. 59 ТК РФ – прием на работу к работодателю, являющемуся субъектом малого предпринимательства с численностью работников менее 35 человек. 1.8. Дата начала работы: __ ________ 2024 г. 1.9. Работник подлежит обязательному социальному страхованию в соответствии с действующим законодательством Российской Федерации. 1.10. Работнику устанавливается испытание при приеме на работу в целях проверки его соответствия поручаемой работе. Срок испытания - 2 недели со дня фактического начала работы. В срок испытания не включаются периоды, когда Работник фактически отсутствовал на работе. (Примечание: При заключении трудового договора на срок от двух до шести месяцев испытание не может превышать двух недель, до двух месяцев – не устанавливается). 1.11. Работник подчиняется Правилам внутреннего трудового распорядка в части, не противоречащей условиям настоящего Трудового договора. 1.12. Взаимодействие Работника и Работодателя может осуществляться путем обмена электронными сообщениями, электронными документами или электронными образами документов (электронной копией документа, изготовленной на бумажном носителе) с использованием адресов электронной почты, указанными в настоящем Договоре, а также посредством ▒▒▒▒▒▒▒▒. ▒ - возможно добавить информационную систему, и указать порядок взаимодействия в ней! 1.13. Каждая из Сторон обязана подтверждать получение электронного сообщения, электронного документа или электронного образа документа от другой Стороны в день его получения, не позже 4 (четырех) часов с момента получения, (прим. можно указать любое по усмотрению) в противном случае, Сторона, нарушившая такое требование считается нарушившей порядок взаимодействия Сторон Договора. 1.14. В течение рабочего времени, для учета рабочего времени Работника может производиться … 1.15. Стороны согласились, что: 1.15.1. На Работника в полном объеме распространяется действие трудового законодательства и иных актов, содержащих нормы трудового права, с учетом особенностей, установленных гл. 49.1 “Особенности регулирования труда дистанционных работников” Трудового кодекса Российской Федерации. 1.15.2. Нормы гл. 49.1 “Особенности регулирования труда дистанционных работников” Трудового кодекса Российской Федерации подлежат безусловному применению в случае, если урегулированный ими аспект трудовых отношений не нашел своего отражения в настоящем Договоре. 1.15.3. В случае изменения действующего законодательства противоречащие ему условия договора, ухудшающие положение Работника, не подлежат применению. 1.16. Стороны договорились не вносить запись о дистанционной работе в трудовую книжку Работника. 2. ПРАВА И ОБЯЗАННОСТИ РАБОТНИКА   2.1. Работник обязан: 2.1.1. Добросовестно исполнять трудовые обязанности, возложенные на него настоящим Договором и должностной инструкцией, которая является неотъемлемой частью настоящего Договора и иными локальными нормативными актами Работодателя. 2.1.2. Соблюдать правила внутреннего трудового распорядка, в части, не противоречащей условиям настоящего Договора, иные локальные нормативные акты Работодателя. 2.1.3. Соблюдать трудовую дисциплину, в части, не противоречащей условиям настоящего Договора. 2.1.4. Выполнять установленные нормы труда. 2.1.5. Соблюдать требования по охране труда и обеспечению безопасности труда. 2.1.6. Ежемесячно не позднее _____ числа каждого месяца (/ еженедельно / иное) представлять Работодателю отчет о проделанной работе с указанием времени, фактически затраченного Работником на выполнение работы. 2.1.7. Работник обязуется не разглашать охраняемую законом тайну (служебную, коммерческую, иную) и конфиденциальную информацию, обладателями которой являются Работодатель и его контрагенты. 2.1.8. Бережно относиться к имуществу Работодателя, переданному Работнику для исполнения трудовых обязанностей, и при необходимости принимать меры для предотвращения ущерба указанному имуществу. 2.1.9. Направить Работодателю по его требованию нотариально заверенные копии документов на бумажном носителе, предусмотренные ст. 65 Трудового кодекса Российской Федерации, по почте заказным письмом с уведомлением. 2.1.10. Сообщить Работодателю по электронной почте о наступлении временной нетрудоспособности в течение одного дня с момента ее наступления. После окончания временной нетрудоспособности направить Работодателю по почте заказным письмом с уведомлением оригинал листка нетрудоспособности, за исключением случая, если медицинская организация и Работодатель являются участниками системы информационного взаимодействия по обмену сведениями в целях формирования листка нетрудоспособности в форме электронного документа, когда Работнику достаточно представить Работодателю сведения о серии и номере листка нетрудоспособности. 2.1.11. Исполнять иные обязанности, предусмотренные трудовым законодательством и иными нормативными правовыми актами, содержащими нормы трудового права, локальными нормативными актами, соглашениями и настоящим Договором. 2.2. Работник имеет право: 2.2.1. На изменение и расторжение настоящего Трудового договора в порядке и на условиях, которые установлены Трудовым кодексом Российской Федерации, иными федеральными законами. 2.2.2. Предоставление ему работы, обусловленной настоящим Трудовым договором. 2.2.3. Своевременную и в полном объеме выплату заработной платы в соответствии со своей квалификацией, сложностью труда, количеством и качеством выполненной работы. 2.2.4. Отдых, обеспечиваемый установлением нормальной продолжительности рабочего времени, сокращенного рабочего времени для отдельных профессий и категорий работников, предоставлением еженедельных выходных дней, нерабочих праздничных дней, оплачиваемых ежегодных отпусков. 2.2.5. Защиту своих трудовых прав, свобод и законных интересов всеми не запрещенными законом способами. 2.2.6. Обязательное социальное страхование в случаях, предусмотренных федеральными законами. 2.2.7. Обращение к Работодателю с заявлением, предоставление Работодателю объяснения либо другой информации в форме электронного документа или в иной форме, предусмотренной настоящим Договором, за исключением случаев, когда определенная форма взаимодействия установлена трудовым законодательством и/или иными нормативными правовыми актами. 2.2.8. Использование с согласия или ведома Работодателя и в его интересах для выполнения трудовой функции принадлежащих Работнику или арендованных им оборудования, программно-технические средств, средств защиты информации и иные средств. 2.2.9. Получение компенсации за использование принадлежащих Работнику или арендованных им оборудования, программно-технических средств, средств защиты информации и иных средств, а также возмещение расходов, связанных с их использованием, в порядке, сроки и размерах, которые определяются соглашением между Работником и Работодателем. Обязательным условием для выплаты компенсации и возмещения расходов является предоставление Работником Работодателю заверенных копий документов, как подтверждающих приобретение (аренду) оборудования (средств) Работником, так и подтверждающих расходы, понесенные им при использовании их в служебных целях. 2.2.10. Осуществление иных прав, предусмотренных трудовым законодательством Российской Федерации, Правилами внутреннего трудового распорядка в части, не противоречащей условиям настоящего Договора, и иными локальными нормативными актами. 3. Права и обязанности Работодателя   3.1. Работодатель обязан: 3.1.1. Соблюдать трудовое законодательство и иные нормативные правовые акты, содержащие нормы трудового права, локальные нормативные акты, условия настоящего Трудового договора, соглашений и настоящего Договора. 3.1.2. Предоставить Работнику работу, обусловленную настоящим Договором. 3.1.3. Обеспечивать Работнику равную с другими работниками оплату труда равной ценности. 3.1.4. Выплачивать в полном размере причитающуюся Работнику заработную плату в сроки, установленные в соответствии с Трудовым кодексом Российской Федерации, Правилами внутреннего трудового распорядка, настоящим Договором. 3.1.5. Вести учет рабочего времени, фактически отработанного Работником. 3.1.6. Осуществлять обязательное социальное страхование Работника в порядке, установленном федеральными законами. 3.1.7. При подаче Работником заявления о выдаче заверенных надлежащим образом копий документов, связанных с работой, не позднее трех рабочих дней со дня подачи указанного заявления направить Работнику эти копии по почте заказным письмом с уведомлением или, если это указано в заявлении, в форме электронного документа. 3.1.8. Знакомить Работника с принимаемыми локальными нормативными актами, непосредственно связанными с его трудовой деятельностью, приказами (распоряжениями), уведомлениями, требованиями и иными документами путем обмена электронными образами документов (электронной копией документа, изготовленной на бумажном носителе) с использованием адресов электронной почты, указанными в настоящем Договоре, если иная форма взаимодействия не установлена трудовым законодательством и/или иными нормативными правовыми актами. … 3.2. Работодатель имеет право: 3.2.1. Изменять и расторгать настоящий Договор с Работником в порядке и на условиях, которые установлены Трудовым кодексом Российской Федерации, иными федеральными законами. 3.2.2. Поощрять Работника за добросовестный эффективный труд в порядке и на условиях, которые установлены действующими у Работодателя локальными нормативными актами. 3.2.3. Требовать от Работника исполнения им трудовых обязанностей, бережного отношения к имуществу Работодателя, переданному Работнику для исполнения трудовых обязанностей (если передавалось), соблюдения Правил внутреннего трудового распорядка в части, не противоречащей условиям настоящего Договора и иных действующих у Работодателя локальных нормативных актов. 3.2.4. Контролировать выполнение Работником трудовых обязанностей, Правил внутреннего трудового распорядка в части, не противоречащей условиям настоящего Договора о дистанционной работе, и иных локальных нормативных актов. …документ дополняется…`}).add({id:18,href:"/blog/check-nda/",title:"Чек-лист проверки NDA. Общие требования.",description:"Как проверить NDA. Решаем подписывать соглашение о неразглашении, или нет.",content:`Приведем несколько пунктов проверки соглашения о неразглашении информации - NDA.   Лицо, с которым разработчик (Исполнитель) заключает NDA является тем же лицом (Заказчиком), с которым у разработчика заключен основной контракт, например, на разработку ПО или сайта. Бывает и так, что контракт на выполнение работ заключается с каким-либо одним лицом из группы юридических лиц или ИП, объединенных общими задачами, а NDA заключается с другим лицом, которое уже поддерживает деятельность всей группы лиц, и “заточено” только на проверку действий разработчика и судебных тяжбах. Реквизиты Заказчика указаны в NDA верно и у подписанта с его стороны есть должные полномочия на подписание такого соглашения. Если полномочий нет, документ лучше вообще не подписывать. Это важно, так как NDA не только документ возлагающий ответственность на Исполнителя, но и содержит ряд обязанностей Заказчика. В NDA указана цель взаимодействия Сторон, то есть соглашение NDA заключается не просто так, а в целях, например, сохранения информации в рамках исполнения договора разработки приложения. В соглашении NDA четко, подробно и понятно указана информация, которая по соглашению Сторон подлежит неразглашению. Если у Исполнителя есть сомнения или непонимание, какая информация является защищенной, либо объем такой информации написан общими фразами, то такое NDA подписывать нельзя. В тексте соглашения NDA подробно и четко указаны способы передачи защищенной информации, а так же указаны ответственные лица Сторон, которые являются участниками обмена информацией. Есть понятный и подробный раздел NDA, в котором Заказчик и Исполнитель оговаривают, что делать, если произошла передача информации в незащищенном виде, или передача с не указанных в соглашении адресов, или несогласованным способом, или не согласованными Сторонами лицами. Какие действия должны быть произведены Сторонами для устранения, выяснения и наказания виновного в случае утечки информации. Что делать с основным договором между Сторонами. Ответы на эти вопросы так же должны быть в NDA. Отдельные пункты в NDA должны быть посвящены ограничению ответственности Исполнителя, например, в связи с тем, что часть информации между Сторонами передается с помощью публичных сетей, и гарантировать сохранность, при такой передаче, в принципе невозможно.   О других нюансах NDA можно узнать из нашего блога. Следите за обновлениями.`}),search.addEventListener("input",showResults,!0)}function hideSuggestions(e){var isClickInsideElement=suggestions.contains(e.target);isClickInsideElement||(suggestions.classList.add("d-none"),background!==null&&background.style.setProperty("--image-opacity","0.1"))}function inputFocus(e){e.ctrlKey&&e.key==="/"&&(e.preventDefault(),search.focus()),e.key==="Escape"&&(search.blur(),suggestions.classList.add("d-none"))}function suggestionFocus(e){const suggestionsHidden=suggestions.classList.contains("d-none");if(suggestionsHidden)return;const focusableSuggestions=[...suggestions.querySelectorAll("a")];if(focusableSuggestions.length===0)return;const index=focusableSuggestions.indexOf(document.activeElement);if(e.key==="ArrowUp"){e.preventDefault();const nextIndex=index>0?index-1:0;focusableSuggestions[nextIndex].focus()}else if(e.key==="ArrowDown"){e.preventDefault();const nextIndex=index+1r.result)){if(flatResults.has(result.doc.href))continue;flatResults.set(result.doc.href,result.doc)}if(suggestions.innerHTML="",suggestions.classList.remove("d-none"),flatResults.size===0&&searchQuery){const msg=suggestions.dataset.noResults,noResultsMessage=document.createElement("div");noResultsMessage.innerHTML=`${msg} "${searchQuery}"`,noResultsMessage.classList.add("suggestion__no-results"),suggestions.appendChild(noResultsMessage);return}for(const[href,doc]of flatResults){const entry=document.createElement("div");suggestions.appendChild(entry);const a=document.createElement("a");a.href=href,entry.appendChild(a);const title=document.createElement("span");title.classList.add("text-start"),title.textContent=doc.title,title.classList.add("suggestion__title"),a.appendChild(title);const description=document.createElement("span");if(description.textContent=doc.description,description.classList.add("suggestion__description"),a.appendChild(description),suggestions.appendChild(entry),suggestions.childElementCount==maxResult)break}}search!==null&&suggestions!==null&&(document.addEventListener("keydown",inputFocus),document.addEventListener("keydown",suggestionFocus),document.addEventListener("click",hideSuggestions),initIndex());const searchModal=document.getElementById("search-modal");searchModal!==null&&searchModal.addEventListener("shown.bs.modal",function(){const searchInput=document.getElementById("search-input-modal");searchInput!==null&&searchInput.focus({focusVisible:!0})}),document.querySelectorAll(".dynamic-svg").forEach(placeholder=>{placeholder.onload=function(){const container=placeholder.parentElement,doc=placeholder.contentDocument,attr=placeholder.getAttribute("data-class"),style=placeholder.getAttribute("data-style");if(container!==null&&doc!==null){const svg=doc.querySelector("svg");svg!==null&&(svg.setAttribute("class","svg-inline--fa "+(attr||"")),svg.setAttribute("fill","currentcolor"),svg.setAttribute("aria-hidden","true"),svg.setAttribute("role","img"),style!==null&&style!==""&&svg.setAttribute("style",style),svg.removeAttribute("height"),svg.removeAttribute("width"),container.innerHTML="",container.appendChild(svg))}}});const fixed=!0,navbar=document.querySelector(".navbar"),togglers=document.querySelectorAll(".main-nav-toggler"),modeSelectors=document.querySelectorAll(".switch-mode-collapsed"),colorsBG=["body","secondary","tertiary"];function updateNavbar(){let storedTheme;if(typeof getLocalStorage=="function"&&(storedTheme=getLocalStorage("theme",null,"functional")),window.scrollY>75)navbar.classList.add("nav-active"),storedTheme&&navbar.setAttribute("data-bs-theme",storedTheme);else{navbar.classList.remove("nav-active");const defaultTheme=navbar.getAttribute("data-bs-overlay"),targetTheme=defaultTheme||storedTheme;targetTheme&&navbar.setAttribute("data-bs-theme",defaultTheme)}}if(navbar!==null&&window.performance.getEntriesByType&&window.performance.getEntriesByType("navigation")[0].type==="reload"&&fixed&&updateNavbar(),navbar!==null&&togglers!==null){const html=document.querySelector("html"),config={attributes:!0,attributeFilter:["data-bs-theme"]},Observer=new MutationObserver(mutationrecords=>{fixed&&updateNavbar()});Observer.observe(html,config);const color=navbar.getAttribute("data-navbar-color")||"body",bg=colorsBG.includes(color)?`var(--bs-${color}-bg)`:`var(--bs-navbar-color-${color})`;navbar.style.setProperty("--bs-navbar-expanded-color",bg),window.onscroll=()=>{fixed&&updateNavbar()};for(let i=0;i{navbar.classList.toggle("navbar-expanded")};for(let i=0;i{for(let j=0;jnew bootstrap.Popover(popoverTriggerEl));function webShareAPI(title,description,link){navigator.share({title,text:description,url:link}).then(()=>console.log("Successful share")).catch(error=>console.log("Error sharing",error))}const shareButtons=document.querySelectorAll("[data-sharing-url]");shareButtons.forEach(btn=>{if(navigator.share){const title=btn.getAttribute("data-sharing-title"),description=btn.getAttribute("data-sharing-description"),url=btn.getAttribute("data-sharing-url");btn.style.display="block",btn.addEventListener("click",()=>webShareAPI(title,description,url))}else btn.style.display="none"});const container=document.getElementById("toast-container");container!==null&&document.querySelectorAll("[data-toast-target]").forEach(trigger=>{const target=document.getElementById(trigger.getAttribute("data-toast-target"));if(target!==null){container.appendChild(target);const toast=bootstrap.Toast.getOrCreateInstance(target);toast!==null&&trigger.addEventListener("click",()=>{toast.show()})}});const tooltipTriggerList=document.querySelectorAll('[data-bs-toggle="tooltip"]'),tooltipList=[...tooltipTriggerList].map(tooltipTriggerEl=>new bootstrap.Tooltip(tooltipTriggerEl));document.querySelectorAll("[data-video-padding]").forEach(element=>{element.style.paddingBottom=element.getAttribute("data-video-padding")})